📄 tcdrv.c
字号:
/* ----------------------------------------------------------------------------
File Name: tcdrv.c (was tdrv.c from sat)
Description: external tuner drivers.
Copyright (C) 1999-2001 STMicroelectronics
date: 01-October-2001
version: 3.2.0
author: from STV0299 and MB validation drivers.
comment: Write for multi-instance/multi-FrontEnd.
Revision History:
Reference:
ST API Definition "TUNER Driver API" DVD-API-06
---------------------------------------------------------------------------- */
/* Includes ---------------------------------------------------------------- */
/* C libs */
#include <string.h>
#include <stdlib.h> /* for abs() */
/* STAPI common includes */
#include "stlite.h" /* Standard includes */
#include "stddefs.h"
/* STAPI */
#include "sttbx.h"
#include "stcommon.h"
#include "stevt.h"
#include "sttuner.h"
/* local to sttuner */
#include "util.h" /* generic utility functions for sttuner */
#include "dbtypes.h" /* data types for databases */
#include "sysdbase.h" /* functions to accesss system data */
#include "ioarch.h" /* I/O for this driver */
#include "ioreg.h" /* I/O for this driver */
#include "cdrv.h" /* utilities */
#include "cioctl.h" /* data structure typedefs for all the the cable ioctl functions */
#include "tcdrv.h" /* header for this file */
#include <assert.h>
/* define ----------------------------------------------------------------- */
#ifdef ST_OS21
#define tuner_tdrv_DelayInMicroSec(micro_sec) task_delay((signed int) \
(((micro_sec) + 999) / 1000) * \
ST_GetClocksPerSecond() / 1000)
#else
#define tuner_tdrv_DelayInMicroSec(micro_sec) task_delay((unsigned int) \
(((micro_sec) + 999) / 1000) * \
ST_GetClocksPerSecond() / 1000)
#endif
#define tuner_tdrv_DelayInMilliSec(milli_sec) tuner_tdrv_DelayInMicroSec(milli_sec*1000)
/* MT2060 */
/* LNA Band cross-over frequencies */
#ifdef STTUNER_DRV_CAB_TUN_MT2060
static const U32 MT2060_LNA_Bands[] =
{
95000000, /* 0 .. 95 MHz: b1011 */
180000000, /* 95 .. 180 MHz: b1010 */
260000000, /* 180 .. 260 MHz: b1001 */
335000000, /* 260 .. 335 MHz: b1000 */
425000000, /* 335 .. 425 MHz: b0111 */
490000000, /* 425 .. 490 MHz: b0110 */
570000000, /* 490 .. 570 MHz: b0101 */
645000000, /* 570 .. 645 MHz: b0100 */
730000000, /* 645 .. 730 MHz: b0011 */
810000000 /* 730 .. 810 MHz: b0010 */
/* 810 .. MHz: b0001 */
};
#endif
typedef struct
{
S32 min;
S32 max;
} MT_ExclZoneS_t;
/* Implement ceiling, floor functions. */
#define ceil(n, d) (((n) < 0) ? (n)/(d) : (n)/(d) + ((n)%(d) != 0))
#define floor(n, d) (((n) < 0) ? (n)/(d) - ((n)%(d) != 0) : (n)/(d))
/* End MT2060*/
#define TCDRV_WAITING_TIME 5 /* In ms (Tuner polling) */
#define TCDRV_CP_WAITING_TIME 10 /* In ms (Charge Pump) */
#define TCDRV_MT2040_WAITING_TIME 10 /* In ms (Init Tuner MT) */
#define TCDRV_IO_TIMEOUT 10
#define TCDRV_TUNER_PART_CODE_MT2030 0x06
#define TCDRV_TUNER_PART_CODE_MT2040 0x07
#define TCDRV_TUNER_PART_CODE_MT2050 0x04
#define TCDRV_TUNER_PART_CODE_MT2060 0x06
typedef enum MT2040_Offsets /* MT203X and MT2040 */
{
TCDRV_MT2040_LO1_1 = 0, /* 0x00: LO1 Byte 1*/
TCDRV_MT2040_LO1_2, /* 0x01: LO1 Byte 2*/
TCDRV_MT2040_LOGC, /* 0x02: LO GC Cntl*/
TCDRV_MT2040_RESERVED_1, /* 0x03: Reserved*/
TCDRV_MT2040_LOVCOC, /* 0x04: *For 2040 only : LO VCO Cntl*/
TCDRV_MT2040_LO2_1, /* 0x05: LO2 Byte 1*/
TCDRV_MT2040_CONTROL_1, /* 0x06: Control Byte 1*/
TCDRV_MT2040_CONTROL_2, /* 0x07: Control Byte 2*/
TCDRV_MT2040_RESERVED_3, /* 0x08: Reserved*/
TCDRV_MT2040_RESERVED_4, /* 0x09: Reserved*/
TCDRV_MT2040_RESERVED_5, /* 0x0A: Reserved*/
TCDRV_MT2040_LO2_2, /* 0x0B: LO2 Byte 2*/
TCDRV_MT2040_LO2_3, /* 0x0C: LO2 Byte 3*/
TCDRV_MT2040_MIX1, /* 0x0D: MIX1 Cntl*/
TCDRV_MT2040_STATUS, /* 0x0E: Status*/
TCDRV_MT2040_TUNEA2D, /* 0x0F: Tune A/D*/
TCDRV_MT2040_RESERVED_6, /* 0x10: Reserved*/
TCDRV_MT2040_COCODE_1, /* 0x11: Company Code Byte 1*/
TCDRV_MT2040_COCODE_2, /* 0x12: Company Code Byte 2*/
TCDRV_MT2040_PARTCODE, /* 0x13: Part Code*/
TCDRV_MT2040_REVCODE, /* 0x14: Revision Code*/
TCDRV_MT2040_NB_REGS
} MT2040_Offsets_t;
typedef enum MT2050_Offsets
{
TCDRV_MT2050_PART_REV = 0, /* 0x00: Part/Rev Code */
TCDRV_MT2050_LO1C_1, /* 0x01: LO1C Byte 1 */
TCDRV_MT2050_LO1C_2, /* 0x02: LO1C Byte 2 */
TCDRV_MT2050_LO2C_1, /* 0x03: LO2C Byte 1 */
TCDRV_MT2050_LO2C_2, /* 0x04: LO2C Byte 2 */
TCDRV_MT2050_LO2C_3, /* 0x05: LO2C Byte 3 */
TCDRV_MT2050_PWR, /* 0x06: PWR Byte */
TCDRV_MT2050_LO_STATUS, /* 0x07: LO Status Byte */
TCDRV_MT2050_RSVD_08, /* 0x08: Reserved */
TCDRV_MT2050_MISC_STATUS, /* 0x09: Misc Status Byte */
TCDRV_MT2050_RSVD_0A, /* 0x0A: Reserved */
TCDRV_MT2050_RSVD_0B, /* 0x0B: Reserved */
TCDRV_MT2050_RSVD_0C, /* 0x0C: Reserved */
TCDRV_MT2050_SRO, /* 0x0D: SRO Byte */
TCDRV_MT2050_RSVD_0E, /* 0x0E: Reserved */
TCDRV_MT2050_MIX_1, /* 0x0F: Mix 1 Byte */
TCDRV_MT2050_PK_DET, /* 0x10: Peak Detect Byte */
TCDRV_MT2050_NB_REGS
} MT2050_Offsets_t;
typedef enum MT2060_Offsets
{
TCDRV_MT2060_PART_REV = 0, /* 0x00: Part/Rev Code */
TCDRV_MT2060_LO1C_1, /* 0x01: LO1C Byte 1 */
TCDRV_MT2060_LO1C_2, /* 0x02: LO1C Byte 2 */
TCDRV_MT2060_LO2C_1, /* 0x03: LO2C Byte 1 */
TCDRV_MT2060_LO2C_2, /* 0x04: LO2C Byte 2 */
TCDRV_MT2060_LO2C_3, /* 0x05: LO2C Byte 3 */
TCDRV_MT2060_LO_STATUS, /* 0x06: LO Status Byte */
TCDRV_MT2060_FM_FREQ, /* 0x07: FM FREQ Byte */
TCDRV_MT2060_MISC_STATUS, /* 0x08: Misc Status Byte */
TCDRV_MT2060_MISC_CTRL_1, /* 0x09: Misc Ctrl Byte 1 */
TCDRV_MT2060_MISC_CTRL_2, /* 0x0A: Misc Ctrl Byte 2 */
TCDRV_MT2060_MISC_CTRL_3, /* 0x0B: Misc Ctrl Byte 3 */
TCDRV_MT2060_RSVD_0C, /* 0x0C: Reserved */
TCDRV_MT2060_RSVD_0D, /* 0x0D: Reserved */
TCDRV_MT2060_RSVD_0E, /* 0x0E: Reserved */
TCDRV_MT2060_RSVD_0F, /* 0x0F: Reserved */
TCDRV_MT2060_RSVD_10, /* 0x10: Reserved */
TCDRV_MT2060_RSVD_11, /* 0x11: Reserved */
TCDRV_MT2060_NB_REGS
} MT2060_Offsets_t;
/* private variables ------------------------------------------------------- */
#ifdef ST_OS21
static semaphore_t *Lock_InitTermOpenClose; /* guard calls to the functions */
#else
static semaphore_t Lock_InitTermOpenClose; /* guard calls to the functions */
#endif
static BOOL Installed = FALSE;
static BOOL Installed_TDBE1 = FALSE;
static BOOL Installed_TDBE2 = FALSE;
static BOOL Installed_TDDE1 = FALSE;
static BOOL Installed_SP5730 = FALSE;
static BOOL Installed_MT2030 = FALSE;
static BOOL Installed_MT2040 = FALSE;
static BOOL Installed_MT2050 = FALSE;
static BOOL Installed_MT2060 = FALSE;
static BOOL Installed_DCT7040 = FALSE;
static BOOL Installed_DCT7050 = FALSE;
static BOOL Installed_DCT7710 = FALSE;
static BOOL Installed_DCF8710 = FALSE;
static BOOL Installed_DCF8720 = FALSE;
static BOOL Installed_MACOETA50DR = FALSE;
static BOOL Installed_CD1516LI = FALSE;
static BOOL Installed_DF1CS1223 = FALSE;
static BOOL Installed_SHARPXX = FALSE;
static BOOL Installed_TDBE1X016A = FALSE;
static BOOL Installed_TDBE1X601 = FALSE;
static BOOL Installed_TDEE4X012A = FALSE;
typedef struct
{
U32 min;
U32 max;
}
MT_ExclZone_t;
/*
** Structure of data needed for Spur Avoidance
*/
#define MAX_ZONES 20
typedef struct
{
U32 nAS_Algorithm;
U32 f_ref;
U32 f_in;
U32 f_LO1;
U32 f_if1_Center;
U32 f_if1_Request;
U32 f_if1_bw;
U32 f_LO2;
U32 f_out;
U32 f_out_bw;
U32 f_LO1_Step;
U32 f_LO2_Step;
U32 f_LO1_FracN_Avoid;
U32 f_LO2_FracN_Avoid;
U32 f_zif_bw;
U32 f_min_LO_Separation;
U32 maxH1;
U32 maxH2;
U32 bSpurPresent;
U32 bSpurAvoided;
U32 nSpursFound;
U32 nZones;
MT_ExclZone_t MT_ExclZones[MAX_ZONES];
}
MT_AvoidSpursData_t;
/* tuner instance data */
typedef struct
{
ST_DeviceName_t *DeviceName; /* unique name for opening under */
STTUNER_Handle_t TopLevelHandle; /* access tuner, lnb etc. using this */
IOARCH_Handle_t IOHandle; /* passed in Open() to an instance of this driver */
STTUNER_TunerType_t TunerType; /* tuner ID number */
TCDRV_PLLType_t PLLType; /* PLL on this type of tuner */
U32 version;
U32 tuner_id;
MT_AvoidSpursData_t AS_Data;
U32 f_IF1_actual;
U32 LNA_Bands[10];
U32 FreqFactor;
TUNER_Status_t Status;
U8 IOBuffer[TCDRV_IOBUFFER_MAX]; /* buffer for ioarch I/O */
U32 BandWidth[TCDRV_BANDWIDTH_MAX];
long TunerLowBand;
long TunerMidBand;
ST_Partition_t *MemoryPartition; /* which partition this data block belongs to */
void *InstanceChainPrev; /* previous data block in chain or NULL if not */
void *InstanceChainNext; /* next data block in chain or NULL if last */
}
TCDRV_InstanceData_t;
/* instance chain, the default boot value is invalid, to catch errors */
static TCDRV_InstanceData_t *InstanceChainTop = (TCDRV_InstanceData_t *)0x7fffffff;
/* functions --------------------------------------------------------------- */
/* API */
ST_ErrorCode_t tuner_tdrv_Init(ST_DeviceName_t *DeviceName, TUNER_InitParams_t *InitParams);
ST_ErrorCode_t tuner_tdrv_Term(ST_DeviceName_t *DeviceName, TUNER_TermParams_t *TermParams);
ST_ErrorCode_t tuner_tdrv_Open(ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Handle_t *Handle);
#ifdef STTUNER_DRV_CAB_TUN_TDBE1
ST_ErrorCode_t tuner_tdrv_Open_TDBE1 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_TDBE2
ST_ErrorCode_t tuner_tdrv_Open_TDBE2 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_TDDE1
ST_ErrorCode_t tuner_tdrv_Open_TDDE1 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_SP5730
ST_ErrorCode_t tuner_tdrv_Open_SP5730 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_MT2030
ST_ErrorCode_t tuner_tdrv_Open_MT2030 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_MT2040
ST_ErrorCode_t tuner_tdrv_Open_MT2040 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_MT2050
ST_ErrorCode_t tuner_tdrv_Open_MT2050 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_MT2060
ST_ErrorCode_t tuner_tdrv_Open_MT2060 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DCT7040
ST_ErrorCode_t tuner_tdrv_Open_DCT7040 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DCT7050
ST_ErrorCode_t tuner_tdrv_Open_DCT7050 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DCT7710
ST_ErrorCode_t tuner_tdrv_Open_DCT7710 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DCF8710
ST_ErrorCode_t tuner_tdrv_Open_DCF8710 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DCF8720
ST_ErrorCode_t tuner_tdrv_Open_DCF8720 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_MACOETA50DR
ST_ErrorCode_t tuner_tdrv_Open_MACOETA50DR(ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_CD1516LI
ST_ErrorCode_t tuner_tdrv_Open_CD1516LI (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_DF1CS1223
ST_ErrorCode_t tuner_tdrv_Open_DF1CS1223 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_SHARPXX
ST_ErrorCode_t tuner_tdrv_Open_SHARPXX (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_TDBE1X016A
ST_ErrorCode_t tuner_tdrv_Open_TDBE1X016A (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_TDBE1X601
ST_ErrorCode_t tuner_tdrv_Open_TDBE1X601 (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Capability_t *Capability, TUNER_Handle_t *Handle);
#endif
#ifdef STTUNER_DRV_CAB_TUN_TDEE4X012A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -