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 + -
显示快捷键?