?? gx1101.c
字號:
u16 lock_time_lim_ms;
GX1101_STATUS status;
u8 buffer[2];
u16 count;
u16 check_delay;
/* Program the tuner */
lock_time_lim_ms = GX1101_LOCK_TIMES;
if (status = gx1101_Program_Tuner(lnb_params) != GX1101_NO_ERROR)
return status;
for(count = 0;count<lock_time_lim_ms;count++)
{
for (check_delay=0; check_delay<800; check_delay++)//800
{
}
/* Read the blind state register */
if ((status = gx1101_Read_Registers(GX1101_BLIND_STATE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
if ( (buffer[0] & 0x1f) == 0)
{
if ( (buffer[0] & 0xc0) == 0xc0)/*success*/
return GX1101_LOCK;
else if((buffer[0] & 0xa0) == 0xa0)/*FEC fail*/
return GX1101_NO_FEC_LOCK;
else/*loop*/
{
}
}
else/* QPSK or AGC or FEC or CARRIER or TIMING fail */
return GX1101_NO_LOCK;
}
return GX1101_NO_LOCK;
}
/*******************************************************************************************
Function : gx1101_Get_Strength()
Description : This registers provide a indication of the signal Strength
Input : none
Return : SS
*******************************************************************************************/
u8 gx1101_Get_Strength(void)
{
GX1101_STATUS status;
u8 buffer[2];
u16 SS;
u16 i;
status = gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
if ( (status != GX1101_NO_ERROR) || (buffer[0]&0x80)!=0x80 )
{
return 0;
}
buffer[1] = buffer[0];
status = gx1101_Read_Registers(GX1101_INTENSITY, buffer, 1, FALSE);
if ( status != GX1101_NO_ERROR )
{
return 0;
}
SS = ((255 - buffer[0])*100);
SS = (u32)(SS/255);
#if 0//通達的為真,其他廠家為假
i=SS*1.7;
if(i>70)
SS=SS*1.62;
if(i<70)
SS=SS*1.8;
#endif
if((SS<=0) && ((buffer[1]&0x40)==0x40))
SS = 5;
if(SS>95)
SS=95;
return SS;
}
/*******************************************************************************************
Function : gx1101_Get_Quality()
Description : This register provide a indication of the signal to noise ratio of the
channel being received by the GX1101. It should not be taken as the absolute
value of the SNR.
Input : none
Return : SNR level from 0 to 99
*******************************************************************************************/
u8 gx1101_Get_Quality(void)
{
GX1101_STATUS status;
u8 buffer[2];
u16 SNR;
status = gx1101_Read_Registers(GX1101_CHIP_STATE, buffer, 1, FALSE);
if ( (status != GX1101_NO_ERROR) || (buffer[0]&0x40)!=0x40 )
{
return 0;
}
status = gx1101_Read_Registers(GX1101_M_SNR, buffer, 1, FALSE);
if ( status != GX1101_NO_ERROR )
{
return 0;
}
if(buffer[0] <= 6)
{
SNR = 99;
}
else if(buffer[0] >= 150)
{
SNR = 1;
}
else
{
SNR = 97*(150 - (u16)buffer[0]);
SNR = SNR/144+1;
}
if((SNR>30) && (SNR <=60))
{
SNR = (SNR-30)/3+30;
}
else if((SNR>60) && (SNR <=85))
{
SNR = ((SNR-60)*20)/25+40;
}
else if((SNR>85) && (SNR <=100))
{
SNR = ((SNR-85)*40)/15+60;
}
//SNR = (SNR*255)/100;
return (u8)(SNR&0xFF);
}
/*******************************************************************************************
Function : gx1101_Set_Symbol_Rate_Reg()
Description : Set the symbol rate
Input : KBd_rate
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Set_Symbol_Rate_Reg(u32 KBd_rate)
{
u32 kbd_rate;
GX1101_STATUS status;
u8 buffer[2];
/* symbol rate info */
kbd_rate = KBd_rate;
/*and multiply by 1024 */
kbd_rate = kbd_rate * 1024 ;
/* To convert from KBaud to MBaud*/
kbd_rate = (u16)(kbd_rate /1000);
buffer[0]= (u8) (kbd_rate & 0xFF);
buffer[1]= (u8) ((kbd_rate >> 8) & 0xFF);
status = gx1101_Write_Registers(GX1101_SYM_RATE_L, buffer, 2, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Set_Polar()
Description : Set the polarization
Input : GX1101_LNB_POLAR
Output : none
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Set_Polar(GX1101_LNB_POLAR enPolar)
{
GX1101_STATUS status;
u8 buffer[2];
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = buffer[0] & 0xbf;
if (enPolar == POL_HORIZONTAL)
{
buffer[0] += 64;
}
status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Cool_Reset()
Description : Cool Reset GX1101
Input : none
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Cool_Reset(void)
{
GX1101_STATUS status;
u8 buffer[2];
if ((status = gx1101_Read_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
//buffer[0] = buffer[0] & 0xfb;
if(u8ChipID == GX1101_CHIP_ID)
buffer[0] = buffer[0] | 0x04;
else
buffer[0] = 0x00;
status = gx1101_Write_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Hot_Reset()
Description : Hot Reset GX1101
Input : none
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Hot_Reset(void)
{
GX1101_STATUS status;
u8 buffer[2];
if ((status = gx1101_Read_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
//buffer[0] = buffer[0] & 0xfd;
if(u8ChipID == GX1101_CHIP_ID)
buffer[0] = buffer[0] | 0x02;
else
buffer[0] = 0x00;
status = gx1101_Write_Registers(GX1101_GLB_CTRL, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Output_Type()
Description : Set parallel or serial output mode
Input : type: 1,parallel; 0,serial
Output : none
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Output_Type(bool8 type)
{
GX1101_STATUS status;
u8 buffer[2];
if(type)
buffer[0] = GX1101_PO_EN_PARALLEL_DEFAULT;
else
buffer[0] = GX1101_PO_EN_SERIAL_DEFAULT;
status = gx1101_Write_Registers(GX1101_TS_FMT_CTRL, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Control_LNB()
Description : Control LNB
Input : GX1101_LNB_CTRL
Output : none
Return : GX1101_STATUS code
*******************************************************************************************/
//控制極軸天線的轉動;保存衛星;轉動至某一衛星
GX1101_STATUS gx1101_Control_LNB(GX1101_LNB_CTRL Lnb_Control,u8 Record_byte)//Record_byte是待保存的衛星的序號
{
GX1101_STATUS status = GX1101_NO_ERROR;
u8 buffer[8];
u32 counter;
buffer[0] = 0xe0;
buffer[1] = 0x31;
switch(Lnb_Control)
{
case LIMIT_WEST:
{
buffer[2] = 0x67;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 3, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x14;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case DRIVE_WEST:
{
buffer[2] = 0x69;
buffer[3] = 0x00;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 4, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x1c;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case LIMIT_EAST:
{
buffer[2] = 0x66;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 3, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x14;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case DRIVE_EAST:
{
buffer[2] = 0x68;
buffer[3] = 0x00;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 4, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x1c;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case STOP:
{
buffer[2] = 0x60;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 3, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x14;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case LIMIT_OFF:
{
buffer[2] = 0x63;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 3, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x14;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case STORE_NN:
{
buffer[2] = 0x6a;
buffer[3] = Record_byte;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 4, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x1c;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
case GOTO_NN:
{
buffer[2] = 0x6b;
buffer[3] = Record_byte;
if((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 4, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0] & 0x40) | 0x1c;
if((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
}break;
default:
return GX1101_NO_ERROR;
}
delay_ms(50);
for(counter = 0;counter<1000;counter++)
{
if ((status = gx1101_Read_Registers(GX1101_DISEQC_INT, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
//printf("\n>> buffer[0] = 0x%hx",buffer[0]);
if( (buffer[0]&0x10) == 0x10)
{
break;
}
}
return GX1101_NO_ERROR;
}
/*******************************************************************************************/
/*選擇LNB*/
GX1101_STATUS gx1101_DiSEqC_ctrl(u8 lnb)
{
GX1101_STATUS status;
u8 buffer[8];
u32 counter;
buffer[0] = (u8) (GX1101_DISEQC_CMD1 & 0xFF);
buffer[1] = (u8) (GX1101_DISEQC_CMD2 & 0xFF);
buffer[2] = (u8) (GX1101_DISEQC_CMD3 & 0xFF);
switch(lnb)
{
case 1: // LNB1
buffer[3] = (u8) (GX1101_DISEQC_CMD4_LNB1 & 0xFF);
break;
case 2: // LNB2
buffer[3] = (u8) (GX1101_DISEQC_CMD4_LNB2 & 0xFF);
break;
case 3: // LNB3
buffer[3] = (u8) (GX1101_DISEQC_CMD4_LNB3 & 0xFF);
break;
case 4: // LNB4
buffer[3] = (u8) (GX1101_DISEQC_CMD4_LNB4 & 0xFF);
break;
default:
buffer[3] = (u8) (GX1101_DISEQC_CMD4_LNB1 & 0xFF);
break;
}
if ((status = gx1101_Write_Registers(GX1101_DISEQC_INS, buffer, 4, FALSE)) != GX1101_NO_ERROR)
return status;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
buffer[0] = (buffer[0]&0xc0) | 0x1c;//length
if ((status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
delay_ms(50);
for(counter = 0;counter<1000;counter++)
{
if ((status = gx1101_Read_Registers(GX1101_DISEQC_INT, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
//printf("\n>> buffer[0] = 0x%hx",buffer[0]);
if( (buffer[0]&0x10) == 0x10)
{
break;
}
}
return GX1101_NO_ERROR;
}
/*******************************************************************************************/
GX1101_STATUS gx1101_tone(u8 tone)
{
GX1101_STATUS status;
u8 buffer[2];
u8 DISEQC;
if ((status = gx1101_Read_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE)) != GX1101_NO_ERROR)
return status;
DISEQC = buffer[0];
DISEQC &= 0xF8;
if(tone != 0)
{
DISEQC |= 1;
}
buffer[0] = DISEQC;
status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Set_DISEQC_MODE_Reg()
Description : Set the LNB Polarisation and 22KHz tone
Input : enPolar status and enTone status
Return : GX1101_STATUS code
*******************************************************************************************/
GX1101_STATUS gx1101_Set_DISEQC_MODE_Reg(GX1101_LNB_POLAR enPolar,GX1101_LNB_TONE enTone)
{
GX1101_STATUS status = GX1101_NO_ERROR;
u8 buffer[2];
buffer[0] = 0x00;
if (enTone == TONE_ON)
{
buffer[0] = 1;
}
else
{
buffer[0] = 0;
}
if (enPolar == POL_HORIZONTAL)
{
buffer[0] += 64;
}
status = gx1101_Write_Registers(GX1101_DISEQC_MODE, buffer, 1, FALSE);
return status;
}
/*******************************************************************************************
Function : gx1101_Open_FD()
Description : Open FD or Close FD
Input : On or Off
Return : GX1101_STATUS code
*******************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -