123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631 |
- /**
- * @file hv_drv_HdmiRx.c
- * @brief HDMI RX 模块提供的驱动层
- * @details 该模块接口提供给Hiview-Madia-Ware及其他上层应用使用。
- * @author HiView SoC Software team
- * @version 0.0.1
- * @date 20220822
- * @copyright Copyright(c),2022-8, Hiview Software. All rights reserved.
- * @par History:
- * <table>
- * <tr><th>作者 <th>日期 <th>描述
- * <tr><td>HiView SoC Software team <td>20220822 <td>Create and first Version.
- * </table>
- **/
- #include "hv_comm_Assert.h"
- #include "hv_comm_Define.h"
- #include "hv_drv_HdmiRx.h"
- #include "hv_drv_HdmiInc.h"
- #include "hv_cal_HdmiInc.h"
- #include "hv_comm_TimingDatabase.h"
- #include "hv_chip_Clk.h"
- #include "hv_comm_DataBase.h"
- Status Hv_Drv_HdmiRx_TmdsInit(UCHAR8 ucPortIndex, UCHAR8 ucLaneSwap)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_SetHdmi21Enable(ucPortIndex, HV_FALSE));
- Hv_Cal_HdmiRx_TmdsCharacterAlignInit(ucPortIndex);
- Hv_Cal_HdmiRx_TmdsDeskewInit(ucPortIndex);
- //Hv_Cal_HdmiRx_TmdsLinkInit(ucPortIndex);
- Hv_Cal_HdmiRx_TmdsLaneClockInit(ucPortIndex);
- Hv_Cal_HdmiRx_Tmds4LaneMode(ucPortIndex, ucLaneSwap);
- Hv_Cal_HdmiRx_OpenTmdsAutoEq(ucPortIndex);
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_GetAVIPara(UCHAR8 ucPortIndex, VideoColorParam *pstVideoAVIPara, VideoTimingParam *pstTimingPara)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstVideoAVIPara);
- CalVideoColorParam stVideoPara = {0};
- Status uiResult = Hv_Cal_HdmiRx_GetAVIPara(ucPortIndex, &stVideoPara);
- HV_MEMCPY(pstVideoAVIPara, &stVideoPara, sizeof(VideoColorParam));
- return uiResult;
- }
- Status Hv_Drv_HdmiRx_GetTimingPara(UCHAR8 ucPortIndex, VideoTimingParam *pstTimingPara)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- ColorDepthType ucColorDepth = ColorDepthType_8Bit;
- ColorFormatType ucColorFormat = ColorFormatType_RGB;
- CalVideoTimingParam stTimingInfo = {0};
- UINT32 uiPixelRep = 0;
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- HV_ASSERT_VALID_PTR(pstTimingPara);
- UINT32 uiResult = Hv_Cal_HdmiRx_GetTimingHVInfo(ucPortIndex, &stTimingInfo, ucLaneSwap);
- if(HV_SUCCESS != uiResult)
- {
- HV_LOG_INFO(HDMI, "HDMI%d Get Timing Failed Result: %d", ucPortIndex, uiResult);
- return HV_FAILURE;
- }
- HV_MEMCPY(pstTimingPara, &stTimingInfo, sizeof(VideoTimingParam));
- //pstTimingPara->uiRxDpllSetFreqKHz = 0;
- ucColorDepth = Hv_Cal_HdmiRx_GetColorDepth(ucPortIndex);
- switch (ucColorDepth)
- {
- case ColorDepthType_6Bit:
- case ColorDepthType_8Bit:
- {
- /*No need to do any*/
- break;
- }
- case ColorDepthType_10Bit:
- {
- pstTimingPara->usHTotal = (pstTimingPara->usHTotal << 2) / 5;
- pstTimingPara->usHActive = (pstTimingPara->usHActive << 2) / 5;
- pstTimingPara->uiRxDpllSetFreqKHz = (pstTimingPara->uiRxDpllSetFreqKHz << 2) / 5;
- break;
- }
- case ColorDepthType_12Bit:
- {
- pstTimingPara->usHTotal = (pstTimingPara->usHTotal << 1) / 3;
- pstTimingPara->usHActive = (pstTimingPara->usHActive << 1) / 3;
- pstTimingPara->uiRxDpllSetFreqKHz = (pstTimingPara->uiRxDpllSetFreqKHz << 1) / 3;
- break;
- }
- case ColorDepthType_16Bit:
- {
- pstTimingPara->usHTotal = (pstTimingPara->usHTotal) >> 1;
- pstTimingPara->usHActive = (pstTimingPara->usHActive) >> 1;
- pstTimingPara->uiRxDpllSetFreqKHz = (pstTimingPara->uiRxDpllSetFreqKHz) >> 1;
- break;
- }
- default:
- {
- HV_LOG_ERROR(HDMI, "Get HDMI%d Pixel Color Depth Error", ucPortIndex);
- break;
- }
- }
- ucColorFormat = Hv_Cal_HdmiRx_GetColorFormat(ucPortIndex);
- if (ucColorFormat == ColorFormatType_YCbCr420)
- {
- pstTimingPara->usHTotal = (pstTimingPara->usHTotal) << 1;
- pstTimingPara->usHActive = (pstTimingPara->usHActive) << 1;
- pstTimingPara->uiRxDpllSetFreqKHz = (pstTimingPara->uiRxDpllSetFreqKHz) << 1;
- }
- /* Pixel Repeation handle */
- uiPixelRep = Hv_Cal_HdmiRx_GetPixelRepeatFactor(ucPortIndex);
- if(uiPixelRep < 10)
- {
- pstTimingPara->usHTotal = (pstTimingPara->usHTotal) / (uiPixelRep + 1);
- pstTimingPara->usHActive = (pstTimingPara->usHActive) / (uiPixelRep + 1);
- pstTimingPara->uiRxDpllSetFreqKHz = (pstTimingPara->uiRxDpllSetFreqKHz) / (uiPixelRep + 1);
- }
- pstTimingPara->uiFreqKHz = (UINT32)((DOUBLE64)((DOUBLE64)(pstTimingPara->usHTotal) * (DOUBLE64)(pstTimingPara->usVTotal)) * (pstTimingPara->fFrameRate) / 1000);
- pstTimingPara->uiHFreqHz = (UINT32)((FLOAT32)(pstTimingPara->usVTotal) * (pstTimingPara->fFrameRate));
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_InterruptInit(UCHAR8 ucPortIndex)
- {
- /* 检查入参 */
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HdmiRxIntStatus stHdmiIntRxStatus = {HV_HDMIRX_INT_1_EVENT_FRL_RATE_CHG, HV_HDMIRX_INT_2_EVENT_STANDBY_DDC};
- /* Set the Trigger mode as edge p */
- Hv_Cal_HdmiRx_SetInterruptTriggerRule(ucPortIndex);
- /* 初始化关闭所有中断 */
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_InterruptClearEvent(ucPortIndex, &stHdmiIntRxStatus));
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_PortInit(UCHAR8 ucPortIndex)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- USHORT16 ausAutoEqValue[4] = {0x178, 0x178, 0x178, 0x00};
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_Init(ucPortIndex, ucLaneSwap));
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_ON)
- Hv_Cal_HdmiRx_InitWithCtsOn(ucPortIndex);
- #endif
- /* HPD 初始化 */
- //HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_HPDIOInit(ucPortIndex));
- /* 5V 检测初始化 */
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_CableConnectInit(ucPortIndex));
- /* 中断初始化 */
- HV_ASSERT_SUCCESS(Hv_Drv_HdmiRx_InterruptInit(ucPortIndex));
- Hv_Drv_HdmiRx_CecInit(ucPortIndex);
- Hv_Cal_HdmiRx_DdcInit(ucPortIndex);
- /* TMDS init */
- HV_ASSERT_SUCCESS(Hv_Drv_HdmiRx_TmdsInit(ucPortIndex, ucLaneSwap));
- Hv_Cal_HdmiRx_FrlInit(ucPortIndex);
- Hv_Cal_HdmiRx_OpenFrlAutoEq(ucPortIndex);
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_PhyInit(ucPortIndex, ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_INV_PN : HV_BOARD_CONFIG_HDMI1_INV_PN)));
- HV_ASSERT_PEEK_SUCCESS(Hv_Cal_HdmiRx_AudioInit(ucPortIndex));
- Hv_Cal_HdmiRx_SetSwEqValue(ucPortIndex, ausAutoEqValue, ucLaneSwap);
- Hv_Cal_HdmiRX_SwitchAutoEqTable(ucPortIndex, HV_TRUE);
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_ON)
- Hv_Cal_HdmiRx_ConfigurePhyRterm(ucPortIndex, 0xF);
- #endif
- HV_LOG_DEBUG(HDMI, "Hv_Drv_HdmiRx_PortInit SUCCESS with Port:%d.",ucPortIndex);
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_HPDCtrol(UCHAR8 ucPortIndex, BOOL bSwitch)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- /* 对HPD进行配置 */
- if (bSwitch == HV_TRUE)
- {
- Hv_Drv_HdmiRx_TmdsPreReset(ucPortIndex);
- Hv_Cal_HdmiRx_ClrMrTiming(ucPortIndex);
- Hv_Cal_HdmiRx_ControlScdcByHPDSwitch(ucPortIndex, bSwitch);
- #if (HV_BOARD_CONFIG_HDMI_HPD_SOURCE_5V == 1)
- return Hv_Cal_HdmiRx_HPDOnWithSource5V(ucPortIndex);
- #else
- return Hv_Cal_HdmiRx_HPDOn(ucPortIndex);
- #endif
- }
- else
- {
- /* 协议里面规定HPD拉低的时候SCDC需要恢复到默认状态 */
- Hv_Drv_HdmiRx_TmdsPreReset(ucPortIndex);
- Hv_Cal_HdmiRx_ClrMrTiming(ucPortIndex);
- Hv_Cal_HdmiRx_ControlScdcByHPDSwitch(ucPortIndex, bSwitch);
- #if (HV_BOARD_CONFIG_HDMI_HPD_SOURCE_5V == 1)
- return Hv_Cal_HdmiRx_HPDOffWithSource5V(ucPortIndex);
- #else
- return Hv_Cal_HdmiRx_HPDOff(ucPortIndex);
- #endif
- }
- }
- #if (HV_PROJECT_CONFIG_FRL)
- /**
- * @brief frl rate change indicate frl or tmds
- *
- * FRL Rate 4 Bit
- * 0 : No FRL, TMDS Only
- * 1 : 3G @ 3Lane
- * 2 : 6G @ 3Lane
- * 3 : 6G @ 4Lane
- * 4 : 8G @ 4Lane
- * 5 : 10G @ 4Lane
- * 6 : 12G @ 4Lane
- * 7 - 15 :reserved
- */
- UCHAR8 Hv_Drv_HdmiFRLRateChange(UCHAR8 ucPortIndex)
- {
- UCHAR8 ucFRLRate = 0;
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- /*检查入参*/
- HV_ASSERT_TRUE_RET_NO_LOG(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM,HV_FAILURE);
- ucFRLRate = Hv_Cal_HdmiRx_GetFrlRate(ucPortIndex);
- if (ucFRLRate == 0)
- {
- /* TMDS mode */
- Hv_Cal_HdmiRx_SWCfgReset(ucPortIndex);
- Hv_Cal_HdmiRx_SetHdmi21Enable(ucPortIndex, HV_FALSE);
- Hv_Cal_HdmiRX_PhyClockInit(ucPortIndex, E_D4LANETMDS, ucLaneSwap);
- }
- else
- {
- Hv_Cal_HdmiRx_SWCfgReset(ucPortIndex);
- Hv_Cal_HdmiRX_SwitchAutoEqTable(ucPortIndex, HV_FALSE);
- /* FRL mode */
- Hv_Cal_HdmiRx_SetHdmi21Enable(ucPortIndex, HV_TRUE);
- if ((ucFRLRate == 1) || (ucFRLRate == 2))
- {
- Hv_Cal_HdmiRX_PhyClockInit(ucPortIndex, E_D3LANEFRL, ucLaneSwap);
- }
- else
- {
- Hv_Cal_HdmiRX_PhyClockInit(ucPortIndex, E_D4LANEFRL, ucLaneSwap);
- }
- }
- //Hv_Cal_HdmiRx_SetFrlRateFreq(ucPortIndex,ucFRLRate);
- return ucFRLRate;
- }
- #endif
- HdmiRxGearMode Hv_Drv_HdmiRx_GetRatioType(UCHAR8 ucPortIndex, HdmiRxGearMode emGearModeCfg)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- #if (HV_PROJECT_CONFIG_FRL == HV_CONFIG_ON)
- if(Hv_Cal_HdmiRx_GetFrlRate(ucPortIndex) != 0)
- {
- return E_FRLMODE;
- }
- #endif
- if (Hv_Cal_HdmiRx_GetScdcTmdsBitClkRatio(ucPortIndex, ucLaneSwap))
- {
- return E_RATIOGEAR;
- }
- else
- {
- return Hv_Cal_HdmiRx_GetGearMode(ucPortIndex, emGearModeCfg, ucLaneSwap);
- }
- }
- UINT32 Hv_Drv_HdmiRx_InterruptEnPrint(UCHAR8 ucPortIndex, UCHAR8 ucIntr)
- {
- /*检查入参*/
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, 0);
- HV_ASSERT_TRUE_RET(ucIntr < 2, 0);
- return Hv_Cal_HdmiRx_InterruptEnPrint(ucPortIndex, ucIntr);
- }
- VOID HV_Drv_HdmirRx_ResetScdcWith5V(UCHAR8 ucPortIndex)
- {
- if(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM)
- {
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_OFF)
- HV_Cal_HdmirRx_ResetScdcWith5V(ucPortIndex);
- #else
- HV_Cal_HdmirRx_ResetScdcWith5VCtsOn(ucPortIndex);
- #endif
- }
- return;
- }
- Status Hv_Drv_HdmiRx_EnterStandby(UCHAR8 ucPortIndex, BOOL bEnterStandby)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- return Hv_Cal_HdmiRx_EnterStandby(ucPortIndex, bEnterStandby);
- }
- Status Hv_Drv_HdmiRx_DdcSend(UCHAR8 ucPortIndex, UCHAR8 *data, UINT32 len)
- {
- HV_ASSERT_TRUE_RET_NO_LOG(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FAILURE);
- return Hv_Cal_HdmiRx_SendDdcMsg(ucPortIndex, len, data);
- }
- UCHAR8 Hv_Drv_HdmiRx_DdcRecv(UCHAR8 ucPortIndex, UCHAR8 *ucBuf)
- {
- UCHAR8 aucFreesyncData[5] = {0x51, 0x82, 0x01, 0xE6, 0x5A};
- UCHAR8 aucReplyData[11] = {0x6E, 0x88, 0x02, 0x00, 0xE6, 0x01, 0x00, 0x01, 0x00, 0x00, 0x53};
- HV_ASSERT_TRUE_RET_NO_LOG(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FAILURE);
- UCHAR8 ucRecvLen = Hv_Cal_HdmiRx_RecvDdcMsg(ucPortIndex, ucBuf);
- if(ucRecvLen == 5)
- {
- if (0 == HV_MEMCMP(aucFreesyncData, ucBuf, 5))
- {
- if (HV_ON == HV_COMMON_DATABASE_GET(UserData, ucFreeSync))
- {
- aucReplyData[9] = 0x01;
- aucReplyData[10] = 0x52;
- }
- else
- {
- aucReplyData[9] = 0x00;
- aucReplyData[10] = 0x53;
- }
- Hv_Cal_HdmiRx_SendDdcMsg(ucPortIndex, sizeof(aucReplyData), aucReplyData);
- }
- }
- return ucRecvLen;
- }
- Status Hv_Drv_HdmiRx_InitEdidConf(UCHAR8 ucPortIndex)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- #if (HV_PROJECT_CONFIG_EDID_EXTER_EEPROM == HV_CONFIG_ON)
- /* 关闭 EDID on Register. */
- Hv_Cal_HdmiRx_CloseRegisterEdid(ucPortIndex);
- #else
- /* 开启 EDID on Register. */
- #if (HV_PROJECT_CONFIG_ESEGMENT == HV_CONFIG_ON)
- Hv_Cal_HdmiRx_OpenRegisterEdid(ucPortIndex, 1);
- #else
- Hv_Cal_HdmiRx_OpenRegisterEdid(ucPortIndex, 0);
- #endif
- #endif
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_TmdsPreReset(UCHAR8 ucPortIndex)
- {
- /*检查入参*/
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- Hv_Cal_HdmiRx_BusSwReset(ucPortIndex);
- Hv_Cal_HdmiRx_TmdsSwReset(ucPortIndex);
- return HV_SUCCESS;
- }
- VOID Hv_Drv_HdmiRx_AudioCheck(UCHAR8 ucPortId)
- {
- HV_ASSERT_TRUE_VOID(ucPortId <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- Hv_Cal_HdmiRx_AudioCheck(ucPortId);
- return;
- }
- VOID Hv_Drv_HdmiRx_ReloadColorDepth(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_VOID(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- Hv_Cal_HdmiRx_ReloadColorDepth(ucPortIndex);
- return;
- }
- Status Hv_Drv_HdmiRx_GetMDVrrPara(UCHAR8 ucPortIndex, VRRInfoParam* pstVrrMdPara)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstVrrMdPara);
- CalVRRInfoParam stMDPara = {0};
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_GetMDVrrPara(ucPortIndex, &stMDPara));
- HV_MEMCPY(pstVrrMdPara, &stMDPara, sizeof(VRRInfoParam));
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_GetAMDVendSpecInfoPara(UCHAR8 ucPortIndex, VRRInfoParam *pstVendSpecInfoPara)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstVendSpecInfoPara);
- CalVRRInfoParam stVSIPara = {0};
- HV_ASSERT_SUCCESS(Hv_Cal_HdmiRx_GetAMDVendSpecInfoPara(ucPortIndex, &stVSIPara));
- HV_MEMCPY(pstVendSpecInfoPara, &stVSIPara, sizeof(VRRInfoParam));
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_GetAudioPara(UCHAR8 ucPortIndex, AudioPara *pstAudioPara)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstAudioPara);
- CalAudioPara stAudioInfo = {0};
- Hv_Cal_HdmiRx_GetAudioPara(ucPortIndex, &stAudioInfo);
- HV_MEMCPY(pstAudioPara, &stAudioInfo, sizeof(AudioPara));
- return HV_SUCCESS;
- }
- Status Hv_Drv_HdmiRx_GetHDRPara(UCHAR8 ucPortIndex, HDRParam *pstHDRPara)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstHDRPara);
- CalHDRParam stHdrInfo = {0};
- Hv_Cal_HdmiRx_GetHDRPara(ucPortIndex, &stHdrInfo);
- HV_MEMCPY(pstHDRPara, &stHdrInfo, sizeof(HDRParam));
- return HV_SUCCESS;
- }
- BOOL Hv_Drv_HdmiRX_RobustCheckRatioMode(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FALSE);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRX_RobustCheckRatioMode(ucPortIndex, ucLaneSwap);
- }
- BOOL Hv_Drv_HdmiRx_IsClockStable(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FALSE);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_IsClockStable(ucPortIndex, ucLaneSwap);
- }
- Status Hv_Drv_HdmiRx_GetLaneCEDValue(UCHAR8 ucPortIndex, HdmiRxLaneCED *pstLaneCedValue)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pstLaneCedValue);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_GetLaneCEDValue(ucPortIndex, pstLaneCedValue, ucLaneSwap);
- }
- Status Hv_Drv_HdmiRx_SetSwEqValue(UCHAR8 ucPortIndex, const USHORT16 *pusSwEqValue)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- HV_ASSERT_VALID_PTR(pusSwEqValue);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_SetSwEqValue(ucPortIndex, pusSwEqValue, ucLaneSwap);
- }
- BOOL Hv_Drv_HdmiRx_IsTimingStable(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FALSE);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_IsTimingStable(ucPortIndex, ucLaneSwap);
- }
- Status Hv_Drv_HdmiRx_CableConnectAction(UCHAR8 ucPortIndex, BOOL bCableSta)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_CableConnectAction(ucPortIndex, bCableSta, ucLaneSwap);
- }
- VOID Hv_Drv_HdmiRX_SwitchPhyGearMode(UCHAR8 ucPortIndex, HdmiRxGearMode ucGrearMode)
- {
- HV_ASSERT_TRUE_VOID(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_OFF)
- if(ucGrearMode < E_HIGHGEAR || ucGrearMode == E_UNLOCKED)
- {
- Hv_Cal_HdmiRX_SwitchAutoEqTable(ucPortIndex, HV_TRUE);
- }
- else
- {
- Hv_Cal_HdmiRX_SwitchAutoEqTable(ucPortIndex, HV_FALSE);
- }
- #endif
- return Hv_Cal_HdmiRX_SwitchPhyGearMode(ucPortIndex, ucGrearMode, ucLaneSwap);
- }
- /**
- * @brief If the PHY is fast locked.
- * @param[in] Port Number used for the HDMI RX.
- * @return TRUE is Loced False is unlocked.
- */
- BOOL Hv_Drv_HdmiRX_IsPhyFastLocked(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FALSE);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRX_IsPhyFastLocked(ucPortIndex, ucLaneSwap);
- }
- /**
- * @brief If the PHY TMDS Clock Is OverFlow.
- * @param[in] Port Number used for the HDMI RX.
- * @return TRUE is OverFlow False is not OverFlow.
- */
- BOOL Hv_Drv_HdmiRX_IsTMDSClockOverFlow(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE_RET(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM, HV_FALSE);
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRX_IsTMDSClockOverFlow(ucPortIndex, ucLaneSwap);
- }
- Status Hv_Drv_HdmiRx_Hdcp1XInitForAuth(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- UCHAR8 ucTryCnt = 10;
- Hv_Cal_HdmiRx_SetHDCPHdmiMode(ucPortIndex, HV_FALSE);
- do
- {
- if(Hv_Cal_HdmiRx_DdcCurStateIsIdle(ucPortIndex))
- {
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_ON)
- Hv_Cal_HdmiRx_SetHdcp1XRiSel(ucPortIndex, 0x0);
- #endif
- /* 配置到HDMI模式到非HDMI模式 */
- Hv_Cal_HdmiRx_SetHDCP1Xstatus(ucPortIndex, HV_FALSE);
- if(Hv_Cal_HdmiRx_DdcCurStateIsIdle(ucPortIndex))
- {
- break;
- }
- }
- Hv_Vos_Delayus(500);
- } while (ucTryCnt--);
- if (!ucTryCnt)
- {
- HV_LOG_ERROR(HDMI, "ddc busy when proc hdcp 1x, %u", ucPortIndex);
- #if (HV_PROJECT_CONFIG_CTS == HV_CONFIG_ON)
- Hv_Cal_HdmiRx_SetHdcp1XRiSel(ucPortIndex, 0x0);
- #endif
- /* 配置到HDMI模式到非HDMI模式 */
- Hv_Cal_HdmiRx_SetHDCP1Xstatus(ucPortIndex, HV_FALSE);
- }
- return HV_SUCCESS;
- }
- BOOL Hv_Drv_HdmiRx_CheckTmdsClockAbnormal(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
-
- UCHAR8 ucLaneSwap = ((ucPortIndex == 0) ? HV_BOARD_CONFIG_HDMI0_LANE_SWP : HV_BOARD_CONFIG_HDMI1_LANE_SWP);
- return Hv_Cal_HdmiRx_CheckTmdsClockAbnormal(ucPortIndex, ucLaneSwap);
- }
- BOOL Hv_Drv_HdmiRx_GetCableStatus(UCHAR8 ucPortIndex)
- {
- HV_ASSERT_TRUE(ucPortIndex <= HV_BOARD_CONFIG_MAX_HDMI_PORT_NUM);
- #if (HV_BOARD_CONFIG_HDMI_CABLE_DETECT == CABLE_DETECT_WITH_SOURCE_5V)
- return (!Hv_Cal_HdmiRx_GetCableStatus(ucPortIndex));
- #else
- return Hv_Cal_HdmiRx_GetCableStatus(ucPortIndex);
- #endif
- }
|