📄 proviewdtv_tda9975.c
字号:
buffer[1] = 0x00;
/*clkout_tog:1 bit*/
buffer[1] &= 0x7F;
/*clkout_sel:3 bits*/
if(videoin == VIDEO_INPUT_AVI1
|| videoin == VIDEO_INPUT_AVI2
|| videoin == VIDEO_INPUT_AVI3)
{
/*analog in*/
/*AVI CLKOUT*/
buffer[1] |= (0x04 << 4);
}
else
{
/*HDMI IN*/
if(outformat == YUV_444_FORMAT
|| outformat == YUV_422_SEMIPLANAR_FORMAT)
{
/*HDMI clock*/
buffer[1] |= (0x02 << 4);
}
else
{
/*HDMI clock * 2*/
buffer[1] |= (0x03 << 4);
}
}
/*clkfor_sel:2bits*/
if(outformat == YUV_422_CCIR656_FORMAT)
{
if(videoin == VIDEO_INPUT_AVI1
|| videoin == VIDEO_INPUT_AVI2
|| videoin == VIDEO_INPUT_AVI3)
{
buffer[1] |= (0x01 << 2);
}
else
{
buffer[1] |= (0x02 << 2);
}
}
else
{
buffer[1] |= (0x03 << 2);
}
/*clkpix_sel:2bits*/
if(videoin == VIDEO_INPUT_AVI1
|| videoin == VIDEO_INPUT_AVI2
|| videoin == VIDEO_INPUT_AVI3)
{
buffer[1] |= 0x02;
}
else
{
buffer[1] |= 0x03;
}
TDA9975_AVIPage();
I2C_Write_TDA9975(buffer, 2);
}
void TDA9975_AVIClockGenerator(int in,
E_TDA9975_OUT_FORAMT out)
{
unsigned char buffer[2];
if(in >= VIDEO_INPUT_INVALID)
{
return;
}
if(out >= TDA9975_OUT_FORAMT_BUTT)
{
return;
}
TDA9975_AVIPage();
buffer[0] = 0x11;
if(in == VIDEO_INPUT_480I60
|| in == VIDEO_INPUT_576I50)
{
buffer[1] = 0xc3;
}
else
{
buffer[0] = 0x83;
}
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0x14; buffer[1] = 0x00;
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0x15; buffer[1] = 0x00;
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0x16;
if(out == YUV_444_FORMAT
|| out == YUV_422_SEMIPLANAR_FORMAT)
{
buffer[1] = 0x48;
}
else
{
buffer[1] = 0x28;
}
I2C_Write_TDA9975(buffer, 2);
}
void IDA9975_VideoVHREF(unsigned int videoin)
{
unsigned char buffer[2];
int i;
if(videoin >= VIDEO_INPUT_INVALID)
{
return;
}
TDA9975_AVIPage();
buffer[0] = 0xAA; buffer[1] = TDA9975_VIDEOVHREF[videoin][0];
//I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0xAB; buffer[1] = TDA9975_VIDEOVHREF[videoin][1];
//I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0xAC; buffer[1] = TDA9975_VIDEOVHREF[videoin][2];
//I2C_Write_TDA9975(buffer, 2);
switch(videoin)
{
case VIDEO_INPUT_480I60:
for(i = 0; ; i++)
{
buffer[0] = TDA9975_480IVHREF[i][0];
buffer[1] = TDA9975_480IVHREF[i][1];
if(buffer[0] == 0xff && buffer[1] == 0xff)
{
break;
}
I2C_Write_TDA9975(buffer, 2);
}
break;
case VIDEO_INPUT_480P60:
for(i = 0; ; i++)
{
buffer[0] = TDA9975_480PVHREF[i][0];
buffer[1] = TDA9975_480PVHREF[i][1];
if(buffer[0] == 0xff && buffer[1] == 0xff)
{
break;
}
I2C_Write_TDA9975(buffer, 2);
}
break;
case VIDEO_INPUT_720P60:
for(i = 0; ; i++)
{
buffer[0] = TDA9975_720PVHREF[i][0];
buffer[1] = TDA9975_720PVHREF[i][1];
if(buffer[0] == 0xff && buffer[1] == 0xff)
{
break;
}
I2C_Write_TDA9975(buffer, 2);
}
break;
case VIDEO_INPUT_1080I60:
for(i = 0; ; i++)
{
buffer[0] = TDA9975_1080IVHREF[i][0];
buffer[1] = TDA9975_1080IVHREF[i][1];
if(buffer[0] == 0xff && buffer[1] == 0xff)
{
break;
}
I2C_Write_TDA9975(buffer, 2);
}
break;
default:
break;
}
}
void TDA9975_ColorSpaceConvertByPass(void)
{
unsigned char buffer[2];
TDA9975_AVIPage();
buffer[0] = 0x80; /* Subaddress of HDMI_SOFT_RST */
buffer[1] = 0x06; /* Bypass Color conversion */
I2C_Write_TDA9975(buffer, 2) ;
}
void TDA9975_ColorSpaceConvert(unsigned int in,
unsigned int YCbCr)
{
unsigned char buffer[2];
unsigned char (*ppdata)[2];
int i = 0;
if(YCbCr == TDA9975_HDMI_IN_YCbCr
|| in >= VIDEO_INPUT_INVALID)
{
TDA9975_ColorSpaceConvertByPass();
return;
}
if(in == VIDEO_INPUT_VGA60)
{
ppdata = (unsigned char(*)[2])TDA9975_FULLRGBITU601Data;
}
else if(in == VIDEO_INPUT_480P60
|| in == VIDEO_INPUT_480I60
|| in == VIDEO_INPUT_576P50
|| in == VIDEO_INPUT_576I50)
{
ppdata = (unsigned char(*)[2])TDA9975_LIMITEDRGBITU601Data;
}
else
{
ppdata = (unsigned char(*)[2])TDA9975_LIMITEDRGBITU709Data;
}
TDA9975_AVIPage();
for( i = 0; ; i++)
{
buffer[0] = ppdata[i][0]; /* Subaddress of MAT register */
buffer[1] = ppdata[i][1];
if(buffer[0] == 0xFF && buffer[1] == 0xFF)
{
break;
}
I2C_Write_TDA9975(buffer, 2);
}
}
void TDA9975_DownSampling(int out)
{
unsigned char buffer[2];
TDA9975_AVIPage();
buffer[0] = 0xE6; /* Subaddress of UPDOWN_CTRL */
if(TDA9975_HDMICheck444Or422())
{ /* YCbCr 4:2:2 pixel encoding */
buffer[1] = 0x00; /* Bypass */
}
else
{ /* 4:4:4 pixel encoding */
if(out == YUV_444_FORMAT)
{
buffer[1] = 0x00;
}
else if(out == YUV_422_SEMIPLANAR_FORMAT)
{
buffer[1] = 0x04; /* down sample by 2*/
}
else
{
buffer[1] = 0x08; /* down sample by 4*/
}
}
I2C_Write_TDA9975(buffer, 2);
}
void TDA9975_HDMIAudio(void)
{
unsigned char buffer[2];
TDA9975_HDMIPage();
buffer[0] = 0xF8; // Subaddress of HDMI_INFO_RST
buffer[1] = 0x01; // Reset audio FIFO
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0xF8; // Subaddress of HDMI_INFO_RST
buffer[1] = 0x00; // Activate audio FIFO
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0x03; // Subaddress of AUDIO_FORM
buffer[1] = 0x1C; // I2S, AP[3:1] low, WS and AP0 and ACLK active
I2C_Write_TDA9975(buffer, 2);
}
void TDA9975_DVIAudio(void)
{
unsigned char buffer[2];
TDA9975_HDMIPage();
buffer[0] = 0x03; // Subaddress of AUDIO_FORM
buffer[1] = 0x3f; // I2S, WS, AP3, AP2, AP1, AP0, ACLK low
I2C_Write_TDA9975(buffer, 2);
}
void TDA9975_HDMIProcess(void)
{
unsigned char buffer[2];
unsigned char pixel_repeat;
TDA9975_HDMIPage();
buffer[0] = 0x00; /* Subaddress of HDMI_CTRL */
buffer[1] = 0x00;
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0xF8; /* Subaddress of HDMI_INFO_RST */
buffer[1] = 0x07; /* Reset Advanced Info, InfoFrames and audio FIFO */
I2C_Write_TDA9975(buffer, 2);
buffer[0] = 0xF8; /* Subaddress of HDMI_INFO_RST */
buffer[1] = 0x01; /* Release Advanced Info and InfoFrames */
I2C_Write_TDA9975(buffer, 2);
TDA9975_Delay(60);
TDA9975_AVIPage();
buffer[0] = 0x0F; /* Subaddress of VAI_FLAGS2 */
buffer[1] = 0x0A; /* Enable AVI an AUD infoframe update and mask other packets update */
I2C_Write_TDA9975(buffer, 2) ;
pixel_repeat = TDA9975_HDMICheckPixelRepeat();
TDA9975_HDMIPage();
buffer[0] = 0x04; /* Subaddress of PIX_REPEAT */
buffer[1] = 0x80 + pixel_repeat;
I2C_Write_TDA9975(buffer, 2);
}
void TDA9975_DVIProcess(void)
{
/*Write DVI register*/
unsigned char DVI_Mode_Buffer[2];
TDA9975_HDMIPage();
DVI_Mode_Buffer[0] = 0x03; /* Subaddress of AUDIO_FORM */
DVI_Mode_Buffer[1] = 0x3f; /* I2S, WS, AP3, AP2, AP1, AP0, ACLK low */
I2C_Write_TDA9975(DVI_Mode_Buffer, 2);
DVI_Mode_Buffer[0] = 0x00; /* Subaddress of HDMI_CTRL */
DVI_Mode_Buffer[1] = 0x40; /* Force AVmute to zero */
I2C_Write_TDA9975(DVI_Mode_Buffer, 2);
DVI_Mode_Buffer[0] = 0x04; /* Subad
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -