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

📄 gx1101.c

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