📄 drv_channel.c
字号:
/* $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 + -