📄 tuner.c
字号:
0x20e2, // CH 15, 487.25
0x2162, // CH 16, 495.25
0x21e2, // CH 17, 503.25
0x2262, // CH 18, 511.25
0x22e2, // CH 19, 519.25
0x2362, // CH 20, 527.25
0x23e2, // CH 21, 535.25
0x2462, // CH 22, 543.25
0x24e2, // CH 23, 551.25
0x2562, // CH 24, 559.25
0x2862, // CH 25, 607.25
0x28e2, // CH 26, 615.25
0x2962, // CH 27, 623.25
0x29e2, // CH 28, 631.25
0x2a62, // CH 29, 639.25
0x2ae2, // CH 30, 647.25
0x2b62, // CH 31, 655.25
0x2be2, // CH 32, 663.25
0x2c62, // CH 33, 671.25
0x2ce2, // CH 34, 679.25
0x2d62, // CH 35, 687.25
0x2de2, // CH 36, 695.25
0x2e62, // CH 37, 703.25
0x2ee2, // CH 38, 711.25
0x2f62, // CH 39, 719.25
0x2fe2, // CH 40, 727.25
0x3062, // CH 41, 735.25
0x30e2, // CH 42, 743.25
0x3162, // CH 43, 751.25
0x31e2, // CH 44, 759.25
0x3262, // CH 45, 767.25
0x32e2, // CH 46, 775.25
0x3362, // CH 47, 783.25
0x33e2, // CH 48, 791.25
0x3462, // CH 49, 799.25
0x34e2, // CH 50, 807.25
0x3562, // CH 51, 815.25
0x35e2, // CH 52, 823.25
0x3662, // CH 53, 831.25
0x36e2, // CH 54, 839.25
0x3762, // CH 55, 847.25
0x37e2, // CH 56, 855.25
0x3862, // CH 57, 863.25
/* // max. support freq : 863.25MHz
0x38e2, // CH 58, 871.25
0x3962, // CH 59, 879.25
0x39e2, // CH 60, 887.25
0x3a62, // CH 61, 895.25
0x3ae2, // CH 62, 903.25
0x3b62, // CH 63, 911.25
0x3be2, // CH 64, 919.25
0x3c62, // CH 65, 927.25
0x3ce2, // CH 66, 935.25
0x3d62, // CH 67, 943.25
0x3de2, // CH 68, 951.25
*/
};
#endif
#endif
#define CATV_MIN 1
#define CATV_MAX 96
#define CATV_TOTAL 96
extern uDWORD m_dwVFrameCntPre;
extern uWORD m_wHSyncPeriodPre;
extern uCHAR idata m_cBuff[4];
void AutoMemory(void)
{
uCHAR i,j;
bit bTVFound;
uWORD wTVFreq, wTVFreqMin;
uCHAR cTVNum=0;
uCHAR cTV_Max,cTV_Min;
#ifdef NTSC
uCHAR cTemp;
uWORD* DK_CCIR;
cTemp=I2CReadByte(EEPVIDEOBLOCK, idVIDEO_FLAG_INDEX);
if(cTemp&0x01)
{
cTV_Max=98;
cTV_Min=0;
DK_CCIR=DK_CCIR2;
}
else
{
cTV_Max=82;
cTV_Min=0;
DK_CCIR=DK_CCIR1;
}
#endif
#ifdef PAL
cTV_Max=TV_MAX;
cTV_Min=TV_MIN;
#endif
// TR1=0;
for(i=cTV_Min; i<=cTV_Max; i++)
{
if((ir_data==REMOTE_KEY_DEC_P)||(ir_data==REMOTE_KEY_INC_P)||(ir_data==REMOTE_KEY_DECR))break;
//p = DK_CCIR + i; //MainLand China
wTVFreq = *(DK_CCIR+i);
wTVFreqMin=wTVFreq-20;
// ClosePanel();
OSDTVShowChannel(19,5,COL_NORMAL,i+1);
//OSDTVShowChannel(19,5,COL_TITLE,i+1); Kuo
bTVFound=ChannelSel(&wTVFreq, wTVFreqMin);
if(bTVFound)
{
EX1=1;
twdDelay(100); //500
/*m_cBuff[3]*/j=TunerReadByte(0x86);
if(!(j&0x80))
bTVFound=0;
}
if(bTVFound)
{
//
if((I2CReadByte(VIDEO_ADDR,0x3A)&0x06)==0x06)
{
//sync ok
//GetSyncPeriodCnt(&m_dwVFrameCntPre, &m_dwVFrameCntPre);
//GetSyncPeriodCnt(&m_dwVFrameCntPre, &m_wHSyncPeriodPre);
// if(cTVNum==0)
{
EX1=1;
twdDelay(200);
// SrcControl();
SourceSelect();
}
// I2CWriteByte(TW702,0x91, 0x0c);
EEPSaveTVChannel(i, wTVFreq);
OSDTVShowChannel(19,1,COL_NORMAL,cTVNum+1);
//OSDTVShowChannel(19,1,COL_TITLE,cTVNum+1); //Kuo
cTVNum++;
OSDDrawTVFreq(wTVFreq);
#ifdef TV
OSDDrawBand(wTVFreq);
#endif
EX1=1;
twdDelay(500); //1000
}
else
{
EEPSaveTVChannel(i, wTVFreq|0x8000);
OSDDrawTVFreq(wTVFreq);
#ifdef PAL
OSDDrawBand(wTVFreq);
#endif
}
// return;
}
else
{
EEPSaveTVChannel(i, wTVFreq|0x8000);
OSDDrawTVFreq(wTVFreq);
#ifdef PAL
OSDDrawBand(wTVFreq);
#endif
}
}
// return;
// OpenPanel(); // ruby
I2CWriteByte(TW101,0x91, 0x0c);
I2CWriteByte(EEPVIDEOBLOCK, 0x00, cTVNum);
twdDelay(NVRDELAY);
I2CWriteByte(EEPVIDEOBLOCK, 0x01, 1);
// AdjTVChannel(0, 0);
wTVFreq=TVSetChannel(1);
SetTuner(wTVFreq);
OSDExit();
// SrcSelect(1) ;
SourceSelect();
// TR1=1;
}
/*
void AutoScan(void)
{
uWORD wTVFreq=TVFREQ_BEGIN;
uWORD wTVFreqMin;
uCHAR cTVNum=0;
bit bTVFound;
while(wTVFreq<=TVFREQ_END)
{
wTVFreqMin=wTVFreq-20;
bTVFound=ChannelSel(&wTVFreq, wTVFreqMin);
if(bTVFound)
{
twdDelay(300); //500
m_cBuff[3]=TunerReadByte(0x86);
if(!(m_cBuff[3]&0x80))
bTVFound=0;
}
if(bTVFound)
{
//twdDelay(100);
if((I2CReadByte(0x42,0x1f)&0x41)==0x01)
{
//sync ok
//GetSyncPeriodCnt(&m_dwVFrameCntPre, &m_dwVFrameCntPre);
//GetSyncPeriodCnt(&m_dwVFrameCntPre, &m_wHSyncPeriodPre);
if(cTVNum==0)
{
twdDelay(200);
SrcControl();
}
EEPSaveTVChannel(cTVNum, wTVFreq);
cTVNum++;
OSDDrawTVFreq(wTVFreq);
// OSDDrawBand(wTVFreq);
twdDelay(500); //1000
}
}
wTVFreq+=40;
}
I2CWriteByte(EEPVIDEOBLOCK, 0x00, cTVNum);
twdDelay(NVRDELAY);
I2CWriteByte(EEPVIDEOBLOCK, 0x01, cTVNum);
}
*/
//p = CATV_CH_Tbl + ch; //Taiwan? CATV_CH_Tbl
BOOL ChannelSel(uWORD *wTVFreq, uWORD wTVFreqMin)
{
uCHAR cTemp, cTemp1,i;
SetTuner(*wTVFreq);
OSDDrawTVFreq(*wTVFreq);
#ifdef PAL
OSDDrawBand(*wTVFreq);
#endif
EX1=1;
twdDelay(1000); //2000
cTemp=TunerReadByte(0x86);
m_cBuff[0]=cTemp;
if(!(m_cBuff[0]&0x80))
return FALSE;
else
{
m_cBuff[0]=(m_cBuff[0]&0x1E)>>1;
if(m_cBuff[0]==0x00||m_cBuff[0]==0x0F)
return TRUE;
}
m_cBuff[0]=0;
for(i=0;i<10;i++)
{
twdDelay(20);
m_cBuff[0]|=I2CReadByte(0xb8,0x3a);
}
// if(!(m_cBuff[0]&0x06))return FALSE;
i=0;
while((*wTVFreq>=wTVFreqMin)&&(*wTVFreq<=wTVFreqMin+40)&&(i<20))
{
if(cTemp&0x80)//Lock
{
cTemp1=(cTemp&0x1E)>>1;
if(cTemp1==0x00||cTemp1==0x0F)
return TRUE;
else if(cTemp1==0x01)
(*wTVFreq)++;
else if(cTemp1==0x02||cTemp1==0x03)
(*wTVFreq)+=2;
else if(cTemp1==0x04||cTemp1==0x05||cTemp1==0x06)
(*wTVFreq)+=3;
else if(cTemp1==0x07)
(*wTVFreq)+=4;
else if(cTemp1==0x08)
(*wTVFreq)-=4;
else if(cTemp1==0x09||cTemp1==0x0A||cTemp1==0x0B)
(*wTVFreq)-=3;
else if(cTemp1==0x0C||cTemp1==0x0D)
(*wTVFreq)-=2;
else if(cTemp1==0x0E)
(*wTVFreq)--;
}
else
break;
//{
// wTVFreq+=4;
i++;
SetTuner(*wTVFreq);
OSDDrawTVFreq(*wTVFreq);
#ifdef PAL
OSDDrawBand(*wTVFreq);
#endif
EX1=1;
twdDelay(300); //1000
cTemp=TunerReadByte(0x86);
}
return FALSE;
}
void SetTuner(uWORD wChanneF)
{
#if 1
uCHAR k;
#ifdef PAL
I2CWriteByte(0x86, 0x00,0xd6);
I2CWriteByte(0x86, 0x01,0x70);
I2CWriteByte(0x86, 0x02,m_cSoundSystem);
#endif
#ifdef NTSC
// I2CWriteByte(0x86, 0x00,0xd6);
// I2CWriteByte(0x86, 0x01,0x70);
// I2CWriteByte(0x86, 0x02,0x0f);
I2CWriteByte(0x86, 0x00,0x16);
I2CWriteByte(0x86, 0x01,0x30);
I2CWriteByte(0x86, 0x02,0x04);//IF 45.75MHz
#endif
wChanneF&=0x7fff;
if(wChanneF < VLMAX)
k=BAND_VL;
else if(wChanneF > VHMAX)
k=BAND_UHF;
else
k=BAND_VH;
#ifdef NTSC
wChanneF-=0x7c;
#endif
TunerWriteByte(0xC6,(uCHAR)(wChanneF>>8),(uCHAR)(wChanneF&0x00FF),k);
#endif
}
uCHAR TVEEPGetChannel(void)
{
uCHAR cTotal, cNum;
// cTotal = I2CReadByte(EEPVIDEOBLOCK, 0x00);
// twdDelay(NVRDELAY);
cNum = I2CReadByte(EEPVIDEOBLOCK, 0x01);
if((cNum>cTotal)||(cNum<1))
{
// cNum=1;
// twdDelay(NVRDELAY);
// I2CWriteByte(EEPVIDEOBLOCK, 0x00, cNum);
// twdDelay(NVRDELAY);
// I2CWriteByte(EEPVIDEOBLOCK, 0x01, cNum);
// twdDelay(NVRDELAY);
// I2CWriteByte(EEPVIDEOBLOCK, idTVCHANNEL_STAT+(cNum-1)*2, (uCHAR)(TVFREQ_BEGIN>>8));
// twdDelay(NVRDELAY);
// I2CWriteByte(EEPVIDEOBLOCK, idTVCHANNEL_STAT+(cNum-1)*2+1, (uCHAR)(TVFREQ_BEGIN&0x00FF));
}
return cNum;
}
uWORD TVSetChannel(uCHAR cNum)
{
uWORD wTemp;
twdDelay(NVRDELAY);
if(m_bAir_Cable)
{
wTemp=I2CReadByte(EEPVIDEOBLOCK, idTVCHANNEL_STAT+cNum*2);
wTemp<<=8;
twdDelay(NVRDELAY);
wTemp|=I2CReadByte(EEPVIDEOBLOCK, idTVCHANNEL_STAT+cNum*2+1);
}
else
{
wTemp=I2CReadByte(EEPVIDEOBLOCK+2, idTVCHANNEL_STAT+cNum*2);
wTemp<<=8;
twdDelay(NVRDELAY);
wTemp|=I2CReadByte(EEPVIDEOBLOCK+2, idTVCHANNEL_STAT+cNum*2+1);
}
// SetTuner(wTemp);
//I2CWriteByte(EEPVIDEOBLOCK, 0x01,cTemp1);
return wTemp;
}
void ResetTVChannel(void)
{
uCHAR i;
OSDShowRESET(0);
OSDResetVideoData();
OSDSetVideoValues();
EEPSaveVideoData();
#ifdef NTSC
m_bAir_Cable=0;
for(i=0;i<83;i++)EEPSaveTVChannel(i, DK_CCIR1[i]);
m_bAir_Cable=1;
for(i=0;i<99;i++)EEPSaveTVChannel(i, DK_CCIR2[i]);
i=I2CReadByte(EEPVIDEOBLOCK, idVIDEO_FLAG_INDEX);
i|=0x01;
I2CWriteByte(EEPVIDEOBLOCK, idVIDEO_FLAG_INDEX,i);
OSDShowTVSource(0);
#endif
#ifdef PAL
for(i=0;i<96;i++)EEPSaveTVChannel(i, DK_CCIR[i]);
#endif
OSDShowRESET(1);
}
#if 0
void SetChannel(uCHAR cChannel)
{
unsigned int *p;
p = DK_CCIR + cChannel;
SetTuner(*p);
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -