📄 stv0399drv.c
字号:
#define COSHIPAPI_NIM
#include "cs_qpsk.h"
#include "cs_i2c.h"
#include "cs_os.h"
//#include "cs_serial.h"
#include "cs_gpio.h"
#include "cs_frnpublic.h"
#include "CS_typedef.h"
#include "CSHDI_typedef.h"
#include "cs_assert.h"
#include "stv0399drv.h"
//#define CSNIM_DEBUG
#define STV0399ADDRESS 0xD0
#define STV0399_CHIPID 0xB0
#define STV0399REG_ID 0x00
#define STV0399REG_ACR 0x02
#define STV0399REG_F22FR 0x03
#define STV0399REG_DACR1 0x04
#define STV0399REG_DACR2 0x05
#define STV0399REG_DiSEqC 0x06
#define STV0399REG_DiSEqC_FIFO 0x07
#define STV0399REG_DiSEqC_STATUS 0x08
#define STV0399REG_IOCFG1 0x0A
#define STV0399REG_IOCFG2 0x0B
#define STV0399REG_AGC0C 0x0C
#define STV0399REG_AGC0R 0x0D
#define STV0399REG_AGC1C 0x0E
#define STV0399REG_DCOFF 0x0F
#define STV0399REG_RTC 0x10
#define STV0399REG_AGC1R 0x11
#define STV0399REG_AGC2O 0x13
#define STV0399REG_TLSR 0x14
#define STV0399REG_CFD 0x15
#define STV0399REG_ACLC 0x16
#define STV0399REG_BCLC 0x17
#define STV0399REG_R8PSK 0x18
#define STV0399REG_LDT 0x19
#define STV0399REG_LDT2 0x1A
#define STV0399REG_AGC0CMD 0x1B
#define STV0399REG_AGC0I 0x1C
#define STV0399REG_AGC1S 0x1D
#define STV0399REG_AGC1P 0x1E
#define STV0399REG_TLIR 0x20
#define STV0399REG_AGC2I1 0x21
#define STV0399REG_AGC2I2 0x22
#define STV0399REG_RTF 0x23
#define STV0399REG_VSTATUS 0x24
#define STV0399REG_LDI 0x25
#define STV0399REG_ECNTM 0x26
#define STV0399REG_ECNTL 0x27
#define STV0399REG_SFRH 0x28
#define STV0399REG_SFRM 0x29
#define STV0399REG_SFRL 0x2A
#define STV0399REG_CFRM 0x2B
#define STV0399REG_CFRL 0x2C
#define STV0399REG_NIRH 0x2D
#define STV0399REG_NIRL 0x2E
#define STV0399REG_VERROR 0x2F
#define STV0399REG_FECM 0x30
#define STV0399REG_VTH0 0x31
#define STV0399REG_VTH1 0x32
#define STV0399REG_VTH2 0x33
#define STV0399REG_VTH3 0x34
#define STV0399REG_VTH4 0x35
#define STV0399REG_VTH5 0x36
#define STV0399REG_PR 0x37
#define STV0399REG_VSEARCH 0x38
#define STV0399REG_RS 0x39
#define STV0399REG_RSOUT 0x3A
#define STV0399REG_ERRCNTL 0x3B
#define STV0399REG_VITPROG 0x3C
#define STV0399REG_ERRCNTL2 0x3D
#define STV0399REG_ECNTM2 0x3E
#define STV0399REG_ECNTL2 0x3F
#define STV0399REG_DIVOUT 0x40
#define STV0399REG_LPFCR 0x41
#define STV0399REG_DIVCTRL 0x42
#define STV0399REG_SYNTH1 0x43
#define STV0399REG_SYNTH2 0x44
#define STV0399REG_SYNTH3 0x45
#define STV0399REG_SYNTCTRL 0x46
#define STV0399REG_SYNTCTRL2 0x47
#define STV0399REG_SYSCTRL 0x48
#define STV0399REG_AGC1EP 0x49
#define STV0399REG_AGC1ES 0x4A
//int g_CSQPSKLockFlag = 1;
static BYTE g_bHWResetGPIOIndex[MAX_TUNER_NUM]= { 0xFF, 0xFF};
static BYTE g_bTSOutputFormat[MAX_TUNER_NUM]= { 0, 0};
static HCSHANDLE g_hdlSTV0399I2C[MAX_TUNER_NUM]= { 0, 0};
#define STV0399_BETA_MASK 0x3F
#define STV0399_CFD_ON_MASK 0x80
#define STV0399_SYM_MASK 0x01
#define STV0399_MODE_COEF_MASK 0x08
#define STV0399_CF_MASK 0x80
#define STV0399_LK_MASK 0x08
#define STV0399_N_BYP_MASK 0x40
#define STV0399_A_DIS_MASK 0x04
#define STV0399_VLOW_MASK 0x02
#define STV0399_VHIGH_MASK 0x20
#define STV0399_PLL_FACTOR_MASK 0x08
#define STV0399_CMD_MASK 0x08
#define STV0399_RESET_SYNT_MASK 0x02
#define STV0399_MD_MASK 0x1F
#define STV0399_FILTER_MASK 0x3F
#define STV0399_ERRMODE_MASK 0x80
#define STV0399_MODE_8PSK_MASK 0x80
#define STV0399_TUNERSTEP 3500000
#define STV0399_SEARCHRANGE 5000000
#define STV0399_ROLLOFF 35
typedef enum
{
STV0399_X,
STV0399_E
} STV0399Tuner_Type_t;
typedef enum
{
CSQPSK_NO_CARRIER,
CSQPSK_CF,
CSQPSK_LK
} STV0399LOCK_STATE_t;
typedef enum
{
VCO_TOO_HIGH, /* VCO selected is too high */
VCO_TOO_LOW, /* VCO selected is too low */
VCO_LOCKED /* VCO locked */
} STV0399VCO_STATE_t;
typedef enum
{
NOAGC1=0,
AGC1OK,
NOTIMING,
ANALOGCARRIER,
TIMING_OK,
NOAGC2,
AGC2OK,
NOCARRIER,
CARRIEROK,
NODATA,
FALSELOCK,
DATAOK,
OUTOFRANGE,
RANGEOK
} STV0399SIGNALTYPE_t;
typedef enum
{
FE_1_2 = 1,
FE_2_3 = 1<<1,
FE_3_4 = 1<<2,
FE_5_6 = 1<<3,
FE_6_7 = 1<<4,
FE_7_8 = 1<<5,
FE_8_9 = 1<<6
}STV0399Rate_t;
typedef enum
{
FE_IERR_NO, /* no error */
FE_IERR_I2C, /* I2C error */
FE_IERR_ZERODIV, /* division by zero */
FE_IERR_PARAM, /* wrong parameters */
FE_IERR_UNKNOWN /* unknown error */
} STV0399ErrorType_t;
typedef enum
{
FE_IERRLOC_NOWHERE, /* no location */
FE_IERRLOC_SRHINIT, /* in SearchInit */
FE_IERRLOC_SRHRUN, /* in SearchRun */
FE_IERRLOC_SRHTERM /* in SearchTerm */
} STV0399Location_t;
typedef enum
{
COUNTER1 = 0,
COUNTER2 = 1
} STV0399ERRORCOUNTER_t;
typedef struct
{
STV0399ErrorType_t Type; /* Error type */
STV0399Location_t Location; /* Error location */
} STV0399InternalError_t;
typedef enum
{
FE_MOD_BPSK,
FE_MOD_QPSK,
FE_MOD_8PSK
} STV0399Modulation_t;
typedef enum
{
FE_BAND_LOW,
FE_BAND_HIGH
} STV0399Bands_t;
typedef enum
{
FE_POL_HORIZONTAL = 1,
FE_POL_VERTICAL = 1<<1
}STV0399Polarization_t;
typedef struct
{
int Locked; /* Transponder locked */
DWORD Frequency; /* transponder frequency (in KHz) */
DWORD SymbolRate; /* transponder symbol rate (in Mbds) */
STV0399Modulation_t Modulation; /* modulation */
STV0399Polarization_t Polarization; /* Polarization */
STV0399Bands_t Band; /* Band */
STV0399Rate_t Rate; /* puncture rate */
int Power; /* Power of the RF signal (dBm) */
DWORD C_N; /* Carrier to noise ratio */
DWORD BER; /* Bit error rate */
} STV0399SignalInfo_t;
int EVM[MAX_TUNER_NUM];
/* structures -------------------------------------------------------------- */
/* Internal result structure */
typedef struct
{
STV0399SIGNALTYPE_t SignalType; /* Type of founded signal */
STV0399Polarization_t Polarization; /* Polarization */
STV0399Rate_t PunctureRate; /* Puncture rate found */
DWORD Frequency; /* Transponder frequency (KHz) */
DWORD SymbolRate; /* Symbol rate (Bds) */
} STV0399InternalResults_t;
typedef struct
{
STV0399SIGNALTYPE_t State; /* Current state of the search algorithm */
DWORD Frequency, /* Current tuner frequency (KHz) */
SymbolRate, /* Symbol rate (Bds) */
MasterClock, /* Master clock frequency (Hz) */
BaseFreq, /* Start tuner frequency (KHz) */
Quartz; /* Quartz frequency (Hz) */
int FreqOffset, /* Frequency offset (Hz) for spurious workaround */
Mclk, /* Divider factor for masterclock (binary value) */
SearchRange, /* Search range (Hz) */
SubRange, /* Current sub range (Hz) */
TunerStep, /* Tuner step (Hz) */
TunerOffset, /* Tuner offset relative to the carrier (Hz) */
TunerBW, /* Current bandwidth of the tuner (Hz) */
RollOff; /* Current RollOff of the filter (x100) */
short int DerotFreq, /* Current frequency of the derotator (Hz) */
DerotPercent, /* Derotator step (in thousands of symbol rate) */
DerotStep, /* Derotator step (binary value) */
Direction, /* Current search direction */
Tagc1, /* Agc1 time constant (ms) */
Tagc2, /* Agc2 time constant (ms) */
Ttiming, /* Timing loop time constant (ms) */
Tderot, /* Derotator time constant (ms) */
Tdata, /* Data recovery time constant (ms) */
SubDir; /* Direction of the next sub range */
STV0399InternalResults_t Results; /* Results of the search */
STV0399InternalError_t Error; /* Last error encountered */
}STV0399InternalParams_t;
typedef enum STTUNER_Modulation_e
{
STTUNER_MOD_NONE = 0x00, /* Modulation unknown */
STTUNER_MOD_ALL = 0x3FF, /* Logical OR of all MODs */
STTUNER_MOD_QPSK = 1,
STTUNER_MOD_8PSK = (1 << 1),
STTUNER_MOD_QAM = (1 << 2),
STTUNER_MOD_4QAM = (1 << 3),
STTUNER_MOD_16QAM = (1 << 4),
STTUNER_MOD_32QAM = (1 << 5),
STTUNER_MOD_64QAM = (1 << 6),
STTUNER_MOD_128QAM = (1 << 7),
STTUNER_MOD_256QAM = (1 << 8),
STTUNER_MOD_BPSK = (1 << 9)
}
STTUNER_Modulation_t;
#define MIN(x,y) ((x) < (y)) ? (x) : (y)
#define MAX(x,y) ((x) > (y)) ? (x) : (y)
#define ABS(X) ((X)<0 ? (-X) : (X))
#define STV0399_CFMASK 0x80
//=========================================================================================
#define STV0399MAXLOOKUPSIZE 50
// For 0399E
#define MINIMUM_GAP 18000 /* Minimum gap size between master clock Harmonic and tuner frequency (KHz) */
#define MINIMUM_GAP_low 10000
#define MINIMUM_GAP_2 33000
typedef struct
{
int nRealValue; /* real value (10000 x C/N or power ) */
int nRegValue; /* register value (C/N estimator value or AGC1 integrator value ) */
} STV0399LookPoint_t;
/* Lookup table definition */
typedef struct
{
int nSize; /* Size of the lookup table */
STV0399LookPoint_t pTable[STV0399MAXLOOKUPSIZE]; /* Lookup table */
} STV0399LookUp_t;
//#define TUNER_TYPE_ADD 0x7FFFFDFE
static BYTE g_b22KMode[MAX_TUNER_NUM]= { 0, 0};
static DWORD g_dwPatchSemID[MAX_TUNER_NUM]= { 0, 0};
int g_Tuner_Type[MAX_TUNER_NUM];
//=========================================================================================
//#ifdef STV0399E_DRV
static STV0399LookUp_t STV0399ERFLookUp =
{
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 STV0399LookUp_t STV0399ECN_LookUp =
{
20,
{
15, 9600,
20, 9450,
30, 9000,
40, 8250,
50, 7970,
60, 7360,
70, 6770,
80, 6200,
90, 5670,
100, 5190,
110, 4740,
120, 4360,
130, 4010,
140, 3710,
150, 3440,
160, 3210,
170, 3020,
180, 2860,
190, 2700,
200, 2600
}
};
static STV0399ESignalQuality_LookUp[20][2] = {
10, 15,
20, 21,
30, 27,
40, 33,
50, 39,
60, 45,
70, 51,
80, 57,
90, 63,
100, 69,
110, 75,
120, 81,
130, 87,
140, 93,
150,100,
160,100,
170,100,
180,100,
190,100,
200,100
};
//#else
static STV0399LookUp_t STV0399RFLookUp =
{
15,
{
-100, -200,
-150, -190,
-200, -140,
-250, -90,
-300, -40,
-350, 10,
-400, 60,
-450, 110,
-500, 140,
-550, 190,
-600, 235,
-650, 285,
-700, 340,
-750, 390,
-800, 440
}
};
static STV0399LookUp_t STV0399CN_LookUp =
{
20,
{
15, 9600,
20, 9450,
30, 9000,
40, 8250,
50, 7970,
60, 7360,
70, 6770,
80, 6200,
90, 5670,
100, 5190,
110, 4740,
120, 4360,
130, 4010,
140, 3710,
150, 3440,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -