📄 tmbslhdmitx_2.c
字号:
* register values, and write to register pairs */ for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { /* Mask & copy MSB */ buf[i*2] = (UInt8)(((UInt16)pMatOffset->Offset[i] & 0x0700) >> 8); /* Copy LSB */ buf[(i*2)+1] = (UInt8)((UInt16)pMatOffset->Offset[i] & 0x00FF); } err = setHwRegisters(pDis, E_REG_P00_MAT_OI1_MSB_W, &buf[0], HDMITX_MAT_OFFSET_NUM * 2); return err;}#endif /* DEMO_BUILD *//*============================================================================*//* tmbslHdmiTxMatrixSetMode *//*============================================================================*/tmErrorCode_ttmbslHdmiTxMatrixSetMode( tmUnitSelect_t txUnit, tmbslHdmiTxmCntrl_t mControl, tmbslHdmiTxmScale_t mScale){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Check remaining parameter(s) */ RETIF_BADPARAM((mControl > HDMITX_MCNTRL_MAX) || (mScale > HDMITX_MSCALE_MAX)) /* For each value that is not NoChange, update the appropriate register */ if (mControl != HDMITX_MCNTRL_NO_CHANGE) { err = setHwRegisterField(pDis, E_REG_P00_MAT_CONTRL_W, E_MASKREG_P00_MAT_CONTRL_mat_bp, (UInt8)mControl); RETIF_REG_FAIL(err) } if (mScale != HDMITX_MSCALE_NO_CHANGE) { err = setHwRegisterField(pDis, E_REG_P00_MAT_CONTRL_W, E_MASKREG_P00_MAT_CONTRL_mat_sc, (UInt8)mScale); RETIF_REG_FAIL(err) } return TM_OK;}/*============================================================================*//* tmbslHdmiTxMatrixSetOutputOffset *//*============================================================================*/#ifndef DEMO_BUILDtmErrorCode_ttmbslHdmiTxMatrixSetOutputOffset( tmUnitSelect_t txUnit, tmbslHdmiTxMatOffset_t *pMatOffset){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ Int i; /* Loop index */ UInt8 buf[HDMITX_MAT_OFFSET_NUM * 2]; /* Temp buffer */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Check remaining parameter(s) */ RETIF_BADPARAM(pMatOffset == (tmbslHdmiTxMatOffset_t *)0) for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { RETIF_BADPARAM((pMatOffset->Offset[i] < HDMITX_MAT_OFFSET_MIN) || (pMatOffset->Offset[i] > HDMITX_MAT_OFFSET_MAX)) } /* Convert signed 11 bit values from Offset array to pairs of MSB-LSB * register values, and write to register pairs */ for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { /* Mask & copy MSB */ buf[i*2] = (UInt8)(((UInt16)pMatOffset->Offset[i] & 0x0700) >> 8); /* Copy LSB */ buf[(i*2)+1] = (UInt8)((UInt16)pMatOffset->Offset[i] & 0x00FF); } err = setHwRegisters(pDis, E_REG_P00_MAT_OO1_MSB_W, &buf[0], HDMITX_MAT_OFFSET_NUM * 2); return err;}#endif /* DEMO_BUILD *//*============================================================================*//* tmbslHdmiTxPktSetAclkRecovery *//*============================================================================*/#ifndef DEMO_BUILDtmErrorCode_ttmbslHdmiTxPktSetAclkRecovery( tmUnitSelect_t txUnit, Bool bEnable){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the * sinkType is not HDMI */ RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) /* Check remaining parameter(s) */ RETIF_BADPARAM((bEnable != True) && (bEnable != False)) /* Write the ACR packet insertion flag */ err = setHwRegisterField(pDis, E_REG_P11_DIP_FLAGS_RW, E_MASKREG_P11_DIP_FLAGS_acr, (UInt8)bEnable); return err;}/*============================================================================*//* tmbslHdmiTxPktSetAcp *//*============================================================================*/tmErrorCode_ttmbslHdmiTxPktSetAcp( tmUnitSelect_t txUnit, tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, UInt8 uAcpType, Bool bEnable){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ UInt8 buf[3]; /* Temp buffer to hold header bytes */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the * sinkType is not HDMI */ RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) /* Only supported for device N4 or later */ /* Check remaining parameter(s) - NULL pointer allowed */ RETIF_BADPARAM((bEnable != True) && (bEnable != False)) if(pPkt != Null) { /* Pointer to structure provided so check parameters */ RETIF_BADPARAM(byteCnt > HDMITX_PKT_DATA_BYTE_CNT) RETIF(byteCnt == 0, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) /* Data to change, start by clearing ACP packet insertion flag */ err = setHwRegisterField(pDis, E_REG_P11_DIP_FLAGS_RW, E_MASKREG_P11_DIP_FLAGS_acp, 0x00); RETIF_REG_FAIL(err) /* Prepare ACP header */ buf[0] = 0x04; /* ACP packet */ buf[1] = uAcpType; buf[2] = 0; /* Reserved [HDMI 1.2] */ /* Write 3 header bytes to registers */ err = setHwRegisters(pDis, E_REG_P11_ACP_HB0_RW, &buf[0], 3); RETIF_REG_FAIL(err) /* Write "byteCnt" bytes of data to registers */ err = setHwRegisters(pDis, E_REG_P11_ACP_PB0_RW, &pPkt->dataByte[0], (UInt16)byteCnt); RETIF_REG_FAIL(err) } /* Write the ACP packet insertion flag */ err = setHwRegisterField(pDis, E_REG_P11_DIP_FLAGS_RW, E_MASKREG_P11_DIP_FLAGS_acp, (UInt8)bEnable); return err;}#endif /* DEMO_BUILD *//*============================================================================*//* tmbslHdmiTxPktSetAudioInfoframe *//*============================================================================*/tmErrorCode_ttmbslHdmiTxPktSetAudioInfoframe( tmUnitSelect_t txUnit, tmbslHdmiTxPktAif_t *pPkt, Bool bEnable){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ UInt8 buf[9]; /* Temp buffer to hold header/packet bytes */ UInt16 bufReg; /* Base register used for writing InfoFrame*/ UInt16 flagReg;/* Flag register to be used */ UInt8 flagMask;/* Mask used for writing flag register */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the * sinkType is not HDMI */ RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) /* Check remaining parameter(s) - NULL pointer allowed */ RETIF_BADPARAM((bEnable != True) && (bEnable != False)) if(pPkt != Null) { /* Pointer to structure provided so check parameters */ RETIF_BADPARAM(pPkt->CodingType > 0x0F) RETIF_BADPARAM(pPkt->ChannelCount > 0x07) RETIF_BADPARAM(pPkt->SampleFreq > 0x07) RETIF_BADPARAM(pPkt->SampleSize > 0x03) /* No need to check ChannelAlloc - all values are allowed */ RETIF_BADPARAM((pPkt->DownMixInhibit != True) && (pPkt->DownMixInhibit != False)) RETIF_BADPARAM(pPkt->LevelShift > 0x0F) } /* Only supported for device N4 or later */ /* We're using n4 or later, use IF4 buffer for Audio InfoFrame */ bufReg = E_REG_P10_IF4_HB0_RW; flagReg = E_REG_P11_DIP_IF_FLAGS_RW; flagMask = E_MASKREG_P11_DIP_IF_FLAGS_if4; if(pPkt != Null) { /* Data to change, start by clearing AIF packet insertion flag */ err = setHwRegisterField(pDis, flagReg, flagMask, 0x00); RETIF_REG_FAIL(err) /* Prepare AIF header */ buf[0] = 0x84; /* Audio InfoFrame */ buf[1] = 0x01; /* Version 1 [HDMI 1.2] */ buf[2] = 0x0A; /* Length [HDMI 1.2] */ /* Prepare AIF packet (byte numbers offset by 3) */ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */ buf[1+3] = ((pPkt->CodingType & 0x0F) << 4) | (pPkt->ChannelCount & 0x07); /* CT3-0, CC2-0 */ buf[2+3] = ((pPkt->SampleFreq & 0x07) << 2) | (pPkt->SampleSize & 0x03); /* SF2-0, SS1-0 */ buf[3+3] = 0; /* [HDMI 1.2] */ buf[4+3] = pPkt->ChannelAlloc; /* CA7-0 */ buf[5+3] = ((pPkt->LevelShift & 0x0F) << 3); /* LS3-0 */ if(pPkt->DownMixInhibit == True) { buf[5+3] += 0x80; /* DMI bit */ } /* Calculate checksum - this is worked out on "Length" bytes of the * packet, the checksum (which we've preset to zero), and the three * header bytes. We exclude bytes PB6 to PB10 (which we * are not writing) since they are zero. */ buf[0+3] = calculateChecksum(&buf[0], 0x0A+1+3-5); /* Write header and packet bytes in one operation */ err = setHwRegisters(pDis, bufReg, &buf[0], 9); RETIF_REG_FAIL(err) } /* Write AIF packet insertion flag */ err = setHwRegisterField(pDis, flagReg, flagMask, (UInt8)bEnable); return err;}/*============================================================================*//* tmbslHdmiTxPktSetGeneralCntrl *//*============================================================================*/#ifndef DEMO_BUILDtmErrorCode_ttmbslHdmiTxPktSetGeneralCntrl( tmUnitSelect_t txUnit, tmbslHdmiTxaMute_t *paMute, Bool bEnable){ tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the * sinkType is not HDMI */ RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) /* Check remaining parameter(s) - NULL pointer allowed */ RETIF_BADPARAM((bEnable != True) && (bEnable != False)) if(paMute != Null) { RETIF_BADPARAM((*paMute != HDMITX_AMUTE_OFF) && (*paMute != HDMITX_AMUTE_ON)) if (*paMute == HDMITX_AMUTE_ON) { err = setHwRegister(pDis, E_REG_P11_GC_AVMUTE_RW, 0x02); RETIF_REG_FAIL(err) } else { err = setHwRegister(pDis, E_REG_P11_GC_AVMUTE_RW, 0x01); RETIF_REG_FAIL(err) } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -