📄 stv0299.c
字号:
return 2;
for (i=0; i<m->msg_len; i++) {
if (stv0299_wait_diseqc_fifo (100) )
return 3;
if (stv0299_writereg (0x09, m->msg[i]))
return 4;
}
if (stv0299_wait_diseqc_idle (100))
return 5;
return 0;
}
int stv0299_send_diseqc_burst ( fe_sec_mini_cmd_t burst)
{
UInt8 val;
if (stv0299_wait_diseqc_idle ( 100) )
return 1;
val = stv0299_readreg (0x08);
if (stv0299_writereg ( 0x08, (val & ~0x7) | 0x2)) /* burst mode */
return 2;
if (stv0299_writereg (0x09, burst == SEC_MINI_A ? 0x00 : 0xff))
return 3;
if (stv0299_wait_diseqc_idle ( 100) )
return 4;
if (stv0299_writereg ( 0x08, val))
return 5;
return 0;
}
int stv0299_set_tone ( fe_sec_tone_mode_t tone)
{
UInt8 val;
if (stv0299_wait_diseqc_idle ( 100) )
return 1;
val = stv0299_readreg (0x08);
switch (tone) {
case SEC_TONE_ON:
return stv0299_writereg (0x08, val | 0x3);
case SEC_TONE_OFF:
return stv0299_writereg ( 0x08, (val & ~0x3) | 0x02);
default:
return 2;
};
}
int stv0299_set_voltage ( fe_sec_voltage_t voltage)
{
UInt8 val;
val = stv0299_readreg (0x0c);
val &= 0x0f;
val |= 0x40; /* LNB power on */
switch (voltage) {
case SEC_VOLTAGE_13:
return stv0299_writereg ( 0x0c, val);
case SEC_VOLTAGE_18:
return stv0299_writereg (0x0c, val | 0x10);
default:
return -EINVAL;
};
}
int stv0299_set_symbolrate (UInt32 srate)
{
Uint8 ratio3[3];
UInt32 ratio;
UInt32 tmp;
UInt8 aclk = 0xb4, bclk = 0x51;
if (srate > M_CLK)
srate = M_CLK;
if (srate < 500000)
srate = 500000;
if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
#define FIN (M_CLK >> 4)
tmp = srate << 4;
ratio = tmp / FIN;
tmp = (tmp % FIN) << 8;
ratio = (ratio << 8) + tmp / FIN;
tmp = (tmp % FIN) << 8;
ratio = (ratio << 8) + tmp / FIN;
// stv0299_writereg (0x13, aclk);
// stv0299_writereg (0x14, bclk);
ratio3[0] = aclk;
ratio3[1] = bclk;
MULT_IIC_WRITE(EVMDM642_I2C_hI2C, stv0299_adw, 0x13, ratio3, 2);
ratio3[0] = (UInt8)((ratio >> 16) & 0xff);
ratio3[1] = (UInt8)((ratio >> 8) & 0xff);
ratio3[2] = (UInt8)((ratio ) & 0xf0);
MULT_IIC_WRITE(EVMDM642_I2C_hI2C, stv0299_adw, 0x1f, ratio3, 3);
// stv0299_writereg (0x1f, ratioH);
// stv0299_writereg (0x20, ratioM);
// stv0299_writereg (0x21, ratioL);
for(tmp=0x13; tmp<=0x21; tmp++)
ratio = stv0299_readreg(tmp);
ratio = stv0299_readreg(0x1b);
// printf("ratio=%d\n",ratio/16);
return 0;
}
int stv0299_get_symbolrate ()
{
UInt32 Mclk = M_CLK / 4096L;
UInt32 srate;
Int32 offset;
UInt8 sfr[3];
UInt8 rtf;
stv0299_readregs ( 0x1f, sfr, 3);
stv0299_readregs (0x1a, &rtf, 1);
srate = (sfr[0] << 8) | sfr[1];
srate *= Mclk;
srate /= 16;
srate += (sfr[2] >> 4) * Mclk / 256;
offset = (Int32) rtf * (srate / 4096L);
offset /= 128;
srate += offset;
srate += 1000;
srate /= 2000;
srate *= 2000;
return srate;
}
fe_status_t stv0299_get_status()
{
fe_status_t status ;
UInt8 signal = 0xff - stv0299_readreg (0x18);
UInt8 sync = stv0299_readreg (0x1b);
status = FE_HAS_BEGIN;
if (signal > 10)
{
status |= FE_HAS_SIGNAL;
// printf("the status is :HAS_SIGNAL");
}
if (sync & 0x80)
{
status |= FE_HAS_CARRIER;
// printf(" HAS_CARRIER");
}
if (sync & 0x10)
{
status |= FE_HAS_VITERBI;
// printf(" HAS_VITERBI");
}
if (sync & 0x08)
{
status |= FE_HAS_SYNC;
// printf(" HAS_SYNC");
}
if ((sync & 0x98) == 0x98)
{
status |= FE_HAS_LOCK;
// printf(" HAS_LOCK");
}
//printf("\n");
return status;
}
int stv0299_check_status()
{
int retval,num, j,k;
fe_status_t status;
UInt8 table1[]={0x00,0x79,0x3b,0x60,0x04,0x07,0x8f,0xdf,0xd0,0x50,0xfb,0x4f};
num=10;
retval=1;
j=0;k=0;
// printf("star check_status\n");
while (num>1)
{
TSK_sleep(20);
// delay(20000);
status=stv0299_get_status();
if (status & FE_HAS_SIGNAL)
{
if (status & FE_HAS_CARRIER)
{
if (status & FE_HAS_LOCK)
{
//printf("FE_HAS_LOCK\n");
retval=0;
num=0;
}
else
{
j++;
if (j>8)
{
stv0299_check_inversion ();
}
if (j>200 )
{
num=0;
}
}
}
}
else
{
k++;
if (k>100) {
//printf("no signal\n");
num=0;
}
}
num--;
}
if (retval==0) {
stv0299_writereg( 0x05, 0xb5); /* enable i2c repeater on stv0299 */
iicwriteregs(stb6000_adw,1,&table1[1],1);
stv0299_writereg(0x05, 0x35); /* disable i2c repeater on stv0299 */
}
return retval;
}
UInt32 stv0299_get_ber()
{
UInt32 rel;
rel = (stv0299_readreg (0x1d) << 8)
| stv0299_readreg (0x1e);
return rel;
}
Int16 stv0299_get_signal_strength()
{
Int16 rel;
Int32 signal = 0xffff - ((stv0299_readreg ( 0x18) << 8)
| stv0299_readreg ( 0x19));
signal = signal * 5 / 4;
rel = (signal > 0xffff) ? 0xffff :
(signal < 0) ? 0 : (Int16)signal;
return rel;
}
Int16 stv0299_get_snr()
{
Int16 rel;
Int32 snr = 0xffff - ((stv0299_readreg ( 0x24) << 8)
| stv0299_readreg ( 0x25));
snr = 3 * (snr - 0xa100);
rel= (snr > 0xffff) ? 0xffff :
(snr < 0) ? 0 : (Int16)snr;
return rel;
}
int stv0299_set_frontend(struct qpsk_frontend_parameters *p)
{
// int rel;
Uint8 data[8]={0,0,};
// stv0299_set_voltage ( p->voltage);
stb6000_set_tv_freq (p);
stv0299_set_FEC ( p->fec_inner);
stv0299_set_symbolrate ( p->symbol_rate);
// stv0299_writereg ( 0x22, 0x00);
// stv0299_writereg ( 0x23, 0x00);
stv0299_writeregs ( 0x22, data, 2);
data[3] = stv0299_readreg ( 0x23);
stv0299_writereg ( 0x12, 0xb9); //0xb9
return 0;
}
int stv0299_get_frontend(struct qpsk_frontend_parameters *p)
{
Int32 derot_freq;
derot_freq = (Int32)(Int16) ((stv0299_readreg ( 0x22) << 8)
| stv0299_readreg (0x23));
derot_freq *= (M_CLK >> 16);
derot_freq += 500;
derot_freq /= 1000;
p->frequency += derot_freq;
p->inversion = (stv0299_readreg ( 0x0c) & 1) ?
INVERSION_OFF : INVERSION_ON;
p->fec_inner = stv0299_get_fec ();
p->symbol_rate = stv0299_get_symbolrate ();
return 0;
}
int stv0299_set_sleep( )
{
stv0299_writereg (0x0c, 0x00); /* LNB power off! */
stv0299_writereg (0x02, 0x80);
return 0;
}
int stv0299_reset( )
{
stv0299_writereg (0x22, 0x00);
stv0299_writereg (0x23, 0x00);
stv0299_readreg (0x23);
stv0299_writereg (0x12, 0xb9);
return 0;
}
/*
void prin_info()
{
UInt32 data;
UInt8 reg;
UInt8 regs[11];
int i;
stv0299_writereg ( 0x05, 0xb5);
iicReadregs(0xc6,regs,11);
//for (i=0;i<11;i++)
// printf(" %02x\n",regs[i]);
printf("font lock %02x\n",regs[0]);
printf("agc1 %2x\n", stv0299_readreg ( 0x16) );
printf("agc21 %2x\n", stv0299_readreg ( 0x18 ));
// data=(stv0299_readreg ( 0x18) << 8)| stv0299_readreg ( 0x19);
// printf("agc2 indcator %d\n",data);
printf("time lock %02d\n", stv0299_readreg (0x17));
printf("time loop %02d\n", (Int8)stv0299_readreg (0x1a));
printf("carr lock %02x\n", stv0299_readreg (0x1C));
data=(stv0299_readreg ( 0x22) << 8)| stv0299_readreg ( 0x23);
printf("CARR FREQENCE %d\n",data);
data=stv0299_readreg ( 0x1b);
printf("status %02x\n",data);
data=(stv0299_readreg ( 0x24) << 8)| stv0299_readreg ( 0x25);
printf("noise indcator %d\n",data);
}
*/
int stb6000_IIC_read(I2C_Handle hI2C,
Uint8 devAddress,
Uint32 subAddress,
Uint8 *data,
Uint16 numBytes
)
{
// Uint8 temp;
int i;
int cnt = 0;
/* make sure handle is valid */
if(hI2C == INV) {
return -1;
}
/* Wait until bus is free */
while (I2C_bb(hI2C))
{
cnt ++;
if(cnt > WHILE_BB_TIMES)
{
I2C_FSETH(hI2C, I2CSTR, BB, 1);
I2C_close(hI2C);
hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
I2C_config(hI2C, &IIC_ConfigR);
I2C_outOfReset(hI2C);
return 4;
}
}
/* save old settings */
// I2C_getConfig(hI2C, &prevIICConfig);
/* set I2C mode register */
I2C_RSETH(hI2C, I2CMDR, IIC_ConfigR.i2cmdr);
/* set I2C imr register */
I2C_RSETH(hI2C, I2CIMR, IIC_ConfigR.i2cimr);
/* configure the I2C slave address register */
I2C_RSETH(hI2C, I2CSAR, devAddress);
/* set I2C count register */
I2C_RSETH(hI2C, I2CCNT, numBytes);
/* write the sub address */
// I2C_RSETH(hI2C, I2CDXR, subAddress);
EVMDM642_waitusec(1);
/* Generate start condition */
I2C_start(hI2C);
I2CDELAY(DELAY_TIME);
/* read the data */
for(i = 0; i < numBytes-1; i ++)
{
cnt = 0;
while(!I2C_rrdy(hI2C))
{
cnt ++;
if(cnt > WHILE_BB_TIMES)
{
I2C_FSETH(hI2C, I2CSTR, BB, 1);
I2C_close(hI2C);
hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
I2C_config(hI2C, &IIC_ConfigR);
I2C_outOfReset(hI2C);
return 5;
}
}
*data ++ = I2C_readByte(hI2C );
// I2CDELAY(DELAY_TIME);
}
/* Generate stop condition */
I2C_sendStop(hI2C);
// I2CDELAY(DELAY_TIME*10000);
/* Need to wait at least 10ms */
// EVMDM642_waitusec(1000);
/* Wait until bus is free */
cnt = 0;
while (I2C_bb(hI2C))
{
cnt ++;
if(cnt > WHILE_BB_TIMES)
{
I2C_FSETH(hI2C, I2CSTR, BB, 1);
I2C_close(hI2C);
hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
I2C_config(hI2C, &IIC_ConfigR);
I2C_outOfReset(hI2C);
return 4;
}
}
/* Clear bus busy */
I2C_FSETH(hI2C, I2CSTR, BB, 1);
I2CDELAY(DELAY_TIME);
{
Uint32 paddr = hI2C->i2cdrrAddr;
Uint8* ptemp = (unsigned char *)paddr;
memcpy(data, ptemp, 1);
}
/* now restore the previous I2C settings */
/* set I2C mode register */
// I2C_RSETH(hI2C, I2CMDR, prevIICConfig.i2cmdr);
/* set I2C imr register */
// I2C_RSETH(hI2C, I2CIMR, prevIICConfig.i2cimr);
/* configure the I2C slave address register */
// I2C_RSETH(hI2C, I2CSAR, prevIICConfig.i2csar);
/* set I2C count register */
// I2C_RSETH(hI2C, I2CCNT, prevIICConfig.i2ccnt);
// I2CDELAY(DELAY_TIME);
return 0;
}
void GetQPSKparams()
{
MULT_IIC_READ(EVMDM642_I2C_hI2C, stv0299_adr,0x16,(UInt8*)(g_tREG0299Info.m_val),17);
g_nRFLockStatus = g_tREG0299Info.m_val[5];
if ( g_nRFLockStatus & 0x08 ) {
static Uint32 m_glFactAGC = 0;
static Uint32 m_glSetAGCState = 0;
g_nRFLock = LOCK;
if (( m_glFactAGC != 0x0FF ) && ( m_glSetAGCState == 0 )) {
Uint8 iagc,diff;
diff = STANDARD_AGC - m_glFactAGC;
iagc = g_tREG0299Info.m_val[0];
iagc += diff;
g_tREG0299Info.m_val[0] = iagc;
}
}
else{
g_nRFLock = UNLOCK;
g_nUnlockTimeout = TIMEOUT_UNLOCK_QPSK;
QPSK_tuner_init();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -