stv0288drv.c

来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,124 行 · 第 1/5 页

C
2,124
字号
/*************************************************************************

* Stv0288drv.C                                                        *

* Copyright ? Shenzhen Coship Electronics Co.#,LTD.  2002.3             *

* All rights reserved.                                                  *

*                                                                       *

* Author: sunfugong                                            *

* Date:  2002/3/13                                                      *

* Compiler:					                                             *

*                                                                       *

* Description:	STV0288 QPSK Link IC Driver								*

* Notes:                                                                *

* Update:   2002/3/6  Zhou Cheng										*
   Update:   2006/11/1 Tang Hu 
   description:add Diseqc interface for stv0288
   Update:   2007/1/15 Tanghu
    description:add STS interface
*************************************************************************/
#include "cs_typedef.h"
#include "CSHDI_typedef.h"
#include "CSQpskCFG.h"
#include "cs_qpsk.h"
#include "cs_os.h"
#include "CS_I2c.h"
#include "Allcommand.h"
#include "cs_frnpublic.h"
#include "cs_gpio.h"
#include "stddefs.h"
#include "STV0288DRV.h"
//#include "stv0299drv.h"
//#define STV0288_DEBUG

#define STV0288_CHIP_ID				0x11
#define STV0288_CHIP_ADDR			0xd0

#define STV0288_EXT_REF_CLOCK  4000  //khz


#define DiSEqCMODE_MASK			0x03
#define PORTCTRL_MASK			0x07
#define TONEBURST_MASK			0x04
#define MODULATED_BURST			0x04
#define UNMODULATED_BURST		0x0
#define FIFO_FULL_MASK			0x01
#define CFOUND_FLAG				0x80
#define TPLOCK_FLAG				0x08
#define VSTATUS_MASK			0x88
#define TIMING_FLAG				0x80

/* STV0288 Register VENRATE (0x09) Puncture rate enable */
#define STV0288_VENRATE_E0_MSK  (0x01)  /* Enable Basic Puncture Rate 1/2 */
#define STV0288_VENRATE_E1_MSK  (0x02)  /* Enable Puncture Rate 2/3 */
#define STV0288_VENRATE_E2_MSK  (0x04)  /* Enable Puncture Rate 3/4 */
#define STV0288_VENRATE_E3_MSK  (0x08)  /* Enable Puncture Rate 5/6 */
#define STV0288_VENRATE_E4_MSK  (0x10)  /* Enable Puncture Rate 6/7 Mode B
                                           or 7/8 Mode A */
//#define CLOCK_HIGH2LOW                                           


/* Register map constants */
	#define R288_ID			0
	#define R288_I2CRPT		1
	#define R288_ACR		2
	#define R288_F22FR		3
	#define R288_F22RX		4
	#define R288_DISEQC		5
	#define R288_DISEQCFIFO		6
	#define R288_DISEQCSTAT1	7
	#define R288_DISEQCSTAT2	8
	#define R288_DISEQC2		9
	#define R288_DISRX_ST0		10
	#define R288_DISRX_ST1		11
	#define R288_DISTXWAIT		12
	#define R288_TSREG		13
	#define R288_AGC1C		14
	#define R288_AGC1R		15
	#define R288_AGC1IN		16
	#define R288_RTC		17
	#define R288_AGC2C0EF	18
	#define R288_AGC2REF	19
	#define R288_STEP1		20
	#define R288_CFD		21
	#define R288_ACLC		22
	#define R288_BCLC		23
	#define R288_ROLLOFF	24
	#define R288_LDT		25
	#define R288_LDT2		26
	#define R288_DACR1		27
	#define R288_DACR2		28
	
	#define R288_TLIRM		30
	#define R288_TLIRL		31
	#define R288_AGC2I1		0x20
	#define R288_AGC2I2		0x21
	#define R288_RTFM		0x22
	#define R288_RTFL		0x23
	#define R288_VSTATUS	0x24
	#define R288_LDI			0x25
	#define R288_ECNTM		0x26
	#define R288_ECNTL		0x27
	#define R288_SFRH		0x28
	#define R288_SFRM		0x29
	#define R288_SFRL		0x2a
	#define R288_CFRM		0x2b
	#define R288_CFRL		0x2c
	#define R288_NIRM		0x2d
	#define R288_NIRL		0x2e
	#define R288_VERROR		0x2f
	#define R288_FECM		0x30
	#define R288_VTH0		0x31
	#define R288_VTH1		0x32
	#define R288_VTH2		0x33
	#define R288_VTH3		0x34
	#define R288_VTH4		0x35
	#define R288_VTH5		0x36
	#define R288_PR			0x37
	#define R288_VAVSRCH	0x38
	#define R288_RS			0x39
	#define R288_RSOUT		0x3a
	#define R288_ERRCTRL	0x3b
	#define R288_VITPROG	0x3c
	#define R288_ERRCTRL2	0x3d
	#define R288_ECNTM2		0x3e
	#define R288_ECNTL2		0x3f
	#define R288_PLLCTRL	0x40
	#define R288_SYNTCTRL	0x41
	#define R288_TSTTNR1	0x42
	#define R288_IRQMSKM	0x43
	#define R288_IRQMSKL	0x44
	#define R288_IRQSTATM	0x45
	#define R288_IRQSTATL	0x46
	#define R288_IRQCFG		0x47
	#define R288_SYMBCTRL	0x4a
	#define R288_ISYMB		0x4b
	#define R288_QSYMB		0x4c
	#define R288_ASCTRL		0x50
	#define R288_COARP1		0x51
	#define R288_COARP2		0x52
	#define R288_FMINM		0x53
	#define R288_FMINL		0x54
	#define R288_FMAXM		0x55
	#define R288_FMAXL		0x56
	#define R288_FINEINC	0x57
	#define R288_STEP2		0x58
	#define R288_TH2		0x59
	#define R288_TH2_TH1	0x5a
	#define R288_TH1		0x5b
	#define R288_THH		0x5c
	#define R288_IND1MAX		0x5d
	#define R288_ACCU1VAL		0x5e
	#define R288_ACCU2VAL		0x5f
	#define R288_IOPGPIO0		0x60
	#define R288_IOPGPIO1		0x61
	#define R288_IOPGPIO2		0x62
	#define R288_IOPGPIO3		0x63
	#define R288_IOPGPIO4		0x64
	#define R288_IOPGPIO5		0x65
	#define R288_IOPGPIO6		0x66
	#define R288_IOPGPIO7		0x67
	#define R288_IOPGPIO8		0x68
	#define R288_IOPGPIO9		0x69
	#define R288_IOPVAL0		0x6a
	#define R288_IOPVAL1		0x6b
	#define R288_IOPVAL2		0x6c
	#define R288_FREEDIS		0x70
	#define R288_FREES		0x71
	#define R288_FREESA		0x72
	#define R288_FREEVIT	0x74
	#define R288_FREERS		0x75
	#define R288_FREEQDM	0x76
	#define R288_TAGC1		0x81
	#define R288_IDCOFF		0x82
	#define R288_QDCOFF		0x83
	#define R288_TSTR		0x84
	#define R288_TCTLT1		0x85
	#define R288_TSTRM1		0x88
	#define R288_TSTRATE	0x89
	#define R288_SELOUT		0x8a
	#define R288_FORCEIN	0x8b
	#define R288_TSTFIFOL	0x8c
	#define R288_TSTCK		0x90
	#define R288_TSTRES		0x91
	#define R288_TSTOUT		0x92
	#define R288_TSTIN		0x93
	#define R288_READREG	0x94
	#define R288_TSTNR2		0x97
	#define R288_TSTDIS		0xa0
	#define R288_TSTDISRX	0xa1
	#define R288_IOPSDAT	0xb0
	#define R288_IOPSCLT	0xb1
	#define R288_IOPAGC		0xb2
	#define R288_IOPDIRCLK	0xb3
	#define R288_IOPAUX		0xb4
	#define R288_IOPSTDBY	0xb5
	#define R288_IOPCS0		0xb6
	#define R288_IOPCS1		0xb7
	#define R288_IOPSDISEQC		0xb8
	#define R288_TBUSBIT		0xb9
	#define R288_TCOMP1			0xf0
	#define R288_TCOMP2			0xf1
	#define R288_TCOMPSTAT		0xf2
	#define STV0288_NUM_REGS	140
	
/********************************************************/
	// function define
#define F288_CFD_ON 		0x80
#define F288_IND1_ACC 		0x00
#define F288_IND2_ACC 		0x80
#define F288_FROZE_LOCK 	0x20
#define F288_IQ_INVERT 		0x01
#define F288_STOPON_FMIN 	0x80
#define F288_STOPON_FMAX	0x80
#define F288_FINE 			0x02
#define F288_COARSE 		0x01
#define F288_AUTOCENTER 	0x04
#define F288_TMG_LOCK 		0x80
#define F288_ALPHS_MASK 	0x0f
#define F288_BETA_MASK 	0x3f

/*************************************************************/
#define BYTE_MSB(x) ((BYTE)((x>>8)&0xff))	
#define BYTE_LSB(x) ((BYTE)(x&0xff))
#define MIN(x,y) ((x) < (y)) ? (x) : (y)
#define MAX(x,y) ((x) > (y)) ? (x) : (y)
#define ABS(X)   ((X)<0 ?   (-X) : (X))
#define MAKEWORD(a, b)      ((WORD)(((BYTE)((a) & 0xff)) | ((WORD)((BYTE)((b) & 0xff))) << 8))
static int	g_nASIInSelect[MAX_TUNER_NUM];
static int g_nASIStatusPin[MAX_TUNER_NUM];
static int g_nTSOutputMode[MAX_TUNER_NUM];
static HCSHANDLE g_hSTV0288I2C[MAX_TUNER_NUM];
//#define NO_USE_REG 0x00

static BYTE g_Stv0288DefVal[STV0288_NUM_REGS]=	/* Default values for STX0288 registers	*/  
{
/*0x00*/0x10,0xb5,0x20,0x8e,0x8e,0x32,0x00,0x20,0x00,0x00, 
		0x04,0x00,0x00,0x00,0xf4,0x30,0xf2,0x44,0x03,0x48,  
		0x84,0xc5,0xb7,0x9c,0x00,0xdd,0xc9,0x8f,0xf0,
/*0x1e*/0x80,0x26,0x0b,0x54,0xff,0x01,0x9a,0x7f,0x00,0x00,0x46,  
		0x66,0x90,0xfe,0x78,0x0e,0x5d,0x00,0x01,0x1e,0x14,  
		0x0f,0x09,0x0c,0x05,0x3f,0x16,0xbc,0x00,0x13,0x11,  
		0xb1,0x00,0x00,0x63,0x04,0x60,0x00,0x00,0x00,0x00,0x00,
/*0x4a*/0x00,0x1b,0x28,
/*0x50*/0x10,0x36,0x20,0x94,0xb2,0x29,  
		0x64,0x2b,0x54,0x86,0x00,0x9b,0x08,0x7f,0xff,0x8d,  
		0x82,0x82,0x82,0x02,0x02,0x02,0x82,0x82,0x82,0x82,  
		0x38,0x0c,0x00,
/*0x70*/0x00,0x00,0x00,
/*0x74*/0x00,0x00,0x00,
/*0x81*/0x00,0x3f,0x3f,0x00,0x00,
/*0x88*/0x00,0x00,0x00,0x00,0x00,
/*0x90*/0x00,0x00,0x00,0x00,0x1c,
/*0x97*/0x00,
/*0xa0*/0x48,0x00,
/*0xb0*/0xb8,0x3a,0x10, 0x82,0x80,0x82,0x82,0x82,0x20,0x00,
/*0xf0*/0x00,0x00,0xc0  
};
//#define Orignal_Freq_Step 1000 /*for STS. if cur Freq is not locked, Next Freq is Cur freq + Orignal_Freq_Step*/
#define Orignal_Freq_Step 2000 
int g_nSRTemp;/*add by th for STS */
static BYTE g_Stv0288RegMapVal[0xff];
static int freq_step;
int g_nProcPer = 0;/*盲扫进度指示*/
int g_nCoarseScan_off_freq = 0;
#if 0
static FE_288_LOOKUP_t FE_288_RF_LookUp =	{
												16,
												{
													-100,	-200,
													-150,	-190,
													-200,	-140,
													-250,	-85,
													-300,	-35,
													-350,	10,
													-400,	65,
													-450,	120,
													-500,	170,
													-550,	220,
													-600,	275,
													-650,	325,
													-700,	370,
													-750,	420,
													-800,	435,
													-840,	475
												}
											};
											



static FE_288_LOOKUP_t FE_288_CN_LookUp =	{
												30,
												{
													25,	8680,
													30,	8420,
													35,	8217,
													40,	7897,
													50,	7333,
													60,	6747,
													70,	6162,
													80,	5580,
													90,	5029,
													100,4529,
													110,4080,
													120,3685,
													130,3316,
													140,2982,
													150,2688,
													160,2418,
													170,2188,
													180,1982,
													190,1802,
													200,1663,
													210,1520,
													220,1400,
													230,1295,
													240,1201,
													250,1123,
													260,1058,
													270,1004,
													280,957,
													290,920,
													300,890
												}
											};
#endif

#define PERROW  3

static DWORD g_ppdwSegSymbR[][PERROW]={
	{ 0,800,50},
	{ 2500,800,80},
	{ 4000,700,100},
	{10000,500,250},
	{0xffffffff,500,500}
};
static DWORD g_dwMaster_Clock_Khz=0;

CSQPSK_Error_t STV0288GetDerotFreq (CSHDITunerIndex bTunerIndex, int *nDerotFrequency);
// add by sfg for complier
//static CSQPSK_Error_t STV0288WaitDiSEqCFree (CSHDITunerIndex bTunerIndex);
#define TUNER_DELAY_MS(x) vDelay_time_ms(x)
static long  STV0288_CalcDataTimeConstant(CSHDITunerIndex bTunerIndex , DWORD SymbolRate_K );
static DWORD STV0288_CalcSymbolRate(DWORD MasterClock,BYTE Hbyte,BYTE Mbyte,BYTE Lbyte);
CSQPSK_Error_t STV0288STSLock5( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL );
static void vDelay_time_ms(int x)
{
	int t;
	t=x*1000;
	while(t--);
	
}

/*****************************************************
**FUNCTION	::	BinaryFloatDiv
**ACTION	::	float division (with integer) 
**PARAMS IN	::	NONE
**PARAMS OUT::	NONE
**RETURN	::	Derotator frequency (KHz)
*****************************************************/
static long BinFloatDiv(long n1, long n2, int precision)
{
	int i=0;
	long result=0;
	
	/*	division de N1 par N2 avec N1<N2	*/
	while(i<=precision) /*	n1>0	*/
	{
		if(n1<n2)
		{
			result<<=1;      
			n1<<=1;
		}
		else
		{
			result=(result<<1)+1;
			n1=(n1-n2)<<1;
		}
		i++;
	}
	
	return result;
}

static int CalcDerotFreq(BYTE derotmsb,BYTE derotlsb,int  fm)
{
	int	dfreq;
	int Itmp;
	#if 0	
	Itmp = (short)(derotmsb<<8)+derotlsb;
	dfreq = (int)(Itmp*(fm/10000L));
	dfreq = (int)(dfreq / 65536L);
	dfreq *= 10;
	#else
	Itmp = (short)(derotmsb<<8)+derotlsb;
	dfreq = (int)(Itmp* fm);
	dfreq = (int)(dfreq / 65536L);
	#endif
	return dfreq; 
}

static void STV0288RegMap_DefaultVal(void)
{
	//memcpy( g_Stv0288RegMapVal, g_Stv0288DefVal, STV0288_NUM_REGS );
	memset(g_Stv0288RegMapVal,0,sizeof(g_Stv0288RegMapVal));
}

static void STV0288Set_RegMap_Val(BYTE StartReg, BYTE *pbValue, DWORD dwLength)
{
	memcpy(&g_Stv0288RegMapVal[StartReg], pbValue, dwLength);
}

static void STV0288Get_RegMap_Val(BYTE StartReg, BYTE *pbValue, DWORD dwLength)
{
	memcpy(pbValue,&g_Stv0288RegMapVal[StartReg],  dwLength);
}

⌨️ 快捷键说明

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