ct202.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,621 行 · 第 1/5 页
C
2,621 行
return RXMSG_PARITY_ERROR;
if( !(lnb_status & 0x10) >> 4)
return RXMSG_NOT_RECIEVED;
if( (lnb_status & 0x08) >> 3)
return RXMSG_TIMEOUT;
lnb_reply->lnb_msg_len= lnb_status & 0x07;
//read the FIFO
status = GetReg(TUNER_I2C_ADDRESS,LNB_FIFO_REGS_0,lnb_reply->lnb_msg,lnb_reply->lnb_msg_len);
return status;
}
//********************************************************************************
//LNB POWER SUPPLY
//********************************************************************************
bool8 SetLNBsupply(int v_enable, int vnom, int vlow
, int vhigh, int ilim, int ipeak, int vboost)
{
UINT8 lnb1_2[2];
UINT8 lnb4;
bool8 status;
status = PASS;
lnb1_2[0] = (vhigh << 4) | vlow;
lnb1_2[1] = (ilim << 6) | (ipeak << 4);
lnb4 = (v_enable << 3) | (vboost << 2) | (vnom <<1);
status = SetReg(TUNER_I2C_ADDRESS,LNB_SUPPLY_CONTROL_REG_1, lnb1_2, 0x02);
if(status != PASS) return status;
status = SetReg(TUNER_I2C_ADDRESS,LNB_SUPPLY_CONTROL_REG_4, &lnb4, 0x01);
return status;
}
bool8 GetLNBvmon(float *vmon)
{
//a float is 4 bytes.
UINT8 vmonreg;
bool8 status;
status = PASS;
GetReg(TUNER_I2C_ADDRESS,LNB_SUPPLY_CONTROL_REG_3,&vmonreg,0x01);
*vmon=(float)vmonreg * 0.0625 + 6.0;
return status;
}
bool8 GetLNBsupplyStat(lnb_supply_stat_t *lnb_supply_stat)
{
UINT8 supstat;
bool8 status;
status = PASS;
status = GetReg(TUNER_I2C_ADDRESS,LNB_SUPPLY_STATUS_REG,&supstat,0x01);
if(supstat >> 7)
*lnb_supply_stat = LNB_SHORT_CIRCUIT;
if((supstat >> 6) & 0x01)
*lnb_supply_stat = LNB_SHORT_CIRCUIT;
else
*lnb_supply_stat = LNB_SUPPLY_OK;
return status;
}
//********************************************************************************
//ERROR MONITORS
//********************************************************************************
BYTE GetAGClevel(BYTE *agclevel)
{
BYTE status;
status = PASS;
status = GetReg(TUNER_I2C_ADDRESS,ANALOG_AGC_POWER_LEVEL_REG, agclevel,0x01);
return status;
}
//sets window len
BYTE SetCNRmon(int CNRwin,CSHDITunerIndex bTunerIndex)
{
BYTE cnr;
BYTE status;
BYTE reg;
status = PASS;
reg = 0x00; //Reset C_N_ESTIMATOR_CONTROL_REG
status = SetReg(g_CTK202A[bTunerIndex],C_N_ESTIMATOR_CONTROL_REG,®,0x01);
switch(CNRwin)
{ case 0x400: cnr = 0x00;
break;
case 0x1000: cnr = 0x01;
break;
case 0x4000: cnr = 0x02;
break;
case 0x10000: cnr = 0x03;
break;
//case 0x00: //infinite
//cnr = 0x04;
//break;
default: cnr = 0x00;
}
#ifdef BERSTART
cnr |= 0x80; //start CNR measurement
#endif
status = SetReg(g_CTK202A[bTunerIndex],C_N_ESTIMATOR_CONTROL_REG,&cnr,0x01);
return status;
}
//gets carrier to noise ratio
BYTE GetCNR(WORD*u16CNR,CSHDITunerIndex bTunerIndex)
{
BYTE status;
BYTE CNEthresh;
BYTE regs[2];
WORD CNElevel;
BYTE systemmode;
BYTE i;
BYTE windowlen;
WORD *lookup_ptr;
DWORD u32Temp;
status = PASS;
//status = GetReg(hDevice,C_N_ESTIMATOR_LEVEL_REG_L,(UINT8*) cnr,0x02);
status = GetReg(g_CTK202A[bTunerIndex],C_N_ESTIMATOR_LEVEL_REG_L, regs,0x02);
CNElevel = ( (regs[0]) & 0xff ) | (( regs[1]& 0xff)<<8); //reorder bytes
//////////printf("CNElevel:%d\n\r ", CNElevel);
if (CNElevel )
*u16CNR = CNElevel;
return status;
/*status |= GetReg(TUNER_I2C_ADDRESS,C_N_ESTIMATOR_THRESHOLD_REG,&CNEthresh,0x01);
status |= GetReg(TUNER_I2C_ADDRESS,C_N_ESTIMATOR_CONTROL_REG,&windowlen,0x01);
if (CNElevel == 0xFFFF) //counter saturated
{
*u8decimal = 0;
*u8point = 0;
return MONITOR_SATURATED;
}
if( (windowlen>>2) & 0x01) //infinite window
{
*u8decimal = 0; //just return the count
*u8point = 0;
return status;
}
else if ((windowlen & 0x80) != 0) // monitor has not completed
return MONITOR_NOT_READY;
windowlen &= 0x03;
status |= GetReg(TUNER_I2C_ADDRESS,SYSTEM_MODE_REG,&systemmode,0x01);
systemmode = (systemmode>>2)&0x01;
switch(CNEthresh)
{
case 0x13: //0.30 threshold
lookup_ptr = &CNE_0_3_0_LOOKUP_EB_NO[0][0];
break;
case 0x16: //0.35 threshold
lookup_ptr = &CNE_0_3_5_LOOKUP_EB_NO[0][0];
break;
case 0x1A: //0.40 threshold
lookup_ptr = &CNE_0_4_0_LOOKUP_EB_NO[0][0];
break;
default:
lookup_ptr = &CNE_0_3_0_LOOKUP_EB_NO[0][0];
break;
}
for(i=1;i<17;i++)
{
if(CNElevel >= *(lookup_ptr + i*4 + windowlen))
{
*u8decimal = ((i-1) + (systemmode * 3)); // +3db for QPSK
u32Temp = (CNElevel - *(lookup_ptr + i*4 + windowlen)) * 10;
*u8point = (u8)(u32Temp / (*(lookup_ptr + (i-1)*4 + windowlen) - *(lookup_ptr + i*4 + windowlen)));
break;
}
}
return status;*/
}
//sets Viterbi BER measurement window len.
BYTE SetVitBERmon(CSHDITunerIndex bTunerIndex, int vitWin)
{
BYTE vitBERctrl;
BYTE status;
BYTE exponent;
status = PASS;
if(vitWin==0) //infinite window
{
vitBERctrl = 0x04;
}
else
{
for(exponent=1;vitWin!=1;++exponent)
vitWin = vitWin >> 1;
vitBERctrl = (exponent - 12) >> 2;
}
#ifdef BERSTART
vitBERctrl |= 0x08; //start BER measurement
#endif
status = SetReg(g_CTK202A[bTunerIndex],/*VITERBI_BER_CONTROL_REG*/ VITERBI_SEARCH_CONTROL_REG_3,&vitBERctrl,0x01);
return status;
}
//gets Viterbi bit error count
bool8 GetVitBERcount(u32 *BERcount,CSHDITunerIndex bTunerIndex)
{
u8 status;
u8 ber_done;
lockstat_t lockstat;
status = PASS;
// make sure that the part is locked
status = GetLockStat(&lockstat,bTunerIndex);
if (status != PASS)
return status;
// part is unlocked
if ((lockstat&RX_LOCK) != RX_LOCK)
return MONITOR_UNLOCK;
status = GetReg(g_CTK202A[bTunerIndex],VITERBI_BER_COUNT_REG_L,(UINT8*) BERcount,0x02);
if (status != PASS)
return status;
if (*BERcount == 0xFFFF)
return MONITOR_SATURATED;
status = GetReg(g_CTK202A[bTunerIndex], VITERBI_SEARCH_CONTROL_REG_3, &ber_done,0x01);
//check the done bit of the Viterbi BER, if not done, return '1' in status
ber_done &= 0x08;
if (ber_done != 0 && status == PASS)
status = MONITOR_NOT_READY;
return status;
}
//sets the Reed-Solomon error type for counting
BYTE SetRSErrMon(CSHDITunerIndex bTunerIndex, int RSerrWin, int RSerrType, int PRBSHeader, int PRBSInvert)
{
//TODO: document Error type parameter (exactly like data sheet)
BYTE RSctrl;
BYTE status;
BYTE PRBSControl;
RSctrl = 0;
status = PASS;
// format the PRBSControl register
PRBSControl = (UINT8) PRBSHeader | ((UINT8) PRBSInvert << 6);
// set the start bit
PRBSControl |= 0x80;
status = SetReg(g_CTK202A[bTunerIndex], PRBS_CONTROL_REG,&PRBSControl,0x01);
if(RSerrWin == 0x1000)
RSctrl = 0x00;
else if(RSerrWin == 0x10000)
RSctrl = 0x04;
else if(RSerrWin == 0x00)
RSctrl = 0x08; //infinite window
RSctrl |= RSerrType;
#ifdef BERSTART
RSctrl |= 0x10; //start RS BER measurement
#endif
status &= SetReg(g_CTK202A[bTunerIndex],REED_SOLOMON_CONTROL_REG,&RSctrl,0x01);
return status;
}
/*for Masaic issue on 070208*/
u8 GetRSErrCount(u8 *errorCount_l, u8 *errorCount_h, CSHDITunerIndex bTunerIndex)
{
u8 status;
lockstat_t lockstat;
u8 ber_done;
u8 PRBS_stat;
u8 buf[4];
status = PASS;
/* //KOHN
// make sure that the part is locked
status = GetLockStat((u8*)&lockstat);
if (status != PASS)
return status;
// part is unlocked
if ((lockstat & RX_LOCK) != RX_LOCK)
return MONITOR_UNLOCK;
*/
// check if in PRBS mode, if so, see if locked
status = GetReg(g_CTK202A[bTunerIndex], REED_SOLOMON_CONTROL_REG, &ber_done,0x01);
if (status != PASS)
return status;
ber_done &= 0x03;
if (ber_done == 0x03)
{
//in PRBS mode, now see if locked
status = GetReg(g_CTK202A[bTunerIndex],PRBS_CONTROL_REG, &PRBS_stat,0x01);
if (status != PASS)
return status;
PRBS_stat &= 0x20;
if (PRBS_stat != 0x20)
return PRBS_UNLOCK;
}
status = GetReg(g_CTK202A[bTunerIndex],REED_SOLOMON_ERROR_COUNT_REG_L, buf,0x02);
*errorCount_l = buf[0];
*errorCount_h = buf[1];
if (status != PASS)
return status;
if (buf[1] << 8 + buf[0] == 0xFFFF)
return MONITOR_SATURATED;
status = GetReg(g_CTK202A[bTunerIndex], REED_SOLOMON_CONTROL_REG, &ber_done,0x01);
//check the done bit of the Viterbi BER, if not done, return '1' in status
ber_done &= 0x10;
if (ber_done != 0 && status == PASS)
status = MONITOR_NOT_READY;
return status;
}
/*del because last function can deal the Masaic issue better on 070208
//gets Reed-Solomon error count.
BYTE GetRSErrCount(int *errorCount,CSHDITunerIndex bTunerIndex)
{
BYTE status;
lockstat_t lockstat;
BYTE ber_done;
BYTE PRBS_stat;
status = PASS;
// make sure that the part is locked
// printf("&&&&&&&&&&&&&&&&\r\n");
status = GetLockStat(&lockstat,bTunerIndex);
//printf("$$$$$$$$$$$$$$$$$\r\n");
if (status != PASS)
return status;
// part is unlocked
if ((lockstat & RX_LOCK) != RX_LOCK)
return MONITOR_UNLOCK;
// check if in PRBS mode, if so, see if locked
status = GetReg(g_CTK202A[bTunerIndex],REED_SOLOMON_CONTROL_REG, &ber_done,0x01);
if (status != PASS)
return status;
ber_done &= 0x03;
if (ber_done == 0x03)
{
//in PRBS mode, now see if locked
status = GetReg(g_CTK202A[bTunerIndex],PRBS_CONTROL_REG, &PRBS_stat,0x01);
if (status != PASS)
return status;
PRBS_stat &= 0x20;
if (PRBS_stat != 0x20)
return PRBS_UNLOCK;
}
status = GetReg(g_CTK202A[bTunerIndex],REED_SOLOMON_ERROR_COUNT_REG_L,(UINT8*) errorCount,0x02);
if (status != PASS)
return status;
if (*errorCount == 0xFFFF)
return MONITOR_SATURATED;
status = GetReg(g_CTK202A[bTunerIndex], REED_SOLOMON_CONTROL_REG, &ber_done,0x01);
//check the done bit of the Viterbi BER, if not done, return '1' in status
ber_done &= 0x10;
if (ber_done != 0 && status == PASS)
status = MONITOR_NOT_READY;
return status;
}*/
BYTE SetTone(CSHDISwitch nF22KCtrl, CSHDITunerIndex bTunerIndex)
{
BYTE reg, reg2;
BYTE status;
status = PASS;
status = GetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®, 0x01);
reg2 = 0x00;
status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®2, 0x01); //Reset LNB request
if(nF22KCtrl)
{
reg &= 0x40;
reg |= 0xA0;/*send continue tone*/
}
else
{
reg &= 0x40;
reg |= 0x80;/*no continue tone*/
}
//////////printf("SetTone Reg:%hx\n", reg);
status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®, 0x01);
return status;
}
/*LNB 供电的开关*/
BYTE SetLNB(BYTE lnb,CSHDITunerIndex bTunerIndex)
{
BYTE reg;
BYTE status;
status = PASS;
status = GetReg(g_CTK202A[bTunerIndex],LNB_SUPPLY_CONTROL_REG_4, ®, 0x01);
if(lnb)
{
reg &= 0xF7;
reg |= 0x08;
}
else
{
reg &= 0xF7;
}
//////////printf("SetLNB Reg:%hx\n", reg);
status &= SetReg(g_CTK202A[bTunerIndex],LNB_SUPPLY_CONTROL_REG_4, ®, 0x01);
return status;
}
BYTE SetPolar(WORD polar,CSHDITunerIndex bTunerIndex)
{
BYTE reg, reg2;
BYTE status;
status = PASS;
status = GetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_2, ®, 0x01);
reg |= 0x04;/*tone burst disable*/
status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_2, ®, 0x01);
status &= GetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®, 0x01);
reg2 = 0x00;
status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®2, 0x01); //Reset LNB request
if(polar)
{
//////////printf("FRONTEND_HORIZONTAL\n");
reg &= 0x20;
reg |= 0xC0;
}
else
{
//////////printf("FRONTEND_VERTICAL\n");
reg &= 0x20;
} reg |= 0x80;
//////////printf("SetPolar Reg:%hx\n", reg);
status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, ®, 0x01);
return status;
}
BYTE SetTStype(BYTE b8Ts_type, WORD KBd_rate,CSHDITunerIndex bTunerIndex)
{
u8 reg[2];
BYTE status = PASS;
if(b8Ts_type)
{
//printf("now! PARALLEL TS!!\r\n");
reg[0] = 0x0d;/*0x05 modify by th on 070216 for Masaic issue when insert CAM card and play free channel*/
reg[1] = 0x20;
}
else
{
//printf("now! SERIAL TS!!\r\n");
reg[0] = 0x0C;
if(KBd_rate >= 40000)
reg[1] = 0x00;
else if(KBd_rate >= 30000)
reg[1] = 0x01;
else if(KBd_rate >= 19000)
reg[1] = 0x02;
else
reg[1] = 0x03;
}
status = SetReg(g_CTK202A[bTunerIndex], TS_CONTROL_REG_1, reg, 0x02);
if(status != PASS) return status;
return status;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?