📄 rf_tuner_atsc.c
字号:
/******************************************************************************
Copyright (c) 2006 MStar Semiconductor, Inc.
All rights reserved.
[Module Name]: Tuner_ATSC.c
[Date]: 28-Aug-2006
[Comment]:
TV tuner header file.
[Reversion History]:
*******************************************************************************/
#ifndef _TUNER_ATSC_C_
#define _TUNER_ATSC_C_
#include <math.h>
#include "datatype.h"
//#include "drviic.h"
#include "RF_Tuner_ATSC.h"
#include "msKeypad.h"
/*------------------------------------------------------//
// + Set_Tuner_Freq
// : Call the function for the tuner setup, which is implemented in Tuner.cpp
//
// + Input : float - frequency to tune //Khz
// + Input : EN_DEMOD_TYPE - modulation type
// + Return : BOOLEAN
//------------------------------------------------------*/
BOOLEAN Set_Tuner_Freq(U16 u16Frequency, EN_DEMOD_TYPE enModulation)
{
U32 freq;
U16 step_num;
U8 dataTune[6];
#if (FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER)
static U8 prevBandSwitchByte;
BOOLEAN IsBandSwitch;
#elif (FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
U32 u32Temp;
#endif
freq=(U32)(u16Frequency)*FREQ_STEP;
#if (FRONTEND_TUNER_TYPE == THOMSON_DTT7630_TUNER)
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f; //DB1
dataTune[1] = LOWBYTE(step_num); //DB2
dataTune[2] = 0x8E;
if (enModulation!=DEMOD_TYPE_NTSC)//VSB, QAM
{
if(freq < 153000) dataTune[3] = 0x39; //BB
else if (freq < 423000) dataTune[3] = 0x3a;
else dataTune[3] = 0x3c;
}
else //NTSC
{
if(freq < 151250) dataTune[3] = 0x11; //BB
else if (freq < 421250) dataTune[3] = 0x12;
else dataTune[3] = 0x14;
}
//no need to send sub address
if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 4, dataTune) == FALSE)
return FALSE;
dataTune[0] = 0x9E; //CB
dataTune[1] = 0xC0; //BB
if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
return FALSE;
/*
dataTune[0] = 0x9E;
dataTune[1] = 0xC0;
if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
return LGDT_ERR_I2C;
*/
#elif (FRONTEND_TUNER_TYPE == PHILIPS_FQD1236_TUNER)
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f; //DB1
dataTune[1] = LOWBYTE(step_num); //DB2
dataTune[2] = 0x86; //CB
if(freq < 160000) dataTune[3] = 0x01; //BB
else if (freq < 450000) dataTune[3] = 0x02;
else dataTune[3] = 0x04;
//no need to send sub address
if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 4, dataTune) == FALSE)
{
return FALSE;
}
/*
dataTune[0] = 0xB6; //CB
dataTune[1] = 0xA0; //AB
if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
{
return LGDT_ERR_I2C;
}
*/
#elif (FRONTEND_TUNER_TYPE == ALPS_TDQU4_TUNER)
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f; //DB1
dataTune[1] = LOWBYTE(step_num); //DB2
dataTune[2] = 0x8B; //CONTROL1
if(freq < 82000) dataTune[3] = 0x60; //CONTROL2
else if (freq < 88000) dataTune[3] = 0x61;
else if (freq < 162000) dataTune[3] = 0x60;
else if (freq < 426000) dataTune[3] = 0x62;
else if (freq < 782000) dataTune[3] = 0xAA;
else dataTune[3] = 0x2A;
if (enModulation!=DEMOD_TYPE_NTSC)
dataTune[4] = 0xC6; //CONTROL3
else
dataTune[4] = 0xE6; //CONTROL3
//no need to send sub address
if(MDrv_IIC_WriteBytes(ALPS_TDQU4_devAddr, 0, NULL, 5, dataTune) == FALSE)
{
return FALSE;
}
#elif (FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f; //DB1
dataTune[1] = LOWBYTE(step_num); //DB2
dataTune[2] = 0xC3;
dataTune[3] = DRV_TDA6651_GetChargePumpData(freq);
if (enModulation!=DEMOD_TYPE_NTSC)//VSB, QAM
dataTune[4] = 0x82;
else
dataTune[4] = 0x83;
u32Temp = (((U32)dataTune[0])<<24) | (((U32)dataTune[1])<<16) | (((U32)dataTune[2])<<8) | ((U32)dataTune[3]);
if(MDrv_IIC_Write4Bytes(SAMSUNG_TUNER_I2C_ADDR, u32Temp, dataTune[4])==FALSE)
{
return FALSE;
}
#elif (FRONTEND_TUNER_TYPE == NXP_TD1636ALMK2_TUNER)
{
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 50Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 50Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f; //DB1
dataTune[1] = LOWBYTE(step_num); //DB2
dataTune[2] = 0xC0; // CB
// Set AGC according demod type
dataTune[3] = 0x04; // BB
switch(enModulation)
{
case DEMOD_TYPE_NTSC:
dataTune[3] |= (BIT4 | BIT3);
break;
case DEMOD_TYPE_8VSB:
dataTune[3] |= BIT4 ;
break;
case DEMOD_TYPE_64QAM:
case DEMOD_TYPE_256QAM:
dataTune[3] |= BIT3;
break;
}
// Set Band Select bit
dataTune[3] &= 0xFC;
if(u16Frequency < (164000/FREQ_STEP)) // Low band < 164MHz
dataTune[3] |= BIT0;
else if(u16Frequency < (458000/FREQ_STEP)) // Mid band < 458MHz
dataTune[3] |= BIT1;
else // Hi Band
dataTune[3] |= 0x00;
if(MDrv_IIC_WriteBytes(NXP_TUNER_I2C_ADDR, 0, NULL, 4, dataTune) == FALSE)
{
return FALSE;
}
}
#elif (FRONTEND_TUNER_TYPE == SHARP_VA1Y2UR2201_TUNER)
//F_osc = RF + IF
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f;
dataTune[1] = LOWBYTE(step_num);
if(freq < 150000) //Khz
{
dataTune[2] =0x85;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x33;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x32;
dataTune[4] =0x53;
}
}
else if (freq < 162000)
{
dataTune[2] =0xA5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x33;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x32;
dataTune[4] =0x53;
}
}
else if (freq < 342000)
{
dataTune[2] =0x85;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x75;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x74;
dataTune[4] =0x53;
}
}
else if (freq < 402000)
{
dataTune[2] =0xA5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x75;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x74;
dataTune[4] =0x53;
}
}
else if (freq < 414000)
{
dataTune[2] =0xC5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x75;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x74;
dataTune[4] =0x53;
}
}
else if (freq < 426000)
{
dataTune[2] =0xE5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] = 0x75;
dataTune[4] = 0x43;
}
else
{
dataTune[3] =0x74;
dataTune[4] =0x53;
}
}
else if (freq < 672000)
{
dataTune[2] =0xA5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] =0xB9;
dataTune[4] =0x43;
}
else
{
dataTune[3] =0xB8;
dataTune[4] =0x53;
}
}
else if (freq < 852000)
{
dataTune[2] =0xC5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] =0xB9;
dataTune[4] =0xC3;
}
else
{
dataTune[3] =0xB8;
dataTune[4] =0xD3;
}
}
else
{
dataTune[2] =0xE5;
if (enModulation == DEMOD_TYPE_NTSC)
{
dataTune[3] =0xB9;
dataTune[4] =0xC3;
}
else
{
dataTune[3] =0xB8;
dataTune[4] =0xD3;
}
}
dataTune[5] = (enModulation == DEMOD_TYPE_NTSC) ? 0x30 : 0x80;
/* 1st Tuner Control - Band Control */
if(MDrv_IIC_WriteBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 6, dataTune) == FALSE)
{
return FALSE;
}
//MDrv_Timer_Delayms(20);
/* 2nd Tuner Control - AGC Control */
dataTune[4] |= 0x20;
if(MDrv_IIC_WriteBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 6, dataTune) == FALSE)
{
return FALSE;
}
#elif (FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER)
enModulation=enModulation;
step_num = IF_STEP+u16Frequency; //PLL step size = 62.5Khz
//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5); //PLL step size = 62.5Khz
dataTune[0] = HIGHBYTE(step_num)&0x7f;
dataTune[1] = LOWBYTE(step_num);
dataTune[2] = 0xCE; //CB
if((freq) < 165000) dataTune[3] = 0x01; //BB
else if ((freq) < 450000) dataTune[3] = 0x02;
else dataTune[3] = 0x04;
if(prevBandSwitchByte != dataTune[3])
IsBandSwitch = TRUE;
else
IsBandSwitch = FALSE;
prevBandSwitchByte = dataTune[3];
//no need to send sub address
if(MDrv_IIC_WriteBytes(LG_TUNER_I2C_ADDR, 0, NULL, 4, dataTune) == FALSE)
return FALSE;
dataTune[0] = 0xDE; //CB
if (enModulation==DEMOD_TYPE_256QAM || enModulation==DEMOD_TYPE_64QAM)
dataTune[1] = 0x20; //AB
else
dataTune[1] = 0x50; //AB
if(MDrv_IIC_WriteBytes(LG_TUNER_I2C_ADDR, 0, NULL, 2, dataTune) == FALSE)
return FALSE;
if(IsBandSwitch == TRUE) MDrv_Timer_Delayms(100);
#endif
return TRUE;
}
#if( (FRONTEND_TUNER_TYPE==THOMSON_DTT7630_TUNER)||(FRONTEND_TUNER_TYPE==PHILIPS_FQD1236_TUNER)||(FRONTEND_TUNER_TYPE==LG_TDVS_H703P_TUNER))
BOOLEAN TDA9885_Init(void)
{
U8 addr;
U8 reg[3];
addr = 0x00;
reg[0] = 0xD5;//0x16//0x17
reg[1] = 0x30;//0x30//0x12
reg[2] = 0x04;//0x44//0x45
return MDrv_IIC_WriteBytes(TDA9885_devAddr, 1, &addr, 3, reg);
}
#endif
#if(FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
U8 DRV_TDA6651_GetChargePumpData(U32 u32freq)
{
float freq;
U8 pChargePumpValue;
freq = (float)u32freq / 1000;
if ((freq>36.0) && (freq<=170.0))
{
if ((freq>36.0) && (freq<=48.0))
pChargePumpValue = 1;
else if ((freq>48.0) && (freq<=100.0))
pChargePumpValue = 2;
else if ((freq>100.0) && (freq<=112.0))
pChargePumpValue = 3;
else if ((freq>112.0) && (freq<=132.0))
pChargePumpValue = 4;
else if ((freq>132.0) && (freq<=140.0))
pChargePumpValue = 5;
else if ((freq>140.0) && (freq<=170.0))
pChargePumpValue = 6;
pChargePumpValue = (pChargePumpValue << 5) | 0x01;
}
else if ((freq>170.0) && (freq<=469.0))
{
if ((freq>169.0) && (freq<=180.0))
pChargePumpValue = 1;
else if ((freq>180.0) && (freq<=252.0))
pChargePumpValue = 2;
else if ((freq>252.0) && (freq<=360.0))
pChargePumpValue = 3;
else if ((freq>360.0) && (freq<=404.0))
pChargePumpValue = 4;
else if ((freq>404.0) && (freq<=428.0))
pChargePumpValue = 5;
else if ((freq>428.0) && (freq<=440.0))
pChargePumpValue = 6;
else if ((freq>440.0) && (freq<=469.0))
pChargePumpValue = 7;
pChargePumpValue = (pChargePumpValue << 5) | 0x02;
}
else if ((freq>469.0) && (freq<=864.0))
{
if ((freq>469.0) && (freq<=560.0))
pChargePumpValue = 3;
else if ((freq>560.0) && (freq<=632.0))
pChargePumpValue = 4;
else if ((freq>632.0) && (freq<=708.0))
pChargePumpValue = 5;
else if ((freq>708.0) && (freq<=824.0))
pChargePumpValue = 6;
else if ((freq>824.0) && (freq<=864.0))
pChargePumpValue = 7;
pChargePumpValue = (pChargePumpValue << 5) | 0x08;
}
else
{
pChargePumpValue = 1;
}
return pChargePumpValue;
}
#endif
BOOLEAN NTSC_IF_ReadStatus(U8 * AFT_Status)
{
#if ((FRONTEND_TUNER_TYPE == THOMSON_DTT7630_TUNER)||(FRONTEND_TUNER_TYPE == PHILIPS_FQD1236_TUNER)||(FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER))
U8 I2C_RESULT;
I2C_RESULT=MDrv_IIC_ReadBytes(TDA9885_devAddr, 0, NULL, 1, AFT_Status);
if(TRUE==I2C_RESULT)
return TRUE;
else
return FALSE;
#if 0
LG3303_DEBUG(printf("\nstatus = 0x%02bx\n", status));
LG3303_DEBUG(printf("after power on : %bu\n", status&0x01 ));
LG3303_DEBUG(printf("afc offset : %bu\n", (status>>1)&0x0f ));
LG3303_DEBUG(printf("fm det : %bu\n", (status & 0x20)>>5 ));
LG3303_DEBUG(printf("vif level : %bu\n", (status & 0x40)>>6 ));
LG3303_DEBUG(printf("afc window : %bu\n", (status & 0x80)>>7 ));
#endif
#elif (FRONTEND_TUNER_TYPE == SHARP_VA1Y2UR2201_TUNER)
if(MDrv_IIC_ReadBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 1, AFT_Status) == FALSE)
return FALSE;
else
return TRUE;
#else
*AFT_Status=*AFT_Status;
#endif
return FALSE;
}//IF_ReadStatus
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -