📄 stv0299.c
字号:
/* Master Clock = 88 MHz */
#include "stv0299.h"
#define M_CLK (88000000UL)
#define stv0299_adw 0xd0
#define stv0299_adr 0xd1
#define stv600_adw 0xc6
#define stv600_adr 0xc7
#define check_max_num 10000
Int iicwriteregs(UInt8 sl_add,UInt8 sub_add,UInt8*data,int num);
Int iicReadregs(UInt8 sl_add,UInt8*data,int num);
struct dvb_frontend_info fe_stv0299_info = {
"STV0299 based",
FE_QPSK,
950000,
2150000,
125, /* kHz for QPSK frontends */
M_CLK/2000,
1000000,
45000000,
500, /* ppm */
0,
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
FE_CAN_QPSK |
FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
};
UInt8 init_tab1 [] = {
/* clock registers */
0x01, 0x15, /* K = 0, DIRCLK = 0, M = 0x15 */
0x02, 0x30, /* STDBY = 0, VCO = 0 (ON), SERCLK = 0, P = 0 */
/* f_VCO = 4MHz * 4 * (M+1) / (K+1) = 352 MHz */
0x03, 0x00, /* auxiliary clock not used */
0x04, 0x7d, /* F22FR = 0x7d */
/* F22 = f_VCO / 128 / 0x7d = 22 kHz */
/* I2C bus repeater */
0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
/* general purpose DAC registers */
0x06, 0x40, /* DAC not used, set to high impendance mode */
0x07, 0x00, /* DAC LSB */
/* DiSEqC registers */
0x08, 0x40, /* DiSEqC off */
0x09, 0x00, /* FIFO */
/* Input/Output configuration register */
0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
/* OP0 ctl = Normal, OP0 val = 1 (18 V) */
/* Nyquist filter = 00, QPSK reverse = 0 */
/* AGC1 control register */
0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
/* Timing loop register */
0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
0x0f, 0xd4, /* Iagc = Normal, m1 = 18 */
0x10, 0x34, // AGC2 0x3d
0x11, 0x84,
0x12, 0xb7, // Lock detect: -64 Carrier freq detect:on
0x13, 0xb6, // alpha_car b:4 a:0 noise est:256ks derot:on
0x14, 0x93, // beat carc:0 d:0 e:0xf phase detect algo: 1
0x15, 0xc9, // lock detector threshold
0x16, 0x1d, /* AGC1 integrator value */
0x17, 0x00,
0x18, 0x14,
0x19, 0xf2,
0x1a, 0x11,
0x1b, 0x9c,
0x1c, 0x00,
0x1d, 0x00,
0x1e, 0x0b,
0x1f, 0x50,
0x20, 0x00,
0x21, 0x00,
0x22, 0x00,
0x23, 0x00,
0x24, 0xff,
0x25, 0xff,
0x26, 0xff,
0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
0x29, 0x1e, // 1/2 threshold
0x2a, 0x14, // 2/3 threshold
0x2b, 0x0f, // 3/4 threshold
0x2c, 0x09, // 5/6 threshold
0x2d, 0x05, // 7/8 threshold
0x2e, 0x01,
0x31, 0x1f, // test all FECs
0x32, 0x19, // viterbi and synchro search
0x33, 0xfc, // rs control
0x34, 0x13, //0x93, // error control
0x0b, 0x00,
0x27, 0x00,
0x2f, 0x00,
0x30, 0x00,
0x35, 0x00,
0x36, 0x00,
0x37, 0x00,
0x38, 0x00,
0x39, 0x00,
0x3a, 0x00,
0x3b, 0x00,
0x3c, 0x00,
0x3d, 0x00,
0x3e, 0x00,
0x3f, 0x00,
0x40, 0x00,
0x41, 0x00,
0x42, 0x00,
0x43, 0x00,
0x44, 0x00,
0x45, 0x00,
0x46, 0x00,
0x47, 0x00,
0x48, 0x00,
0x49, 0x00,
0x4a, 0x00,
0x4b, 0x00,
0x4c, 0x00,
0x4d, 0x00,
0x4e, 0x00,
0x4f, 0x00
};
void delay(UInt32 num)
{
UInt32 i,j;
for(i=0;i<num;i++)
{
j=1024*5000;
while (j==0) {
j--;
}
}
}
Int iicwriteregs(UInt8 sl_add,UInt8 sub_add,UInt8*data,int num)
{
Int instance;
UInt8 xdata[256];
iicRequest_t req;
int retval,ret;
Int i;
iicOpen(&instance);
/* write out the address */
xdata[0]=sub_add;
for (i = 0; i < num; i++)
xdata[i+1] = data [i];
req.direction = IIC_WRITE;
req.type = IIC_SIMPLE;
req.data = xdata;
req.mode = IIC_Synchronous_By_Polling;
req.completion_function = Null;
req.byteCount = num+1;
req.address = sl_add;
retval = iicDispatch(instance, &req);
if (retval) {
char errstr[80];
//printf(" Error writing to %2x\n", sl_add);
ret=1;
}
iicClose(instance);
ret=0;
return ret;
}
Int iicReadregs(UInt8 sl_add,UInt8*data,int num)
{
Int instance;
UInt8 xdata[256];
iicRequest_t req;
int retval,ret;
Int i;
iicOpen(&instance);
/* write out the address */
req.direction = IIC_READ;
req.type = IIC_SIMPLE;
req.data = xdata;
req.mode = IIC_Synchronous_By_Polling;
req.completion_function = Null;
req.byteCount = num;
req.address = sl_add;
retval = iicDispatch(instance, &req);
if (retval) {
// printf(" Error reding string from %2x\n",sl_add);
ret=1;
}
for (i=0;i<num;i++)
data[i]=xdata[i];
iicClose(instance);
ret=0;
return ret;
}
int iic_read_regs_a(UInt8 address,UInt8 reg1,UInt8 *data,int count)
{
iicRequest_t req;
Int instance,i,retval;
UInt8 xdata[256];
req.address = address;
req.subaddress=reg1;
req.byteCount = count;
req.direction = IIC_READ;
req.type = IIC_SUBADDRESS;
req.data = xdata;
req.mode = IIC_Synchronous_By_Polling;
req.completion_function = NULL;
iicOpen(&instance);
retval = iicDispatch(instance, &req);
for(i=0;i<count;i++){
data[i]=xdata[i];
}
if (retval) {
// printf("Error \n" );
return 1;
}
iicClose(instance);
return 0;
}
int stv0299_writereg (UInt8 reg, UInt8 data)
{
int retval;
retval = iicWriteReg(stv0299_adw, reg, data);
return retval;
}
int stv0299_writeregs (UInt8 reg1, UInt8 *data,int len)
{
int i, retval;
retval = iicwriteregs(stv0299_adw,reg1,data,len);
return retval;
}
UInt8 stv0299_readreg (UInt8 reg)
{
int ret;
UInt data;
ret = iicReadReg(stv0299_adr, reg, &data);
return (UInt8)data;
}
int stv0299_readregs ( UInt8 reg1, UInt8 *b, UInt8 len)
{
int ret;
int i;
UInt temp;
ret=0;
for(i=0;i<len;i++)
{
ret=iicReadReg(stv0299_adr,reg1, &temp);
reg1++;
b[i]=(UInt8)temp;
}
return ret;
}
int stv6000_write(UInt8 reg,UInt8 data)
{
int retval;
retval = iicWriteReg(stv600_adw, reg, data);
return retval;
}
int stb6000_set_tv_freq (struct dvb_frontend_parameters *p)
{
UInt8 i,table[]={0x00,0xba,0x3b,0x60,0x04,0x07,0x8f,0xd8,0xd0,0x50,0xeb,0x4f};
UInt8 table1[]={0x00,0x79,0x3b,0x60,0x04,0x07,0x8f,0xdf,0xd0,0x50,0xfb,0x4f};
UInt8 osm;
UInt16 freqm,n,a,f,t;
UInt32 freq,symbol_rate,vco;
int rel;
UInt8 regs[13];
UInt8 table2[]={0x00,0x00,0x58,0x00,0x62,0x0a};
freq=p->frequency;
if (freq<950000) freq=950000;
if (freq>2150000) freq=2150000;
if(m_glTunerType != 0x08)
{
if (freq>949000) osm=0xba;
if (freq>999000) osm=0xbc;
if (freq>1075000) osm=0xa0;
if (freq>1199000) osm=0xa1;
if (freq>1299000) osm=0xa2;
if (freq>1369000) osm=0xa4;
if (freq>1469000) osm=0xa5;
if (freq>1529000) osm=0xa6;
if (freq>1649000) osm=0xa8;
if (freq>1799000) osm=0xaa;
if (freq>1949000) osm=0xac;
table[1]=osm;
f=(p->symbol_rate+500000)/1000000;
if (f>30) {
f=30;
}
table[6]=f&0x1f;
freqm = (UInt16)(freq /1000);
if (freqm<1075) {
n=freqm >>3;
a=(freqm<<1) & 0x000f;
}
else{
n=freqm >>4;
a=freqm & 0x000f;
}
table[2]=(n>>1) & 0xff;
table[3] |=(n << 7) | (a & 0x0f);
rel=stv0299_writereg( 0x05, 0xb5); /* enable i2c repeater on stv0299 */
rel= iicwriteregs(0xc6,1,&table[1],11);
rel=stv0299_writereg(0x05, 0x35); /* disable i2c repeater on stv0299 */
rel=stv0299_writereg( 0x05, 0xb5); /* enable i2c repeater on stv0299 */
iicwriteregs(0xc6,7,&table1[7],4);
rel=stv0299_writereg(0x05, 0x35); /* disable i2c repeater on stv0299 */
}
else
{
vco=freq*2;
if (freq<1125000)
{
table2[0] =0x00;
vco=freq*4;
}
else
{
table2[0] =0x80;
}
osm=0;
if (vco>2432000) osm=0x01;
if (vco>2710000) osm=0x02;
if (vco>3024000) osm=0x03;
if (vco>3340000) osm=0x04;
if (vco>3726000) osm=0x05;
if (vco>4142000) osm=0x06;
if (vco>4492000) osm=0x07;
table2[2]|=osm;
f=(p->symbol_rate/2-4000000)/1000000;
t=(f*1000+144)/145;
table2[3]=t&0x007f;
freqm=(UInt16)(freq /500);
table2[1]=freqm & 0x00ff;
table2[0]|=(freqm>>8) & 0x007f;
rel=stv0299_writereg( 0x05, 0xb5); /* enable i2c repeater on stv0299 */
rel= iicwriteregs(0xc0,0,&table2[0],6);
rel=stv0299_writereg(0x05, 0x35); /* disable i2c repeater on stv0299 */
}
return 0;
}
int stv0299_init ()
{
int i,num;
UInt32 rel;
for (i=0; i<sizeof(init_tab1); i+=2)
{
rel=stv0299_writereg ( init_tab1[i], init_tab1[i+1]);
}
if(m_glTunerType == 0x08) { stv0299_writereg (0x0f, 0x54); } /* Iagc = Normal, m1 = 18 */
else { stv0299_writereg (0x0f, 0xd4); }
return 0;
}
int stv0299_check_inversion ()
{
UInt8 val;
val = stv0299_readreg (0x0c);
stv0299_writereg ( 0x0c, val ^ 0x01);
stv0299_writereg ( 0x22, 0x00);
stv0299_writereg ( 0x23, 0x00);
stv0299_readreg ( 0x23);
stv0299_writereg ( 0x12, 0xb9); //0xb9
return 0;
}
int stv0299_set_FEC ( fe_code_rate_t fec)
{
switch (fec) {
case FEC_AUTO:
return stv0299_writereg ( 0x31, 0x1f);
case FEC_1_2:
return stv0299_writereg ( 0x31, 0x01);
case FEC_2_3:
return stv0299_writereg ( 0x31, 0x02);
case FEC_3_4:
return stv0299_writereg ( 0x31, 0x04);
case FEC_5_6:
return stv0299_writereg ( 0x31, 0x08);
case FEC_7_8:
return stv0299_writereg ( 0x31, 0x10);
default:
return -EINVAL;
}
}
fe_code_rate_t stv0299_get_fec ()
{
fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6,
FEC_7_8, FEC_1_2 };
UInt8 index;
index = stv0299_readreg (0x1b);
index &= 0x7;
if (index > 4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -