📄 dvb_nim.c
字号:
/**************************************************************************
(C)Copyright Cheertek Inc. 2002-2004,
D700, all right reserved.
Product : STB Firmware
****************************************************************************/
#include <stdio.h>
#include "dvb_type.h"
#include "dvb_db.h"
#include "dvb_nim.h"
#include "dvb_msg.h"
#include "frontend.h"
#include "dvb_sys.h"
static EN_SYS_COUNTRY_TYPE enCountry;
static EN_SYS_COUNTRY_TYPE enOldCountry;
static u8 u8MHzBW;
static u32 u32Frequency;//KHz
static u8 u8OldChannel=0;
static bool8 b8HierarchyExist=FALSE;
static bool8 b8LPMode=FALSE;
static bool8 b8AntLowActive = FALSE;
static u8 code u8Dummy;
//====================================================================================
#include "ch_table.c"
//====================================================================================
void DVB_TunerReset(void)
{
reset_frontend_enable();
}
bool8 DVB_TunerInit(void)
{
u8 u8retry=0;
bool8 b8NIM_Int=FALSE;
reset_frontend_disable();
b8NIM_Int=init_frontend();
while ((b8NIM_Int==FALSE)&&(u8retry<6)) //2004.12.09 Alex add NIM reset fail protect
{
DVB_Msg(MSG_4_NIM, "DVB NIM initial fail! try again.\n");
reset_frontend_enable();
DVB_TimerBlockingWait(200);
reset_frontend_disable();
DVB_TimerBlockingWait(20);
b8NIM_Int=init_frontend();
u8retry++;
if (b8NIM_Int) return b8NIM_Int;
}
return b8NIM_Int;
}
EN_NIM_STATUS DVB_TunerSetFrequency(u32 u32FreqKHz, u8 u8BWMHz, EN_TUNER_WAITING enWaitingType)
{
u8 u8Channel;
u8 u8WaitCount;
FRONTEND_STATUS enFeState;
u32Frequency=u32FreqKHz;
u8MHzBW=u8BWMHz;
set_frontend(u32Frequency, u8MHzBW, b8LPMode);
switch(enWaitingType)
{
case EN_TUNER_WAITING_NO:
u8WaitCount=0;
break;
case EN_TUNER_WAITING_SHORT:
u8WaitCount=TUNER_WAITING_SHORT_COUNT;
break;
case EN_TUNER_WAITING_LONG:
u8WaitCount=TUNER_WAITING_LONG_COUNT;
break;
}
for(;u8WaitCount>0;u8WaitCount-- )
{
if ( DVB_TimerPollWait(150)==FALSE )
return EN_NIM_ABORT;
enFeState=check_frontend_state();
if ( enFeState == FRONTEND_FEC_LOCK )
return EN_NIM_LOCKED;
if ( u8WaitCount<SIGNAL_LOW_SKIP_COUNT )
{
if (get_frontend_strength()<= SIGNAL_LOW_THRESHOLD)
{
if ( enFeState == FRONTEND_UNLOCK )
{
//printf("[dvb_nim.c] RF input power low and no signal, break\n");
break;
}
else
{
//printf("[dvb_nim.c] Waiting lock (power low)\n");
}
}
else
{
//printf("[dvb_nim.c] Waiting lock (power high)\n");
}
}
}
return EN_NIM_NO_LOCKED;
}
EN_NIM_STATUS DVB_TunerSetParameter(u16 u16TPIdx, EN_TUNER_WAITING enWaitingType)
{
u8 u8Channel;
u8 u8TuneCh;
u8 u8WaitCount;
if ( u16TPIdx>200 || u16TPIdx==0 )
{
// channel number error
return EN_NIM_NO_LOCKED;
}
u8Channel=(u8)(u16TPIdx&0xFF);
//DVB_Msg(MSG_4_NIM, "%s,%d> CH(%hd,%hd), country(%hd,%hd)\n", __FFLL__, u8Channel, u8OldChannel, DVB_GetSystemCountry(), enOldCountry);
if ( u8Channel==u8OldChannel && enOldCountry==DVB_GetSystemCountry() )
{
if ( check_frontend_state()== FRONTEND_FEC_LOCK )
return EN_NIM_LOCKED;
}
if ( u8Channel<100 )
{
u8TuneCh=u8Channel;
}else
{
u8TuneCh=u8Channel-100;
}
// DVB_Msg(MSG_4_NIM, "%s,%d> u8TuneCh(%hd),u32Frequency(%ld),u8MHzBW(%hd)\n", __FFLL__,u8TuneCh,u32Frequency,u8MHzBW);
if ( TunerGetChInfo(u8TuneCh, &u32Frequency, &u8MHzBW)==FALSE )
{
//set to a unavailable frequency
DVB_TunerSetFrequency(400000, 8, EN_TUNER_WAITING_NO);
// channel number error
return EN_NIM_NO_LOCKED;
}
u8OldChannel=u8Channel;
enOldCountry=DVB_GetSystemCountry();
if ( u8Channel<100 )
{
b8LPMode=FALSE;
}else
{
b8LPMode=TRUE;
}
return DVB_TunerSetFrequency(u32Frequency, u8MHzBW, enWaitingType);
}
bool8 DVB_TunerCheckLock(void)
{
if ( check_frontend_state()!= FRONTEND_FEC_LOCK )
{
return FALSE;
}
return TRUE;
}
u8 DVB_TunerGetStrength (void)
{
return get_frontend_strength();
}
u8 DVB_TunerGetQuality (void)
{
return get_frontend_quality();
}
static bool8 b8LnbStatus=FALSE;
void DVB_TunerLNBPower(bool8 b8Enable)
{
b8LnbStatus = b8Enable;
//PIO high to active lnb
if(b8AntLowActive==FALSE)
set_frontend_lnb(b8Enable);
else //PIO low to active lnb
{
if(b8Enable == TRUE)
set_frontend_lnb(FALSE);
else
set_frontend_lnb(TRUE);
}
}
bool8 DVB_TunerGetLNBPower(void)
{
return b8LnbStatus;
}
void DVB_TunerAntLowActive(bool8 b8Enable)
{
b8AntLowActive = b8Enable;
}
bool8 DVB_TunerGetChInfo(u8 u8Channel, u32 *pu32FreqKHz, u8 *pu8BWMHz)
{
return TunerGetChInfo(u8Channel, pu32FreqKHz, pu8BWMHz);
}
void DVB_TunerGetFreqBound(u8 *pu8MinCh, u8 *pu8MaxCh)
{
EN_SYS_COUNTRY_TYPE enCountry;
enCountry=DVB_GetSystemCountry();
*pu8MinCh=0;
*pu8MaxCh=0;
switch(enCountry)
{
case EN_SYS_COUNTRY_TAIWAN:
case EN_SYS_COUNTRY_AMERICA:
*pu8MinCh=14;//Start of 470MHz
// *pu8MaxCh=83;//End of 890MHz
*pu8MaxCh=78;//End of 860MHz
break;
case EN_SYS_COUNTRY_CHINA:
*pu8MinCh=13;
*pu8MaxCh=57;
break;
case EN_SYS_COUNTRY_ENGLAND:
*pu8MinCh=21;
*pu8MaxCh=68;
break;
case EN_SYS_COUNTRY_AUSTRALIA:
*pu8MinCh=6;
*pu8MaxCh=69;
break;
case EN_SYS_COUNTRY_FRANCE:
*pu8MinCh=21;
*pu8MaxCh=69;
break;
case EN_SYS_COUNTRY_GERMANY:
*pu8MinCh=5;
*pu8MaxCh=69;
break;
case EN_SYS_COUNTRY_PORTUGAL:
case EN_SYS_COUNTRY_SPAIN:
case EN_SYS_COUNTRY_ITALY:
case EN_SYS_COUNTRY_HOLLAND:
default:
*pu8MinCh=21;
*pu8MaxCh=69;
break;
}
}
bool8 DVB_TunerGetParameter( DVB_COFDMParameters *pstParameter)
{
if ( pstParameter==NULL )
return FALSE;
if ( check_frontend_state()!= FRONTEND_FEC_LOCK )
{
pstParameter->enConstellation = EN_QPSK_ERR;
pstParameter->enHPCodeRate = EN_FEC_ERR;
pstParameter->enLPCodeRate = EN_FEC_ERR;
pstParameter->enGI = EN_GI_ERR;
pstParameter->enFFT = EN_FFT_ERR;
pstParameter->enHierarchy=EN_HIERARCHY_ERR;
}
else
{
get_COFDM_parameter(pstParameter);
}
return TRUE;
}
bool8 DVB_TunerGetHierarchy(void)
{
if ( DVB_TunerCheckLock()==FALSE )
{
b8HierarchyExist=FALSE;
}else
{
b8HierarchyExist=get_COFDM_Hierarchy();
}
return b8HierarchyExist;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -