ct_nim.c

来自「DVB软件,基于CT216软件的开发源程序.」· C语言 代码 · 共 1,736 行 · 第 1/3 页

C
1,736
字号
		{
			if(u8AGCLevel >= 0xE0)
			{//0
				u8Strength = 0;
			}
			else if(u8AGCLevel >= 0x65)
			{//0~40
				u8Strength = (39 * (0xE0 - u8AGCLevel)) / (0xE0 - 0x65);			
			}			
			else if(u8AGCLevel >= 0x40)
			{//40~60
				u8Strength = (19 * (0x60 - u8AGCLevel)) / (0x65 - 0x40);
				u8Strength += 40;
			}
			else if(u8AGCLevel > 0x35)
			{//60~75
				u8Strength = (14 * (0x40 - u8AGCLevel)) / (0x40 - 0x35);
				u8Strength += 60;
			}
			else
			{
				if(u32ADCCode >= 0xCF)
				{//75
					u8Strength = 75;	
				}
				else if(u32ADCCode >= 0xA0)
				{//75~80
					u8Strength = (14 * (0xCF - u32ADCCode)) / (0xCF - 0xA0);
					u8Strength += 75; 
				}
				else if(u32ADCCode >= 0x50)
				{//80~100
					u8Strength = (19 * (0xA0 - u32ADCCode)) / (0xA0 - 0x50);
					u8Strength += 80;			
				}
				else
				{
					u8Strength = 99;
				}
			}
			
			u8Strength += ((u8AGCLevel & 0x01) + (u32ADCCode & 0x01)); 
		}
		else
		{
			u8Strength = CT221_Get_SignalStrength();
		}
	}
	else
	{
		u8Strength = 0;
	}
		
	*pu16Strength = u8Strength;
	return DRV_OK;
}

/*
 *Get these features of NIM module device supported.
*/
EN_DRV_RESULT CT_NIM_GetDevInfo(CT_NIM_DevInfo *pstDevInfo)
{
	#ifdef CT_OS_CHECK_STACKSIZE
	   CT_OS_RecordTaskStack();
    #endif
    
	SYS_INFO sys_info;

	#ifdef CT_NIM_VOID
	if(b8NIMDebugMode)
	{
		return DRV_OK;
	}
	#endif

	if (b8InitSuccess==FALSE)
	{
		return DRV_OK;
	}
	
	CT221_GetSysInfo(&sys_info);
	
	switch(sys_info.mod)
	{
		case 0:
			pstDevInfo->enType = EN_CT_FE_QPSK; break;
		case 1:
			pstDevInfo->enType = EN_CT_FE_QAM; break;	//16
		case 2:
			pstDevInfo->enType = EN_CT_FE_QAM; break; 	//64
	}

	pstDevInfo->u16Id2WS = (u16) DevID;
	pstDevInfo->u32FreqMax = 0;
	pstDevInfo->u32FreqMin = 0;
	pstDevInfo->u32ScanStepSize = 0;

	return DRV_OK;
}

/*
 * Get NIM modulation information & signal lock or not
 */
EN_DRV_RESULT CT_NIM_GetChannelStatus(u32 u32FreqKHz, CT_NIM_ChannelStatus *pstStatus)
{
	#ifdef CT_OS_CHECK_STACKSIZE
	   CT_OS_RecordTaskStack();
    #endif
	
	SYS_INFO sys_info;

	#ifdef CT_NIM_VOID
	if(b8NIMDebugMode)
	{
		return DRV_OK;
	}
	#endif

	if (b8InitSuccess==FALSE)
	{
		return DRV_OK;
	}
	
	CT221_GetSysInfo(&sys_info);

	if (CT221_TPS_Lock_Status() == FALSE)
	{
		pstStatus->u16Modulation=CT_QPSK_ERR;
		pstStatus->u16Hierarchy=CT_HIERARCHY_ERR;
		pstStatus->u16CodeRate_HP=CT_FEC_ERR;
		pstStatus->u16CodeRate_LP=CT_FEC_ERR;
		pstStatus->u16GuardRate=CT_GI_ERR;
		pstStatus->u16TxMode=CT_FFT_ERR;
		return DRV_OK;
	}
	else
	{
//		printf("TPS Lock\n");
	}
#if 0
	//pstStatus->u32CenterFreq;            		/* current lock frequency */
	//pstStatus->s32FreqOffset;   				/* offset range between setting frequency and locked frequency */
	//pstStatus->u16SymbRate;
#else
	
	if (sys_info.fft)
		pstStatus->s32FreqOffset = CT221_Get_FreqOffset(8192);
	else
		pstStatus->s32FreqOffset = CT221_Get_FreqOffset(2048);	
//	CTNIM_DBG(("\n[Jeff] pstStatus->s32FreqOffset = %d",pstStatus->s32FreqOffset));
#endif
    pstStatus->u16ClkInv = 0;			      	/* TS clock invert or not */
    pstStatus->u16Modulation = 0;     			/* which modulation type */
/*	
	if(	pstStatus->u16Locked == FALSE)
	{
		pstStatus->u16Modulation=CT_QPSK_ERR;
		pstStatus->u16Hierarchy=CT_HIERARCHY_ERR;
		pstStatus->u16CodeRate_HP=CT_FEC_ERR;
		pstStatus->u16CodeRate_LP=CT_FEC_ERR;
		pstStatus->u16GuardRate=CT_GI_ERR;
		pstStatus->u16TxMode=CT_FFT_ERR;
		return DRV_OK;
	}
*/
	pstStatus->u16Locked=CT221_Lock_Status();

    switch(sys_info.mod)
	{
		case 0:
			pstStatus->u16Modulation=CT_QPSK; 
			break;
		case 1:
			pstStatus->u16Modulation=CT_QAM16;
			break;
		case 2:
			pstStatus->u16Modulation=CT_QAM64;
			break;
		default:
			pstStatus->u16Modulation=CT_QPSK_ERR;
			break;
	}

	switch(sys_info.TpsHier)
	{
		case 0:
			pstStatus->u16Hierarchy=CT_HIERARCHY_NON;
			break;
		case 1:
			pstStatus->u16Hierarchy=CT_HIERARCHY_1;
			break;
		case 2:
			pstStatus->u16Hierarchy=CT_HIERARCHY_2;
			break;
		case 3:
			pstStatus->u16Hierarchy=CT_HIERARCHY_4;
			break;
		default:
			pstStatus->u16Hierarchy=CT_HIERARCHY_ERR;
			break;
	}

	switch(sys_info.hpcr)
	{
		case 0:
			pstStatus->u16CodeRate_HP=CT_FEC_1_2;
			break;
		case 1:
			pstStatus->u16CodeRate_HP=CT_FEC_2_3;
			break;
		case 2:
			pstStatus->u16CodeRate_HP=CT_FEC_3_4;
			break;
		case 3:
			pstStatus->u16CodeRate_HP=CT_FEC_5_6;
			break;
		case 4:
			pstStatus->u16CodeRate_HP=CT_FEC_7_8;
			break;
		default:
			pstStatus->u16CodeRate_HP=CT_FEC_ERR;
			break;
	}
	switch(sys_info.lpcr)
	{
		case 0:
			pstStatus->u16CodeRate_LP=CT_FEC_1_2;
			break;
		case 1:
			pstStatus->u16CodeRate_LP=CT_FEC_2_3;
			break;
		case 2:
			pstStatus->u16CodeRate_LP=CT_FEC_3_4;
			break;
		case 3:
			pstStatus->u16CodeRate_LP=CT_FEC_5_6;
			break;
		case 4:
			pstStatus->u16CodeRate_LP=CT_FEC_7_8;
			break;
		default:
			pstStatus->u16CodeRate_LP=CT_FEC_ERR;
			break;
	}
	switch(sys_info.gi)
	{
		case 0:
			pstStatus->u16GuardRate=CT_GI_1_32;
			break;
		case 1:
			pstStatus->u16GuardRate=CT_GI_1_16;
			break;
		case 2:
			pstStatus->u16GuardRate=CT_GI_1_8;
			break;
		case 3:
			pstStatus->u16GuardRate=CT_GI_1_4;
			break;
		default:
			pstStatus->u16GuardRate=CT_GI_ERR;
			break;
	}

	switch(sys_info.fft)
	{
		case 0:
			pstStatus->u16TxMode=CT_FFT_2K;
			break;
		case 1:
			pstStatus->u16TxMode=CT_FFT_8K;
			break;
		default:
			pstStatus->u16TxMode=CT_FFT_ERR;
			break;
	}

	switch(sys_info.hplp)
	{
		case 0:
			pstStatus->u8Priority=CT_PRIORITY_HIGH;
			break;
		case 1:
			pstStatus->u8Priority=CT_PRIORITY_LOW;
			break;
		default:
			pstStatus->u8Priority=CT_PRIORITY_LOW;
			break;
	}	

	return DRV_OK;
}

/*
 * Set antenna power ON / OFF
 */
EN_DRV_RESULT CT_NIM_SetAntennaPwr(u16 u16Power) /* 13/18V */
{
	#ifdef CT_OS_CHECK_STACKSIZE
	   CT_OS_RecordTaskStack();
    #endif

	#ifdef CT_NIM_VOID
	if(b8NIMDebugMode)
	{
		return DRV_OK;
	}
	#endif

#ifdef TWIN_TUNER	
	if (CT_NIM_GetBus() == EN_CT_NIM_BUS_0)
	{
		if(u16Power == TRUE)
		{
			CT_GPIO_BitSet(enNim0_Power_Port, enNim0_Power_Bit, 0);
		}	
		else
		{
			CT_GPIO_BitSet(enNim0_Power_Port, enNim0_Power_Bit, 1);
		}	
	}
	else
	{
		if(u16Power == TRUE)
		{
			CT_GPIO_BitSet(enNim1_Power_Port, enNim1_Power_Bit, 0);
		}	
		else
		{
			CT_GPIO_BitSet(enNim1_Power_Port, enNim1_Power_Bit, 1);		
		}	
	}
#else
	if(u16Power)
		CT_GPIO_BitSet(enNim0_Power_Port, enNim0_Power_Bit, 0);
	else
		CT_GPIO_BitSet(enNim0_Power_Port, enNim0_Power_Bit, 1);
#endif	
	return DRV_OK;
}

/*
 * Set tone ON / OFF
 */
EN_DRV_RESULT CT_NIM_SetTone(u16 u16NimTone)   /* 22K */
{
	// In DVB_T system, NULL function.
	return DRV_OK;
}

/*
 * Set polar H / V
 */
EN_DRV_RESULT CT_NIM_SetPolar(u16 u16NimPolar)  /* H/V */
{
	#ifdef CT_OS_CHECK_STACKSIZE
	   CT_OS_RecordTaskStack();
    #endif
/*
#ifdef TWIN_TUNER
	if (CT_NIM_GetBus() == EN_CT_NIM_BUS_0)
	{
		if(u16NimPolar == TRUE)
		{
			CT_GPIO_BitSet(enNim0_Polar_Port, enNim0_Polar_Bit, 0);
		}	
		else
		{
			CT_GPIO_BitSet(enNim0_Polar_Port, enNim0_Polar_Bit, 1);
		}	
	}
	else
	{
		if(u16NimPolar == TRUE)
		{
			CT_GPIO_BitSet(enNim1_Polar_Port, enNim1_Polar_Bit, 0);
		}	
		else
		{
			CT_GPIO_BitSet(enNim1_Polar_Port, enNim1_Polar_Bit, 1);		
		}	
	}		
#else	
	if(u16NimPolar == TRUE)
	{
		CT_GPIO_BitSet(enNim0_Polar_Port, enNim0_Polar_Bit, 0);
	}	
	else
	{
		CT_GPIO_BitSet(enNim0_Polar_Port, enNim0_Polar_Bit, 1);
	}	
#endif
*/
	return DRV_OK;
}

/*
 * Set 12V ON / OFF
 */
EN_DRV_RESULT CT_NIM_Set12V(u16 u16Nim12V)   /* 12v */
{
	// In DVB_T system, NULL function.
	return DRV_OK;
}

/*
 * Set scan channel by singal manual or auto blind scan
 */
EN_DRV_RESULT CT_NIM_SetChannel(CT_NIM_Channel stChannel)
{
	// this func is ported from set_frontend of frontend.c.
	bool8 status = FALSE;
	
#ifdef CT_OS_CHECK_STACKSIZE
	   CT_OS_RecordTaskStack();
#endif
	#ifdef CT_NIM_VOID
	if(b8NIMDebugMode)
	{
		return DRV_OK;
	}
	#endif
    
	if (b8InitSuccess==FALSE)
	{
		return DRV_OK;
	}		
	
	//printf("CT_NIM_SetChannel\n");
	
	//printf("\n[START] Freq = %lu\n",stChannel.u32Freq);		
	//printf("\n[START] B.W = %u\n",stChannel.u16SymbRate);
	//printf("\n[START] Mode = %u\n",stChannel.u16Mode);
	if (stChannel.u8TunerAISL == 1)
		CT221_InitValueByAISL(EN_TUNER_AISL_TRUE);
	else
		CT221_InitValueByAISL(EN_TUNER_AISL_FALSE);
#if 1	
	if ((u32TempFreq == stChannel.u32Freq) && (u16TempBW == stChannel.u16SymbRate)
		&& (CT221_Lock_Status() == TRUE) )
	{
		if (stChannel.u16Mode == CT_NIM_CHANNEL_MODE_LP)    
		{
    		CT221_SetPriority(FALSE, LPMODE);    
		}	
    	else
    	{
    		CT221_SetPriority(FALSE, HPMODE);		    	
    	}	
    	return DRV_OK;	
	}		
	else
	{
		u32TempFreq = stChannel.u32Freq;
		u16TempBW   = stChannel.u16SymbRate;		
		u32OffSetFreq = stChannel.u32Freq;
	}
#endif		

	if (Tuner_Init.enADCFrequency == EN_ADC_DQPLL)
	{
		//Dynamic QPLL
		if(stChannel.u16SymbRate == 7)
		{
			//CT221_SetMAINQPLL(QPLL_49_95M);
			//CT221_SetMAINQPLL(QPLL_49_50M);
			CT221_SetMAINQPLL(QPLL_49_17M);
		}
		else
		{
			CT221_SetMAINQPLL(QPLL_56_25M);
		}
	}
	

    
    if (stChannel.u16Mode == CT_NIM_CHANNEL_MODE_LP)    
    {
    	CT221_SetPriority(TRUE, LPMODE);    
    }	
    else
    {
    	CT221_SetPriority(TRUE, HPMODE);
    }	
	CT221_soft_reset();

/*
#if (TUNER_TYPE == TUNER_TD1611)	
	CT221_AGC_Target(TRUE);
#endif
*/
	if (stChannel.u16Type == 0)
	{
		CT221_SetType(TYPE_NORMAL);
	}	
	else
	{
		CT221_SetType(TYPE_SCAN);
	}	
	status = CT221_AcquireChannel(stChannel.u32Freq, stChannel.u16SymbRate);
	
	if(status == FALSE)
	{
		return DRVERR_NOTOK;
	}

    // 20080512 ism : for CT221 MB0 and MB1 mode detection but the TS packets will be injected to decoder.
    CT_MPG_SetVideoDropPktCnt(250);

	CT221_Go();

#if defined ADJUST_FREQOFFSET
 
    GI emGI; 
    FFT emFFTmode;
    u32 u32Newfreq;
    if(stChannel.u16Type == 0)
    {
        if( CT221_AdjustFreqOffSet(stChannel.u32Freq, &u32Newfreq, &emGI, &emFFTmode) == TRUE )
        {
            CT221_soft_reset();
            //printf("u32Oldfreq:%ld, u32Newfreq:%ld, \n", stChannel.u32Freq, u32Newfreq);
            //printf("emGI:%d, emFFTmode:%d\n", emGI, emFFTmode);
            if(CT221_AcquireChannel(u32Newfreq , stChannel.u16SymbRate) == FALSE)
            {
             return DRVERR_NOTOK;
            }
    
            CT221_SetGI_FFT_Mode(emGI, emFFTmode);
    
            // 20080512 ism : for CT221 MB0 and MB1 mode detection but the TS packets will be injected to decoder.
            CT_MPG_SetVideoDropPktCnt(250);

	       CT221_Go();
	       u32OffSetFreq = u32Newfreq;
    	}
	}
#endif
	u8chswitch = 1;
	u8SDRstCnt = 0;		//add by ks, change channel need set zero.
	return DRV_OK;
}

/*
 * When CT_NIM_SetChannel return a lock channel, user need to know the next frequency for blind scan,
 * then user call CT_NIM_SetChannel again.
*/
//*
EN_DRV_RESULT CT_NIM_GetBlindScanNextFreq(CT_NIM_Scan stScan, bool8 b8CtScanStatus, u32 *pu32NextFreq)
{
	// In DVB_T system, NULL function.
	return DRV_OK;
}//*/

EN_DRV_RESULT CT_NIM_WaitLock(u16 u16Mode)
{
	u16 count;	
	u32	u32Current_Timer_Tick, u32TimeOutTick;
	bool8 Status = FALSE;
	#ifdef CT_NIM_VOID
	if(b8NIMDebugMode)
	{
		return DRV_OK;
	}
	#endif
	
	CT_OS_GetClock(&u32Current_Timer_Tick);
	u32TimeOutTick=CT_OS_TimerPlus(u32Current_Timer_Tick, COUNT_5_SEC);

	for(count = 0;count<10000;count++)
	{			
		if(_u16KeyInterrupt)														// Detecting key
		{
			return DRVERR_UNCOMPLETE;
		}
		
		if(CT221_Lock_Status())
		{						
			return DRV_OK;
		}

⌨️ 快捷键说明

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