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 + -
显示快捷键?