?? gx1101.c
字號:
GX1101_STATUS gx1101_Open_FD(bool8 OnOff)
{
GX1101_STATUS status = GX1101_NO_ERROR;
u8 buffer[2];
if ((status = gx1101_Read_Registers(GX1101_DEROT, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] &= 0xbf;
if(OnOff)
{
buffer[0] = buffer[0] | 0x40;
}
else
{
buffer[0] = buffer[0] | 0x00;
}
if((status = gx1101_Write_Registers(GX1101_DEROT, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
/*Hot reset*/
if ((status = gx1101_Read_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = buffer[0] |0x02;
status = gx1101_Write_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Freq_Modify()
Description : Modify Carrier Frequency Error
Input : KBd_rate
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Freq_Modify(u32 KBd_rate)
{
GX1101_STATUS status;
u8 buffer[2];
s32 value1,value2,value3;
s32 s32FreLimit=0;
s32 s32Temp;
if ((status = gx1101_Read_Registers(GX1101_ERR1_L, buffer, 2, FALSE)) != GX1101_NO_ERROR)
return status;
value1 = ((s32)buffer[1]) *256 + (s32)buffer[0];
if (buffer[1]&0x80) value1-=0x10000;
if ((status = gx1101_Read_Registers(GX1101_ERR2_L, buffer, 2, FALSE)) != GX1101_NO_ERROR)
return status;
value2 = ((s32)buffer[1]) *256 + (s32)buffer[0];
if (buffer[1]&0x80) value2-=0x10000;
value3 = value1*GX1101_SYSCLK_KHZ + value2*(s32)KBd_rate;
if(KBd_rate < 5000)
s32FreLimit = 3000;
#if 0
printf("\n11gx1101_Freq_Modify KBd_rate = %d\n",(int)KBd_rate);
s32Temp = 5000+s32FreLimit;
printf("\n11gx1101_Freq_Modify s32Temp = %d\n",(int)s32Temp);
s32Temp = -5000+s32FreLimit;
printf("\n22gx1101_Freq_Modify s32Temp = %d\n",(int)s32Temp);
s32Temp = value3/65536;
printf("\n33gx1101_Freq_Modify s32Temp = %d\n",(int)s32Temp);
#endif
if(((value3/65536)>(5000+s32FreLimit)) || ((value3/65536)<(-5000+s32FreLimit)))
{
s32Temp = (s32FreLimit*65536)/GX1101_SYSCLK_KHZ;
buffer[0] = (u8)(s32Temp&0xff);
buffer[1] = (u8)(s32Temp>>8);
gx1101_Write_Registers(GX1101_ERR1_L, buffer, 2, FALSE);
gx1101_Open_FD(FALSE);
gx1101_Hot_Reset();
return FALSE;
}
value3 = value3/GX1101_SYSCLK_KHZ;
//printf("\ngx1101_Freq_Modify value3 = %ld\n",value3);
buffer[0] = (u8)(value3 & 0x000000ff);
buffer[1] = (u8)(value3>>8);
status = gx1101_Write_Registers(GX1101_ERR1_L, buffer, 2, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Test_FD()
Description : Open or Close FD and Read Chip State
Input : KBd_rate,On or Off
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Test_FD(u32 KBd_rate,bool8 OnOff)
{
u32 check_delay;
u8 buffer[2];
u16 i;
u8 temp;
gx1101_Open_FD(OnOff);
gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
for (check_delay=0; ((check_delay<100) ||((check_delay<200)&&((buffer[0]&0xe0)==0xe0))) ; check_delay++)//375ms+375ms
{
gx1101_delay_ms(5);
gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
//printf("\ngx1101_Test_FD buffer[0]=%d",(int)buffer[0]);
if((buffer[0] & 0xf0) == 0xf0)
{
gx1101_Read_Registers(GX1101_VIT_RAT_CUR, buffer, 1, FALSE);
temp = buffer[0];
gx1101_Freq_Modify(KBd_rate);
if((temp & 0xe0) == 0)
{
buffer[0] = 0x50;
gx1101_Write_Registers(0x66, buffer, 1, FALSE);
}
gx1101_Open_FD(FALSE);
for(i = 0; i< 300;i++)
{
gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
if((buffer[0] & 0xf5) == 0xf5)
break;
}
gx1101_Read_Registers(GX1101_STBY, buffer, 1, FALSE);
buffer[0] = buffer[0] & 0xbf;
gx1101_Write_Registers(GX1101_STBY, buffer, 1, FALSE);//open TS output
gx1101_Read_Registers(GX1101_DEROT, buffer, 1, FALSE);
buffer[0] &= 0xbf;
buffer[0] = buffer[0] | 0x40;
gx1101_Write_Registers(GX1101_DEROT, buffer, 1, FALSE);
return GX1101_LOCK;
}
else
{
//printf("\n>>>>>>>>>>>>gx1101_Test_FD fail");
//return GX1101_NO_LOCK;
}
}
gx1101_Read_Registers(GX1101_STBY, buffer, 1, FALSE);
buffer[0] = buffer[0] & 0xbf;
gx1101_Write_Registers(GX1101_STBY, buffer, 1, FALSE);//open TS output
gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
if((buffer[0]&0xe0)==0xe0)
return GX1101_LOCK;
return GX1101_NO_LOCK;
}
/*******************************************************************************************/
GX1101_STATUS gx1101_Test_FD_Few(u32 KBd_rate,bool8 OnOff)
{
u16 check_delay;
// GX1101_LNB_PARAMS lnb_params;
u8 buffer[2];
u16 i;
u8 temp;
gx1101_Open_FD(OnOff);
// for interrupt
for (check_delay=0; check_delay<40; check_delay++)//循環完耗時200ms
{
gx1101_delay_ms(5);
gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
//printf("\ngx1101_Test_FD buffer[0]=%d",(int)buffer[0]);
if((buffer[0] & 0xf0) == 0xf0)
{
//printf("\n>>>>>>>>>>>>gx1101_Test_FD success");
gx1101_Read_Registers(GX1101_VIT_RAT_CUR, buffer, 1, FALSE);
temp = buffer[0];
//if(gx1101_Freq_Modify(KBd_rate) == FALSE)
// break;
if((temp & 0xe0) == 0)
{
buffer[0] = 0x50;
gx1101_Write_Registers(0x66, buffer, 1, FALSE);
}
//gx1101_Open_FD(FALSE);
//for(i = 0; i< 300;i++)
//{
// gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
// if((buffer[0] & 0xf5) == 0xf5)
// break;
//}
gx1101_Read_Registers(GX1101_STBY, buffer, 1, FALSE);
buffer[0] = buffer[0] & 0xbf;
gx1101_Write_Registers(GX1101_STBY, buffer, 1, FALSE);//open TS output//hongg
//gx1101_Read_Registers(GX1101_DEROT, buffer, 1, FALSE);
//buffer[0] &= 0xbf;
//buffer[0] = buffer[0] | 0x40;
//gx1101_Write_Registers(GX1101_DEROT, buffer, 1, FALSE); //open FD
return GX1101_LOCK;
}
else
{
//printf("\n>>>>>>>>>>>>gx1101_Test_FD fail");
//return GX1101_NO_LOCK;
}
}
//printf("\n30s stop");
gx1101_Read_Registers(GX1101_STBY, buffer, 1, FALSE);
buffer[0] = buffer[0] & 0xbf;
gx1101_Write_Registers(GX1101_STBY, buffer, 1, FALSE);//open TS output//hongg
return GX1101_NO_LOCK;
}
/*******************************************************************************************
Function : gx1101_Try_Test_FD()
Description : Try to Test FD
Input : lnb_params,On or Off
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Try_Test_FD(GX1101_LNB_PARAMS lnb_params,bool8 OnOff)
{
GX1101_STATUS status;
gx1101_Set_Symbol_Rate_Reg(lnb_params.KBd_rate);
if ((status = gx1101_Program_Tuner(lnb_params)) != GX1101_NO_ERROR)
return status;
//printf("\ngx1101_Try_Test_FD lnb_params.KHz_tuner_freq=%ld",lnb_params.KHz_tuner_freq);
if((status = gx1101_Test_FD(lnb_params.KBd_rate,OnOff)) == GX1101_NO_LOCK)
{
if((status = gx1101_Test_FD(lnb_params.KBd_rate,!OnOff)) == GX1101_NO_LOCK)
{
status = gx1101_Test_FD(lnb_params.KBd_rate,OnOff);
return status;
}
else
return status;
}
else
{
return status;
}
return GX1101_NO_LOCK;
}
/*******************************************************************************************
Function : gx1101_Set_Program()
Description : Set Program
Input : lnb_params
Return : TRUE or FALSE
*******************************************************************************************/
bool8 gx1101_Set_Program(GX1101_LNB_PARAMS *lnb_params)
{
GX1101_STATUS status;
u8 buffer[2];
u16 iTry = 0;
int offset = -1;
u32 tunerfreq;
u32 iTemp;
Baud = (u16)lnb_params->KBd_rate;
gx1101_Set_Polar(lnb_params->enPolar);
gx1101_Read_Registers(GX1101_STBY, buffer, 1, FALSE);
buffer[0] = buffer[0] | 0x40;
gx1101_Write_Registers(GX1101_STBY, buffer, 1, FALSE);//close TS output
buffer[0] = 0x72;
gx1101_Write_Registers(0x66, buffer, 1, FALSE);
gx1101_Set_Blind_Enable(GX1101_SET_BLIND_DISABLE);
if(lnb_params->KBd_rate >= 5000)
{
buffer[0] = 0;
buffer[1] = 0;
}
else
{//如果符號率小于5M,則先置FD為正3M,然后把L波段的頻率減3M
iTemp = (3000*65536)/GX1101_SYSCLK_KHZ;
buffer[0] = (u8)(iTemp&0xff);
buffer[1] = (u8)(iTemp>>8);
lnb_params->KHz_tuner_freq -= 3000;
}
gx1101_Write_Registers(GX1101_ERR1_L, buffer, 2, FALSE);
//if(gx1101_Set_Symbol_Rate_Reg(lnb_params->KBd_rate) != GX1101_NO_ERROR )
// return FALSE;
// if ((status = gx1101_Program_Tuner(*lnb_params)) != GX1101_NO_ERROR)
// return FALSE;
if(lnb_params->KBd_rate == 0)
{
gx1101_Program_Tuner(*lnb_params);
return FALSE;
}
if((lnb_params->KBd_rate >= 7994 && lnb_params->KBd_rate <= 8006) &&
(lnb_params->KHz_tuner_freq >= 1674000 && lnb_params->KHz_tuner_freq <= 1680000))
{//掃頻方式
tunerfreq = lnb_params->KHz_tuner_freq;
do
{
buffer[0] = 0;
buffer[1] = 0;
gx1101_Write_Registers(GX1101_ERR1_L, buffer, 2, FALSE);
lnb_params->KHz_tuner_freq = (u32)((s32)tunerfreq + offset*(s32)iTry);
gx1101_Program_Tuner(*lnb_params);
if(gx1101_Test_FD_Few(lnb_params->KBd_rate,FALSE) == GX1101_LOCK)
return TRUE;
if (offset<0)
iTry+=1000;
offset*=-1;
}
while(iTry<=3000);
return FALSE;
}
else if(lnb_params->KBd_rate >= 25000L)
{
if((status = gx1101_Try_Test_FD(*lnb_params,FALSE)) == GX1101_NO_LOCK)
{
return FALSE;
}
else if(status == GX1101_LOCK)
{
return TRUE;
}
else
return FALSE;
}
else
{
if((status = gx1101_Try_Test_FD(*lnb_params,TRUE)) == GX1101_NO_LOCK)
{
if(lnb_params->KBd_rate < 2000)
{
lnb_params->KHz_tuner_freq = lnb_params->KHz_tuner_freq - 2000;
if((status = gx1101_Try_Test_FD(*lnb_params,TRUE)) == GX1101_NO_LOCK)
{
lnb_params->KHz_tuner_freq = lnb_params->KHz_tuner_freq + 4000;
if((status = gx1101_Try_Test_FD(*lnb_params,TRUE)) == GX1101_NO_LOCK)
{
lnb_params->KHz_tuner_freq = lnb_params->KHz_tuner_freq - 2000;
if((status = gx1101_Try_Test_FD(*lnb_params,TRUE)) == GX1101_NO_LOCK)
{
return FALSE;
}
else if(status == GX1101_LOCK)
{
return TRUE;
}
else
return FALSE;
}
else if(status == GX1101_LOCK)
{
return TRUE;
}
else
return FALSE;
}
else if(status == GX1101_LOCK)
{
return TRUE;
}
else
return FALSE;
}
else
{
return FALSE;
}
}
else if(status == GX1101_LOCK)
{
return TRUE;
}
else
return FALSE;
}
return FALSE;
}
/*******************************************************************************************
Function : gx1101_Test_Program()
Description : In the Blind Search Mode,Test Program to make sure the signal is existed
Input : *channel_params
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Test_Program(GX1101_CHANNEL_PARAMS *channel_params)
{
GX1101_LNB_PARAMS lnb_params;
u16 check_delay;
u8 buffer[2];
GX1101_STATUS status;
if((status = gx1101_Set_Symbol_Rate_Reg(channel_params->KBd_rate)) != GX1101_NO_ERROR )
return status;
lnb_params.KHz_tuner_freq = channel_params->KHz_center_freq;
lnb_params.KBd_rate = channel_params->KBd_rate;
if(gx1101_Set_Program(&lnb_params) == FALSE)
return GX1101_NO_LOCK;
return GX1101_LOCK;
#if 0
if ((status = gx1101_Program_Tuner(lnb_params)) != GX1101_NO_ERROR)
return status;
for (check_delay=0; check_delay<1000; check_delay++)
{
if ((status = gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
if((buffer[0] & 0xf0) == 0xf0)
{
//if((status = gx1101_Freq_Modify(channel_params->KBd_rate)) != GX1101_NO_ERROR)
// return status;
//printf("\n>>gx1101_try_find_FEC_OK GX1101_LOCK");
//printf("\n>>gx1101_try_find_FEC_OK channel_params->KHz_center_freq=%ld\n",channel_params->KHz_center_freq );
return GX1101_LOCK;
}
else
{
//printf("\n>>gx1101_try_find_FEC_OK GX1101_NO_LOCK");
//printf("\n>>gx1101_try_find_FEC_OK channel_params->KHz_center_freq=%ld\n",channel_params->KHz_center_freq );
}
}
return GX1101_NO_LOCK;
#endif
}
/*******************************************************************************************
Function : gx1101_Try_Find_FEC_OK()
Description : In the Blind Search Mode,Try to Find FEC_OK
Input : *channel_params
Return : GX1101_STATUS code
*******************************************************************************************/
bool8 gx1101_Try_Find_FEC_OK(GX1101_CHANNEL_PARAMS *channel_params)
{
GX1101_STATUS status;
//KHz_tuner_freq = channel_params->KHz_tuner_freq;
if(channel_params->KBd_rate > 11250)
{
if(gx1101_Open_FD(FALSE) != GX1101_NO_ERROR)
return FALSE;
}
else
{
if(gx1101_Open_FD(TRUE) != GX1101_NO_ERROR)
return FALSE;
}
if((status = gx1101_Test_Program(channel_params)) == GX1101_NO_LOCK)
{
if(channel_params->KBd_rate <= 11250)
return FALSE;
channel_params->KHz_center_freq -= channel_params->KBd_rate/4;
//printf("\n>>gx1101_Try_Find_FEC_OK channel_params->KHz_center_freq=%ld\n",channel_params->KHz_center_freq );
if((status = gx1101_Test_Program(channel_params)) == GX1101_NO_LOCK)
{
channel_params->KHz_center_freq += channel_params->KBd_rate/2;
if((status = gx1101_Test_Program(channel_params)) == GX1101_NO_LOCK)
{
channel_params->KHz_center_freq -= channel_params->KBd_rate/4;
return FALSE;
}
else if(status == GX1101_LOCK)
return TRUE;
else
return FALSE;
}
else if(status == GX1101_LOCK)
return TRUE;
else
return FALSE;
}
else if(status == GX1101_LOCK)
return TRUE;
else
return FALSE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -