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