tda10086drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 1,716 行 · 第 1/4 页
C
1,716 行
#include "cs_typedef.h"
#include "CSHDI_typedef.h"
//#include "stddefs.h"
#include "cs_frnpublic.h"
#include "cs_i2c.h"
#include "cs_os.h"
#include "TDA10086Drv.h"
#include "QPSKFrontEnd.h"
#include "cs_assert.h"
//#define TDA10086_DEBUG
#define TDA10086ADDRESS 0x1C
#define TDA8263ADDRESS 0xC0
#define TDQX_SYSCLK 96000000
#define TDA10086_ID 0xE1
#define PLL_FREQ_SETP 1000
#define AS_ALGOSUCCESS_RET 1
#define AS_ALGOFAILED_RET 2
#define AS_ALGOQUICKEXIT_RET 3
#define AS_AGCRA_DEF 0x04
#define AS_LOWER_FREQUENCY_VAL 943000L
#define AS_UPPER_FREQUENCY_VAL 2157000L
#define TDA10086_ALGO_AGCA_TIMER_VAL 3
#define TDA10086_ALGO_RAUTO_TIMER_VAL 200000L
#define TDA10086_ALGO_AGCCONV_TIMER_VAL 4
#define TDA10086_ALGO_RXSIG_TIMER_VAL 20000
#define TDA10086_ALGO_LOCK_TIMER_VAL 325000
// ==============================================================================
// TDA10086 Register Define
// ==============================================================================
typedef enum
{
TDA10086REG_CLEAR, // 0x00
TDA10086REG_CARC, // 0x01
TDA10086REG_CSWP, // 0x02
TDA10086REG_CARINIT, // 0x03
TDA10086REG_RHYC, // 0x04
TDA10086REG_AGCRN, // 0x05
TDA10086REG_BDR_LSB, // 0x06
TDA10086REG_BDR_MID, // 0x07
TDA10086REG_BDR_MSB, // 0x08
TDA10086REG_BDR_INV, // 0x09
TDA10086REG_VAFC, // 0x0A
TDA10086REG_VAGCN, // 0x0B
TDA10086REG_CONF, // 0x0C
TDA10086REG_RATE, // 0x0D
TDA10086REG_SYNC, // 0x0E
TDA10086REG_STATUS, // 0x0F
TDA10086REG_RAM_CONF, // 0x10
TDA10086REG_POLA1, // 0x11
TDA10086REG_POLA2, // 0x12
TDA10086REG_FREQ_NCO_MSB,// 0x13
TDA10086REG_FREQ_NCO_LSB,// 0x14
TDA10086REG_VBER_LSB, // 0x15
TDA10086REG_VBER_MID, // 0x16
TDA10086REG_VBER_MSB, // 0x17
TDA10086REG_CPT_UNCOR, // 0x18
TDA10086REG_TS_INT, // 0x19
TDA10086REG_MODE, // 0x1A
TDA10086REG_NTHR, // 0x1B
TDA10086REG_NEST, // 0x1C
TDA10086REG_CKOFFSET, // 0x1D
TDA10086REG_IDENTITY, // 0x1E
TDA10086REG_TEST, // 0x1F
TDA10086REG_ADCONF, // 0x20
TDA10086REG_FCONF, // 0x21
TDA10086REG_GAIN, // 0x22
TDA10086REG_CLAMP_IN, // 0x23
TDA10086REG_CLAMP_1, // 0x24
TDA10086REG_CLAMP_2, // 0x25
TDA10086REG_CLAMP_3, // 0x26
TDA10086REG_CLAMP_4, // 0x27
TDA10086REG_CLAMP_A, // 0x28
TDA10086REG_CLAMP_MID, // 0x29
TDA10086REG_THRES_1, // 0x2A
TDA10086REG_THRES_2, // 0x2B
TDA10086REG_AFC_0 = 0x30,// 0x30
TDA10086REG_AFC_1, // 0x31
TDA10086REG_ITSEL, // 0x32
TDA10086REG_ITSAT, // 0x33
TDA10086REG_H22K_LSB, // 0x34
TDA10086REG_H22K_MSB, // 0x35
TDA10086REG_DiSEqC, // 0x36
TDA10086REG_AGCN, // 0x37
TDA10086REG_DCIOFF, // 0x38
TDA10086REG_DCQOFF, // 0x39
TDA10086REG_PLL_P1, // 0x3A
TDA10086REG_PLL_P2, // 0x3B
TDA10086REG_FTUN_MSB = 0x3D,// 0x3D
TDA10086REG_FTUN_LSB, // 0x3E
TDA10086REG_AGCRA, // 0x3F
TDA10086REG_AGCA, // 0x40
TDA10086REG_GTR_1, // 0x41
TDA10086REG_GTR_2, // 0x42
TDA10086REG_VAGCA, // 0x43
TDA10086REG_ERADC, // 0x44
TDA10086REG_ERFAR, // 0x45
TDA10086REG_ERNYQ, // 0x46
TDA10086REG_GAUTO, // 0x47
TDA10086REG_OCT_1, // 0x48
TDA10086REG_OCT_2, // 0x49
TDA10086REG_OCT_3, // 0x4A
TDA10086REG_OCT_4, // 0x4B
TDA10086REG_OCT_5, // 0x4C
TDA10086REG_OCT_6, // 0x4D
TDA10086REG_OCT_7, // 0x4E
TDA10086REG_OCT_8, // 0x4F
TDA10086REG_ENDOFMSG, // 0x50
TDA10086REG_VAFC_MSB, // 0x51
TDA10086REG_VAFC_LSB, // 0x52
TDA10086REG_ISYMB, // 0x53
TDA10086REG_QSYMB, // 0x54
TDA10086REG_PLL_P3, // 0x55
TDA10086REG_WPLL_1, // 0x56
TDA10086REG_WPLL_2, // 0x57
TDA10086REG_ADC // 0x58
};
typedef struct
{ BYTE bReceiveSignal;
BYTE bCarLock;
BYTE bFrameSync;
BYTE bFel;
} T_DemodStatus;
void TDA10086Regiterset( CSHDITunerIndex bTunerIndex );
void TDA10086SetPLL( CSHDITunerIndex bTunerIndex );
extern int CSQPSKSleep( CSHDITunerIndex bTunerIndex, DWORD dwSleepTime);
extern void CSClear( CSHDITunerIndex bTunerIndex );
void TDA10086InitDemod(CSHDITunerIndex bTunerIndex);
DWORD TDA10086WriteRF(CSHDITunerIndex bTunerIndex,DWORD uFreqWanted);
void TDA10086WriteVR( CSHDITunerIndex bTunerIndex );
void TDA10086WriteSI( CSHDITunerIndex bTunerIndex );
int TDA10086WriteNextSearch(CSHDITunerIndex bTunerIndex, BYTE bMode, DWORD* uRF, DWORD uSR);
void TDA10086AlgoStart(CSHDITunerIndex bTunerIndex);
BYTE TDA10086AlgoMain(CSHDITunerIndex bTunerIndex, int* pAlgoTimer, DWORD *pRF, DWORD uSR);
BYTE TDA10086ReadSync(CSHDITunerIndex bTunerIndex);
CSQPSK_Error_t TDA8263SetFrequency(CSHDITunerIndex bTunerIndex, DWORD TunerFrequency);
CSQPSK_Error_t TDA8263SetPLLTuner (CSHDITunerIndex bTunerIndex, PBYTE pbPLLData, int nLength);
CSQPSK_Error_t TDA10086SetSymbolRate (CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate);
CSQPSK_Error_t TDA10086CheckLockStatus(CSHDITunerIndex bTunerIndex, int *pnLockStatus );
static BYTE g_bAMPoff[MAX_TUNER_NUM]; // 0-Normal ; 1-20dB attenuation ; 2-9dB additional gain ;
static BYTE g_bChanged[MAX_TUNER_NUM]; // 0-Normal ; 1-tuner gain control has changed
static HCSHANDLE g_hdlTDA10086I2C[MAX_TUNER_NUM];
static HCSHANDLE g_hdlTDA8263I2C[MAX_TUNER_NUM];
static T_DemodStatus g_tDemodStatus[MAX_TUNER_NUM];
static DWORD g_dwLockedFreq[MAX_TUNER_NUM]; /*hjh added*/
static DWORD g_dwCurrFreq[MAX_TUNER_NUM];
static DWORD g_dwSymRate[MAX_TUNER_NUM];
static BYTE g_bSearchRange[MAX_TUNER_NUM];
static int g_nAlgoTimer[MAX_TUNER_NUM];
CSQPSK_Error_t TDA10086SetRegisters ( CSHDITunerIndex bTunerIndex, BYTE bStartReg, PBYTE pbValue, int nLength )
{
BYTE pbData[100];
int nActWrittenLen;
int ii;
int nResult;
if (nLength > 100)
{
CSTRACE( ERROR_LEVEL, "[HDI][CS_QPSK][TDA10086SetRegisters]:\n[Tuner Debug] TDA10086 Write Err: Data too Long!!!");
return CSQPSK_INVALID_PARAM;
}
if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
pbData[0] = bStartReg;
for (ii=0; ii<nLength; ii++)
pbData[ii+1] = *pbValue++;
nResult = CSI2CWriteWithStop( g_hdlTDA10086I2C[bTunerIndex], pbData, nLength+1 );
CSI2CReleaseBus_inner(bTunerIndex);
if ( nResult == CSI2C_SUCCESS )
{
return CSQPSK_SUCCESS;
}
}
return CSQPSK_I2C_ERROR;
}
CSQPSK_Error_t TDA10086SetOneRegister ( CSHDITunerIndex bTunerIndex, BYTE bRegIndex, BYTE bRegValue )
{
return TDA10086SetRegisters(bTunerIndex, bRegIndex, &bRegValue, 1);
}
CSQPSK_Error_t TDA10086GetRegisters ( CSHDITunerIndex bTunerIndex, BYTE bStartReg, PBYTE pbValue, int nLength )
{
BYTE bValue;
int nResult;
if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
bValue = bStartReg;
if ( CSI2CWriteWithStop ( g_hdlTDA10086I2C[bTunerIndex], &bValue, 1 ) == CSI2C_SUCCESS )
{
nResult = CSI2CReadWithStop (g_hdlTDA10086I2C[bTunerIndex], pbValue, nLength);
}
else
{
nResult = CSQPSK_I2C_ERROR;
}
CSI2CReleaseBus_inner(bTunerIndex);
if ( nResult == CSI2C_SUCCESS )
{
return CSQPSK_SUCCESS;
}
}
return CSQPSK_I2C_ERROR;
}
CSQPSK_Error_t TDA10086GetOneRegister ( CSHDITunerIndex bTunerIndex, BYTE bRegIndex, BYTE *bRegValue)
{
return TDA10086GetRegisters ( bTunerIndex, bRegIndex, bRegValue, 1 );
}
CSQPSK_Error_t TDA10086Initialize(CSHDITunerIndex bTunerIndex, BYTE bTSOutputMode)
{
/* TDA10085_CLEAR */
TDA10086SetOneRegister(bTunerIndex,0x00,0x01);
/* TDA10085_CARC */
TDA10086SetOneRegister(bTunerIndex,0x01,0x94);
/* TDA10085_CSWP */
TDA10086SetOneRegister(bTunerIndex,0x02,0x00);
/* TDA10085_CARINIT */
TDA10086SetOneRegister(bTunerIndex,0x03,0xe4);
/* TDA10085_RHYC */
TDA10086SetOneRegister(bTunerIndex,0x04,0x43);
/* TDA10085_AGCRN */
TDA10086SetOneRegister(bTunerIndex,0x05,0x0b);
/* TDA10085_BDR_LSB */
TDA10086SetOneRegister(bTunerIndex,0x06,0x00);
/* TDA10085_BDR_MID */
TDA10086SetOneRegister(bTunerIndex,0x07,0x00);
/* TDA10085_BDR_MSB */
TDA10086SetOneRegister(bTunerIndex,0x08,0x00);
/* TDA10085_BDR_INV */
TDA10086SetOneRegister(bTunerIndex,0x09,0x00);
/* TDA10085_VAFC */
TDA10086SetOneRegister(bTunerIndex,0x0A,0x00);
/* TDA10085_VAGCN */
TDA10086SetOneRegister(bTunerIndex,0x0B,0x00);
/* TDA10085_CONF */
TDA10086SetOneRegister(bTunerIndex,0x0C,0x0C);
/* TDA10085_RATE */
TDA10086SetOneRegister(bTunerIndex,0x0D,0x08);
/* TDA10085_SYNC */
TDA10086SetOneRegister(bTunerIndex,0x0E,0x00);
/* TDA10085_STATUS */
TDA10086SetOneRegister(bTunerIndex,0x0F,0x00);
/* TDA10085_RAM_CONF */
TDA10086SetOneRegister(bTunerIndex,0x10,0x2A);
if (TS_SERIAL== bTSOutputMode)
{
/* TDA10085_POLA1 */
TDA10086SetOneRegister(bTunerIndex,0x11,0x81);
/* TDA10085_POLA2 */
TDA10086SetOneRegister(bTunerIndex,0x12,0x81);
}
else
{
/* TDA10085_POLA1 */
TDA10086SetOneRegister(bTunerIndex,0x11,0x89);
/* TDA10085_POLA2 */
TDA10086SetOneRegister(bTunerIndex,0x12,0x89);
}
/* TDA10085_FNCO_MSB */
TDA10086SetOneRegister(bTunerIndex,0x13,0x00);
/* TDA10085_FNCO_LSB */
TDA10086SetOneRegister(bTunerIndex,0x14,0x00);
/* TDA10085_VBER_LSB */
TDA10086SetOneRegister(bTunerIndex,0x15,0x00);
/* TDA10085_VBER_MID */
TDA10086SetOneRegister(bTunerIndex,0x16,0x00);
/* TDA10085_VBER_MSB */
TDA10086SetOneRegister(bTunerIndex,0x17,0x00);
/* TDA10085_CPT_UNCOR */
TDA10086SetOneRegister(bTunerIndex,0x18,0x80);
if (TS_SERIAL== bTSOutputMode)
{
// printf("\n - - - S E R I A L - - -");
/* TDA10085_TS_INT */
TDA10086SetOneRegister(bTunerIndex,0x19,0x71);
/* TDA10085_MODE */
TDA10086SetOneRegister(bTunerIndex,0x1A,0x6d);
}
else
{
/* TDA10085_TS_INT */
TDA10086SetOneRegister(bTunerIndex,0x19,0x6a);
/* TDA10085_MODE */
TDA10086SetOneRegister(bTunerIndex,0x1A,0x61);
}
/* TDA10085_NTHR */
TDA10086SetOneRegister(bTunerIndex,0x1B,0xb0);
/* TDA10085_NEST */
TDA10086SetOneRegister(bTunerIndex,0x1C,0x00);
/* TDA10085_CKOFFSET */
TDA10086SetOneRegister(bTunerIndex,0x1D,0x00);
/* TDA10085_IDENTITY */
TDA10086SetOneRegister(bTunerIndex,0x1E,0x00);
/* TDA10085_TEST */
TDA10086SetOneRegister(bTunerIndex,0x1F,0x10);
/* TDA10085_ADCONF */
TDA10086SetOneRegister(bTunerIndex,0x20,0x81);
/* TDA10085_FCONF */
TDA10086SetOneRegister(bTunerIndex,0x21,0x83);
/* TDA10085_GAIN */
TDA10086SetOneRegister(bTunerIndex,0x22,0x00);
/* TDA10085_CLAMPIN */
TDA10086SetOneRegister(bTunerIndex,0x23,0x00);
/* TDA10085_CLAMP1 */
TDA10086SetOneRegister(bTunerIndex,0x24,0x00);
/* TDA10085_CLAMP2 */
TDA10086SetOneRegister(bTunerIndex,0x25,0x00);
/* TDA10085_CLAMP3 */
TDA10086SetOneRegister(bTunerIndex,0x26,0x00);
/* TDA10085_CLAMP4 */
TDA10086SetOneRegister(bTunerIndex,0x27,0x00);
/* TDA10085_CLAMPA */
TDA10086SetOneRegister(bTunerIndex,0x28,0x00);
/* TDA10085_CLAMPMID */
TDA10086SetOneRegister(bTunerIndex,0x29,0x00);
/* TDA10085_THRES1 */
TDA10086SetOneRegister(bTunerIndex,0x2A,0x00);
/* TDA10085_THRES2 */
TDA10086SetOneRegister(bTunerIndex,0x2B,0x00);
/* TDA10085_AFC0 */
TDA10086SetOneRegister(bTunerIndex,0x30,0x0c);
/* TDA10085__AFC1 */
TDA10086SetOneRegister(bTunerIndex,0x31,0x55);
/* TDA10085_ITSEL */
TDA10086SetOneRegister(bTunerIndex,0x32,0x00);
/* TDA10085_ITSTAT */
TDA10086SetOneRegister(bTunerIndex,0x33,0x00);
/* TDA10085_H22K_LSB */
TDA10086SetOneRegister(bTunerIndex,0x34,0x78);
/* TDA10085_H22K_MSB */
TDA10086SetOneRegister(bTunerIndex,0x35,0x00);
/* TDA10085_DISEQ */
TDA10086SetOneRegister(bTunerIndex,0x36,0x20);
/* TDA10085_AGCN */
TDA10086SetOneRegister(bTunerIndex,0x37,0x43);
/* TDA10085_DCIOFF */
TDA10086SetOneRegister(bTunerIndex,0x38,0x00);
/* TDA10085_DCQOFF */
TDA10086SetOneRegister(bTunerIndex,0x39,0x00);
/* TDA10085_PLL1 */
TDA10086SetOneRegister(bTunerIndex,0x3A,0x00);
/* TDA10085_PLL2 */
TDA10086SetOneRegister(bTunerIndex,0x3B,0x00);
/* TDA10085_PLL3 */
TDA10086SetOneRegister(bTunerIndex,0x3C,0x00);
/* TDA10085_FTUNMSB */
TDA10086SetOneRegister(bTunerIndex,0x3D,0x81);
/* TDA10085_FTUNLSB */
TDA10086SetOneRegister(bTunerIndex,0x3E,0x00);
/* TDA10085_AGCRA */
TDA10086SetOneRegister(bTunerIndex,0x3F,0x0A);
/* TDA10085_AGCA */
TDA10086SetOneRegister(bTunerIndex,0x40,0x64);
/* TDA10085_GTR1 */
TDA10086SetOneRegister(bTunerIndex,0x41,0x4f);
/* TDA10085_GTR2 */
TDA10086SetOneRegister(bTunerIndex,0x42,0x4f);
/* TDA10085_VAGCA */
TDA10086SetOneRegister(bTunerIndex,0x43,0x00);
/* TDA10085_ERADC */
TDA10086SetOneRegister(bTunerIndex,0x44,0x00);
/* TDA10085_ERFAR */
TDA10086SetOneRegister(bTunerIndex,0x45,0x00);
/* TDA10085_ERNYQ */
TDA10086SetOneRegister(bTunerIndex,0x46,0x00);
/* TDA10085_GAUTO */
TDA10086SetOneRegister(bTunerIndex,0x47,0x00);
/* TDA10085_OCT1 */
TDA10086SetOneRegister(bTunerIndex,0x48,0x00);
/* TDA10085_OCT2 */
TDA10086SetOneRegister(bTunerIndex,0x49,0x00);
/* TDA10085_OCT3 */
TDA10086SetOneRegister(bTunerIndex,0x4A,0x00);
/* TDA10085_OCT4 */
TDA10086SetOneRegister(bTunerIndex,0x4B,0x00);
/* TDA10085_OCT5 */
TDA10086SetOneRegister(bTunerIndex,0x4C,0x00);
/* TDA10085_OCT6 */
TDA10086SetOneRegister(bTunerIndex,0x4D,0x00);
/* TDA10085_OCT7 */
TDA10086SetOneRegister(bTunerIndex,0x4E,0x00);
/* TDA10085_OCT8 */
TDA10086SetOneRegister(bTunerIndex,0x4F,0x00);
/* TDA10085_ENDOFMSG */
TDA10086SetOneRegister(bTunerIndex,0x50,0x00);
/* TDA10085_VAFC_MSB */
TDA10086SetOneRegister(bTunerIndex,0x51,0x00);
/* TDA10085_VAFC_LSB */
TDA10086SetOneRegister(bTunerIndex,0x52,0x00);
/* TDA10085_ISYMB */
TDA10086SetOneRegister(bTunerIndex,0x53,0x00);
/* TDA10085_QSYMB */
TDA10086SetOneRegister(bTunerIndex,0x54,0x00);
/* TDA10085_PLLTS */
TDA10086SetOneRegister(bTunerIndex,0x55,0x00);
/* TDA10085_WPLL1 */
TDA10086SetOneRegister(bTunerIndex,0x56,0x00);
/* TDA10085_WPLL2 */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?