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

📄 drv_channel.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void AS_IQinversion(unsigned char unitId)
{
	#ifdef THOMSON_MM
	#else
	/*Because 2nd tuner (single type) has H/W IQ swapped!! 2003.05.16*/
	if( unitId == 1 )
		DEMOD_REG[unitId][DEMOD_REG_CONF] |= (DEMOD_REG_BIT_IQP); // 0100 0000 : IQP = 1 : swap
	else
		DEMOD_REG[unitId][DEMOD_REG_CONF] &= ~(DEMOD_REG_BIT_IQP); // 1011 1111 : IQP = 0 : not swap
	// DEMOD_REG[unitId][DEMOD_REG_CONF] = g_ucDemodID[unitId]; //10086
	drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);
	#endif
} // end of AS_IQinversion

/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_ResetCarrier
//	Description	: The CLBCAR signal clears the carrier synchronization block
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void drv_channel_ResetCarrier(unsigned char unitId)
{
	#ifdef THOMSON_MM
	#else
	// To reset the carrier synchronizer
	DEMOD_REG[unitId][DEMOD_REG_CARINIT] &= ~(DEMOD_REG_BIT_CLBCAR);
	drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARINIT, &DEMOD_REG[unitId][DEMOD_REG_CARINIT], 1);

	VK_TASK_Sleep(2);

	DEMOD_REG[unitId][DEMOD_REG_CARINIT] |= DEMOD_REG_BIT_CLBCAR;
	drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARINIT, &DEMOD_REG[unitId][DEMOD_REG_CARINIT], 1);
	#endif
} // end of drv_channel_ResetCarrier

/////////////////////////////////////////////////////////////////////////////////
//	Function	: AS_AlgoStart
//	Description	: Chip Algorithm ALL Clear & IQ Inersion Default Setting.
//	Input		:
//	Output		:
//	Return		: TRUE if error, FALSE if success
/////////////////////////////////////////////////////////////////////////////////
void AS_AlgoStart(unsigned char unitId)
{	
	AS_ResetAll(unitId);
    	AS_WriteInitAGCRA(unitId);
	AS_IQinversion(unitId);
//	drv_channel_ResetCarrier(unitId); // by kwonkh 2002/1215

} // end of AS_AlgoStart

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetCodeRate
//	Description	: set the rate of the Viterbi decoder
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
	
void SetCodeRate(unsigned char unitId)
{
	unsigned char ucFEC;

	if (prevCodeRate[unitId] != g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode)
	{
		prevCodeRate[unitId] = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
		g_ChannelFlag[unitId].fgSpecialInversion = 0;

		switch (g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode)
		{
			case TUNER_CODERATE_1_2:		// 1/2
				ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
				break;

			case TUNER_CODERATE_2_3:		// 2/3
				ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
				break;

			case TUNER_CODERATE_3_4:		// 3/4
				ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
				break;

			case TUNER_CODERATE_5_6:		// 5/6
				ucFEC = 0x04; 
				g_ChannelFlag[unitId].fgSpecialInversion = 1;
				break; 
			case TUNER_CODERATE_7_8: 	// 7/8
				ucFEC = 0x06; 
				g_ChannelFlag[unitId].fgSpecialInversion = 1;
				break; 
			case TUNER_CODERATE_AUTO:		// AUTO
				ucFEC = 0x08; 
				g_ChannelFlag[unitId].fgSpecialInversion = 1;
				break; 

		}
	
		DEMOD_REG[unitId][DEMOD_REG_RATE] = ucFEC;
		//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_RATE, &DEMOD_REG[unitId][DEMOD_REG_RATE], 1);
	}
} // end of SetCodeRate

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetIQInversion
//	Description	: Check I,Q Status & Set I,Q Inversion or Normal
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SetIQInversion(unsigned char unitId)
{
	//thomson   drv_ch_i2c_DEMODRead(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);

	// DEMOD_REG[unitId][DEMOD_REG_CONF] ^= 0x40; // IQP toggle
	if (DEMOD_REG[unitId][DEMOD_REG_CONF] & DEMOD_REG_BIT_IQP)
		DEMOD_REG[unitId][DEMOD_REG_CONF] &= ~(DEMOD_REG_BIT_IQP);
	else
		DEMOD_REG[unitId][DEMOD_REG_CONF] |= DEMOD_REG_BIT_IQP;

	//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);
} // end of SetIQInversion

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SearchRange
//	Description	: for Adjust Tuner
//					32 ~ 8Ms/s -> +/- 12MHz Carrier Tracking.
//					 8 ~ 4Ms/s -> +/- 7MHz  Carrier Tracking.
//					 4 ~ 1Ms/s -> +/- 4MHz  Carrier Tracking.
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SearchRange(unsigned char unitId)
{
	if (g_ChInfoWork[unitId].Tuner.Sat.ucAutoSearch == AUTOSEARCH_OFF)
	{
		if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 18000)		g_ucMaxCarrierSweepLoop[unitId] = 6;

		else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 8000)	g_ucMaxCarrierSweepLoop[unitId] = 12;

		else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000)	g_ucMaxCarrierSweepLoop[unitId] = 24;

		else	g_ucMaxCarrierSweepLoop[unitId] = 28;
	}
	else
	{
		if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 18000)		g_ucMaxCarrierSweepLoop[unitId] = 4;

		else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 8000)	g_ucMaxCarrierSweepLoop[unitId] = 8;

		else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000)	g_ucMaxCarrierSweepLoop[unitId] = 16;

		else	g_ucMaxCarrierSweepLoop[unitId] = 24;
	}
} // end of SearchRange

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetCarrierSweep
//	Description	: Select the filter coefficients for the Carrier frequency recovery loop
//					and define internal carrier sweep 
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SetCarrierSweep(unsigned char unitId)
{
	if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 32000)
	{
		DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x93;			// RS/2800
		DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x53;

		DEMOD_REG[unitId][DEMOD_REG_AGCN] = 0x63;
		DEMOD_REG[unitId][DEMOD_REG_ADCONF] = 0x89;
		DEMOD_REG[unitId][DEMOD_REG_GTR2] = 0x4f;
		//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCN, &DEMOD_REG[unitId][DEMOD_REG_AGCN], 1);
		//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_ADCONF, &DEMOD_REG[unitId][DEMOD_REG_ADCONF], 1);
		//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_GTR2, &DEMOD_REG[unitId][DEMOD_REG_GTR2], 1);
	}
	else
	{
		if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 15000)						// MCPC Mid
		{
		    DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x94;					// RS/1400  (default)
		    DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x53;
		}
		else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 7000)					// MCPC Min
		{
		    DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x95;					// RS/700
		    DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
		} 
		else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000)					// SCPC Max
		{   
			DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x96;					// RS/350
			DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
		}
		else																// SCPC Min
		{   
			DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x97;					// RS/175
			DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
		}


		if (prevSymbolRate[unitId] > 32000)
		{
			DEMOD_REG[unitId][DEMOD_REG_AGCN] = 0x44;
			DEMOD_REG[unitId][DEMOD_REG_ADCONF] = 0x81;
			DEMOD_REG[unitId][DEMOD_REG_GTR2] = 0x43;
			//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCN, &DEMOD_REG[unitId][DEMOD_REG_AGCN], 1);
			//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_ADCONF, &DEMOD_REG[unitId][DEMOD_REG_ADCONF], 1);
			//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_GTR2, &DEMOD_REG[unitId][DEMOD_REG_GTR2], 1);
		}
	}		
	DEMOD_REG[unitId][DEMOD_REG_AFC0] = 0x03;
	//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AFC0, &DEMOD_REG[unitId][DEMOD_REG_AFC0], 1);
	//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARC, &DEMOD_REG[unitId][DEMOD_REG_CARC], 2);
} // end of SetCarrierSweep

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetSymbolRate
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SetSymbolRate(unsigned char unitId)
{
	#ifdef THOMSON_MM
	#else
	if (prevSymbolRate[unitId] != g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate)
	{
		prevSymbolRate[unitId] = g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate;
		PN1010_Set_Symbolrate(unitId,g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode, g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate);	
	}
	#endif
	
} // end of SetSymbolRate

/////////////////////////////////////////////////////////////////////////////////
//	Function	: SetTunerFreq
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void SetTunerFreq(unsigned char unitId)
{
	#ifdef THOMSON_MM
	#else
	unsigned long	N_pro;
	N_pro = g_ChInfoWork[unitId].Tuner.Sat.dwFreq;	
	PN1010_Set_Frequency(unitId, N_pro);	// Mhz  
	#endif

} // end of SetTunerFreq

/////////////////////////////////////////////////////////////////////////////////
//	Function	: AdjustTuner
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void AdjustTuner(unsigned char unitId)
{
	int iAdjustFrequencyOffset;

	// Freq. OffSet 蔼阑 1MHz 窜困肺 佬绢 柯促.
	iAdjustFrequencyOffset = iClockAdjustTable[g_ucClockSweepCnt[unitId]++];

	if (g_ucClockSweepCnt[unitId] >= g_ucMaxCarrierSweepLoop[unitId]) // Freq. Sweep 捞 +/- 率栏肺 肯丰 等 版快
		g_ChannelFlag[unitId].fgClockFreqSweepDone = 1;

   	if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 4000)				// 2000 <= S.R. < 4000
		iAdjustFrequencyOffset /= 4;							// 250KHz
	else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 8000)			// 4000 <= S.R. < 8000
		iAdjustFrequencyOffset /= 2;							// 500Khz
	else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 18000)		// 8000 <= S.R. < 18000
		;														// 1MHz
	else														// 18000 <= S.R.
		iAdjustFrequencyOffset *= 2;							// 2MHz

	g_ChInfoWork[unitId].Tuner.Sat.dwFreq = g_ChInfoWork[unitId].ulFrequencyBase + iAdjustFrequencyOffset;

	SetTunerFreq(unitId);
} // end of SetTunerFreq

/////////////////////////////////////////////////////////////////////////////////
//	Function	: AS_ReadAFC
//	Description	: AFC provides the frequency offset, in 2's complement
//					between the transmitter and receiver
//					when carrier has been recovered.
//				  There are 2 cases depending on the position of the complex multiplier
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void AS_ReadAFC(	unsigned char unitId,	long *deltaF)
{
	unsigned char	ucVAFC;
	unsigned long	ulDeltaF;
	
    VK_TASK_Sleep(10);									// Wait until carrier loop is stable.

	//thomson   drv_ch_i2c_DEMODRead(unitId, DEMOD_REG_VAFC, &ucVAFC, 1);

    if (ucVAFC & 0x80)	// Negative case
	{
		ulDeltaF = (unsigned long)(0x100 - (unsigned long)ucVAFC); 		// calculate 2's complement
		*deltaF = (long)fnEX_MulDiv64((ulDeltaF*1000), (unsigned long)g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate, 128);
	}
	else				// Positive case
	{
		ulDeltaF = (unsigned long)ucVAFC;
		*deltaF = -(long)fnEX_MulDiv64((ulDeltaF*1000), (unsigned long)g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate, 128);
	}

	/*Because 2nd tuner (single type) has H/W IQ swapped!! 2003.05.16*/
	if (unitId == 1) 
		*deltaF = (-1) * (*deltaF);
} // end of AS_ReadAFC

/////////////////////////////////////////////////////////////////////////////////
//	Function	: CheckTunerLock
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
__channel_TunerPhaseLock_t CheckTunerLock(unsigned char unitId)
{

	#ifdef THOMSON_MM

	unsigned char  ucTunerState;
	unsigned char  ucTunerState2;

	Snim_Drv_Run_Monitor();
	ucTunerState = Snim_Drv_IsTunerLocked();	
	//printDrvCh((" ~~~~~~~~~~~~~~~~~~~~ucTunerState : %x \n\r" , ucTunerState));	
	return ucTunerState;
	#else
	unsigned char  ucTunerState;
	unsigned char  ucTunerState2;


	ucTunerState = PN1010_Check_Lock(unitId);	
	
	printDrvCh((" ~~~~~~~~~~~~~~~~~~~~ucTunerState : %x \n\r" , ucTunerState));
	
	return ucTunerState;
	#endif
} // end of CheckTunerLock

/////////////////////////////////////////////////////////////////////////////////
//	Function	: AS_WriteDecrementAGCRA
//	Description	: decrement the AGCRA register (0x0A -> 0x03 max)
//					VAGCA : analog AGC information
//					ERADC : error between the signal level at the ADC output
//							and the AGCRA reference.
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void AS_WriteDecrementAGCRA(unsigned char unitId)
{
	unsigned char  ucVAGCA, ucERADC;

	DEMOD_REG[unitId][DEMOD_REG_AGCRA] = 0x0A;
#ifdef PHILIPS_TUNER
	DEMOD_REG[unitId][DEMOD_REG_AGCRA] |= DEMOD_REG_BIT_PWMOD;
#else
	DEMOD_REG[unitId][DEMOD_REG_AGCRA] &= ~(DEMOD_REG_BIT_PWMOD);
#endif
	//thomson   drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCRA, &DEMOD_REG[unitId][DEMOD_REG_AGCRA], 1); // by kwonkh 2002/1215
	VK_TASK_Sleep(15);

	GE

⌨️ 快捷键说明

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