DVB-C TUNER RF_SHARP_6093驱动代码指南
#include "gx1001.h"
#include "init_stb.h"
#include "gx_tuner.h"
#if (GX1001_TUNER == RF_SHARP_6093)
#define GX_TUNER_ADDRESS 0xC0
u32 g_nOscFreqValue = 28636;
u32 g_nIFFreqValue = 36125;
U16 GX_TS_OUTPUT_MODE = 1; // 1: Parallel output, 0: Serial output
S32 GX_PLL_M_VALUE =0x0b; // This parameter is effective only for GX1001B
S32 GX_PLL_N_VALUE =0x00; // This parameter is effective only for GX1001B
S32 GX_PLL_L_VALUE =0x05; // This parameter is effective only for GX1001B
S32 GX_RF_AGC_MIN_VALUE =0x00; // This parameter is effective only for GX1001B
S32 GX_RF_AGC_MAX_VALUE =0xff; // This parameter is effective only for GX1001B
S32 GX_IF_AGC_MIN_VALUE =0x00; // This parameter is effective only for GX1001B
S32 GX_IF_AGC_MAX_VALUE =0xff; // This parameter is effective only for GX1001B
/*AGC parameter*/
#if 0
u8 g_chAgcStd = 0x1F;
u8 g_chDAgcStd = 0x57;
u8 g_chAdcFixGain = 2;
u8 g_chDoubleAgcSel = SINGLE;
u16 g_wRepeateTime=250;
u8 g_chAdcSelect=SINGLE;
u8 g_chAdcXOSelect=LOW;
u8 g_chTSOutConf0 = 0x10;
u8 g_chTSOutConf1 = 0x32;
u8 g_chTSOutConf2 = 0x54;
u8 g_chTSOutConf3 = 0x76;
u8 g_chTSOutConf4 = 0x98;
u8 g_chTSOutConf5 = 0x0A;
s32 SIGNAL_C0=130;
s32 SIGNAL_C1=61, SIGNAL_A1=-7;
s32 SIGNAL_C2=108, SIGNAL_A2=-27;
s32 SIGNAL_C3=14, SIGNAL_A3=9;
s32 SIGNAL_C4=119, SIGNAL_A4=-6;
s32 SIGNAL_WORD = 0xDF;
s8 g_SFEnable = DISABLE;
s8 g_FMEnable = ENABLE;
#endif
/*
***********************************************************************************************************************************
Function: init the GX1501 chip
Input:
chip work mode: DTMB or DVB_C
Output:
SUCCESS or FAILURE
***********************************************************************************************************************************
*/
//GX1501_STATE GX1501_Init_Chip(CHIP_WORK_MODE_t ChipWorkMode)
GX_STATE GX_Init_Chip (void)
{
int UCtmp=FAILURE;
UCtmp = GX_Set_AGC_Parameter(); //Set AGC parameter
if (SUCCESS == UCtmp)
{
UCtmp = GX_SetOSCFreq(); /* set crystal frequency */
if (SUCCESS == UCtmp)
{
UCtmp = GX_Set_OutputMode(GX_TS_OUTPUT_MODE); /* set the TS output mode */
}
}
if( ( NEWONE == GX_Get_Version())&&( SUCCESS == UCtmp ) )
{
UCtmp = GX_Set_Digital_AGC(ENABLE);
if(UCtmp==FAILURE)return UCtmp;
UCtmp = GX_Set_RF_Min(GX_RF_AGC_MIN_VALUE);
if(UCtmp==FAILURE)return UCtmp;
UCtmp = GX_Set_RF_Max(GX_RF_AGC_MAX_VALUE);
if(UCtmp==FAILURE)return UCtmp;
UCtmp = GX_set_IF_Min(GX_IF_AGC_MIN_VALUE);
if(UCtmp==FAILURE)return UCtmp;
UCtmp = GX_set_IF_Max(GX_IF_AGC_MAX_VALUE);
if(UCtmp==FAILURE)return UCtmp;
UCtmp = GX_Set_Pll_Value(GX_PLL_M_VALUE,GX_PLL_N_VALUE,GX_PLL_L_VALUE);
if(UCtmp==FAILURE)return UCtmp;
}
return UCtmp;
}
/*
***********************************************************************************************************************************
Function: GX1501_Set_RfFreq
Input:
RFfreq-- RF freq (unit:kHz)
Output:
SUCCESS or FAILURE
***********************************************************************************************************************************
*/
GX_STATE GX_Set_RFFrequency(u32 nRFfreq)
{
GX_STATE state = FAILURE;
u8 chRegData[10] = {0};
u32 nFreq = 0;
if(0 == nRFfreq)
{
return FAILURE;
}
chRegData[0] = GX_TUNER_ADDRESS;
nFreq = (u32)(((nRFfreq + g_nIFFreqValue)*24/4+500)/1000);
chRegData[1] = (u8)((nFreq >> 8) & 0xFF);
chRegData[2] = (u8)(nFreq & 0xFF);
chRegData[3] = 0x86;
nFreq = nRFfreq;
chRegData[4]=0;
if((nFreq >= 50000) && (nFreq < 100000))chRegData[4] += ((0x02 << 5) + 0x01);
if((nFreq >= 100000) && (nFreq < 122000))chRegData[4] += ((0x03 << 5) + 0x01);
if((nFreq >= 122000) && (nFreq < 129000))chRegData[4] += ((0x04 << 5) + 0x01);
if((nFreq >= 129000) && (nFreq < 136000))chRegData[4] += ((0x05 << 5) + 0x01);
if((nFreq >= 136000) && (nFreq < 147000))chRegData[4] += ((0x06 << 5) + 0x01);
if((nFreq >= 147000) && (nFreq < 240000))chRegData[4] += ((0x01 << 5) + 0x02);
if((nFreq >= 240000) && (nFreq < 310000))chRegData[4] += ((0x02 << 5) + 0x02);
if((nFreq >= 310000) && (nFreq < 380000))chRegData[4] += ((0x03 << 5) + 0x02);
if((nFreq >= 380000) && (nFreq < 430000))chRegData[4] += ((0x04 << 5) + 0x02);
if((nFreq >= 430000) && (nFreq < 578000))chRegData[4] += ((0x04 << 5) + 0x04);
if((nFreq >= 578000) && (nFreq < 650000))chRegData[4] += ((0x05 << 5) + 0x04);
if((nFreq >= 650000) && (nFreq < 746000))chRegData[4] += ((0x06 << 5) + 0x04);
if((nFreq >= 746000) && (nFreq < 871000))chRegData[4] += ((0x07 << 5) + 0x04);
chRegData[5] = 0x80;
/*Set turner freq*/
//state = GX_Set_Tunner_Repeater_Enable(ENABLE);
//if(SUCCESS == state)
{
GX_Delay_N_ms(10);
state = GX_I2cReadWrite(WRITE , chRegData[0] , chRegData[1] , &chRegData[2] , 4);
if(SUCCESS == state)
{
GX_Delay_N_ms(10);
// state = GX_Set_Tunner_Repeater_Enable(DISABLE);
}
}
return state;
}
/*
Function: Set AGC parameter
Output:
SUCCESS or FAILURE
*/
GX_STATE GX_Set_AGC_Parameter(void)
{
GX_Write_one_Byte(GX_AGC2_THRES,0xa0); /* set the AGC2 parameter */
int temp=0;
temp=GX_Read_one_Byte(GX_MODE_AGC);
if(temp!=FAILURE)
{
temp&=0xe7;
temp=temp+0x10;
temp = GX_Write_one_Byte(GX_MODE_AGC,temp);
}
return temp;
}
/*
Function: get the signal intensity expressed in percentage
Output:
The signal Strength value ( Range is [0,100] )
*/
unsigned char GX_Get_Signal_Strength(void)
{
int iAGC1_word=300,iAGC2_word=300,Amp_Value;
int read_i=0, agc1_temp=0, agc2_temp=0;
//the following parameters are specific for certain tuner
int C0=133;
int C1=40, A1=20;
int C2=85, A2=0;
int C3=33, A3=20;
int C4=101, A4=0;
//-----------------------------------------------
int i=0;
while (i<40)
{
agc1_temp =GX_Read_one_Byte(GX_AGC1_CTRL);
agc2_temp =GX_Read_one_Byte(GX_AGC2_CTRL);
if ((agc1_temp>0)&&(agc2_temp>0))
{
if ((abs(agc1_temp - iAGC1_word)<5)&&(abs(agc2_temp - iAGC2_word)<5))
{
break;
}
iAGC1_word = agc1_temp;
iAGC2_word = agc2_temp;
}
GX_Delay_N_ms(10);
i++;
}
if (i>=40)
{
iAGC1_word =GX_Read_one_Byte(GX_AGC1_CTRL);
iAGC2_word =GX_Read_one_Byte(GX_AGC2_CTRL);
}
if (iAGC1_word < 0x70) iAGC1_word += 25;
if (iAGC1_word > 0xC9) iAGC1_word = 0xC9;
if (iAGC2_word < 0x30) iAGC1_word = 0x30;
//if (iAGC2_word > 0x81) iAGC1_word = 0x81;
Amp_Value = C0 - ((iAGC1_word-C1)*(A1-A2))/(C2-C1) - ((iAGC2_word-C3)*(A3-A4))/(C4-C3);
return GX_Change2percent(Amp_Value,0,100);
}
#endif
文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/xushx_bigbear/article/details/122729231
- 点赞
- 收藏
- 关注作者
评论(0)