📄 stv0299.c
字号:
return FEC_AUTO;
return fec_tab [index];
}
int stv0299_wait_diseqc_fifo ( int timeout)
{
int start = 0;
while (stv0299_readreg(0x0a) & 1) {
if ( start > timeout) {
return 1;
}
start++;
// add delay her
};
return 0;
}
int stv0299_wait_diseqc_idle ( int timeout)
{
int start = 0;
while ((stv0299_readreg(0x0a) & 3) != 2 ) {
if (start > timeout) {
return 1;
}
start++;
//add delay here
};
return 0;
}
int stv0299_send_diseqc_msg ( struct dvb_diseqc_master_cmd *m)
{
UInt8 val;
int i;
if (stv0299_wait_diseqc_idle ( 100) )
return 1;
val = stv0299_readreg (0x08);
if (stv0299_writereg (0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */
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)
{
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);
stv0299_writereg (0x1f, (UInt8)(ratio >> 16) & 0xff);
stv0299_writereg (0x20, (UInt8)(ratio >> 8) & 0xff);
stv0299_writereg (0x21, (UInt8)(ratio ) & 0xf0);
// 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=1000;;
retval=1;
j=0;k=0;
// printf("star check_status\n");
while (num>1)
{
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>100)
{
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(0xc6,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 dvb_frontend_parameters *p)
{
int rel;
stv0299_set_voltage ( p->voltage);
rel=stb6000_set_tv_freq (p);
rel=stv0299_set_FEC ( p->fec_inner);
rel=stv0299_set_symbolrate ( p->symbol_rate);
stv0299_writereg ( 0x22, 0x00);
stv0299_writereg ( 0x23, 0x00);
stv0299_readreg ( 0x23);
stv0299_writereg ( 0x12, 0xb9); //0xb9
return 0;
}
int stv0299_get_frontend(struct dvb_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;
}
int stv0299_get_regs(struct stv0299_regs_val *p)
{
iic_read_regs_a(stv0299_adw,0,(UInt8*)p,0x35);
return 0;
}
int stv0299_get_info()
{ struct stv0299_regs_val_a regs;
int i;
iic_read_regs_a(stv0299_adw,0x16,(UInt8*)(®s),17);
// printf(" %2x %2x\n",regs.verror,stv0299_readreg (0x26));
// printf(" %2x %2x\n",regs.tl1r, stv0299_readreg (0x17));
// printf(" %2x %2x\n",regs.agc2i1,stv0299_readreg (0x18));
// printf(" %2x %2x\n",regs.agc2i2,stv0299_readreg (0x19));
// printf(" %2x %2x\n",regs.agc2i2,stv0299_readreg (0x19));
// printf(" %2x %2x\n",regs.vstatus,stv0299_readreg (0x1b));
//
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -