/**
* @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:
*
* 作者 | 日期 | 描述
* |
---|
HiView SoC Software team | 20220822 | Create and first Version.
* |
**/
#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
}