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

📄 dvb_nim.c

📁 上海tower公司DVB-T tuner驱动程序
💻 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 + -