📄 hdmi.c
字号:
else if((freq >= 955) && (freq <= 965))
{
coeff = _AUDIO_MCK_96000;
freq = 96000;
}
else if((freq >= 1754) && (freq <= 1774))
{
coeff = _AUDIO_MCK_176400;
freq = 176400;
}
else if((freq >= 1910) && (freq <= 1930))
{
coeff = _AUDIO_MCK_192000;
freq = 192000;
}
else
{
SET_AVRESUME();
}
if(!GET_AVRESUME())
{
do
{
s = s + 4;
((DWORD *)pData)[0] = (DWORD)128 * freq * coeff * s;
}
while (((DWORD *)pData)[0] < 180000000);
o = 1;
m = ((DWORD *)pData)[0] * 2 / ((DWORD)_RTD_XTAL * 1000);
m = m + 1;
s = s / (o * 2);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AAPNR_2D, 0x08); // Disable SDM
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_MCAPR_11, (m - 2));
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_SCAPR_12, (coeff == _AUDIO_256_TIMES) ? ((s / 2) | 0x80) : (s / 2));
#if(_AUDIO_LOCK_MODE == _HARDWARE_TRACKING)
// Calculate D code
((DWORD *)pData)[1] = (DWORD)1000 * _RTD_XTAL * m / 2; // PLL freq
if (((DWORD *)pData)[0] > ((DWORD *)pData)[1])
{
a = (((DWORD *)pData)[0] - ((DWORD *)pData)[1]) * 128 / (((DWORD *)pData)[1] / 2048);
a = 0xffff - a;
}
else
{
a = (((DWORD *)pData)[1] - ((DWORD *)pData)[0]) * 128 / (((DWORD *)pData)[1] / 2048);
a += 100; // MUST for compatibility
}
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DCAPR0_13, a >> 8);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DCAPR1_14, a & 0xff);
#endif
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DPCR0_38, ~(_BIT5 | _BIT4), (o << 4));
// Calculate Ich for audio PLL
pData[0] = (m < 5) ? 0 : ((m / 5) - 1);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DPCR1_39, pData[0] | 0x80);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DPCR3_3B, 0x03); // Enable K and enable VCOSTART
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_CMCR_10, 0x50); //Enable Double Buffer for K/M/S/D/O
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DPCR0_38, ~(_BIT7 | _BIT6), 0x00); // Enable PLL
CTimerDelayXms(1);
#if(_AUDIO_LOCK_MODE == _HARDWARE_TRACKING)
do
{
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AAPNR_2D, 0x00); // Disable SDM
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AAPNR_2D, 0x02); // Enable SDM
CTimerDelayXms(1);
CScalerGetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_DPCR3_3B + 1, 2, pData, _NON_AUTOINC);
}
while((((a >> 8) & 0xff) != pData[0]) || (((a >> 0) & 0xff) != pData[1]));
#endif
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AOCR_62, 0x00);//Disable SPDIF/I2S Output
CAdjustDisableHDMIWatchDog(_WD_SET_AVMUTE_ENABLE);//Disable Set_AVMute Watch Dog //731301
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AVMCR_30, ~_BIT5, _BIT5);//Enable Audio Output
CAdjustEnableHDMIWatchDog(_WD_SET_AVMUTE_ENABLE);//Enable Set_AVMute Watch Dog //731301
#if(_AUDIO_LOCK_MODE == _HARDWARE_TRACKING)
//H/W FIFO Tracking
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_PSCR_15, 0x04);//Enable boundary tracking
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_ICBPSR1_25, 0x01);//Set I code
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_PCBPSR1_27, 0x01);//Set P code
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_STBPR_2A, 0x80);//Set Boundary Tracking Update Response Time
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AAPNR_2D, 0xC2);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_FBR_1B, 0xe2);//0xe5 for DVR team ?
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_WDCR0_31, ~_BIT5, _BIT5);//Enable FIFO Tracking//731301
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_CMCR_10, 0x50);//update double buffer
CScalerSetByte(_P2_HDMI_SR_CB, 0x06);//Write 1 clear
//Fine tune
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_PSCR_15, 0xEC);//Enable FIFO Trend
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_FTR_1A, 0x03);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_ICTPSR1_21, 0x07);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_CMCR_10, 0x50);//Update Double Buffer
#else
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_PSCR_15, 0xfe);//Enable N/CTS tracking
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, 0x1d, 0x05);//Set I code
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, 0x1f, 0x9F);//Set P code
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AAPNR_2D, 0x02);
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_CMCR_10, 0x50);//update double buffer
#endif
SET_AUDIOWAITINGFLAG();
}
else
{
CLR_AUDIOPLLLOCKREADY();
}
}
else
{
CLR_AUDIOPLLLOCKREADY();
}
}
//--------------------------------------------------
// Description : Enable Audio Output
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CHdmiEnableAudioOutput(void)
{
CLR_AUDIOWAITINGTIMEOUT();//731301
//DebugPrintf("\n HA%c",0x20);
if(GET_AUDIOWAITINGFLAG())
{
CScalerSetByte(_P2_HDMI_SR_CB, 0x06);//Write 1 clear //731301
//CTimerReactiveTimerEvent(SEC(1), CHdmiAudioWaitingFlagReadyEven);//731301
CLR_AUDIOWAITINGFLAG();
SET_AUDIOPLLLOCKREADY();
}
else
{
//DebugPrintf(" b%c",0x20);
if (CHdmiAudioFIFODetect() || GET_AVRESUME())//For HDMI audio pll setting
{
//DebugPrintf(" c%c",0x20);
CHdmiAudioFirstTracking();
//CTimerReactiveTimerEvent(SEC(1), CHdmiAudioWaitingFlagReadyEven);//731301
CLR_AUDIOPLLLOCKREADY();
}
else if (GET_AUDIOPLLLOCKREADY())
{
//DebugPrintf(" d%c",0x20);
CLR_AUDIOPLLLOCKREADY();
//modify Start
// CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AOCR_62, 0x0f);//Enable I2S Output
CScalerRead(_P2_HDMI_SR_CB, 1, pData, _NON_AUTOINC);
if((pData[0] & 0x16) == 0x00) //LPCM & no overflow/underflow in Audio FIFO
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AOCR_62, 0xff);//Enable I2S Output
else
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AOCR_62, 0xf0);//Disable I2S Output
CScalerSetDataPortByte(_P2_HDMI_ADDR_PORT_C9, _P2_HDMI_AFCR_03, 0x26);//Enable Audio FIFO
CAdjustEnableHDMIWatchDog(_WD_AUDIO_FOR_TMDS_CLOCK | _WD_AUDIO_FIFO);
//modify End
}
}
CTimerActiveTimerEvent(SEC(0.5), CHdmiAudioWaitingFlagReadyEven);//731301
}
//--------------------------------------------------
// Description : Audio Waiting Time Flag Ready
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CHdmiAudioWaitingFlagReadyEven(void)
{
SET_AUDIOWAITINGTIMEOUT();
}
#if (_HDMI_HOT_PLUG_OPTION == _ENABLE)
//741001***
void CHdmiModeChange()
{
bHot_Plug = 1;//bHot_Plug = 0;
CTimerDelayXms(10);
bHot_Plug = 0;//bHot_Plug = 1;
//DebugPrintf("\n bHot_Plug!!!\n",'i');
}
//741001###
#endif
#endif //End of #if(_HDMI_SUPPORT == _ON)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -