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,&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, &reg, 0x01);

	reg2 = 0x00;
	status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, &reg2, 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, &reg, 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, &reg, 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, &reg, 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, &reg, 0x01);
	reg |= 0x04;/*tone burst disable*/
	status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_2, &reg, 0x01);	

	status &= GetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, &reg, 0x01);
	
	reg2 = 0x00;
	status &= SetReg(g_CTK202A[bTunerIndex],LNB_CONTROL_REG_1, &reg2, 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, &reg, 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 + -
显示快捷键?