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

📄 drv_channel.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
void DiSEqCDataSend(unsigned char unitId, unsigned char ucCmdNum)
{
	#ifdef THOMSON_MM
	#else
	unsigned char i,ret;
    	unsigned char timeout;
	unsigned char tempCOunt = ucCmdNum;

    	if (ucCmdNum > 7) ucCmdNum = 7;

    	PN1010_Set_Register(unitId,0x3B, 0x03);
    	PN1010_Set_Register(unitId,0x3B,((ucCmdNum-1)<<4)|0x2); 		/* LNB Control : Set DiSEqC Mode and count*/

    	 /* LNB Message Contents ( MSB Sent first on each byte) */
    	if(((PN1010_Get_Register(unitId,0x3B) & 0x08) >>3 ) == 0 )    /* Check whether data transfer has been finished or not? */
    	{
       	for(i=0; i< ucCmdNum; i++)
        	{
            		PN1010_Set_Register(unitId,0x3D+i,DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/+i]); /* LNB Control : Set DiSEqC Mode */
        	}
	       PN1010_Set_Register(unitId,0x3B,((ucCmdNum-1)<<4)|0x2|(BEGIN_DATA_TRANSFER<<3)); /* LNB Control : Set DiSEqC Mode and count*/
		ret = 0;
		timeout = 1000;		
        	while(timeout-- && !ret) ret = DSEC_Get_Status(unitId);
    	}
    	else 
    	{
       	//printDrvCh(("[DSEC] DsecCommandWrite : DiSEqC not ready.. \n\r"));
		task_delay(17);

		/* One more try */ 
        	PN1010_Set_Register(unitId,0x3B, 0x03);
	    	PN1010_Set_Register(unitId,0x3B,((tempCOunt-1)<<4)|0x2);
		if(((PN1010_Get_Register(unitId,0x3B) & 0x08) >>3 ) == 0)
    		{
       		for(i=0; i< tempCOunt; i++)
        		{
            			PN1010_Set_Register(unitId,0x3D+i,DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/+i]);
        		}
	       	PN1010_Set_Register(unitId,0x3B,((tempCOunt-1)<<4)|0x2|(BEGIN_DATA_TRANSFER<<3));

			ret = 0;
			timeout = 1000;	
        		while(timeout-- && !ret) ret = DSEC_Get_Status(unitId);
    		}
			else
			{
		       	printDrvCh(("[DSEC] DsecCommandWrite : DiSEqC Still not ready.. \n\r"));
			}
    	}
    	#endif
    	
} // end of DiSEqCDataSend


/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_DiSEqC
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void drv_channel_DiSEqC(unsigned char unitId,__channel_DiSEqCType_t type)
{

	#ifdef THOMSON_MM
	int  ucCmdNum;
	int i;

	DEMOD_REG[unitId][0x3B] = 0x00; // Framing Byte (Clear)

	// set DiSEqC message
	switch(type)
	{
		case DiSEqCType_2_0:
			DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/] = 0x02; // Framing Byte
		case DiSEqCType_1_0:
			DEMOD_REG[unitId][0x3D+0/*DEMOD_REG_OCT1*/] |= 0xE0; // Framing Byte (0xE0 for Type1, 0xE2 for Type2)
			DEMOD_REG[unitId][0x3D+1/*DEMOD_REG_OCT2*/] = 0x10; // Address Byte
			DEMOD_REG[unitId][0x3D+2/*DEMOD_REG_OCT3*/] = 0x38; // Command Byte
			DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] = 0xF0; // Data Byte
			
			if (g_ChInfo[unitId].Tuner.Sat.ucSwitchOption == SWITCH_OPTION_B)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x08;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucSatellitePosition == SATELLITE_POSITION_B)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x04;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucPolarisation == TUNER_POLAR_HOR)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x02;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucLnbSelect == LNB_SELECT_HIGH)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x01;
			
			ucCmdNum = 4;

			break;
		//  8sw
		case DiSEqCType_1_1:
			DEMOD_REG[unitId][0x3D+0/*DEMOD_REG_OCT1*/] |= 0xE0; // Framing Byte (0xE0 for Type1, 0xE2 for Type2)
			DEMOD_REG[unitId][0x3D+1/*DEMOD_REG_OCT2*/] = 0x10; // Address Byte
			DEMOD_REG[unitId][0x3D+2/*DEMOD_REG_OCT3*/] = 0x39; // Command Byte
			DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] = 0xF1; // Data Byte
#ifdef CANADA_PORT_8//20070709 EMP-CENTAURI 
			//sttbx_Print(">>> g_ChInfo[unitId].Tuner.Sat.ucSatellitePosition : %d\n",g_ChInfo[unitId].Tuner.Sat.ucSatellitePosition-1);
			DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] = (g_ChInfo[unitId].Tuner.Sat.ucSatellitePosition-1);//0xF1; // Data Byte		drvTunerParam.Sat.ucSatellitePosition = stChannelParam.Sat.ucDiseqcPosInput;
#endif

			ucCmdNum = 4;
			break;
		//end
		case DiSEqCType_1_2:
		#if 0//original
			ucCmdNum = g_ucDiSEqCCmdNum[unitId];
			for(i = 0; i < g_ucDiSEqCCmdNum[unitId]; i++)
				DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/ + i] = g_ucDiSEqCCmdBuf[unitId][i];
		#else //  080118

			ucCmdNum = g_ucDiSEqCCmdNum[unitId];
			for(i = 0; i < g_ucDiSEqCCmdNum[unitId]; i++)
				{
				if(flag_motor_stop == 1)
					{
						DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/ + i] = g_ucDiSEqCCmdBuf[unitId][i];
						DEMOD_REG[unitId][0x3D] = 0xe0;
					}
				else
					DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/ + i] = g_ucDiSEqCCmdBuf[unitId][i];
				}
		#endif
			break;
			
	}
	
	drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_OFF);
	//thomson   DiSEqCDataSend(unitId, ucCmdNum);

#if 0 //original opened
	DsecCommandWrite(0,&DEMOD_REG[unitId][0x3D],ucCmdNum);
#else //  080118
	VK_TASK_Sleep(100);
	DsecCommandWrite(0,&DEMOD_REG[unitId][0x3D],ucCmdNum);
	VK_TASK_Sleep(100);

#endif
	
	#else
	unsigned char  ucCmdNum;
	int i;

	DEMOD_REG[unitId][0x3B] = 0x00; // Framing Byte (Clear)

	// set DiSEqC message
	switch(type)
	{
		case DiSEqCType_2_0:
			DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/] = 0x02; // Framing Byte
		case DiSEqCType_1_0:
			DEMOD_REG[unitId][0x3D+0/*DEMOD_REG_OCT1*/] |= 0xE0; // Framing Byte (0xE0 for Type1, 0xE2 for Type2)
			DEMOD_REG[unitId][0x3D+1/*DEMOD_REG_OCT2*/] = 0x10; // Address Byte
			DEMOD_REG[unitId][0x3D+2/*DEMOD_REG_OCT3*/] = 0x38; // Command Byte
			DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] = 0xF0; // Data Byte
			
			if (g_ChInfo[unitId].Tuner.Sat.ucSwitchOption == SWITCH_OPTION_B)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x08;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucSatellitePosition == SATELLITE_POSITION_B)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x04;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucPolarisation == TUNER_POLAR_HOR)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x02;
			
			if (g_ChInfo[unitId].Tuner.Sat.ucLnbSelect == LNB_SELECT_HIGH)
				DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] |= 0x01;
			
			ucCmdNum = 4;

			break;
		//  8sw
		case DiSEqCType_1_1:
			DEMOD_REG[unitId][0x3D+0/*DEMOD_REG_OCT1*/] |= 0xE0; // Framing Byte (0xE0 for Type1, 0xE2 for Type2)
			DEMOD_REG[unitId][0x3D+1/*DEMOD_REG_OCT2*/] = 0x10; // Address Byte
			DEMOD_REG[unitId][0x3D+2/*DEMOD_REG_OCT3*/] = 0x39; // Command Byte
			DEMOD_REG[unitId][0x3D+3/*DEMOD_REG_OCT4*/] = 0xF1; // Data Byte
			ucCmdNum = 4;
			break;
		//end
		case DiSEqCType_1_2:
			ucCmdNum = g_ucDiSEqCCmdNum[unitId];
			for(i = 0; i < g_ucDiSEqCCmdNum[unitId]; i++)
				DEMOD_REG[unitId][0x3D/*DEMOD_REG_OCT1*/ + i] = g_ucDiSEqCCmdBuf[unitId][i];

			break;
			
	}
	
	drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_OFF);
	DiSEqCDataSend(unitId, ucCmdNum);
	#endif
} // end of drv_channel_DiSEqC


/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetExternalControl
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SetExternalControl(unsigned char unitId)
{
	// LNB Over Load 啊 惯积 饶 官肺 Power阑 On 版快 SMPS俊 何淬阑 临 荐啊 乐栏骨肺
	// 3锅狼 Loop 阑 荐青 饶 LNB Power 阑 On 窍绊 促矫 OverLoad阑 Check.
	printDrvChEnter(("SetExternalControl ++\n"));
	#if 0
	printDrvCh(("Drv_channel : SetExternalControl unitId [%x] \n",unitId));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbPower : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbPower ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucSwitchOption : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucSwitchOption ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucToneBurst : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucToneBurst ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbSelect : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbSelect ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucSwitchOption : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucSwitchOption ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbVoltage : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbVoltage ));
	printDrvCh(("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucPolarisation : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucPolarisation ));	
	printDrvCh(("Drv_channel : g_ChannelFlag[%x].fgLNBOverLoad : %x  \n",unitId,g_ChannelFlag[unitId].fgLNBOverLoad ));
	printf("Drv_channel : SetExternalControl unitId [%x] \n",unitId);
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbPower : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbPower );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucSwitchOption : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucSwitchOption );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucToneBurst : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucToneBurst );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbSelect : %x \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbSelect );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucSwitchOption : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucSwitchOption );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucLnbVoltage : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucLnbVoltage );
	printf("Drv_channel : g_ChInfo[%x].Tuner.Sat.ucPolarisation : %x  \n",unitId,g_ChInfo[unitId].Tuner.Sat.ucPolarisation );	
	printf("Drv_channel : g_ChannelFlag[%x].fgLNBOverLoad : %x  \n",unitId,g_ChannelFlag[unitId].fgLNBOverLoad);
	#endif
#if (0)	
	if(g_ChInfo[unitId].Tuner.Sat.ucLnbPower == LNB_POWER_ON)
	{
		if(!g_ChannelFlag[unitId].fgLNBOverLoad)
		{
			drv_channel_Stream_Disable(unitId); // disable the ts stream.
		}
	}
#endif	
//  080118 closed 	DSEC_ResetMicom(unitId); //
	
	if(g_ChInfo[unitId].Tuner.Sat.ucLnbPower == LNB_POWER_ON)
	{
	
		if(!g_ChannelFlag[unitId].fgLNBOverLoad)
		{
			drv_channel_SoftresetRegister(unitId); // disable the ts stream.
			//drv_channel_LNBPower(unitId, LNB_POWER_ON);
			drv_channel_LNBVoltage(unitId, LNB_POWER_ON);

#if defined(SUPPORT_LEGACY_SWITCH)   /* Legacy SW support */
			FE_Wait(20);
//sttbx_Print(">>> SUPPORT_LEGACY_SWITCH g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode : %x  !!!\n",g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode);
			if (g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode != eDISEQC_LEGACY_OFF)
			{
//				sttbx_Print("[%s %d]SetExternalControl ... Legacy SW = %d\n", __FILE__, __LINE__, g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode);
				drv_channel_LegacySwitchControl(unitId, g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode);
			}
			FE_Wait(100);

			drv_channel_Polarization(unitId,g_ChInfo[unitId].Tuner.Sat.ucPolarisation);

			FE_Wait(100);
#else
			drv_channel_Polarization(unitId,g_ChInfo[unitId].Tuner.Sat.ucPolarisation);
			
			FE_Wait(20);
#endif /* SUPPORT_LEGACY_SWITCH */


			g_ucLNBPower[unitId] = LNB_POWER_ON;

			// g_ChannelFlag[unitId].fgLNBOverLoad = 0;
			if(g_ChInfo[unitId].Tuner.Sat.ucSwitchOption != SWITCH_OPTION_MOTOR
				&& g_ChInfo[unitId].Tuner.Sat.ucSwitchOption != SWITCH_OPTION_NONE)
			{
 				// drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_OFF);
				if((g_ChInfo[unitId].Tuner.Sat.ucToneBurst == TONE_BURST_A)
					|| (g_ChInfo[unitId].Tuner.Sat.ucToneBurst == TONE_BURST_B))
				{
					//printDrvCh(("ucToneBurst Control : %x\n",g_ChInfo[unitId].Tuner.Sat.ucToneBurst));
					drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_OFF);
					drv_channel_ToneBurst(unitId, g_ChInfo[unitId].Tuner.Sat.ucToneBurst);
				}
				else if(g_ChInfo[unitId].Tuner.Sat.ucSwitchOption ==  SWITCH_OPTION_A ||
						g_ChInfo[unitId].Tuner.Sat.ucSwitchOption == SWITCH_OPTION_B )
				{
					//printDrvCh(("ucSwitchOption : %x\n",g_ChInfo[unitId].Tuner.Sat.ucSwitchOption));
					if(g_ChInfo[unitId].Tuner.Sat.ucDiseqc2xCommand == DiSEqC2XCMD)
					{
						drv_channel_DiSEqC(unitId, DiSEqCType_2_0);
					}
					else if(g_ChInfo[unitId].Tuner.Sat.ucDiseqc2xCommand == DiSEqC11XCMD)//  8sw
					{
#ifndef CANADA_PORT_8
						drv_channel_DiSEqC(unitId, DiSEqCType_1_0);
						//task_delay(ST_GetClocksPerSecond()/1000*17);//do not delete	
#endif
						VK_TASK_Sleep(17);
						drv_channel_DiSEqC(unitId, DiSEqCType_1_1);
						
					}//end
					else
					{
						drv_channel_DiSEqC(unitId, DiSEqCType_1_0);
												
					}
				}
			}
			
			//printf(">> g_ChInfo[unitId].Tuner.Sat.ucLnbSelect : %x \n",g_ChInfo[unitId].Tuner.Sat.ucLnbSelect);
			//task_delay((ST_GetClocksPerSecond()*60)/1000);//  5105
			VK_TASK_Sleep(60*3);
						
			if( g_ChInfo[unitId].Tuner.Sat.ucLnbSelect == DDI_LNB_22K_TONE_ON/*  NEO_ANTENNA_LNB_22K_TONE_ON */)
				drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_ON);
			else if( g_ChInfo[unitId].Tuner.Sat.ucLnbSelect == DDI_LNB_22K_TONE_OFF /*NEO_ANTENNA_LNB_22K_TONE_OFF*/ )
				drv_channel_LNB22KHzTone(unitId, LNB22KHzTone_OFF);	
	
			
#if defined(SUPPORT_LEGACY_SWITCH)   /* Legacy SW support */
			FE_Wait(100);
			if (g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode != eDISEQC_LEGACY_OFF)
				drv_channel_LegacySwitchControl(unitId, g_ChInfo[unitId].Tuner.Sat.ucLegacySwitchMode);

			/* Recover HV */
			FE_Wait(100);
			//drv_channel_LNBVoltage(unitId, g_ChInfo[unitId].Tuner.Sat.ucLnbVoltage);
			drv_channel_Polarization(unitId,g_ChInfo[unitId].Tuner.Sat.ucPolarisation);
			FE_Wait(20);
#endif /* SUPPORT_LEGACY_SWITCH */

		}
	}
    	else
	{
		//drv_channel_LNBPower(unitId, LNB_POWER_OFF);
		drv_channel_LNBVoltage(unitId, LNB_POWER_OFF);
		g_ucLNBPower[unitId] = LNB_POWER_OFF;
	}
    	
    	printDrvChExit(("SetExternalControl --\n"));
} // end of SetExternalControl

/////////////////////////////////////////////////////////////////////////////////
//	Function	: GET_VAGCA
//	Description	: Get Analog AGC information
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void GET_VAGCA(unsigned char unitId,unsigned char  *VAGCA)
{
	#ifdef THOMSON_MM
	#else
	drv_ch_i2c_DEMODRead(unitId, DEMOD_REG_VAGCA, VAGCA, 1);
	#endif
} // end of GET_VAGCA

/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_GetAGCLevel
//	Description	: 
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
unsigned char  drv_channel_GetAGCLevel(unsigned char unitId)
{
	
	unsigned char 	ucVAGCA_tmp, ucVAGCA;
	unsigned char 	ucMaxAttempt = 3;

	do
	{
		ucMaxAttempt --;
		ucVAGCA_tmp = Snim_Drv_Get_Strength();
		ucVAGCA = Snim_Drv_Get_Strength();
	} while((ucVAGCA_tmp != ucVAGCA) && (ucMaxAttempt > 0));
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -