piSmasher Configuration Libraries
piSmasher peripheral device configuration libraries

Modules

 Color Conversion Matrix
 

Functions

static int tda998x_vidout_enable (struct tda998x_dev *dev, bool en)
 Video Output Enable. More...
 
static int tda998x_vidout_set_config (struct tda998x_dev *dev, enum tda998x_sink sink, enum tda998x_vidout_mode vout_mode, enum hvf_cntrl_0_prefil prefil, enum hvf_cntrl_1_yuv_blk yuv_blk, enum hvf_cntrl_1_vqr vqr)
 Set Video Output Configuration. More...
 
static int tda998x_vidout_set_sync (struct tda998x_dev *dev, bool h_ext, bool v_ext, bool de_ext, uint8_t tgl, enum tbg_cntrl_0_sync sync)
 Set Video Output Synchronization. More...
 
static int tda998x_video_set_inout (struct tda998x_dev *dev, enum tda998x_vid_fmt vin_fmt, enum tda998x_format_3d format_3d, enum tda998x_scaler_mode sca_mod_req, enum tda998x_vid_fmt vout_fmt, uint8_t pix_rpt, enum tda998x_mtx_mode mtx_mode, enum tda998x_dwidth dwidth, enum tda998x_vqr vqr)
 
static int tda998x_set_aud_pkt_enable (struct tda998x_dev *dev, bool en)
 Set Audio Clock Packet Recovery.
 
static int tda998x_set_pkt_acp (struct tda998x_dev *dev, struct tda998x_pkt *pkt, unsigned int len, uint8_t uAcpType, bool en)
 
static int tda998x_PktSetGeneralCntrl (struct tda998x_dev *dev, bool mute, bool en)
 
static int tda998x_PktSetIsrc1 (struct tda998x_dev *dev, struct tda998x_pkt *pkt, unsigned int len, bool bIsrcCont, bool bIsrcValid, uint8_t uIsrcStatus, bool en)
 
static int tda998x_PktSetIsrc2 (struct tda998x_dev *dev, struct tda998x_pkt *pkt, unsigned int len, bool en)
 
static int tda998x_PktSetMpegInfoframe (struct tda998x_dev *dev, struct tda998x_mpeg_pkt *pkt, bool en)
 
static int tda998x_pkt_set_null_insert (struct tda998x_dev *dev, bool en)
 Set Null Packet Insertion. More...
 
static int tda998x_pkt_set_null (struct tda998x_dev *dev)
 
static int tda998x_pkg_set_spdinfo (struct tda998x_dev *dev, struct tda998x_spd_pkt *pkt, bool en)
 Set Source Product Description Infoframe.
 
static int tda998x_pkt_set_raw_vid_infoframe (struct tda998x_dev *dev, struct tda998x_pkt *pkt, bool en)
 
static int tda998x_pkt_set_vs_infoframe (struct tda998x_dev *dev, struct tda998x_pkt *pkt, unsigned int len, uint8_t version, bool en)
 
static int tda998x_set_pix_edge (struct tda998x_dev *dev, enum vip_cntrl_3_edge edge)
 
static int input_config (struct tda998x_dev *dev, enum tda998x_vidin_mode vin_mode, enum vip_cntrl_3_edge edge, enum tda998x_pix_rate pix_rate, enum tda998x_upsample upsample_mode, uint8_t pix_rpt, enum tda998x_vid_fmt vout_fmt, enum tda998x_format_3d format_3d)
 Configure Video Input. More...
 
static int tda998x_reset (struct tda998x_dev *dev)
 
int tda998x_init (struct tda998x_dev *dev, struct tda998x_cfg *cfg)
 
int tda998x_set_input_output (struct tda998x_dev *dev, struct tda998x_vidin_cfg *vidin_cfg, struct tda998x_vidout_cfg *vidout_cfg, struct tda998x_audin_cfg *audin_cfg, enum tda998x_sink sink)
 Set Input and Output. More...
 
static int tda998x_aud_set_pkt_infoframe (struct tda998x_dev *dev, struct tda998x_aud_if_pkt *pkt, bool en)
 Set Audio Infoframe Packet. More...
 

Detailed Description

Function Documentation

◆ input_config()

static int input_config ( struct tda998x_dev dev,
enum tda998x_vidin_mode  vin_mode,
enum vip_cntrl_3_edge  edge,
enum tda998x_pix_rate  pix_rate,
enum tda998x_upsample  upsample_mode,
uint8_t  pix_rpt,
enum tda998x_vid_fmt  vout_fmt,
enum tda998x_format_3d  format_3d 
)
static

#include <projects/lib/tda998x.c>

Configure Video Input.

Parameters
devTDA998x device structure pointer
Returns
0 on success, non-zero error status otherwise
4446 {
4447  int ret = 0;
4448  uint8_t reg_idx, reg_idx3D; /* Video format value used for register */
4449  uint8_t ssd = 0; /* Packed srl, scg and de */
4450  struct tda998x_vidin_cfg *vidin_cfg;
4451  const struct vidfmt_desc *desc;
4452 
4453  /* Check parameters */
4454  if (dev == NULL)
4455  return ERR_NULL_PARAM;
4456 
4457  desc = get_vidfmt_desc(vout_fmt);
4458  if (desc == NULL)
4459  return ERR_NOT_FOUND;
4460 
4461  ret = write_reg_mask(dev,
4462  VIP_CNTRL_3,
4463  VIP_CNTRL_3_EDGE,
4464  (uint8_t) edge);
4465  if (ret < 0)
4466  return ret;
4467 
4468  vidin_cfg->pix_rate = pix_rate;
4469 
4470  switch (vidin_cfg->mode) {
4471  case VINMODE_RGB444:
4472  case VINMODE_YUV444:
4473  if ((vidin_cfg->pix_rate == PIXRATE_SINGLE) ||
4474  (vidin_cfg->pix_rate == PIXRATE_SINGLE_REPEATED)) {
4475  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_CCIR656, 0);
4476  if (ret < 0)
4477  return ret;
4478 
4479  ret = write_reg_mask(dev, HVF_CNTRL_1, HVF_CNTRL_1_SEMI_PLANAR, 0);
4480  if (ret < 0)
4481  return ret;
4482 
4483  ret = write_reg_mask(dev, PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR, 0);
4484  if (ret < 0)
4485  return ret;
4486 
4487  ret = write_reg_mask(dev, SEL_CLK, SEL_CLK_SEL_VRF_CLK_MASK, 0);
4488  if (ret < 0)
4489  return ret;
4490 
4491  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_656_ALT, 0);
4492  if (ret < 0)
4493  return ret;
4494  } else {
4495  return ERR_BAD_PARAM;
4496  }
4497  break;
4498 
4499  case VINMODE_YUV422:
4500  if ((vidin_cfg->pix_rate == PIXRATE_SINGLE) ||
4501  (vidin_cfg->pix_rate == PIXRATE_SINGLE_REPEATED)) {
4502  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_CCIR656, 0);
4503  if (ret < 0)
4504  return ret;
4505 
4506  ret = write_reg_mask(dev, HVF_CNTRL_1, HVF_CNTRL_1_SEMI_PLANAR, HVF_CNTRL_1_SEMI_PLANAR);
4507  if (ret < 0)
4508  return ret;
4509 
4510  ret = write_reg_mask(dev, PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR, 0);
4511  if (ret < 0)
4512  return ret;
4513 
4514  ret = write_reg_mask(dev, SEL_CLK, SEL_CLK_SEL_VRF_CLK_MASK, 0);
4515  if (ret < 0)
4516  return ret;
4517 
4518  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_656_ALT, 0);
4519  if (ret < 0)
4520  return ret;
4521  } else {
4522  return ERR_BAD_PARAM;
4523  }
4524  break;
4525 
4526  case VINMODE_CCIR656:
4527  if ((vidin_cfg->pix_rate == PIXRATE_SINGLE) ||
4528  (vidin_cfg->pix_rate == PIXRATE_SINGLE_REPEATED)) {
4529  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_CCIR656, VIP_CNTRL_4_CCIR656);
4530  if (ret < 0)
4531  return ret;
4532 
4533  ret = write_reg_mask(dev, HVF_CNTRL_1, HVF_CNTRL_1_SEMI_PLANAR, HVF_CNTRL_1_SEMI_PLANAR);
4534  if (ret < 0)
4535  return ret;
4536 
4537  ret = write_reg_mask(dev, PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR, PLL_SERIAL_3_SRL_CCIR);
4538  if (ret < 0)
4539  return ret;
4540 
4541  ret = write_reg_mask(dev, SEL_CLK, SEL_CLK_SEL_VRF_CLK_MASK, 0x02);
4542  if (ret < 0)
4543  return ret;
4544 
4545  ret = write_reg_mask(dev,
4546  VIP_CNTRL_4,
4547  VIP_CNTRL_4_656_ALT,
4548  0);
4549  if (ret < 0)
4550  return ret;
4551  } else if (vidin_cfg->pix_rate == PIXRATE_DOUBLE) {
4552  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_CCIR656, VIP_CNTRL_4_CCIR656);
4553  if (ret < 0)
4554  return ret;
4555 
4556  ret = write_reg_mask(dev, HVF_CNTRL_1, HVF_CNTRL_1_SEMI_PLANAR, HVF_CNTRL_1_SEMI_PLANAR);
4557  if (ret < 0)
4558  return ret;
4559 
4560  ret = write_reg_mask(dev, PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR, 0);
4561  if (ret < 0)
4562  return ret;
4563 
4564  ret = write_reg_mask(dev, SEL_CLK, SEL_CLK_SEL_VRF_CLK_MASK, 0);
4565  if (ret < 0)
4566  return ret;
4567 
4568  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_656_ALT, VIP_CNTRL_4_656_ALT);
4569  if (ret < 0)
4570  return ret;
4571  }
4572  break;
4573 
4574  default:
4575  ret = write_reg_mask(dev, VIP_CNTRL_4, VIP_CNTRL_4_CCIR656, 0);
4576  if (ret < 0)
4577  return ret;
4578 
4579  ret = write_reg_mask(dev, HVF_CNTRL_1, HVF_CNTRL_1_SEMI_PLANAR, 0);
4580  if (ret < 0)
4581  return ret;
4582 
4583  ret = write_reg_mask(dev, PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR, 0);
4584  if (ret < 0)
4585  return ret;
4586 
4587  ret = write_reg_mask(dev, SEL_CLK, SEL_CLK_SEL_VRF_CLK_MASK, 0);
4588  if (ret < 0)
4589  return ret;
4590 
4591  break;
4592  }
4593 
4594  ret = write_reg_mask(dev,
4595  PLL_SERIAL_2,
4596  PLL_SERIAL_2_SRL_NOSC_MASK,
4597  desc->pll_sc);
4598 
4599  /* Set pixel repetition */
4600  ret = write_reg_mask(dev,
4601  PLL_SERIAL_2,
4602  PLL_SERIAL_2_SRL_PR_MASK,
4603  desc->pix_rpt);
4604  if (ret < 0)
4605  return ret;
4606 
4607  /* Set pixel repetition count for repeater module */
4608  ret = write_reg(dev, RPT_CNTRL, desc->pix_rpt);
4609  if (ret < 0)
4610  return ret;
4611 
4612  ret = write_reg_mask(dev,
4613  PLL_SERIAL_1,
4614  PLL_SERIAL_1_SRL_MAN_IZ,
4615  0);
4616  if (ret < 0)
4617  return ret;
4618 
4619  ret = write_reg_mask(dev,
4620  PLL_SERIAL_3,
4621  PLL_SERIAL_3_SRL_DE,
4622  0);
4623  if (ret < 0)
4624  return ret;
4625 
4626  ret = write_reg(dev, SERIALIZER, 0);
4627  if (ret < 0)
4628  return ret;
Definition: tda998x.h:131
static int write_reg(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t data)
Write Register.
Definition: tda998x.c:1283
Definition: tda998x.c:647
Definition: tda998x.h:146
enum tda998x_vidin_mode mode
Definition: tda998x.h:273
Definition: tda998x.h:130
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371
Definition: tda998x.h:147
uint8_t pll_sc
Definition: tda998x.c:1130
Definition: tda998x.c:648
Definition: tda998x.c:1121
enum tda998x_pix_rate pix_rate
Definition: tda998x.h:275
Definition: tda998x.h:129
Definition: tda998x.h:145
Video Input Configuration.
Definition: tda998x.h:271
Definition: tda998x.h:128

◆ tda998x_aud_set_pkt_infoframe()

static int tda998x_aud_set_pkt_infoframe ( struct tda998x_dev dev,
struct tda998x_aud_if_pkt pkt,
bool  en 
)
static

#include <projects/lib/tda998x.c>

Set Audio Infoframe Packet.

Parameters
devTDA998x device structure pointer
pktAudio infoframe packet structure pointer
enEnable infoframe insertion
Returns
0 on success, non-zero error status otherwise
3990 {
3991  int ret;
3992  uint8_t buf[9]; /* Temp buffer to hold header/packet bytes */
3993  uint16_t buf_reg; /* Base register used for writing InfoFrame */
3994  uint16_t flag_reg; /* Flag register to be used */
3995  uint8_t flag_mask; /* Mask used for writing flag register */
3996 
3997  if (dev->sink != SINK_HDMI)
3998  return ERR_NOT_PERMITTED;
3999 
4000  buf_reg = IF4_HB0;
4001  flag_reg = DIP_IF_FLAGS;
4002  flag_mask = DIP_IF_FLAGS_IF4;
4003 
4004 // if (pkt != Null) {
4005  /* Data to change, start by clearing AIF packet insertion flag */
4006  ret = write_reg_mask(dev, flag_reg, flag_mask, 0);
4007  if (ret < 0)
4008  return ret;
4009 
4010  /* Prepare AIF header */
4011  buf[0] = 0x84; /* Audio InfoFrame */
4012  buf[1] = 0x01; /* Version 1 [HDMI 1.2] */
4013  buf[2] = 0x0A; /* Length [HDMI 1.2] */
4014 
4015  /* Prepare AIF packet (byte numbers offset by 3) */
4016  buf[3] = 0; /* Preset checksum to zero */
4017 
4018  buf[4] = ((pkt->type & 0x0F) << 4) |
4019  (pkt->nchan & 0x07); /* CT3-0, CC2-0 */
4020 
4021  buf[5] = ((pkt->samp_freq & 0x07) << 2) |
4022  (pkt->samp_size & 0x03); /* SF2-0, SS1-0 */
4023 
4024  buf[6] = 0; /* [HDMI 1.2] */
4025  buf[7] = pkt->chan_alloc; /* CA7-0 */
4026  buf[8] = ((pkt->lvl_shift & 0x0F) << 3); /* LS3-0 */
4027 
4028  if (pkt->dmix_inhib)
4029  buf[8] |= (1 << 7);
4030 
4031  /* Calculate checksum - this is worked out on "Length" bytes of the
4032  * packet, the checksum (which we've preset to zero), and the three
4033  * header bytes. We exclude bytes PB6 to PB10 (which we
4034  * are not writing) since they are zero.
4035  */
4036  buf[3] = chksum(&buf[0], 9);
4037 
4038 
4039  /* Write header and packet bytes in one operation */
4040  ret = tda998x_write(dev, buf_reg, 9, &buf[0]);
4041  if (ret < 0)
4042  return ret;
4043 // }
4044 
4045  /* Write AIF packet insertion flag */
4046  ret = write_reg_mask(dev,
4047  flag_reg,
4048  flag_mask,
4049  (uint8_t) en);
uint8_t chan_alloc
Definition: tda998x.h:441
uint8_t samp_size
Definition: tda998x.h:440
static int tda998x_write(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t len, uint8_t *data)
Write Data.
Definition: tda998x.c:1247
bool dmix_inhib
Definition: tda998x.h:442
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371
Definition: tda998x.h:65
uint8_t nchan
Definition: tda998x.h:438
uint8_t samp_freq
Definition: tda998x.h:439
uint8_t lvl_shift
Definition: tda998x.h:443
uint8_t type
Definition: tda998x.h:437

◆ tda998x_pkt_set_null_insert()

static int tda998x_pkt_set_null_insert ( struct tda998x_dev dev,
bool  en 
)
static

#include <projects/lib/tda998x.c>

Set Null Packet Insertion.

Parameters
devTDA998x device structure pointer
enSet or clear null packet insertion
Returns
0 on success, non-zero error status otherwise
4245 {
4246  int ret;
4247  if (dev->sink != SINK_HDMI)
4248  return ERR_NOT_PERMITTED;
4249 
4250  /* Set or clear FORCE_NULL packet insertion flag */
4251  ret = write_reg_mask(dev,
4252  DIP_FLAGS,
4253  DIP_FLAGS_FORCE_NULL,
4254  en ? DIP_FLAGS_FORCE_NULL : 0);
4255  if (ret < 0)
4256  return ret;
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371
Definition: tda998x.h:65

◆ tda998x_set_input_output()

int tda998x_set_input_output ( struct tda998x_dev dev,
struct tda998x_vidin_cfg vidin_cfg,
struct tda998x_vidout_cfg vidout_cfg,
struct tda998x_audin_cfg audin_cfg,
enum tda998x_sink  sink 
)

#include <projects/lib/tda998x.c>

Set Input and Output.

Parameters
devTDA998x device structure pointer
vidin_cfgVideo input configuration structure pointer
vidout_cfgVideo output configuration structure pointer
audin_cfgAudio input configuration structure pointer
Returns
0 on success, non-zero error status otherwise

< Pixel repetition






< Data path bit width





< Pixel sampling edge




< Sync method



< Toggling


< Subpacket synchronization

< Blanking source

Todo:
BEGIN VIDO INPUT SYNCHRONIZATION
4809 {
4810  int ret;
4811  uint8_t pix_rpt;
4812  enum tda998x_dwidth dwidth;
4813  enum vip_cntrl_3_edge pix_edge;
4814  enum tbg_cntrl_0_sync_mthd sync_mthd;
4815  enum tda998x_pix_tgl toggle;
4816  uint8_t sync;
4817  enum vip_cntrl_3_sp_sync sp_sync;
4818  enum vip_cntrl_4_blnkit blankit;
4819  uint16_t ref_pix;
4820  uint16_t ref_line;
4821  const struct vidfmt_desc *desc;
4822 
4823  const enum vip_cntrl_swap *swap = NULL;
4824  const enum vip_cntrl_mirr *mirr = NULL;
4825 
4826 // if (sink == SINK_EDID) {
4827 // /* Change sink type with the currently defined in EDID */
4828 // ret = tda998x_edid_get_sinktype(dev, &sinktype);
4829 // if (ret < 0)
4830 // return ret;
4831 // }
4832 
4833  desc = get_vidfmt_desc(vidout_cfg->format);
4834  if (desc == NULL)
4835  return ERR_NOT_FOUND;
4836 
4837  /* Pixel repetition for DVI not allowed */
4838  if (sink == SINK_DVI) {
4839  if (((vidout_cfg->format >= VFMT_06_720x480i_60Hz) && (vidout_cfg->format <= VFMT_15_1440x480p_60Hz)) ||
4840  ((vidout_cfg->format >= VFMT_21_720x576i_50Hz) && (vidout_cfg->format <= VFMT_30_1440x576p_50Hz)) ||
4841  ((vidout_cfg->format >= VFMT_35_2880x480p_60Hz)&& (vidout_cfg->format <= VFMT_38_2880x576p_50Hz)))
4842  return ERR_BAD_PARAM;
4843  }
4844 
4845  /* Set the TMDS outputs to a forced state */
4846  ret = tda998x_set_tmds_output(dev, TMDSOUT_FORCED0);
4847  if (ret < 0)
4848  return ret;
4849 
4850  dev->vin_cfg = vidin_cfg;
4851  dev->vout_cfg = vidout_cfg;
4852 
4853  /* Set video output configuration */
4854  ret = tda998x_vidout_set_config(dev, sink, vidout_cfg->mode, PREFIL_OFF, YUVBLK_16, QRANGE_FS);
4855  if (ret < 0)
4856  return ret;
4857 
4858  /* Default config */
4859  pix_rpt = PIXREP_DEFAULT;
4860  dwidth = VOUT_DBITS_12;
4861  pix_edge = PIXEDGE_CLK_POS;
4862  sync_mthd = SYNCMTHD_V_XDE;
4863  toggle = PIXTOGL_ENABLE;
4864 
4865  /* Set sync details */
4866  if (vidin_cfg->sync_src == SYNCSRC_EMBEDDED) {
4867  sync = 1; /* Embedded sync */
4868  sp_sync = SPSYNC_HEMB;
4869  blankit = BLNKSRC_VS_HEMB_VEMB;
4870  sync_mthd = SYNCMTHD_V_XDE;
4871  } else {
4872  sync = 0; /* External sync */
4873 
4874  /* DE is available */
4875  sp_sync = SPSYNC_RISING_DE;
4876  blankit = BLNKSRC_NOT_DE;
4877  }
4878 
4879  /* Port swap table */
4880  switch(vidin_cfg->mode) {
4881 // case VINMODE_CCIR656:
4882 // dwidth = VOUT_DBITS_8;
4883 // pix_edge = PIXEDGE_CLK_NEG;
4884 // swap = port_map_ccir656;
4885 // mirr = mirr_map_ccir656;
4886 // break;
4887 
4888  case VINMODE_RGB444:
4889  swap = port_map_rgb444;
4890  mirr = mirr_map_rgb444;
4891  break;
4892 
4893 // case VINMODE_YUV444:
4894 // swap = port_map_yuv444;
4895 // mirr = mirr_map_yuv444;
4896 // break;
4897 
4898 // case VINMODE_YUV422:
4899 // swap = port_map_yuv422;
4900 // mirr = mirr_map_yuv422;
4901 // break;
4902 
4903  default:
4904  return ERR_BAD_PARAM;
4905  }
4906 
4907  /* Set the audio and video input port configuration */
4908  ret = tda998x_vidin_set_port_enable(dev);
4909  if (ret < 0)
4910  return ret;
4911 
4912  ret = tda998x_vidin_set_mapping(dev, swap, mirr);
4913  if (ret < 0)
4914  return ret;
4915 
4916  ret = tda998x_vidin_set_fine(dev, sp_sync, 0, TGLCLK_HIGH);
4917  if (ret < 0)
4918  return ret;
4919 
4920  /* Set input blanking */
4921  ret = tda998x_vidin_set_blanking(dev, blankit, BLNKCODE_RGB444);
4922  if (ret < 0)
4923  return ret;
4924 
4925  ret = tda998x_vidin_set_config(dev,
4926  vidin_cfg->mode,
4927  vidout_cfg->format,
4928  vidin_cfg->format_3d,
4929  pix_edge,
4930  vidin_cfg->pix_rate,
4931  UPSAMPLE_AUTO);
4932  if (ret < 0)
4933  return ret;
4934 
4935  /* Set input output */
4936  ret = tda998x_video_set_inout(dev,
4937  vidin_cfg->format,
4938  vidin_cfg->format_3d,
4940  vidout_cfg->format,
4941  0,
4942  MTX_MODE_AUTO,
4943  dwidth,
4944  vidout_cfg->vqr);
4945  if (ret < 0)
4946  return ret;
4947 
4948  /* Only set audio for HDMI, not DVI */
4949  if (sink == SINK_HDMI) {
4950  /* Set audio parameters */
4951  ret = tda998x_aud_set_input(dev, audin_cfg);
4952  if (ret < 0)
4953  return ret;
4954  }
4955 
4956  if (sync == 0) {
4957  /* External synchronization */
4958  switch (vidin_cfg->format) {
4963  if ((vidout_cfg->format == VFMT_16_1920x1080p_60Hz) ||
4964  (vidout_cfg->format == VFMT_31_1920x1080p_50Hz)) {
4965  toggle = PIXTOGL_NO_ACTION;
4966  }
4967  break;
4968  default:
4969  toggle = PIXTOGL_ENABLE;
4970  break;
4971  }
4972  }
4973 
4977  ret = write_reg_mask(dev,
4978  VIP_CNTRL_3,
4979  VIP_CNTRL_3_EMB,
4980  (uint8_t) vidin_cfg->sync_src);
4981  if (ret < 0)
4982  return ret;
4983 
4984  ret = write_reg_mask(dev,
4985  TBG_CNTRL_0,
4986  TBG_CNTRL_0_SYNC_MTHD,
4987  (uint8_t) sync_mthd);
4988  if (ret < 0)
4989  return ret;
4990 
4991  /* Toggle DE */
4992  ret = write_reg_mask(dev,
4993  VIP_CNTRL_3,
4994  VIP_CNTRL_3_V_TGL | VIP_CNTRL_3_H_TGL | VIP_CNTRL_3_X_TGL,
4995  VIP_CNTRL_3_X_TGL);
4996  if (ret < 0)
4997  return ret;
4998 
4999  if (desc->reg_fmt >= VIDFORMAT_800x600p_60Hz) {
5000  set_video_config(dev, &vidformat_pc[desc->reg_fmt - VIDFORMAT_800x600p_60Hz]);
5001  }
5002 
5003  ref_pix = desc->hfp + 2;
5004  ref_line = desc->vfp;
5005 
5006  if ((ref_pix >= REFPIX_MIN) &&
5007  (ref_pix <= REFPIX_MAX)) {
5008  ret = write_reg16(dev, REFPIX_MSB, ref_pix);
5009  if (ret < 0)
5010  return ret;
5011  }
5012 
5013  if ((ref_line >= REFLINE_MIN) &&
5014  (ref_line <= REFLINE_MAX)) {
5015  ret = write_reg16(dev, REFLINE_MSB, ref_line);
5016  if (ret < 0)
5017  return ret;
5018  }
5019 
5020 // ret = tda998x_vidin_set_sync(dev,
5021 // vidin_cfg->sync_src,
5022 // sync_mthd,
5023 // false,
5024 // false,
5025 // true,
5026 // ref_pix,
5027 // ref_line);
5028 // if (ret < 0)
5029 // return ret;
5030 
5031 // toggle = HDMITX_PIXTOGL_ENABLE;
5032 // ref_pix = 0;
5033 // ref_line = 0;
5034 // sync_mthd = 0;
5035 
5036  /* Not found so assume non-scaler and auto-configure input */
5037 // ret = tda998x_vidin_set_sync_auto(dev,
5038 // vidin_cfg->sync_src,
5039 // vidin_cfg->format,
5040 // vidin_cfg->mode,
5041 // vidin_cfg->format_3d);
5042 // if (ret < 0)
5043 // return ret;
5044 
5045  /* Set infoframes for HDMI only */
5046 // if (sink == SINK_HDMI) {
5047 // /* Set infoframe */
5048 // ret = tda998x_vidout_set_infofram(dev, vidout_cfg->format, vidout_cfg->mode);
5049 // if (ret < 0)
5050 // return ret;
5051 // }
5052 
5053  /* Set video synchronization */
5054  ret = tda998x_vidout_set_sync(dev,
5058  VS_TGL_TABLE,
5059  SYNC_EACH_FRAME);
5060  if (ret < 0)
#define PIXREP_DEFAULT
Definition: tda998x.c:363
Definition: tda998x.h:89
Definition: tda998x.h:168
enum tda998x_vid_fmt format
Definition: tda998x.h:272
static int tda998x_vidin_set_port_enable(struct tda998x_dev *dev)
Set Video Input Port Pin Enable.
Definition: tda998x.c:3238
vip_cntrl_3_sp_sync
Video Input Port Control Subpacket Synchronization Enumeration.
Definition: tda998x.c:268
Definition: tda998x.h:154
static int tda998x_vidin_set_fine(struct tda998x_dev *dev, enum vip_cntrl_3_sp_sync sp_sync, uint8_t sp_cnt, enum vip_cntrl_5_clkpol clkpol)
Set Video Input Fine.
Definition: tda998x.c:3147
Definition: tda998x.c:501
Definition: tda998x.h:92
static int tda998x_vidin_set_blanking(struct tda998x_dev *dev, enum vip_cntrl_4_blnkit src, enum vip_cntrl_4_blc code)
Set Video Input Blanking Source and Code.
Definition: tda998x.c:2983
Definition: tda998x.h:158
Definition: tda998x.c:289
Definition: tda998x.c:647
Definition: tda998x.h:64
static int set_video_config(struct tda998x_dev *dev, struct tda998x_vid_frm *vid)
Set Video Configuration.
Definition: tda998x.c:1699
Definition: tda998x.c:447
static int tda998x_vidout_set_config(struct tda998x_dev *dev, enum tda998x_sink sink, enum tda998x_vidout_mode vout_mode, enum hvf_cntrl_0_prefil prefil, enum hvf_cntrl_1_yuv_blk yuv_blk, enum hvf_cntrl_1_vqr vqr)
Set Video Output Configuration.
Definition: tda998x.c:3366
Definition: tda998x.c:351
enum tda998x_vqr vqr
Definition: tda998x.h:294
enum tda998x_vidin_mode mode
Definition: tda998x.h:273
static int tda998x_set_tmds_output(struct tda998x_dev *dev, enum buffer_out_srl_force tmds)
Set TMDS Output.
Definition: tda998x.c:2952
Definition: tda998x.h:77
Definition: tda998x.h:202
vip_cntrl_3_edge
Definition: tda998x.c:277
enum tda998x_vidout_mode mode
Definition: tda998x.h:292
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371
Definition: tda998x.h:65
Definition: tda998x.c:932
Definition: tda998x.h:78
enum tda998x_vid_fmt format
Definition: tda998x.h:291
tbg_cntrl_0_sync_mthd
Definition: tda998x.c:499
Definition: tda998x.c:303
vip_cntrl_mirr
Definition: tda998x.c:249
Definition: tda998x.c:437
Definition: tda998x.h:94
Definition: tda998x.h:93
static int write_reg16(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint16_t data)
Write 16-bit Register.
Definition: tda998x.c:1299
Definition: tda998x.c:1121
tda998x_dwidth
Definition: tda998x.h:201
tda998x_pix_tgl
Definition: tda998x.h:157
Definition: tda998x.c:300
Definition: tda998x.h:103
Definition: tda998x.h:88
Definition: tda998x.h:108
enum tda998x_sync_src sync_src
Definition: tda998x.h:274
enum tda998x_pix_rate pix_rate
Definition: tda998x.h:275
Definition: tda998x.h:135
enum tda998x_format_3d format_3d
Definition: tda998x.h:276
Definition: tda998x.h:79
Definition: tda998x.c:903
Definition: tda998x.h:129
Definition: tda998x.h:159
static int tda998x_vidout_set_sync(struct tda998x_dev *dev, bool h_ext, bool v_ext, bool de_ext, uint8_t tgl, enum tbg_cntrl_0_sync sync)
Set Video Output Synchronization.
Definition: tda998x.c:3454
static int tda998x_vidin_set_mapping(struct tda998x_dev *dev, const enum vip_cntrl_swap *swap, const enum vip_cntrl_mirr *mirr)
Set Video Input Port Mapping.
Definition: tda998x.c:3206
Definition: tda998x.h:111
int tda998x_aud_set_input(struct tda998x_dev *dev, struct tda998x_audin_cfg *audin_cfg)
Definition: tda998x.c:2465
vip_cntrl_4_blnkit
Video Input Port Control Blanking Source Enumeration.
Definition: tda998x.c:299
Definition: tda998x.h:104
Definition: tda998x.h:177
Definition: tda998x.c:898

◆ tda998x_vidout_enable()

static int tda998x_vidout_enable ( struct tda998x_dev dev,
bool  en 
)
static

#include <projects/lib/tda998x.c>

Video Output Enable.

Parameters
devTDA998x device structure pointer
enEnable video selection
Returns
0 on success, non-zero error status otherwise
3341 {
3342  int ret;
3343 
3344  ret = write_reg_mask(dev,
3345  TBG_CNTRL_0,
3346  TBG_CNTRL_0_FRAME_DIS,
3347  en ? 0 : TBG_CNTRL_0_FRAME_DIS);
3348  if (ret < 0)
3349  return ret;
3350 
3351  return 0;
3352 }
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371

◆ tda998x_vidout_set_config()

static int tda998x_vidout_set_config ( struct tda998x_dev dev,
enum tda998x_sink  sink,
enum tda998x_vidout_mode  vout_mode,
enum hvf_cntrl_0_prefil  prefil,
enum hvf_cntrl_1_yuv_blk  yuv_blk,
enum hvf_cntrl_1_vqr  vqr 
)
static

#include <projects/lib/tda998x.c>

Set Video Output Configuration.

Parameters
devTDA998x device structure pointer
sinkVideo output sink type
vout_modeVideo output mode
prefilPrefilter
yuv_blk
vqrVideo quantization range
Returns
0 on success, non-zero error status otherwise
3372 {
3373  int ret;
3374 
3375  if (dev == NULL)
3376  return ERR_NULL_PARAM;
3377 
3378  if (sink == SINK_EDID) {
3379  if (dev->edid->state == EDID_NOT_READ)
3380  dev->sink = SINK_DVI; /* Assume simplest sink */
3381  else
3382  dev->sink = dev->edid->sink; /* Set sink to the type that was read */
3383  } else {
3384  /* Set demanded sink type */
3385  dev->sink = sink;
3386  }
3387 
3388  if (dev->sink == SINK_DVI) {
3389  ret = write_reg_mask(dev,
3390  AIP_CNTRL_0,
3391  AIP_CNTRL_0_RST_FIFO,
3392  AIP_CNTRL_0_RST_FIFO);
3393  if (ret < 0)
3394  return ret;
3395 
3396  vout_mode = VOUTMODE_RGB444;
3397 
3398  ret = write_reg_mask(dev, TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS, TBG_CNTRL_1_DWIN_DIS);
3399  if (ret < 0)
3400  return ret;
3401 
3402  ret = write_reg_mask(dev, OTP_TX33, OTP_TX33_HDMI, 0);
3403  if (ret < 0)
3404  return ret;
3405 
3406  ret = write_reg_mask(dev, ENC_CNTRL, ENC_CNTRL_CTL_CODE_MASK, 0);
3407  if (ret < 0)
3408  return ret;
3409  } else {
3410  ret = write_reg_mask(dev, AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO, 0);
3411  if (ret < 0)
3412  return ret;
3413 
3414  ret = write_reg_mask(dev, TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS, 0);
3415  if (ret < 0)
3416  return ret;
3417 
3418  ret = write_reg_mask(dev, ENC_CNTRL, ENC_CNTRL_CTL_CODE_MASK, 0x04U);
3419  if (ret < 0)
3420  return ret;
3421 
3422  ret = write_reg_mask(dev, OTP_TX33, OTP_TX33_HDMI, OTP_TX33_HDMI);
3423  if (ret < 0)
3424  return ret;
3425  }
3426 
3427  dev->vout_cfg->mode = vout_mode;
3428 
3429  ret = write_reg_mask(dev,
3430  HVF_CNTRL_0,
3432  (uint8_t) prefil);
3433  if (ret < 0)
3434  return ret;
3435 
3436  ret = write_reg_mask(dev,
3437  HVF_CNTRL_1,
3439  (uint8_t) yuv_blk);
3440  if (ret < 0)
3441  return ret;
3442 
3443  return 0;
3444 }
Definition: tda998x.h:196
#define HVF_CNTRL_0_PREFIL_MASK
Definition: tda998x.c:410
Definition: tda998x.h:64
enum tda998x_vidout_mode mode
Definition: tda998x.h:292
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371
#define HVF_CNTRL_1_YUVBLK
Definition: tda998x.c:431
Definition: tda998x.h:66

◆ tda998x_vidout_set_sync()

static int tda998x_vidout_set_sync ( struct tda998x_dev dev,
bool  h_ext,
bool  v_ext,
bool  de_ext,
uint8_t  tgl,
enum tbg_cntrl_0_sync  sync 
)
static

#include <projects/lib/tda998x.c>

Set Video Output Synchronization.

Parameters
devTDA998x device structure pointer
Returns
0 on success, non-zero error status otherwise
3463 {
3464  int ret;
3465  uint8_t reg_val = 0;
3466 
3467  /* Build register value */
3468  if (h_ext)
3469  reg_val |= TBG_CNTRL_1_VHX_EXT_HS;
3470 
3471  if (v_ext)
3472  reg_val |= TBG_CNTRL_1_VHX_EXT_VS;
3473 
3474  if (de_ext)
3475  reg_val |= TBG_CNTRL_1_VHX_EXT_DE;
3476 
3477  ret = write_reg_mask (dev,
3478  TBG_CNTRL_1,
3479  TBG_CNTRL_1_VHX_EXT_MASK,
3480  reg_val);
3481  if (ret < 0)
3482  return ret;
3483 
3484  ret = write_reg_mask(dev,
3485  TBG_CNTRL_1,
3486  TBG_CNTRL_1_VH_TGL_MASK,
3487  tgl);
3488 
3489  if (ret < 0)
3490  return ret;
3491 
3492  /* Must be last register set */
3493  ret = write_reg_mask(dev,
3494  TBG_CNTRL_0,
3495  TBG_CNTRL_0_SYNC,
3496  (uint8_t) sync);
3497  if (ret < 0)
3498  return ret;
3499 
3500  /* Toggle TMDS serializer */
3501  ret = write_reg_mask(dev,
3502  BUFFER_OUT,
3503  BUFFER_OUT_SRL_FORCE_MASK,
3504  (uint8_t) TMDSOUT_FORCED0);
3505  if (ret < 0)
3506  return ret;
3507 
3508  ret = write_reg_mask(dev,
3509  BUFFER_OUT,
3510  BUFFER_OUT_SRL_FORCE_MASK,
3511  (uint8_t) TMDSOUT_NORMAL);
3512  if (ret < 0)
3513  return ret;
3514 
3515  if (sync == SYNC_ONCE) {
3516  /* Toggle output Sync Once flag for settings to take effect */
3517  ret = write_reg_mask(dev,
3518  TBG_CNTRL_0,
3519  TBG_CNTRL_0_SYNC,
3520  (uint8_t) SYNC_EACH_FRAME);
3521  if (ret < 0)
3522  return ret;
3523 
3524  ret = write_reg_mask(dev,
3525  TBG_CNTRL_0,
3526  TBG_CNTRL_0_SYNC,
3527  (uint8_t) SYNC_ONCE);
3528  if (ret < 0)
3529  return ret;
3530  }
static int write_reg_mask(struct tda998x_dev *dev, enum tda998x_hdmi_reg reg, uint8_t mask, uint8_t val)
Register Mask Write Write a value with mask bits to a register.
Definition: tda998x.c:1371