⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gx1101.c

📁 做STB的朋友接好了,国芯调协器软件包说明介绍.
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -