it6613: add support for HDR Infoframe

This commit is contained in:
marqs 2023-08-26 11:27:36 +03:00
parent 0ce2809183
commit 4bc98224e4
5 changed files with 246 additions and 152 deletions

View File

@ -16,19 +16,19 @@ extern BOOL bHDMIMode;
extern BOOL bAudioEnable;
BOOL ParseEDID();
INSTANCE InitInstanceData =
INSTANCE InitInstanceData =
{
0,0, //I2C_DEV, I2C_ADDR
0, //bIntType (TxCLK active, Push-Pull Mode, INT active low)
0,/* | T_MODE_CCIR656 | T_MODE_SYNCEMB | T_MODE_INDDR */ // bInputVideoSignalType
B_AUDFMT_STD_I2S, // bOutputAudioMode, 0x00, standard i2s, rising edge to sample ws/i2s, not full packet mode REG[0xE1]
0,// bAudioChannelSwap
B_AUD_EN_I2S0 | B_AUD_I2S | M_AUD_16BIT, // bAudioChannelEnable, 0x01, REG[0xE0], defined in it6613_drv.h
AUDFS_48KHz, //0, //bAudFs,
0, // TMDSClock
TRUE,//bAuthenticated
TRUE,//bAuthenticated
TRUE,// bHDMIMode
FALSE,// bIntPOL
FALSE // bHPD
@ -38,19 +38,19 @@ bool HDMITX_ChipVerify(void){
bool bPass = FALSE;
alt_u8 szID[4];
int i;
for(i=0;i<4;i++)
szID[i] = HDMITX_ReadI2C_Byte(i);
// if (szID[0] == 0x00 && szID[1] == 0xCA && szID[1] == 0x13 && szID[1] == 0x06) szID[0] ???
if ((szID[1] == 0xCA && szID[2] == 0x13 && szID[3] == 0x06) || (szID[1] == 0xCA && szID[2] == 0x13 && szID[3] == 0x16)){
bPass = TRUE;
printf("TX Chip Revision ID: %d\n", szID[0]);
printf("TX Chip Revision ID: %d\n", szID[0]);
}else{
printf("NG, Read TX Chip ID:%02X%02X%02X%02Xh (expected:00CA1306h)\n", szID[0], szID[1], szID[2], szID[3]);
printf("NG, Read TX Chip ID:%02X%02X%02X%02Xh (expected:00CA1306h)\n", szID[0], szID[1], szID[2], szID[3]);
}
return bPass;
}
@ -62,19 +62,19 @@ bool HDMITX_Init(void){
OS_PRINTF("Failed to find IT6613 HDMI-TX Chip.\n");
bSuccess = FALSE;
//return 0;
}
}
HDMITX_InitInstance(&InitInstanceData) ;
InitIT6613() ;
return bSuccess;
}
return bSuccess;
}
bool HDMITX_HPD(void){
if (TX_HDP)
return TRUE;
return FALSE;
return FALSE;
}
@ -85,10 +85,10 @@ void HDMITX_SetAVIInfoFrame(alt_u8 VIC, alt_u8 OutputColorMode, bool b16x9, bool
OS_PRINTF("HDMITX_SetAVIInfoFrame: VIC=%d, ColorMode=%d, Aspect-Ratio=%s, ITU709=%s, ITC=%s, pixelrep=%u\n",
VIC, OutputColorMode, b16x9?"16:9":"4:3", ITU709?"Yes":"No", ITC?"Yes":"No", pixelrep);
AviInfo.pktbyte.AVI_HB[0] = AVI_INFOFRAME_TYPE|0x80 ;
AviInfo.pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ;
AviInfo.pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ;
AviInfo.pktbyte.AVI_HB[0] = AVI_INFOFRAME_TYPE|0x80 ;
AviInfo.pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ;
AviInfo.pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ;
switch(OutputColorMode)
{
case F_MODE_YUV444:
@ -128,7 +128,7 @@ void HDMITX_SetAVIInfoFrame(alt_u8 VIC, alt_u8 OutputColorMode, bool b16x9, bool
void HDMITX_ChangeVideoTiming(int VIC){
int OutputVideoTiming = VIC;
int HdmiColorMode;
switch(bOutputColorMode)
{
case F_MODE_YUV444:
@ -141,15 +141,15 @@ void HDMITX_ChangeVideoTiming(int VIC){
default:
HdmiColorMode = HDMI_RGB444;
break ;
}
HDMITX_ChangeDisplayOption(OutputVideoTiming, HdmiColorMode); // just modify variable. Take effect when HDMITX_SetOutput is called in HDMITX_DevLoopProc
}
HDMITX_ChangeDisplayOption(OutputVideoTiming, HdmiColorMode); // just modify variable. Take effect when HDMITX_SetOutput is called in HDMITX_DevLoopProc
}
void HDMITX_ChangeVideoTimingAndColor(int VIC, COLOR_TYPE Color){
int OutputVideoTiming = VIC;
int HdmiColorMode;
switch(Color)
{
case COLOR_YUV444:
@ -162,12 +162,12 @@ void HDMITX_ChangeVideoTimingAndColor(int VIC, COLOR_TYPE Color){
default:
HdmiColorMode = HDMI_RGB444;
break ;
}
HDMITX_ChangeDisplayOption(OutputVideoTiming, HdmiColorMode);
}
HDMITX_ChangeDisplayOption(OutputVideoTiming, HdmiColorMode);
}
void HDMITX_DisableVideoOutput(void){
DisableVideoOutput();
DisableVideoOutput();
}
void HDMITX_EnableVideoOutput(void){
@ -183,7 +183,7 @@ void HDMITX_SetColorSpace(COLOR_TYPE InputColor, COLOR_TYPE OutputColor){
bool HDMITX_IsSinkSupportYUV444(void){
bool bSupport = FALSE;
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
(RxCapability.VideoMode & CEA_SUPPORT_YUV444))
bSupport = TRUE;
return bSupport;
@ -191,7 +191,7 @@ bool HDMITX_IsSinkSupportYUV444(void){
bool HDMITX_IsSinkSupportYUV422(void){
bool bSupport = FALSE;
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
(RxCapability.VideoMode & CEA_SUPPORT_YUV422))
bSupport = TRUE;
return bSupport;
@ -199,19 +199,19 @@ bool HDMITX_IsSinkSupportYUV422(void){
bool HDMITX_IsSinkSupportColorDepth36(void){
bool bSupport = FALSE;
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
RxCapability.dc.info.DC_36Bit)
bSupport = TRUE;
return bSupport;
return bSupport;
}
bool HDMITX_IsSinkSupportColorDepth30(void){
bool bSupport = FALSE;
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
if (RxCapability.Valid && RxCapability.ValidHDMI && RxCapability.ValidCEA &&
RxCapability.dc.info.DC_30Bit)
bSupport = TRUE;
return bSupport;
return bSupport;
}
void HDMITX_SetOutputColorDepth(int ColorDepth){
@ -228,36 +228,36 @@ bool HDMITX_DevLoopProc()
// Richard CheckHDMI(&HPD,&HPDChange) ;
CheckHDMITX(&HPD,&HPDChange) ;
if (HPD == PreHPD && HPDChange) // richard add
return FALSE;
TX_HDP = HPD;
PreHPD = HPD;
PreHPDChange = HPDChange;
TX_HDP = HPD;
PreHPD = HPD;
PreHPDChange = HPDChange;
if( HPDChange )
{
OS_PRINTF("HPDChange\n");
if( HPD )
{
OS_PRINTF("HPD=ON\n");
RxCapability.Valid = ParseEDID() ;
//bOutputColorMode = F_MODE_YUV444; //F_MODE_RGB444; // richard node. users can change color space here according to HDMI sink
//bOutputColorMode = F_MODE_YUV444; //F_MODE_RGB444; // richard node. users can change color space here according to HDMI sink
if( RxCapability.Valid && RxCapability.ValidHDMI )
{
OS_PRINTF("HDMI Display found\n");
bHDMIMode = TRUE ;
if(RxCapability.VideoMode & (1<<6))
{
bAudioEnable = TRUE ;
}
#if 0 // richard, don't care edid, the output always RGB444
#if 0 // richard, don't care edid, the output always RGB444
if( RxCapability.VideoMode & (1<<5))
{
bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;
@ -268,17 +268,17 @@ bool HDMITX_DevLoopProc()
bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;
bOutputColorMode |= F_MODE_YUV422 ;
}
#endif
#endif
}
else if (!RxCapability.Valid)
{
OS_PRINTF("Failed to read EDID\n");
// enable it when edid fail
bHDMIMode = TRUE ;
bAudioEnable = TRUE ;
}
else
}
else
{
OS_PRINTF("Invalid HDMI Display\n");
bHDMIMode = FALSE ;
@ -287,7 +287,7 @@ bool HDMITX_DevLoopProc()
OS_PRINTF("HDMITX_SetOutput\n");
//HDMITX_SetOutput() ;
}
else
{
@ -308,7 +308,7 @@ bool HDMITX_DevLoopProc()
HDMITX_SetOutput() ;
}
}
return HPDChange;
}
@ -339,3 +339,26 @@ void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling)
EnableAudioInfoFrame(TRUE, (BYTE *) &AudioInfo);
}
void HDMITX_SetHDRInfoFrame(BYTE HDR_TF)
{
int i;
HDR_InfoFrame HDRInfo;
HDRInfo.info.Type = HDR_INFOFRAME_TYPE;
HDRInfo.info.Ver = HDR_INFOFRAME_VER;
HDRInfo.info.Len = HDR_INFOFRAME_LEN;
HDRInfo.info.TF = HDR_TF;
for (i=1; i<HDR_INFOFRAME_LEN; i++) {
HDRInfo.pktbyte.HDR_DB[i] = 0;
}
/*HDRInfo.pktbyte.HDR_DB[22] = 0xe8;
HDRInfo.pktbyte.HDR_DB[23] = 0x03;
HDRInfo.pktbyte.HDR_DB[24] = 0xfa;
HDRInfo.pktbyte.HDR_DB[25] = 0x00;*/
EnableHDRInfoFrame(TRUE, (BYTE *) &HDRInfo);
}

View File

@ -27,5 +27,6 @@ bool HDMITX_IsSinkSupportColorDepth30(void);
void HDMITX_SetOutputColorDepth(int ColorDepth);
void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling);
void HDMITX_SetHDRInfoFrame(BYTE enableHDR);
#endif /*HDMI_TX_H_*/

View File

@ -80,6 +80,7 @@ static SYS_STATUS SetAVIInfoFrame(AVI_InfoFrame *pAVIInfoFrame) ;
static SYS_STATUS SetAudioInfoFrame(Audio_InfoFrame *pAudioInfoFrame) ;
static SYS_STATUS SetSPDInfoFrame(SPD_InfoFrame *pSPDInfoFrame) ;
static SYS_STATUS SetMPEGInfoFrame(MPEG_InfoFrame *pMPGInfoFrame) ;
static SYS_STATUS SetHDRInfoFrame(HDR_InfoFrame *pHDRInfoFrame) ;
static SYS_STATUS ReadEDID(BYTE *pData,BYTE bSegment,BYTE offset,SHORT Count) ;
static void AbortDDC() ;
static void ClearDDCFIFO() ;
@ -183,7 +184,7 @@ static _CODE BYTE bCSCOffset_0_255[] =
0xCE,0x3C,0x83,0x03,0xAE,0x3F,
0x49,0x3D,0x33,0x3F,0x83,0x03
} ;
#endif
#endif
/*
#ifdef SUPPORT_INPUTYUV
@ -270,7 +271,7 @@ static BYTE InitIT6613_HDCPROM()
HDMITX_WriteI2C_Byte(0xF8,0xA5) ; // password
HDMITX_WriteI2C_Byte(REG_TX_LISTCTRL,0x60) ; // Richard, ????
I2C_Read_ByteN(0xE0,0x00,uc,5) ; // richard note. internal rom is used
if(uc[0] == 1 &&
uc[1] == 1 &&
uc[2] == 1 &&
@ -288,7 +289,7 @@ static BYTE InitIT6613_HDCPROM()
HDMITX_WriteI2C_Byte(REG_TX_LISTCTRL,0x00) ; // Richard, ????
}
HDMITX_WriteI2C_Byte(0xF8,0xFF) ; // password
// richard add
return ER_SUCCESS;
}
@ -299,26 +300,26 @@ void InitIT6613()
HDMITX_WriteI2C_Byte(REG_TX_INT_CTRL,Instance[0].bIntType) ;
Instance[0].bIntPOL = (Instance[0].bIntType&B_INTPOL_ACTH)?TRUE:FALSE ;
// Reset
// Reset
HDMITX_WriteI2C_Byte(REG_TX_SW_RST,B_REF_RST|B_VID_RST|B_AUD_RST|B_AREF_RST|B_HDCP_RST) ;
DelayMS(1) ;
HDMITX_WriteI2C_Byte(REG_TX_SW_RST,B_VID_RST|B_AUD_RST|B_AREF_RST|B_HDCP_RST) ;
#if 0
#if 0
// Enable clock ring (richard add according toe programming guide)
HDMITX_WriteI2C_Byte(REG_TX_AFE_DRV_CTRL, 0x10);
// Set default DVI mode (richard add according toe programming guide)
// HDMITX_WriteI2C_Byte(REG_TX_HDMI_MODE, 0x01); // set HDMI mode
HDMITX_WriteI2C_Byte(REG_TX_HDMI_MODE, 0x00); // set DVI mode
#endif
// HDMITX_WriteI2C_Byte(REG_TX_HDMI_MODE, 0x01); // set HDMI mode
HDMITX_WriteI2C_Byte(REG_TX_HDMI_MODE, 0x00); // set DVI mode
#endif
// Avoid power loading in un play status.
HDMITX_WriteI2C_Byte(REG_TX_AFE_DRV_CTRL,B_AFE_DRV_RST|B_AFE_DRV_PWD) ;
// set interrupt mask,mask value 0 is interrupt available.
// richard HDMITX_WriteI2C_Byte(REG_TX_INT_MASK1,0xB2) ; // enable interrupt: HPD, DDCBusHangMask,
HDMITX_WriteI2C_Byte(REG_TX_INT_MASK1,0xB2) ; // enable interrupt: HPD, DDCBusHangMask,
// richard HDMITX_WriteI2C_Byte(REG_TX_INT_MASK1,0xB2) ; // enable interrupt: HPD, DDCBusHangMask,
HDMITX_WriteI2C_Byte(REG_TX_INT_MASK1,0xB2) ; // enable interrupt: HPD, DDCBusHangMask,
HDMITX_WriteI2C_Byte(REG_TX_INT_MASK2,0xF8) ; // enable interrupt: AuthFailMask, AUthDoneMask, KSVListChkMask
HDMITX_WriteI2C_Byte(REG_TX_INT_MASK3,0x37) ; // enable interrupt: PktAudMask, PktDBDMask, PkMpgMask, AUdCTSMask, HDCPSynDetMask
@ -331,7 +332,7 @@ void InitIT6613()
DISABLE_AUD_INFOFRM_PKT() ;
DISABLE_SPD_INFOFRM_PKT() ;
DISABLE_MPG_INFOFRM_PKT();
//////////////////////////////////////////////////////////////////
// Setup Output Audio format.
@ -396,7 +397,7 @@ BOOL EnableVideoOutput(VIDEOPCLKLEVEL level,BYTE inputColorMode,BYTE outputColor
uc = HDMITX_ReadI2C_Byte(REG_TX_CLK_CTRL1) ;
uc |= B_VDO_LATCH_EDGE ;
HDMITX_WriteI2C_Byte(REG_TX_CLK_CTRL1, uc) ;
#endif
#endif
HDMITX_WriteI2C_Byte(REG_TX_SW_RST, B_AUD_RST|B_AREF_RST|B_HDCP_RST) ;
@ -442,7 +443,7 @@ BOOL EnableAudioOutput(ULONG VideoPixelClock,BYTE bAudioSampleFreq,BYTE ChannelN
Instance[0].TMDSClock = VideoPixelClock ;
Instance[0].bAudFs = bAudioSampleFreq ;
ErrorF("EnableAudioOutput(%d,%ld,%x,%d,%d,%d);\n",0,VideoPixelClock,bAudioSampleFreq,ChannelNumber,bAudSWL,bSPDIF) ;
switch(ChannelNumber)
@ -474,12 +475,12 @@ BOOL EnableAudioOutput(ULONG VideoPixelClock,BYTE bAudioSampleFreq,BYTE ChannelN
HDMITX_WriteI2C_Byte(REGPktAudCTS0,0x50) ;
HDMITX_WriteI2C_Byte(REGPktAudCTS1,0x73) ;
HDMITX_WriteI2C_Byte(REGPktAudCTS2,0x00) ;
HDMITX_WriteI2C_Byte(REGPktAudN0,0) ;
HDMITX_WriteI2C_Byte(REGPktAudN1,0x18) ;
HDMITX_WriteI2C_Byte(REGPktAudN2,0) ;
Switch_HDMITX_Bank(0) ;
HDMITX_WriteI2C_Byte(0xC5, 2) ; // D[1] = 0, HW auto count CTS
}
else
@ -615,15 +616,15 @@ EnableHDCP(BYTE bEnable)
{
if(ER_FAIL == HDCP_Authenticate())
{
HDCP_ResetAuth() ;
HDCP_ResetAuth() ;
return FALSE ;
}
}
else
{
HDCP_ResetAuth() ;
HDCP_ResetAuth() ;
}
return TRUE ;
}
@ -638,8 +639,8 @@ CheckHDMITX(BYTE *pHPD,BYTE *pHPDChange)
BOOL HPD ;
sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS) ; // read system status register
// OS_PRINTF("sysstat(REG[0x0E])=%02Xh\r\n", sysstat);
// OS_PRINTF("sysstat(REG[0x0E])=%02Xh\r\n", sysstat);
HPD = ((sysstat & (B_HPDETECT|B_RXSENDETECT)) == (B_HPDETECT|B_RXSENDETECT))?TRUE:FALSE ;
@ -751,7 +752,7 @@ CheckHDMITX(BYTE *pHPD,BYTE *pHPDChange)
}
SetupAudioChannel() ; // 2007/12/12 added by jj_tseng
if(pHPD)
{
*pHPD = HPD ? TRUE:FALSE ;
@ -810,7 +811,7 @@ EnableAudioInfoFrame(BYTE bEnable,BYTE *pAudioInfoFrame)
if(!bEnable)
{
// richard modify, DISABLE_AVI_INFOFRM_PKT() ;
DISABLE_AUD_INFOFRM_PKT();
DISABLE_AUD_INFOFRM_PKT();
return TRUE ;
}
@ -823,6 +824,22 @@ EnableAudioInfoFrame(BYTE bEnable,BYTE *pAudioInfoFrame)
return FALSE ;
}
BOOL
EnableHDRInfoFrame(BYTE bEnable, BYTE *pHDRInfoFrame)
{
if (!bEnable) {
DISABLE_NULL_PKT();
return TRUE;
}
if(SetHDRInfoFrame((HDR_InfoFrame *)pHDRInfoFrame) == ER_SUCCESS)
{
return TRUE;
}
return FALSE ;
}
void
SetAVMute(BYTE bEnable)
{
@ -1087,7 +1104,7 @@ BOOL ProgramDEGenModeByID(MODE_ID id,BYTE bInputSignalType)
{
return FALSE ;
}
Switch_HDMITX_Bank(0) ;
HDMITX_WriteI2C_Byte(0x90,DeGen_Table[i].Reg90) ;
HDMITX_WriteI2C_Byte(0x92,DeGen_Table[i].Reg92) ;
@ -1100,7 +1117,7 @@ BOOL ProgramDEGenModeByID(MODE_ID id,BYTE bInputSignalType)
HDMITX_WriteI2C_Byte(0x9E,DeGen_Table[i].Reg9E) ;
HDMITX_WriteI2C_Byte(0x9F,DeGen_Table[i].Reg9F) ;
return TRUE ;
}
return FALSE ;
}
@ -1181,21 +1198,21 @@ ProgramSyncEmbeddedVideoMode(BYTE VIC,BYTE bInputSignalType)
break ;
}
}
if(SyncEmbTable[i].fmt == 0xFF)
{
return FALSE ;
}
HDMITX_WriteI2C_Byte(REG_TX_HVPol,SyncEmbTable[i].RegHVPol) ; // Reg90
HDMITX_WriteI2C_Byte(REG_TX_HfPixel,SyncEmbTable[i].RegHfPixel) ; // Reg91
HDMITX_WriteI2C_Byte(REG_TX_HSSL,SyncEmbTable[i].RegHSSL) ; // Reg95
HDMITX_WriteI2C_Byte(REG_TX_HSEL,SyncEmbTable[i].RegHSEL) ; // Reg96
HDMITX_WriteI2C_Byte(REG_TX_HSH,SyncEmbTable[i].RegHSH) ; // Reg97
HDMITX_WriteI2C_Byte(REG_TX_VSS1,SyncEmbTable[i].RegVSS1) ; // RegA0
HDMITX_WriteI2C_Byte(REG_TX_VSE1,SyncEmbTable[i].RegVSE1) ; // RegA1
HDMITX_WriteI2C_Byte(REG_TX_VSS2,SyncEmbTable[i].RegVSS2) ; // RegA2
HDMITX_WriteI2C_Byte(REG_TX_VSE2,SyncEmbTable[i].RegVSE2) ; // RegA3
}
@ -1441,7 +1458,7 @@ SetCSCScale(BYTE bInputMode,BYTE bOutputMode)
case F_MODE_ITU601|F_MODE_0_255:
default:
ErrorF("ITU601 0-255 ") ;
HDMITX_WriteI2C_ByteN(REG_TX_CSC_YOFF,bCSCOffset_0_255,SIZEOF_CSCOFFSET) ;
HDMITX_WriteI2C_ByteN(REG_TX_CSC_MTX11_L,bCSCMtx_RGB2YUV_ITU601_0_255,SIZEOF_CSCMTX) ;
break ;
@ -1685,7 +1702,7 @@ SetAudioFormat(BYTE NumChannel,BYTE AudioEnable,BYTE bSampleFreq,BYTE AudSWL,BYT
fs = ~fs ; // OFS is the one's complement of FS
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_OFS_WL,(fs<<4)|SWL) ;
Switch_HDMITX_Bank(0) ;
// richard modify (could be bug), if(!(AudioEnable | B_AUD_SPDIF))
if(!(AudioEnable & B_AUD_SPDIF))
{
@ -1693,7 +1710,7 @@ SetAudioFormat(BYTE NumChannel,BYTE AudioEnable,BYTE bSampleFreq,BYTE AudSWL,BYT
}
Instance[0].bAudioChannelEnable = AudioEnable ;
// HDMITX_AndREG_Byte(REG_TX_SW_RST,B_AUD_RST) ; // enable Audio
return ER_SUCCESS;
}
@ -1717,30 +1734,30 @@ AutoAdjustAudio()
// return ;
// }
// }
Switch_HDMITX_Bank(1) ;
N = ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudN2)&0xF) << 16 ;
N |= ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudN1)) <<8 ;
N |= ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudN0)) ;
CTS = ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudCTSCnt2)&0xF) << 16 ;
CTS |= ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudCTSCnt1)) <<8 ;
CTS |= ((unsigned long)HDMITX_ReadI2C_Byte(REGPktAudCTSCnt0)) ;
Switch_HDMITX_Bank(0) ;
// CTS = TMDSCLK * N / ( 128 * SampleFreq )
// SampleFreq = TMDSCLK * N / (128*CTS)
if( CTS == 0 )
// CTS = TMDSCLK * N / ( 128 * SampleFreq )
// SampleFreq = TMDSCLK * N / (128*CTS)
if( CTS == 0 )
{
return ;
}
SampleFreq = Instance[0].TMDSClock/CTS ;
SampleFreq *= N ;
SampleFreq /= 128 ;
if( SampleFreq>31000 && SampleFreq<=38050 )
{
Instance[0].bAudFs = AUDFS_32KHz ;
@ -1776,16 +1793,16 @@ AutoAdjustAudio()
Instance[0].bAudFs = AUDFS_192KHz ;
fs = AUDFS_192KHz ;;
}
else
else
{
Instance[0].bAudFs = AUDFS_OTHER;
fs = AUDFS_OTHER;;
}
// bPendingAdjustAudioFreq = FALSE ;
SetNCTS(Instance[0].TMDSClock, Instance[0].bAudFs) ; // set N, CTS by new generated clock.
Switch_HDMITX_Bank(1) ; // adjust the new fs in channel status registers
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CA_FS,0x00|fs) ; // choose clock
fs = ~fs ; // OFS is the one's complement of FS
@ -1793,7 +1810,7 @@ AutoAdjustAudio()
uc &= 0xF ;
uc |= fs << 4 ;
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_OFS_WL,uc) ;
Switch_HDMITX_Bank(0) ;
}
@ -1994,7 +2011,7 @@ AbortDDC()
{
break ; // success
}
if( uc & (B_DDC_NOACK|B_DDC_WAITBUS|B_DDC_ARBILOSE) )
{
ErrorF("AbortDDC Fail by reg16=%02X\n",uc) ;
@ -2100,12 +2117,12 @@ ReadEDID(BYTE *pData,BYTE bSegment,BYTE offset,SHORT Count)
for(TimeOut = 0 ; TimeOut < 200 ; TimeOut++)
{
ucdata = HDMITX_ReadI2C_Byte(REG_TX_DDC_STATUS) ;
if(ucdata&B_DDC_DONE)
{
break ;
break ;
}
if((ucdata & B_DDC_ERROR)||(HDMITX_ReadI2C_Byte(REG_TX_INT_STAT1) & B_INT_DDC_BUS_HANG))
{
ErrorF("Called AboutDDC()\n") ;
@ -2458,14 +2475,14 @@ HDCP_Authenticate()
HDCP_GetBKSV(BKSV) ;
ErrorF("BKSV %02X %02X %02X %02X %02X\n",BKSV[0],BKSV[1],BKSV[2],BKSV[3],BKSV[4]) ;
for(TimeOut = 0, ucdata = 0 ; TimeOut < 5 ; TimeOut ++)
{
ucdata += countbit(BKSV[TimeOut]) ;
}
if( ucdata != 20 ) return ER_FAIL ;
#ifdef SUPPORT_REVOKE_KSV
HDCP_VerifyRevocationList(SRM1,BKSV,&revoked) ;
if(revoked)
@ -2513,7 +2530,7 @@ HDCP_Authenticate()
{
HDCP_Auth_Fire();
// wait for status ;
for(TimeOut = 250 ; TimeOut > 0 ; TimeOut --)
{
DelayMS(5) ; // delay 1ms
@ -2525,7 +2542,7 @@ HDCP_Authenticate()
Instance[0].bAuthenticated = TRUE ;
break ;
}
ucdata = HDMITX_ReadI2C_Byte(REG_TX_INT_STAT2) ;
if(ucdata & B_INT_AUTH_FAIL)
{
@ -2616,12 +2633,12 @@ HDCP_GetKSVList(BYTE *pKSVList,BYTE cDownStream)
{
BYTE TimeOut = 100 ;
BYTE ucdata ;
if(cDownStream == 0 || pKSVList == NULL)
{
return ER_FAIL ;
}
HDMITX_WriteI2C_Byte(REG_TX_DDC_MASTER_CTRL,B_MASTERHOST) ;
HDMITX_WriteI2C_Byte(REG_TX_DDC_HEADER,0x74) ;
HDMITX_WriteI2C_Byte(REG_TX_DDC_REQOFF,0x43) ;
@ -2667,13 +2684,13 @@ HDCP_GetVr(BYTE *pVr)
{
BYTE TimeOut ;
BYTE ucdata ;
if(pVr == NULL)
{
// richard return NULL ;
return ER_FAIL;
}
HDMITX_WriteI2C_Byte(REG_TX_DDC_MASTER_CTRL,B_MASTERHOST) ;
HDMITX_WriteI2C_Byte(REG_TX_DDC_HEADER,0x74) ;
HDMITX_WriteI2C_Byte(REG_TX_DDC_REQOFF,0x20) ;
@ -2713,9 +2730,9 @@ HDCP_GetVr(BYTE *pVr)
pVr[TimeOut*4+2] = (ULONG)HDMITX_ReadI2C_Byte(REG_TX_SHA_RD_BYTE2) ;
pVr[TimeOut*4+1] = (ULONG)HDMITX_ReadI2C_Byte(REG_TX_SHA_RD_BYTE3) ;
pVr[TimeOut*4] = (ULONG)HDMITX_ReadI2C_Byte(REG_TX_SHA_RD_BYTE4) ;
ErrorF("V' = %02X %02X %02X %02X\n",pVr[TimeOut*4],pVr[TimeOut*4+1],pVr[TimeOut*4+2],pVr[TimeOut*4+3]) ;
ErrorF("V' = %02X %02X %02X %02X\n",pVr[TimeOut*4],pVr[TimeOut*4+1],pVr[TimeOut*4+2],pVr[TimeOut*4+3]) ;
}
return ER_SUCCESS ;
}
@ -2728,7 +2745,7 @@ HDCP_GetM0(BYTE *pM0)
{
return ER_FAIL ;
}
HDMITX_WriteI2C_Byte(REG_TX_SHA_SEL,5) ; // read m0[31:0] from reg51~reg54
pM0[0] = HDMITX_ReadI2C_Byte(REG_TX_SHA_RD_BYTE1) ;
pM0[1] = HDMITX_ReadI2C_Byte(REG_TX_SHA_RD_BYTE2) ;
@ -2764,7 +2781,7 @@ void SHATransform(ULONG * h)
{
LONG t;
for (t = 16; t < 80; t++) {
ULONG tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];
w[t] = rol(tmp,1);
@ -2787,7 +2804,7 @@ void SHATransform(ULONG * h)
h[2] = rol(h[1],30);
h[1] = h[0];
h[0] = tmp;
}
for (t = 20; t < 40; t++) {
ULONG tmp = rol(h[0],5) + (h[1] ^ h[2] ^ h[3]) + h[4] + w[t] + 0x6ed9eba1;
@ -2841,8 +2858,8 @@ void SHA_Simple(void *p,LONG len,BYTE *output)
int i, t ;
ULONG c ;
char *pBuff = p ;
for( i = 0 ; i < len ; i++ )
{
t = i/4 ;
@ -2867,14 +2884,14 @@ void SHA_Simple(void *p,LONG len,BYTE *output)
w[t] = 0 ;
}
w[15] = len*8 ;
for( t = 0 ; t< 16 ; t++ )
{
printf("w[%2d] = %08lX\n",t,w[t]) ;
}
SHATransform(sha) ;
for( i = 0 ; i < 5 ; i++ )
{
output[i*4] = (BYTE)((sha[i]>>24)&0xFF) ;
@ -2888,7 +2905,7 @@ static SYS_STATUS
HDCP_CheckSHA(BYTE pM0[],USHORT BStatus,BYTE pKSVList[],int cDownStream,BYTE Vr[])
{
int i,n ;
for(i = 0 ; i < cDownStream*5 ; i++)
{
SHABuff[i] = pKSVList[i] ;
@ -2926,7 +2943,7 @@ HDCP_CheckSHA(BYTE pM0[],USHORT BStatus,BYTE pKSVList[],int cDownStream,BYTE Vr[
{
printf(" %02X",Vr[i]) ;
}
for(i = 0 ; i < 20 ; i++)
{
if(V[i] != Vr[i])
@ -2941,7 +2958,7 @@ static SYS_STATUS
HDCP_Authenticate_Repeater()
{
BYTE uc ;
#ifdef SUPPORT_DSSSHA
#ifdef SUPPORT_DSSSHA
BYTE revoked ;
int i ;
#else
@ -2978,7 +2995,7 @@ HDCP_Authenticate_Repeater()
//////////////////////////////////////
// Authenticate Fired
//////////////////////////////////////
HDCP_GetBCaps(&BCaps,&BStatus) ;
DelayMS(2);
HDCP_Auth_Fire();
@ -3038,7 +3055,7 @@ HDCP_Authenticate_Repeater()
{
ErrorF("Wait KSV FIFO Ready %d\n",TimeOut) ;
}
if(HDCP_GetBCaps(&BCaps,&BStatus) == ER_FAIL)
{
ErrorF("Get BCaps fail\n") ;
@ -3061,17 +3078,17 @@ HDCP_Authenticate_Repeater()
}
ErrorF("Wait timeout = %d\n",TimeOut) ;
ClearDDCFIFO() ;
GenerateDDCSCLK() ;
cDownStream = (BStatus & M_DOWNSTREAM_COUNT) ;
if(cDownStream == 0 || cDownStream > 6 || BStatus & (B_MAX_CASCADE_EXCEEDED|B_DOWNSTREAM_OVER))
{
ErrorF("Invalid Down stream count,fail\n") ;
goto HDCP_Repeater_Fail ;
}
if(HDCP_GetKSVList(KSVList,cDownStream) == ER_FAIL)
{
@ -3087,38 +3104,38 @@ HDCP_Authenticate_Repeater()
uc += countbit(KSVList[i*5+TimeOut]) ;
}
if( uc != 20 ) revoked = TRUE ;
#ifdef SUPPORT_REVOKE_KSV
#ifdef SUPPORT_REVOKE_KSV
HDCP_VerifyRevocationList(SRM1,&KSVList[i*5],&revoked) ;
#endif
if(revoked)
{
ErrorF("KSVFIFO[%d] = %02X %02X %02X %02X %02X is revoked\n",i,KSVList[i*5],KSVList[i*5+1],KSVList[i*5+2],KSVList[i*5+3],KSVList[i*5+4]) ;
ErrorF("KSVFIFO[%d] = %02X %02X %02X %02X %02X is revoked\n",i,KSVList[i*5],KSVList[i*5+1],KSVList[i*5+2],KSVList[i*5+3],KSVList[i*5+4]) ;
goto HDCP_Repeater_Fail ;
}
}
if(HDCP_GetVr(Vr) == ER_FAIL)
{
goto HDCP_Repeater_Fail ;
goto HDCP_Repeater_Fail ;
}
if(HDCP_GetM0(M0) == ER_FAIL)
{
goto HDCP_Repeater_Fail ;
}
// do check SHA
if(HDCP_CheckSHA(M0,BStatus,KSVList,cDownStream,Vr) == ER_FAIL)
{
goto HDCP_Repeater_Fail ;
}
HDCP_ResumeRepeaterAuthenticate() ;
Instance[0].bAuthenticated = TRUE ;
return ER_SUCCESS ;
HDCP_Repeater_Fail:
HDCP_CancelRepeaterAuthenticate() ;
return ER_FAIL ;
@ -3388,6 +3405,38 @@ SetAudioInfoFrame(Audio_InfoFrame *pAudioInfoFrame)
return ER_SUCCESS ;
}
static SYS_STATUS
SetHDRInfoFrame(HDR_InfoFrame *pHDRInfoFrame)
{
int i ;
BYTE ucData ;
if(!pHDRInfoFrame)
{
return ER_FAIL ;
}
Switch_HDMITX_Bank(1) ;
HDMITX_WriteI2C_Byte(REG_TX_PKT_HB00, (0x80+pHDRInfoFrame->info.Type));
HDMITX_WriteI2C_Byte(REG_TX_PKT_HB01, pHDRInfoFrame->info.Ver);
HDMITX_WriteI2C_Byte(REG_TX_PKT_HB02, pHDRInfoFrame->info.Len);
for(i = 0; i < HDR_INFOFRAME_LEN ; i++)
HDMITX_WriteI2C_Byte(REG_TX_PKT_PB01+i, pHDRInfoFrame->pktbyte.HDR_DB[i]);
for(i = 0,ucData = 0 ; i< HDR_INFOFRAME_LEN ; i++)
{
ucData -= pHDRInfoFrame->pktbyte.HDR_DB[i] ;
}
ucData -= 0x80+HDR_INFOFRAME_VER+HDR_INFOFRAME_TYPE+HDR_INFOFRAME_LEN ;
HDMITX_WriteI2C_Byte(REG_TX_PKT_PB00, ucData);
Switch_HDMITX_Bank(0) ;
ENABLE_NULL_PKT();
return ER_SUCCESS ;
}
//////////////////////////////////////////////////////////////////////
// Function: SetSPDInfoFrame()
// Parameter: pSPDInfoFrame - the pointer to HDMI SPD Infoframe ucData

View File

@ -277,7 +277,7 @@
#define B_AFE_DRV_PDRXDET (1<<2)
#define B_AFE_DRV_TERMON (1<<1)
#define B_AFE_DRV_ENCAL (1<<0)
#define REG_TX_AFE_XP_CTRL 0x62
#define B_AFE_XP_GAINBIT (1<<7)
#define B_AFE_XP_PWDPLL (1<<6)
@ -287,7 +287,7 @@
#define B_AFE_XP_PWDI (1<<2)
#define B_AFE_XP_DEI (1<<1)
#define B_AFE_XP_DER (1<<0)
#define REG_TX_AFE_ISW_CTRL 0x63
#define B_AFE_RTERM_SEL (1<<7)
#define B_AFE_IP_BYPASS (1<<6)
@ -296,7 +296,7 @@
#define B_AFE_DRV_ISWK 7
#define REG_TX_AFE_IP_CTRL 0x64
#define B_AFE_IP_GAINBIT (1<<7)
#define B_AFE_IP_PWDPLL (1<<6)
#define M_AFE_IP_CKSEL (3<<4)
@ -315,15 +315,15 @@
#define M_AFE_DRV_VSW (3<<2)
#define B_AFE_RING_SLOW (1<<1)
#define B_AFE_RING_FAST (1<<0)
#define REG_TX_AFE_TEST 0x66
#define REG_TX_AFE_TEST 0x66
#define B_AFE_AFE_ENTEST (1<<6)
#define B_AFE_AFE_ENBIST (1<<5)
#define M_AFE_CAL_RTERM_MANUAL 0x1F
#define REG_TX_AFE_LFSR 0x67
#define REG_TX_AFE_LFSR 0x67
#define B_AFE_AFELFSR_VAL (1<<7)
#define B_AFE_DIS_AFELFSR (1<<6)
#define M_AFE_RTERM_VAOUE 0xF
//
//#define REG_TX_AFE_DRV_CTRL 0x61
// #define M_AFE_DRV_SR (3<<2)
@ -448,7 +448,7 @@
#define B_BLUE_SCR_MUTE (1<<1)
#define B_NODEF_PHASE (1<<2)
#define B_PHASE_RESYNC (1<<3)
#define O_COLOR_DEPTH 4
#define M_COLOR_DEPTH 7
#define B_COLOR_DEPTH_MASK (M_COLOR_DEPTH<<O_COLOR_DEPTH)
@ -688,12 +688,12 @@
// data structure
/////////////////////////////////////////////////////////////////////
typedef struct _INSTANCE_STRUCT {
BYTE I2C_DEV ;
BYTE I2C_ADDR ;
/////////////////////////////////////////////////
// Interrupt Type
// Interrupt Type
/////////////////////////////////////////////////
BYTE bIntType ; // = 0 ;
/////////////////////////////////////////////////
@ -707,12 +707,12 @@ typedef struct _INSTANCE_STRUCT {
BYTE bAudioChannelSwap ; // = 0 ;
BYTE bAudioChannelEnable ;
BYTE bAudFs ;
unsigned long TMDSClock ;
unsigned long TMDSClock ;
BYTE bAuthenticated:1 ;
BYTE bHDMIMode: 1;
BYTE bIntPOL:1 ; // 0 = Low Active
BYTE bIntPOL:1 ; // 0 = Low Active
BYTE bHPD:1 ;
} INSTANCE ;
@ -828,6 +828,7 @@ BOOL CheckHDMITX(BYTE *pHPD,BYTE *pHPDChange) ;
BOOL EnableHDCP(BYTE bEnable) ;
BOOL EnableAVIInfoFrame(BYTE bEnable,BYTE *pAVIInfoFrame);
BOOL EnableAudioInfoFrame(BYTE bEnable,BYTE *pAudioInfoFrame);
BOOL EnableHDRInfoFrame(BYTE bEnable, BYTE *pHDRInfoFrame);
// BOOL EnableVideoOutputIndirect(BYTE xCnt,BYTE inputColorMode,BYTE outputColorMode,BYTE bHDMI) ;
void SetAVMute(BYTE bEnable) ;
void SetOutputColorDepthPhase(BYTE ColorDepth,BYTE bPhase) ;

View File

@ -130,7 +130,7 @@ typedef enum {
#define F_VIDMODE_16_235 F_MODE_16_235 // richard add
typedef union _VideoFormatCode
typedef union _VideoFormatCode
{
struct _VFC
{
@ -195,18 +195,21 @@ typedef union _VideoFormatCode
#define SPD_INFOFRAME_TYPE 0x03
#define AUDIO_INFOFRAME_TYPE 0x04
#define MPEG_INFOFRAME_TYPE 0x05
#define HDR_INFOFRAME_TYPE 0x07
#define VENDORSPEC_INFOFRAME_VER 0x01
#define AVI_INFOFRAME_VER 0x02
#define SPD_INFOFRAME_VER 0x01
#define AUDIO_INFOFRAME_VER 0x01
#define MPEG_INFOFRAME_VER 0x01
#define HDR_INFOFRAME_VER 0x01
#define VENDORSPEC_INFOFRAME_LEN 8
#define AVI_INFOFRAME_LEN 13
#define SPD_INFOFRAME_LEN 25
#define AUDIO_INFOFRAME_LEN 10
#define MPEG_INFOFRAME_LEN 10
#define HDR_INFOFRAME_LEN 26
#define ACP_PKT_LEN 9
#define ISRC1_PKT_LEN 16
@ -316,6 +319,23 @@ typedef union _SPD_InfoFrame {
} pktbyte ;
} SPD_InfoFrame ;
// HDR
typedef union _HDR_InfoFrame {
struct {
BYTE Type ;
BYTE Ver ;
BYTE Len ;
BYTE TF ; // vendor name character in 7bit ascii characters
BYTE DESC_ID ; // product description character in 7bit ascii characters
BYTE DESC[24] ;
} info ;
struct {
BYTE HDR_HB[3] ;
BYTE HDR_DB[HDR_INFOFRAME_LEN] ;
} pktbyte ;
} HDR_InfoFrame ;
///////////////////////////////////////////////////////////////////////////
// Using for interface.
///////////////////////////////////////////////////////////////////////////