📄 t103_util.c
字号:
I2CWriteByte(TW803_P0, 0xBF,(uCHAR)(DISP_DFLT_VSWIDTH>>8));//VSYNC Width
// Calculate line buffer
Temp =wDVBILK/(wDHTotal*(DNDIV_40/LLCK_Divider))-DISP_DFLT_VSWIDTH;
Temp -= (int)Temp;
wTemp=(1.88*1716.0)+(Temp*wDHTotal/(DNDIV_40/LLCK_Divider));
I2CWriteByte(TW803_P0, 0x84, wTemp);
I2CWriteByte(TW803_P0, 0x85, wTemp>>8);//line buffer
m_dwTemp[0]=(wDVTotal-m_wVRes-DWVSST-DISP_DFLT_VSWIDTH)*wDHTotal;
m_dwTemp[1]=wTemp*(DNDIV_40/LLCK_Divider);
I2CWriteByte(TW803_P0, 0xe2, 0x11);
}
void IRScaleratioCtrl(void)
{
uCHAR Hcut=0;
Hcut=12;
m_wHRes=720-2*Hcut;
if(m_cStandard==S_PAL) m_wVRes=280; //230 //ruby 2004-08-18
else if(m_cStandard==S_NTSC) m_wVRes=234; //ruby 2004-08-18
else if(m_cStandard==S_SECAM) m_wVRes=289; //ruby 2004-08-18
I2CWriteByte(TW803_P0,0x54,m_wHRes);
I2CWriteByte(TW803_P0,0x55,m_wHRes>>8);
switch(m_cScaleratio){
case ScaleFULL:
I2CWriteByte(TW803_P2,0x2E,0x88); //0x82); //setup video decoder h start == 130
I2CWriteByte(TW803_P2,0x2F,0x50); //0x50); //Setup video decoder h active 720 玡狠
break;
case Scale4_3:
if(!NoSignal){
I2CWriteByte(TW803_P0, 0x9d, 0x00);//0x10);
I2CWriteByte(TW803_P0, 0x9e, 0x00);//0x80);
I2CWriteByte(TW803_P0, 0x9f, 0x00);//0x80);
I2CWriteByte(TW803_P0, 0x88, ((H_Size-(H_Size43))/2));
I2CWriteByte(TW803_P0, 0x89, 0x00);
I2CWriteByte(TW803_P0, 0x8a, (((H_Size43))+((H_Size-(H_Size43))/2))-2);
I2CWriteByte(TW803_P0, 0x8b, ((H_Size43)>>8));
}
I2CWriteByte(TW803_P2,0x2E,0x82);
I2CWriteByte(TW803_P2,0x2F,0x50); //0x50); //Setup video decoder h active 720
break;
}
/*
#ifdef T515
if((EepPublic.cSource&0x0F)<isrc_T515_CVIDEO1)
{
#endif */
I2CWriteByte(TW803_P0, INT_STATUS, 0x3F);
/* while(!(I2CReadByte(TW803_P0, INT_STATUS)&0x20)){
twdDelay(1);
}
*/
I2CWriteByte(TW803_P0, INT_STATUS, 0x3F);
/*#ifdef T515
}
#endif*/
switch(m_cScaleratio){
case ScaleFULL:
if(!NoSignal){
I2CWriteByte(TW803_P0,0x88, 00);
I2CWriteByte(TW803_P0,0x89, 00);
I2CWriteByte(TW803_P0,0x8a, 00);
I2CWriteByte(TW803_P0,0x8b, 00);
}
I2CWriteByte(TW803_P0,0x40,Hcut); //Hcut put picture position in center 2004-10-16 //For Foxconn
I2CWriteByte(TW803_P0,0xD8,0x00);// Horizontal Main Display Start
I2CWriteByte(TW803_P0,0xDC, (H_Size&0xFF));//
I2CWriteByte(TW803_P0,0xDD, (H_Size>>8));
break;
case Scale4_3:
I2CWriteByte(TW803_P0,0x40,Hcut); //Ruby 2004-08-23 0x00);
I2CWriteByte(TW803_P0,0xD8,((H_Size-H_Size43)/2)); // 0x53);// Horizontal Main Display Start
I2CWriteByte(TW803_P0,0xDC, (H_Size43));
I2CWriteByte(TW803_P0,0xDD, (H_Size43>>8));
break;
}
}
void Scaling(void)
{
switch(m_cScaleratio){
case ScaleFULL:
m_wBuff[0] = (float)m_wHRes/DWHSZ * 0x8000;
break;
case Scale4_3:
m_wBuff[0] = (float)m_wHRes/H_Size43 * 0x8000;
break;
}
m_wBuff[1] = (float)m_wVRes/DWVSZ * 0x8000;
I2CWriteByte(TW803_P0, SC_HOR_H1, (uCHAR)m_wBuff[0]);
I2CWriteByte(TW803_P0, SC_HOR_H2, (uCHAR)(m_wBuff[0]>>8));
I2CWriteByte(TW803_P0, SC_VER_V1, (uCHAR)m_wBuff[1]);
I2CWriteByte(TW803_P0, SC_VER_V2, (uCHAR)(m_wBuff[1]>>8));
}
#endif //end of Real time calculating output timing (FIX_OUTPUT_TIMING)
/* S E T I P V I D E O T Y P E */
/*-------------------------------------------------------------------------
set video source selection of Comb Filter(P20x00),
set bandwidth control register(P20x01)
set comb filtering mode register(P20x03)
acording to m_cChroma
-------------------------------------------------------------------------*/
void SetIPVideoType(void)
{
if(m_cChroma==S_NTSC){
m_wVTotal=525;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01);
I2CWriteByte(TW803_P2,0x01, I2CReadByte(TW803_P2,0x01)|0x09);
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
I2CWriteByte(TW803_P2,0x03, 0x03);
else I2CWriteByte(TW803_P2,0x03, 0x00);
}
else if(m_cChroma==S_PAL){
m_wVTotal=625;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01|0x32);
I2CWriteByte(TW803_P2,0x01, I2CReadByte(TW803_P2,0x01)|0x08);
I2CWriteByte(TW803_P2,0x03, I2CReadByte(TW803_P2,0x03)&0x01|0x02); //s_video or pal?
}
else if(m_cChroma==S_SECAM){
m_wVTotal=625;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01|0x28);
I2CWriteByte(TW803_P2,0x03, I2CReadByte(TW803_P2,0x03)&0x01|0x02); //s_video or pal?
}
else if(m_cChroma==S_PAL_M){
m_wVTotal=525;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01|0x04);
}
else if(m_cChroma==S_PAL_CN){
m_wVTotal=625;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01|0x26);
}
else if(m_cChroma==S_NTSC_4){
m_wVTotal=525;
I2CWriteByte(TW803_P2,0x00, I2CReadByte(TW803_P2,0x00)&0x01|0x00);
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
I2CWriteByte(TW803_P2,0x03, 0x03);
else I2CWriteByte(TW803_P2,0x03, 0x03);
}
}
//#ifdef AUTO_DETECT
/* D E T E C T _ S I G */
/*-------------------------------------------------------------------------
-------------------------------------------------------------------------*/
void Detect_Sig(bit detect)
{
uCHAR tmp;
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeTV){
// OpenPanel();
return;
}
/*
#ifdef T515
if((EepPublic.cSource&0x0F)<isrc_T515_CVIDEO1)
tmp=I2CReadByte(TW803_P2, 0x3A)&0x01;
else
tmp=I2CReadByte(TW515, 0x5A)&0x01;
#else*/
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB565)
{
tmp=I2CReadByte(TW803_P0, 0x32); //interrupt status register
I2CWriteByte(TW803_P0, 0x32,tmp);
tmp &= 0x01; //if lost vsync
}
#ifdef PC_MODE
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB)
{
tmp=!SyncChangDect();
}
#endif
if (uiaSrcMux1[EepPublic.cSource].SourceRoute==isrcVIDEO)
tmp=I2CReadByte(TW803_P2, 0x3A)&0x01; // if signal detected
//#endif
if(tmp) // No signal
{
if((detect)||(NoSignal!=tmp)) // When switch to signal lost input or Signal lost
{
OSDShowSource();
Timer0Stop();
ClosePanel(0x10, 0xff, 0x40);
/*-------------------------------------------------------------------------
20060809 Phil add sound control
-------------------------------------------------------------------------*/
twdDelay(10);
AV_AUDIO_SW1 = OFF;
TV_AUDIO_SW2 = OFF;
SV_AUDIO_SW3 = OFF;
twdDelay(10);
AUDIO_MUTE = ON; //Mute
twdDelay(10);
AUDIO_STBY = OFF;
/*-------------------------------------------------------------------------
20060809 Phil add sound control
-------------------------------------------------------------------------*/
}
}
else
{
if((detect)|| (NoSignal!=tmp)) //When video switch and signal is normal
{
OpenPanel();
/*-------------------------------------------------------------------------
20060809 Phil add sound control
-------------------------------------------------------------------------*/
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeTV)
{
twdDelay(10);
AV_AUDIO_SW1 = OFF;
TV_AUDIO_SW2 = ON;
SV_AUDIO_SW3 = OFF;
twdDelay(10);
AUDIO_STBY = OFF;
twdDelay(10);
AUDIO_MUTE = OFF; //Play
}
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeCVBS)
{
twdDelay(10);
AV_AUDIO_SW1 = ON;
TV_AUDIO_SW2 = OFF;
SV_AUDIO_SW3 = OFF;
twdDelay(10);
AUDIO_STBY = OFF;
twdDelay(10);
AUDIO_MUTE = OFF; //Play
}
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
{
twdDelay(10);
AV_AUDIO_SW1 = OFF;
TV_AUDIO_SW2 = OFF;
SV_AUDIO_SW3 = ON;
twdDelay(10);
AUDIO_STBY = OFF;
twdDelay(10);
AUDIO_MUTE = OFF; //Play
}
/*-------------------------------------------------------------------------
20060809 Phil add sound control
-------------------------------------------------------------------------*/
}
}
NoSignal= tmp;
}
//#endif
void LoadGammaTable(uCHAR cGammaModeID)
{
#ifdef GAMMADAT_Default
/*
uCHAR c;
uCHAR *p=pcGammaData[cGammaModeID];
//disable I2C Auto_Inc_Address
I2CWriteByte(TW803_P0,TW_INTERFACE,I2CReadByte(TW803_P0,TW_INTERFACE)&~AUTO_INC);
//I2CWriteByte(TW803_P0,IMG_FUN_CTRL,I2CReadByte(TW803_P0,IMG_FUN_CTRL)&GAMMA_RGB); // mark by Sherman 06'01'11
I2CWriteByte(TW803_P0,GAMMA_ADDR,0x00);
for(i=0;i<GAMMA_TABLE_DATA_SIZE;i++) {
c=*p++;
I2CWriteByte(TW803_P0,GAMMA_DATA,c);
}
//11.13 I2CWriteByte(TW803_P0,GAMMA_DATA,pcGammaDataRGB[cGammaModeID][i]);
*/
#else
int i;
uCHAR j,k;
//uCHAR code **ppcGm;
uCHAR *pcGm;
for(j=0,k=3;j<3;j++,k--)
{
pcGm=(uCHAR *)pcGammaData[j+cGammaModeID*GAMMA_PNUM];
I2CWriteByte(TW803_P0,IMG_FUN_CTRL,(I2CReadByte(TW803_P0,IMG_FUN_CTRL)& ~GAMMA_CTL_MSK)|(k<<6));
I2CWriteByte(TW803_P0,GAMMA_ADDR,0x00);
for(i=0;i<GAMMA_TABLE_DATA_SIZE;i++)
I2CWriteByte(TW803_P0,GAMMA_DATA,pcGm[i]);
}
#endif // GM_RGB_ALL_SAME
I2CWriteByte(TW803_P0,TW_INTERFACE,I2CReadByte(TW803_P0,TW_INTERFACE)|AUTO_INC);
#ifdef EnableGamma
I2CWriteByte(TW803_P0,IMG_FUN_CTRL,I2CReadByte(TW803_P0,IMG_FUN_CTRL)|ENGAMMA);
#else
I2CWriteByte(TW803_P0,IMG_FUN_CTRL,I2CReadByte(TW803_P0,IMG_FUN_CTRL)&~ENGAMMA); //Disable Gamma
#endif
return;
}
/* C L O S E P A N E L */
/*-------------------------------------------------------------------------
ignore and block the input vsync triggering the output vsync ,
display user define color in panel
-------------------------------------------------------------------------*/
void ClosePanel(uCHAR uR, uCHAR uG, uCHAR uB)
{
I2CWriteByte(TW803_P0, 0xC2, I2CReadByte(TW803_P0, 0xC2)|(PSYNC_STR|IGNORE_VSYNC));
I2CWriteByte(TW803_P0, 0x9d, uR);
I2CWriteByte(TW803_P0, 0x9e, uG);
I2CWriteByte(TW803_P0, 0x9f, uB);
I2CWriteByte(TW803_P0, PATTERN_CTRL, 0x87);//enable frame background color
I2CWriteByte(TW803_P0, 0xe2, 0x11); //enable registers shadow control,sync all shadow registers
}
void OpenPanel(void)
{
#ifdef lucy_edition
m_bPanelClose = 0;
#endif
I2CWriteByte(TW803_P0, 0xC2, I2CReadByte(TW803_P0, 0xC2)&~(PSYNC_STR|IGNORE_VSYNC));
I2CWriteByte(TW803_P0, PATTERN_CTRL, I2CReadByte(TW803_P0, PATTERN_CTRL)&~0x80); //Disable Frame Background Color
}
// kenny 20060512
#ifdef IR_DECODE
void IR_Init(void)
{
I2CWriteByte(TW803_P0 + 2, 0x40, 0x10);
I2CWriteByte(TW803_P0 + 2, 0x41, 0x3B);
I2CWriteByte(TW803_P0 + 2, 0x47, 0x80);
// turn on IR intterrupt
I2CWriteByte(TW803_P0, 0x33, I2CReadByte(TW803_P0, 0x33) & 0x3F);
I2CWriteByte(TW803_P0, 0x32, I2CReadByte(TW803_P0, 0x32) & 0xFF);
}
#endif
// kenny 20060512
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -