📄 tuner.c
字号:
/*******************************************************************************
TUNER.C
Copyright (c) HIMAX Technologies Inc. All rights reserved.
*******************************************************************************/
#include "intrins.h"
#include "MCU_IO.h"
#include "COMMON.H"
#include "Key.H"
#include "MAIN.H"
#include "i2c_control.h"
#include "HX8824.h"
#include "OSD.h"
#include "rs232.h"
#define PHILIPS_TUNER 0xC2 // AS pin floating
#define PHILIPS_CONTROL 0xCE // 0x86 taylor 2006/02/06
#define TUNER 1
#if (TUNER == 0)//Long
#define PHILIPS_LOW_BAND 0xA0//Philips Tuner Low Bank Byte
#define PHILIPS_MID_BAND 0x90//Philips Tuner Middle Bank Byte
#define PHILIPS_HIGH_BAND 0x30//Philips Tuner High Bank Byte
#define PHILIPS_DIV_ML 0x0CDC//Philips Tuner division between Low Bank and Middle Bank
#define PHILIPS_DIV_HM 0x1F3C//Philips Tuner division between Middle Bank and High Bank
#endif
#if (TUNER == 1)//Short
#define PHILIPS_LOW_BAND 0x01//Philips Tuner Low Bank Byte
#define PHILIPS_MID_BAND 0x02//Philips Tuner Middle Bank Byte
#define PHILIPS_HIGH_BAND 0x04//Philips Tuner High Bank Byte
#define PHILIPS_DIV_ML 0x0D0E //Philips Tuner division between Low Bank and Middle Bank
#define PHILIPS_DIV_HM 0x1E7C//Philips Tuner division between Middle Bank and High Bank
#endif
/* -------------------------------------------------------------------
Name :
Purpose : Define Tuner table
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
code unsigned char BIT_OPOR[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
code unsigned char BIT_OPAND[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code unsigned int NTSC_J_CATV[126] = {
0x0650,0x06b0,0x0710,0x0770,0x07b0,0x0810,0x0890,0x08f0,0x0950,0x09b0,
0x0a10,0x0a70,0x0ad0,0x0b30,0x0b90,0x0bf0,0x0c50,0x0cb0,0x0d10,0x0d70,
0x0dd0,0x0e30,0x0e90,0x0ef0,0x0f50,0x0fb0,0x1010,0x1070,0x10d0,0x1130,
0x1190,0x11f0,0x1250,0x12b0,0x1310,0x1370,0x13d0,0x1430,0x1490,0x14f0,
0x1550,0x15b0,0x1610,0x1670,0x16d0,0x1730,0x1790,0x17f0,0x1850,0x18b0,
0x1910,0x1970,0x19d0,0x1a30,0x1a90,0x1af0,0x1b50,0x1bb0,0x1c10,0x1c70,
0x1cd0,0x1d30,0x1d90,0x1df0,0x1e50,0x1eb0,0x1f10,0x1f70,0x1fd0,0x2030,
0x2050,0x20b0,0x2110,0x2170,0x21d0,0x2230,0x2290,0x22f0,0x2350,0x23b0,
0x2410,0x2470,0x24d0,0x2530,0x2590,0x25f0,0x2650,0x26b0,0x2710,0x2770,
0x27d0,0x2830,0x2890,0x28f0,0x2950,0x29b0,0x2a10,0x2a70,0x2ad0,0x2b30,
0x2b90,0x2bf0,0x2c50,0x2cb0,0x2d10,0x2d70,0x2dd0,0x2e30,0x2e90,0x2ef0,
0x2f50,0x2fb0,0x3010,0x3070,0x30d0,0x3130,0x3190,0x31f0,0x3250,0x32b0,
0x3310,0x3370,0x33d0,0x3430,0x3490,0x34f0};
code unsigned int NTSC_J_AIRTV[60] = {
0x0650,0x06b0,0x0710,0x07b0,0x0810,0x0dd0,0x0e30,0x0e90,0x0ef0,0x0f50,
0x0fb0,0x1010,0x2050,0x20b0,0x2110,0x2170,0x21d0,0x2230,0x2290,0x22f0,
0x2350,0x23b0,0x2410,0x2470,0x24d0,0x2530,0x2590,0x25f0,0x2650,0x26b0,
0x2710,0x2770,0x27d0,0x2830,0x2890,0x28f0,0x2950,0x29b0,0x2a10,0x2a70,
0x2ad0,0x2b30,0x2b90,0x2bf0,0x2c50,0x2cb0,0x2d10,0x2d70,0x2dd0,0x2e30,
0x2e90,0x2ef0,0x2f50,0x2fb0,0x3010,0x3070,0x30d0,0x3130,0x3190,0x31f0};
code unsigned int NTSC_M_CATV[125] = {
0x0770,0x0650,0x06B0,0x0710,0x07B0,0x0810,0x0DD0,0x0E30,0x0E90,0x0EF0,
0x0F50,0x0FB0,0x1010,0x0A70,0x0AD0,0x0B30,0x0B90,0x0BF0,0x0C50,0x0CB0,
0x0D10,0x0D70,0x1070,0x10D0,0x1130,0x1190,0x11F0,0x1250,0x12B0,0x1310,
0x1370,0x13D0,0x1430,0x1490,0x14F0,0x1550,0x15B0,0x1610,0x1670,0x16D0,
0x1730,0x1790,0x17F0,0x1850,0x18B0,0x1910,0x1970,0x19D0,0x1A30,0x1A90,
0x1AF0,0x1B50,0x1BB0,0x1C10,0x1C70,0x1CD0,0x1D30,0x1D90,0x1DF0,0x1E50,
0x1EB0,0x1F10,0x1F70,0x1FD0,0x2030,0x2090,0x20F0,0x2150,0x21B0,0x2210,
0x2270,0x22D0,0x2330,0x2390,0x23F0,0x2450,0x24B0,0x2510,0x2570,0x25D0,
0x2630,0x2690,0x26F0,0x2750,0x27B0,0x2810,0x2870,0x28D0,0x2930,0x2990,
0x29F0,0x2A50,0x2AB0,0x2B10,0x0890,0x08F0,0x0950,0x09B0,0x0A10,0x2B70,
0x2BD0,0x2C30,0x2C90,0x2CF0,0x2D50,0x2DB0,0x2E10,0x2E70,0x2ED0,0x2F30,
0x2F90,0x2FF0,0x3050,0x30B0,0x3110,0x3170,0x31D0,0x3230,0x3290,0x32F0,
0x3350,0x33B0,0x3410,0x3470,0x34D0};
code unsigned int NTSC_M_AIRTV[69] = {
0x0770,0x0650,0x06B0,0x0710,0x07B0,0x0810,0x0DD0,0x0E30,0x0E90,0x0EF0,
0x0F50,0x0FB0,0x1010,0x2050,0x20B0,0x2110,0x2170,0x21D0,0x2230,0x2290,
0x22F0,0x2350,0x23B0,0x2410,0x2470,0x24D0,0x2530,0x2590,0x25F0,0x2650,
0x26B0,0x2710,0x2770,0x27D0,0x2830,0x2890,0x28F0,0x2950,0x29B0,0x2A10,
0x2A70,0x2AD0,0x2B30,0x2B90,0x2BF0,0x2C50,0x2CB0,0x2D10,0x2D70,0x2DD0,
0x2E30,0x2E90,0x2EF0,0x2F50,0x2F50,0x3010,0x3070,0x30D0,0x3130,0x3190,
0x31F0,0x3250,0x32B0,0x3310,0x3370,0x33D0,0x3430,0x3490,0x34f0};
code unsigned int PAL_CHINA_TV[125] = {
0x058A,0x060A,0x068A,0x0742,0x07C2,0x0CF2,0x0D72,0x0DF2,0x0E72,0x0EF2,
0x0F72,0x0FF2,0x1FE2,0x2062,0x20E2,0x2162,0x21E2,0x2262,0x22E2,0x2362,
0x23E2,0x2462,0x24E2,0x2562,0x2862,0x28E2,0x2962,0x29E2,0x29D2,0x2AE2,
0x2B62,0x2BE2,0x2C62,0x2CE2,0x2D62,0x2DE2,0x2E62,0x2EE2,0x2F62,0x2FE2,
0x3062,0x30E2,0x3162,0x31E2,0x3262,0x32E2,0x3362,0x33E2,0x3462,0x34E2,
0x3562,0x35E2,0x3662,0x36E2,0x3762,0x37E2,0x3862,0x38E2,0x3962,0x39E2,
0x3A62,0x3AE2,0x3B62,0x3BE2,0x3C62,0x3CE2,0x3D62,0x3DE2,0x0972,0x09F2,
0x0A72,0x0AF2,0x0B72,0x0BF2,0x0C72,0x1072,0x10F2,0x1172,0x11F2,0x1272,
0x12F2,0x1372,0x13F2,0x1472};
/* -------------------------------------------------------------------
Name : Tuner_Start
Purpose : Transmit I2C start to tuner
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
void Tuner_Start(void)
{
ioI2cSda = 1;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 1;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cSda = 0;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 0;
_nop_(); _nop_(); _nop_(); _nop_();
}
/* -------------------------------------------------------------------
Name : Tuner_Stop
Purpose : Transmit I2C stop to tuner
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
void Tuner_Stop(void)
{
ioI2cScl = 0;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cSda = 0;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 1;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cSda = 1;
_nop_(); _nop_(); _nop_(); _nop_();
}
/* -------------------------------------------------------------------
Name : Tuner_Data_In
Purpose : transmit I2C data to tuner
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
bit Tuner_Data_In(unsigned char bytedata)
{
unsigned char i;
bit ack;
for(i = 0; i < 8; i++) {
ioI2cSda=bytedata & 0x80;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 1;
bytedata <<= 1;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 0;
_nop_(); _nop_(); _nop_(); _nop_();
}
ioI2cSda = 1;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 1;
_nop_(); _nop_(); _nop_(); _nop_();
ack=ioI2cSda;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cScl = 0;
_nop_(); _nop_(); _nop_(); _nop_();
ioI2cSda = 0;
_nop_(); _nop_(); _nop_(); _nop_();
return ack;
}
/* -------------------------------------------------------------------
Name : Initial_Tuner
Purpose : initial tuner register
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
void Initial_Tuner(void)
{
#if (TUNER == 1)
TunerError:
Tuner_Start();
if(Tuner_Data_In(PHILIPS_TUNER)) //taylor 2006/02/06
goto TunerError;
if(Tuner_Data_In(0x86))
goto TunerError;
if(Tuner_Data_In(0x00))
goto TunerError;
if(Tuner_Data_In(0x16))
goto TunerError;
if(Tuner_Data_In(0x30))
goto TunerError;
if(Tuner_Data_In(0x44))
goto TunerError;
Tuner_Stop();
//Puts_UART("Initial TUNER OK!\r\n");
#endif
}
/* -------------------------------------------------------------------
Name : Set_Channel
Purpose :
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
void Set_Channel(unsigned char Channel_Number)
{
unsigned char BandSwitch;
unsigned int Devider;
// Puts_UART("Channel Number = ");HexTobyStr(Channel_Number);Puts_UART(byStr);Puts_UART("\r\n");
switch(TV_Mode)
{
case(TV_AIR):
Devider = NTSC_M_AIRTV[Channel_Number];
//Puts_UART("TV AIR!\r\n");
break;
case(CATV_STD):
Devider = NTSC_M_CATV[Channel_Number];
//Puts_UART("CATV!\r\n");
break;
default:
break;
}
if(Devider < PHILIPS_DIV_ML)
BandSwitch = PHILIPS_LOW_BAND;
else if(Devider < PHILIPS_DIV_HM)
BandSwitch = PHILIPS_MID_BAND;
else
BandSwitch = PHILIPS_HIGH_BAND;
TunerError:
Tuner_Start();
if(Tuner_Data_In(PHILIPS_TUNER))
goto TunerError;
if(Tuner_Data_In(Devider/256))
goto TunerError;
if(Tuner_Data_In(Devider%256))
goto TunerError;
if(Tuner_Data_In(PHILIPS_CONTROL))
goto TunerError;
if(Tuner_Data_In(BandSwitch))
goto TunerError;
#if (TUNER == 1)
if(Tuner_Data_In(0x00)) // 0x80 taylor 2006/02/06
goto TunerError;
#endif
Tuner_Stop();
//Puts_UART("set channel ok!\r\n");
}
/* -------------------------------------------------------------------
Name : Auto_Scan
Purpose : scan the channel if exist
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
void Auto_Scan(void)
{
unsigned char i, ch, lock, locktime, pre_channel;
unsigned char min_channel, max_channel;
pre_channel = Channel;
if(TV_Mode == TV_AIR)
{
min_channel = CHANNEL_AIR_MIN;
max_channel = CHANNEL_AIR_MAX; // 69
}
else
{
min_channel = CHANNEL_MIN;
max_channel = CHANNEL_MAX; // 125
}
for(i = min_channel; i < max_channel; i++)
{
Set_Channel(i);
ch = I2CReadByte(EEPROM_MCU | (((ChannelTable_EEPROM_Address() + i/8)/256)*2), (ChannelTable_EEPROM_Address() + i/8)); // 0x100;0x120
lock = locktime = 0;
do
{
DelayX10ms(5);
if((I2CReadByte(SAA7114_ADDR, 0x1F) & 0x01) == 0x01)
lock++;
locktime++;
}while((lock < 2) && (locktime < 5));
if(lock < 2)
ch = Set_Bit(ch, i % 8, 0); // store this channel no exist
else
ch = Set_Bit(ch, i % 8, 1); // store this channel exist
#if EEPROM
I2CWriteByte(EEPROM_MCU | (((ChannelTable_EEPROM_Address() + i/8)/256)*2), ChannelTable_EEPROM_Address() + i/8, ch);
//Puts_UART("Write to EEPROM_MCU");HexTobyStr(EEPROM_MCU);Puts_UART(byStr);Puts_UART("\r\n");
//Puts_UART("Write to EEPROM ChannelTable_EEPROM_Address");HexTobyStr((ChannelTable_EEPROM_Address()/256)*2);Puts_UART(byStr);Puts_UART("\r\n");
//Puts_UART("Write to EEPROM device addr ");HexTobyStr(EEPROM_MCU | (((ChannelTable_EEPROM_Address()+i/8)/256)*2));Puts_UART(byStr);Puts_UART("\r\n");
//Puts_UART("Write to EEPROM address");HexTobyStr(ChannelTable_EEPROM_Address()+i/8);Puts_UART(byStr);Puts_UART("\r\n");
//Puts_UART("Write to EEPROM value");HexTobyStr(ch);Puts_UART(byStr);Puts_UART("\r\n");
#endif
}
for(i = min_channel; i < max_channel; i++)
{
ch = I2CReadByte(EEPROM_MCU | (((ChannelTable_EEPROM_Address() + i/8)/256)*2), ChannelTable_EEPROM_Address() + ((pre_channel + i)%max_channel)/8);
if(Get_Bit(ch, i % 8))
break;
}
Channel = (pre_channel + i) % max_channel;
#if EEPROM
I2CWriteByte(EEPROM_MCU | (((Channel_EEPROM_Address()/256)*2)), Channel_EEPROM_Address(), Channel);
#endif
Set_Channel(Channel);
}
/* -------------------------------------------------------------------
Name : Channel_EEPROM_Address
Purpose : define the address in EEPROM
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
unsigned int Channel_EEPROM_Address(void)
{
//Puts_UART("EE_CHANNEL_AIR+TV_Mode= ");HexTobyStr(EE_CHANNEL_AIR+TV_Mode);Puts_UART(byStr);Puts_UART("\r\n");
return EE_CHANNEL_AIR + TV_Mode; //EE_CHANNEL_AIR = 0x82; TV_Mode = 0x00(AIR)/0x01(CATV)
}
/* -------------------------------------------------------------------
Name : ChannelTable_EEPROM_Address
Purpose :
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
unsigned int ChannelTable_EEPROM_Address(void)
{
return EE_TV_AIR_CHANNEL_TABLE + TV_Mode * 0x20; // EE_TV_AIR_CHANNEL_TABLE = 0x100
}
/* -------------------------------------------------------------------
Name : ChannelLockTable_EEPROM_Address
Purpose :
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
/*
unsigned int ChannelLockTable_EEPROM_Address(void)
{
return EE_AIR_CHANNEL_LOCK_TABLE+TV_Mode*0x20;
}
*//* -------------------------------------------------------------------
Name : Get_Bit
Purpose :
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
bit Get_Bit(unsigned char bytedata, unsigned char bit_pos)
{
return ((bytedata & BIT_OPOR[bit_pos]) != 0);
}
/* -------------------------------------------------------------------
Name : Set_Bit
Purpose :
Passed :
Returns :
Notes :
------------------------------------------------------------------- */
unsigned char Set_Bit(unsigned char bytedata, unsigned char bit_pos, bit set)
{
unsigned char retdata;
retdata = bytedata & BIT_OPAND[bit_pos];
if(set)
retdata = retdata | BIT_OPOR[bit_pos];
return retdata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -