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

📄 drv_channel.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
/* $Header:   V:/ST7710/archives/Echo_7710_T/Driver/ddi_channel/thomson_mm/drv_channel.c-arc   1.10   18 Jan 2008 16:22:58   扁夯蔼  $ */
/********************************************************************************
* $Workfile:   drv_channel.c  $
* $Modtime:   18 Jan 2008 16:22:36  $
*	Copyright (C) 2005 by       Co., Ltd.
********************************************************************************/

/////////////////////////////////////////////////////////////////////////////////
//	Includes
/////////////////////////////////////////////////////////////////////////////////
// 
#include <string.h>

#include "drv_ch_i2c_com.h"
#include "drv_ch_pio_com.h"
#include "drv_tuner_com.h"
#include "drv_tuner_sat.h"
#include "drv_channel_com.h"
#include "ddi_channel.h" // 
//thomson   #include "pn1010.h"

#include "vkernel.h"
#include "taskdef.h"
#include "ddi_uart.h"
#include "event.h"

#include "FE_DAL.h"//thomson  
/********************************************************************
							Debug Option
 ********************************************************************/
#define THOMSON_MM	//thomson  


//#define CH_PRINT				// All Print Enable /Disable
//#define CH_PRINT_ERROR			// Error Print Enable / Disable
//#define CH_PRINT_WARNING
//#define CH_PRINT_DEBUG
//#define CH_PRINT_DATA
#include "ch_print.h"

//#define	__DEBUG_DRV_CHANNEL

//#define	DRV_CHANNEL_DEBUG			(0)
//#define	DRV_CHANNEL_ENTER_EXIT		(0)
//#define	DRV_CHANNEL_DATA			(0)

//#define	DRV_BLIND_DEMOD_EVENT		(0)

#if 	defined(DRV_BLIND_DEMOD_EVENT)
#define	printDrvDemodEvt(x)		DDI_UART_Print x 
#else
#define	printDrvDemodEvt(x)		
#endif

#if 	defined(CH_PRINT_ERROR)
#define	printDrvChError(x)	DDI_UART_Print x 
#else
#define	printDrvChError(x)	
#endif

#if 	defined(DRV_CHANNEL_DEBUG)
#define	printDrvCh(x)		DDI_UART_Print x 
#else
#define	printDrvCh(x)		
#endif

#if 	defined(DRV_CHANNEL_ENTER_EXIT)
#define	printDrvChEnter(x)	DDI_UART_Print x 
#define	printDrvChExit(x)	DDI_UART_Print x 
#else
#define	printDrvChEnter(x)		
#define	printDrvChExit(x)		
#endif

#if 	defined(DRV_CHANNEL_DATA)
#define	printDrvChData(x)	DDI_UART_Print x 
#else
#define	printDrvChData(x)		
#endif

#define MODIFY_MOTOR_PROCESS (1)
/////////////////////////////////////////////////////////////////////////////////
//	Global Variables
/////////////////////////////////////////////////////////////////////////////////
#define	DRV_CH_TASK_PRIORITY			6	/* ORG 6 */	
#define	DRV_CH_TASK_STACK_SIZE		(8192)	

#define	DRV_CHANNEL_MSG_NUM			200 /* ORG (20) */
#define	DRV_CHANNEL_MSG_SIZE			(16)
#define	DRV_CHANNEL_MSG_TIMEOUT		(1000)


#ifdef __DEBUG_DRIVERS
unsigned int	g_TimerTickREF[DDI_CHANNEL_NUM_TUNER];
unsigned int	g_TimerTick[DDI_CHANNEL_NUM_TUNER];
#endif

unsigned long 	g_ulChannelHwUnitId[DDI_CHANNEL_NUM_TUNER];

unsigned char 	g_ucDiSEqCCmdBuf[DDI_CHANNEL_NUM_TUNER][6];
unsigned char 	g_ucDiSEqCCmdNum[DDI_CHANNEL_NUM_TUNER];
unsigned char 	g_ucAFC1TimeOutRetryCnt[DDI_CHANNEL_NUM_TUNER];
unsigned char 	g_ucDeltaOffsetFrequencyCnt[DDI_CHANNEL_NUM_TUNER];
unsigned char  	g_ucFECRetryCnt[DDI_CHANNEL_NUM_TUNER] = {0, 0};
unsigned char  	g_ucSYNC[DDI_CHANNEL_NUM_TUNER];
unsigned char  	g_ucLNBPower[DDI_CHANNEL_NUM_TUNER];
//unsigned char  	g_ucLNBOverLoadRetryCnt[DDI_CHANNEL_NUM_TUNER]={0, 0}; //   20051129
unsigned char  	g_ucClockSweepCnt[DDI_CHANNEL_NUM_TUNER];
unsigned char  	g_ucMaxCarrierSweepLoop[DDI_CHANNEL_NUM_TUNER];
unsigned char		g_ucPVBERDepth[DDI_CHANNEL_NUM_TUNER];
//unsigned char		g_ucDemodID[DDI_CHANNEL_NUM_TUNER] = {0x8C, 0x8C};//10086 //   20051129
unsigned char 	prevCodeRate[DDI_CHANNEL_NUM_TUNER] = {0xFF, 0xFF};
//  unsigned char 	prevSymbolRate[DDI_CHANNEL_NUM_TUNER] = {0, 0};
unsigned short 	prevSymbolRate[DDI_CHANNEL_NUM_TUNER] = {0, 0};
unsigned char 	prevDiSEqc[DDI_CHANNEL_NUM_TUNER] = {0x00, 0x00};
unsigned char 	AutoSearch_Diseqc[DDI_CHANNEL_NUM_TUNER] = {DISEQC_ON, DISEQC_ON};
unsigned char 	g_ucTimeChanged[DDI_CHANNEL_NUM_TUNER] = {FALSE, FALSE};
unsigned char 	g_ucStateTimerDuration[DDI_CHANNEL_NUM_TUNER] = {10, 10};

//unsigned long	g_ulVitErrCounter[DDI_CHANNEL_NUM_TUNER]; //   20051129
unsigned long	g_ulBER_DISP[DDI_CHANNEL_NUM_TUNER][11];

static __channel_flag_t			g_ChannelFlag[DDI_CHANNEL_NUM_TUNER];
volatile __channel_info_t	g_ChInfo[DDI_CHANNEL_NUM_TUNER];
volatile __channel_info_t	g_ChInfoWork[DDI_CHANNEL_NUM_TUNER];

static pfnDRV_TunerNotifyLock			g_pfnNotifyLock[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
static pfnDRV_TunerNotifyCarrier			g_pfnNotifyCarrier[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
static pfnDRV_TunerNotifyAgcChanged		g_pfnNotifyAgcChanged[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
static pfnDRV_TunerNotifyBerChanged		g_pfnNotifyBerChanged[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
static pfnDRV_AntNotifyDiseqcResultDone	g_pfnNotifyDiseqcResultDone[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
#ifdef _BLIND_SCAN_
static pfnDRV_TunerNotifyBlindLock			g_pfnNotifyBlindLock[DDI_CHANNEL_NUM_TUNER] = {NULL, NULL};
#endif

static unsigned long g_stTunerTimerHandle[DDI_CHANNEL_NUM_TUNER];
static unsigned long g_ulChanelMsgQueueId[DDI_CHANNEL_NUM_TUNER] = {0, 0};
static unsigned long  g_ulChannelTaskId[DDI_CHANNEL_NUM_TUNER] = {0, 0};
static unsigned long  g_ulChannelMonitorTaskId[DDI_CHANNEL_NUM_TUNER] = {0, 0};//thomson   

const int iClockAdjustTable[30] =
{
	-CLOCK_SWEEP_OFFSET,	CLOCK_SWEEP_OFFSET,
	-CLOCK_SWEEP_OFFSET*2,	CLOCK_SWEEP_OFFSET*2,
	-CLOCK_SWEEP_OFFSET*3,	CLOCK_SWEEP_OFFSET*3,
	-CLOCK_SWEEP_OFFSET*4,	CLOCK_SWEEP_OFFSET*4,
	-CLOCK_SWEEP_OFFSET*5,	CLOCK_SWEEP_OFFSET*5,
	-CLOCK_SWEEP_OFFSET*6,	CLOCK_SWEEP_OFFSET*6,
	-CLOCK_SWEEP_OFFSET*7,	CLOCK_SWEEP_OFFSET*7,
	-CLOCK_SWEEP_OFFSET*8,	CLOCK_SWEEP_OFFSET*8,
    -CLOCK_SWEEP_OFFSET*9,	CLOCK_SWEEP_OFFSET*9,
    -CLOCK_SWEEP_OFFSET*10,	CLOCK_SWEEP_OFFSET*10,
    -CLOCK_SWEEP_OFFSET*11,	CLOCK_SWEEP_OFFSET*11,
    -CLOCK_SWEEP_OFFSET*12,	CLOCK_SWEEP_OFFSET*12,
    -CLOCK_SWEEP_OFFSET*13,	CLOCK_SWEEP_OFFSET*13,
    -CLOCK_SWEEP_OFFSET*14,	CLOCK_SWEEP_OFFSET*14,
    -CLOCK_SWEEP_OFFSET*15,	CLOCK_SWEEP_OFFSET*15
};

CH_EV_t						g_CH_EV[DDI_CHANNEL_NUM_TUNER];
unsigned long	g_CH_EV_Semaphore[DDI_CHANNEL_INSTANCE_NUM];

extern unsigned char DEMOD_REG[DDI_CHANNEL_NUM_TUNER][DEMOD_NUM_OF_REG];
//extern unsigned char TUNER_DATA[DDI_CHANNEL_NUM_TUNER][TUNER_NUM_OF_DATA]; //   20051129

void drv_channel_SoftresetRegister(unsigned char unitId);
void drv_channel_Stream_Disable(unsigned char unitId);
void drv_channel_Stream_Enable(unsigned char unitId);

extern void DSEC_ResetMicom(unsigned char unitId); //  080118

int flag_diseqc_version; //  080118
int	flag_motor_stop ; //  080118, 1(Stop), 0(moving)


/////////////////////////////////////////////////////////////////////////////////
//	Function	: fnEX_GetNINT
//	Description	: Nearest INTeger
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
unsigned long fnEX_GetNINT( unsigned long x, unsigned long y)
{
	unsigned long ulNInteger;

	ulNInteger = ( x + y / 2 ) / y;

	return (ulNInteger);
} // end of fnEX_GetNINT


/////////////////////////////////////////////////////////////////////////////////
//	Function	: fnEX_SymbolToTime
//	Description	: calculate the sleep time in msec according to the symbol rate
//					Convert "number of symbols" to time in msec
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
unsigned short fnEX_SymbolToTime( unsigned long unitId, unsigned long symbols)
{
	unsigned short	usTime;

	if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate <= 0) return 0;

	usTime = (unsigned short)fnEX_GetNINT(symbols, g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate);

	return ( usTime );

} // end of fnEX_SymbolToTime

/////////////////////////////////////////////////////////////////////////////////
//	Function	: fnEX_Mul64
//	Description	: 32bits * 32bits -> 64bits
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void fnEX_Mul64(
	unsigned long uiX, 
	unsigned long uiY, 
	unsigned long* uiH, 
	unsigned long* uiL
)
{
	unsigned long ulLowIntTemp, ulHighIntTemp, uiX_H, uiX_L, uiY_H, uiY_L;
	unsigned char ucCounter;

	// initial values
	uiX_H	= uiX >> 16;
	uiX_L	= uiX & 0x0000FFFF;
	uiY_H	= uiY >> 16;
	uiY_L	= uiY & 0x0000FFFF;

	*uiH = uiX_H * uiY_H;						// calculate X1Y1
	ulLowIntTemp = uiX_H*uiY_L+uiX_L*uiY_H;		// calculate X0Y1+X1Y0

	ulHighIntTemp = 0;
	for (ucCounter = 0; ucCounter < 16; ucCounter++)
	{
		if ((ulLowIntTemp & 0x80000000) || (ulHighIntTemp != 0))
		{
			ulHighIntTemp <<= 1; 
			ulHighIntTemp |= (ulLowIntTemp>>31);
		}
		ulLowIntTemp <<= 1;
	}

	// test overflow for low byte
	*uiL  = (uiX_L*uiY_L)>>1;
	*uiL += ulLowIntTemp>>1;
	if (*uiL & 0x80000000) ulHighIntTemp++;

	// calculate X0Y0 Low Byte
	*uiL = uiX_L*uiY_L+ulLowIntTemp;

	// calculate High Byte
	*uiH += ulHighIntTemp;

} // end of fnEX_Mul64

/////////////////////////////////////////////////////////////////////////////////
//	Function	: fnEX_Div64
//	Description	: 64bits / 32bits -> 32bits
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
unsigned long fnEX_Div64(
	unsigned long uHighInt, 
	unsigned long uLowInt, 
	unsigned long uDown
)
{
	unsigned long volatile ulResult;
	unsigned long volatile ulRemain1;
	unsigned long volatile ulRemain2;
	unsigned long ulRemain3;
	unsigned long uHighInt1, uLowInt1;
	unsigned long uHighInt2, uLowInt2;

	if (uDown == 0) return 0;

	ulResult = 0xFFFFFFFF/uDown;
	ulResult *= uHighInt;

	fnEX_Mul64((0xFFFFFFFF%uDown), uHighInt, &uHighInt1, &uLowInt1);

	ulRemain1 =  0xFFFFFFFF/uDown;
	ulRemain1 *= uHighInt1;

	fnEX_Mul64((0xFFFFFFFF%uDown), uHighInt1, &uHighInt2, &uLowInt2);

	ulRemain2 =  0xFFFFFFFF/uDown;
	ulRemain2 *= uHighInt2;

	ulRemain3 = 0xFFFFFFFF%uDown;
	ulRemain3 *= uHighInt2;

	ulRemain2 += (uLowInt2+uHighInt2+ulRemain3+(uDown/2))/uDown;

	ulRemain1 += (uLowInt1+uHighInt1+(uDown/2))/uDown + ulRemain2;

	ulResult += (uLowInt+uHighInt+(uDown/2))/uDown + ulRemain1;

	return ulResult;
} // end of fnEX_Div64

/////////////////////////////////////////////////////////////////////////////////
//	Function	: fnEX_MulDiv64
//	Description	: 32bits * 32bits / 64bits -> 32bits
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
unsigned long fnEX_MulDiv64(
	unsigned long ulUP1, 
	unsigned long ulUP2, 
	unsigned long ulDOWN
)
{
	unsigned long ulHighInt, ulLowInt;

	fnEX_Mul64(ulUP1, ulUP2, &ulHighInt, &ulLowInt);

	return fnEX_Div64(ulHighInt, ulLowInt, ulDOWN);

} // end of fnEX_MulDiv64

/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_TimerIsr
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void drv_channel_TimerIsr(unsigned long timerId, void *args)
{
	unsigned long unitId;
	//  MMAC_RTOS_RESULT_CODE rtosResult;
	
	if( timerId == g_stTunerTimerHandle[0] && *(unsigned long *)args == 0 )
		unitId = 0;
	else if( timerId == g_stTunerTimerHandle[1] && *(unsigned long *)args == 1 )
		unitId = 1;
	else
	{
		PrintError("[drv_channel_TimerIsr] Unknown timer ID 0x%x\n\r", timerId);
		return;
	}

	g_CH_EV[unitId].CH_EV_ChDataGet = 1;
	VK_SEM_Release(g_CH_EV_Semaphore[unitId]);	
	
} // end of drv_channel_TimerIsr

/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_DEMODRegInit
//	Description	:
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
void drv_channel_DEMODRegInit(unsigned char unitId)
{
	//PN1010_Init_Register(unitId);
	#ifdef THOMSON_MM
	
	#else
	PN1010_StartAcquisition(unitId);
	#endif
} // end of drv_channel_DEMODRegInit

/////////////////////////////////////////////////////////////////////////////////
//	Function	: drv_channel_DEMODStandby
//	Description	: power consumption is reduced.
//	Input		:
//	Output		:
//	Return		:
/////////////////////////////////////////////////////////////////////////////////
static void drv_channel_DEMODStandby(unsigned char unitId, int nStdbyMode)
{
	#ifdef THOMSON_MM

⌨️ 快捷键说明

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