//static fci_u16 tunerbb_drv_fc8050_rserror_count(void)
static fci_u16 tunerbb_drv_fc8050_rserror_count(fci_u16 *nframe)//for dummy channel.
{
	//fci_u32 rt_esum;
	fci_u16 rt_nframe, rt_rserror;
	fci_u8  rs_ctrl=0;

#ifdef MON_BURST_MODE
	uint8 burst[12];

	rs_ctrl = 0x21;
	BBM_WRITE(0, BBM_RS_CONTROL, rs_ctrl);
	BBM_BULK_READ(0, BBM_RS_RT_BER_PER, &burst[0], 4);
	//BBM_LONG_READ(0, BBM_RS_RT_BER_PER, burst[0]);
	rt_nframe = (uint16)(*(uint16*)burst);
	rt_rserror = (uint16)(*((uint16*)burst+1));

	rs_ctrl = 0x1;
	BBM_WRITE(0, BBM_RS_CONTROL, rs_ctrl);
#else
	BBM_READ(0, BBM_RS_CONTROL, &rs_ctrl);
	rs_ctrl |= 0x20;
	BBM_WRITE(0, BBM_RS_CONTROL, rs_ctrl);

	BBM_WORD_READ(0, BBM_RS_RT_BER_PER, &rt_nframe);	//실시간으로 count 되는 frame 수
	//BBM_LONG_READ(0, BBM_RS_RT_ERR_SUM, &rt_esum);
	BBM_WORD_READ(0, BBM_RS_RT_FAIL_CNT, &rt_rserror);

	rs_ctrl &= ~0x20;
	BBM_WRITE(0, BBM_RS_CONTROL, rs_ctrl);
#endif

	*nframe=rt_nframe; //실시간으로 count 되는 frame 수
	return rt_rserror;
}
static uint32 tunerbb_drv_fc8050_get_rs_ber(void)	//va_ber
{
	uint16 nframe, rserror;
	uint32 esum;
	uint32 ber;

#ifdef MON_BURST_MODE
	uint8 burst[12];

	BBM_BULK_READ(0, BBM_RS_BER_PERIOD, &burst[0], 8);
	nframe = (uint16)(*(uint16*)burst);
	rserror = (uint16)(*((uint16*)burst+1));
	esum = (uint32)(*((uint32*)burst+1));
#else
	BBM_WORD_READ(0, BBM_RS_BER_PERIOD, &nframe);
	BBM_LONG_READ(0, BBM_RS_ERR_SUM, &esum);
	BBM_WORD_READ(0, BBM_RS_FAIL_COUNT, &rserror);
#endif

	if(nframe == 0)
	{
		// LGE_INTG_090217
		ber = MAX_VA_BER;
	}
	else if((esum == 0) && (rserror == 0))
	{
		ber = 0;
	}
	else
	{
		//LGE_INTG_090217
		#if (1)	//include corrected bit 
		ber = esum;
		#else	//not include
		ber = 0;
		#endif
		
		ber += rserror * 9;
		ber /= (nframe + 1) * 204 * 8;
		ber = ber * 100000;
	}

	ber = (ber >= MAX_VA_BER) ? MAX_VA_BER : ber;

	return ber; 	

}
/*====================================================================
FUNCTION       fc8150_bb_get_status
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void fc8150_bb_get_status(tIsdbtSigInfo *sig_info)
{
	struct dm_st {
		u8	start;
		s8	rssi;
		u8	wscn;
		u8	reserved;
		u16 main_rxd_rsps;
		u16 main_err_rsps;
		u32 main_err_bits;
		u32 dmp_rxd_bits;
		u32 dmp_err_bits;
		u16 inter_rxd_rsps;
		u16 inter_err_rsps;
		u32 inter_err_bits;
		u8	lna_code;
		u8	rfvga;
		u8	k;
		u8	csf_gain;
		u8	pga_gain;
		u8	extlna;
		u8	high_current_mode_gain;
		u8	extlna_gain;
	} dm;

    /** read info */
	BBM_WRITE(NULL, BBM_REQ_BER, 0x0e);
	BBM_BULK_READ(NULL, BBM_DM_DATA, (u8*) &dm + 1, sizeof(dm) - 1);

    /** calc BER */
	if (dm.dmp_rxd_bits)
		sig_info->ber = ((u32)dm.dmp_err_bits * 10000 / (u32)dm.dmp_rxd_bits);
	else
		sig_info->ber = 10000;

    /** calc PER */
	if (dm.inter_rxd_rsps)
		sig_info->per = ((u32)dm.inter_err_rsps * 10000 / (u32)dm.inter_rxd_rsps);
	else
		sig_info->per = 10000;

    /** read CN */
    sig_info->cninfo = dm.wscn;
}
static uint32 tunerbb_drv_fc8050_get_viterbi_ber(void)	//msc_ber
{
	uint8 vt_ctrl;
	uint32 bper, tbe;
	uint32 ber;

#ifdef MON_BURST_MODE
	uint8 burst[12];

#ifdef FEATURE_FIC_BER
	if(serviceType[0]==FC8050_ENSQUERY)
		vt_ctrl = 0x11;
	else
		vt_ctrl = 0x13;
#else
	vt_ctrl = 0x13;
#endif

	BBM_WRITE(0, BBM_VT_CONTROL, vt_ctrl);
	BBM_BULK_READ(0, BBM_VT_RT_BER_PERIOD, &burst[0], 8);
	bper = (uint32)(*(uint32*)burst);
	tbe = (uint32)(*((uint32*)burst+1));

#ifdef FEATURE_FIC_BER
	if(serviceType[0]==FC8050_ENSQUERY)
		vt_ctrl = 0x1;
	else
		vt_ctrl = 0x3;
#else
	vt_ctrl = 0x3;
#endif

	BBM_WRITE(0, BBM_VT_CONTROL, vt_ctrl);
#else
	BBM_READ(0, BBM_VT_CONTROL, &vt_ctrl);
	vt_ctrl |= 0x10;
	BBM_WRITE(0, BBM_VT_CONTROL, vt_ctrl);

	BBM_LONG_READ(0, BBM_VT_RT_BER_PERIOD, &bper);
	BBM_LONG_READ(0, BBM_VT_RT_ERROR_SUM, &tbe);

	vt_ctrl &= ~0x10;
	BBM_WRITE(0, BBM_VT_CONTROL, vt_ctrl);
#endif

	if(bper == 0)
	{
		// LGE_INTG_090217
		ber = MAX_MSC_BER; 
	}
	else if(tbe == 0)
	{
		ber = 0;
	}
	else
	{		
		//ber = ((tbe / bper) * 100000);
		//ber = (tbe * 100000) / bper;
		if(tbe > 42949)
		{
			ber = ((tbe * 1000)/bper)*100;
		}
		else
		{
			ber = (tbe*100000)/bper;
		}
	}

	ber = (ber >= MAX_MSC_BER) ? MAX_MSC_BER : ber;

	/* ber must bigger than 0 because FactoryTest issue */
	if(ber == 0)
	{
		ber = 1;
	}
	
	return ber;

}
/*====================================================================
FUNCTION       fc8150_bb_get_tuner_info
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void fc8150_bb_get_tuner_info(tIsdbtTunerInfo* tuner_info)
{
    u8 mode;
	u8 buf_lock;
	s32 i32RSSI;
	u32 ui32BER;
	u32 ui32PER;
	s32 CN;
    static u32 prelvl = 0;
	u32 ui32Antlvl;
    u16 AGC;
    u8 GI;
    u8 TM;
	struct dm_st {
		u8	start;
		s8	rssi;
		u8	wscn;
		u8	reserved;
		u16 main_rxd_rsps;
		u16 main_err_rsps;
		u32 main_err_bits;
		u32 dmp_rxd_bits;
		u32 dmp_err_bits;
		u16 inter_rxd_rsps;
		u16 inter_err_rsps;
		u32 inter_err_bits;
		u8	lna_code;
		u8	rfvga;
		u8	k;
		u8	csf_gain;
		u8	pga_gain;
		u8	extlna;
		u8	high_current_mode_gain;
		u8	extlna_gain;
	} dm;

	BBM_READ(NULL, 0x5053, &buf_lock);
	ISDBT_MSG_FC8150_BB("[%s] Lock = %d\n", __func__, buf_lock);
	if (!buf_lock)
        ui32Antlvl = prelvl = 0;
    tuner_info->rssi = buf_lock;

	BBM_WRITE(NULL, BBM_REQ_BER, 0x0e);
	BBM_BULK_READ(NULL, BBM_DM_DATA, (u8*) &dm + 1, sizeof(dm) - 1);

	ISDBT_MSG_FC8150_BB("[%s] main_rxd_rsps: %d, dmp_rxd_bits: %d, inter_rxd_rsps: %d\n", __func__, dm.main_rxd_rsps, dm.dmp_rxd_bits, dm.inter_rxd_rsps);
		
	if (dm.inter_rxd_rsps)
		ui32PER = ((u32)dm.inter_err_rsps * 10000 / (u32)dm.inter_rxd_rsps);
	else
		ui32PER = 10000;

	if (dm.dmp_rxd_bits)
		ui32BER = ((u32)dm.dmp_err_bits * 10000 / (u32)dm.dmp_rxd_bits);
	else
		ui32BER = 10000;
	
	i32RSSI = dm.rssi;
	CN = dm.wscn;

    BBM_READ(NULL, 0x302a, &mode);
    GI = (mode & 0x70) >> 4;    //	1 : 1/32, 2 : 1/16, 3 : 1/8, 4 : 1/4
    TM = mode & 0x03;           //	1 : mode1, 2 : mode2, 3 : mode3

	BBM_WORD_READ(0, 0x100e, &AGC);

	switch (prelvl) {
    case 0:
		if (ui32BER < 650)
			ui32Antlvl = prelvl = 1;
		else
			ui32Antlvl = prelvl;
	    break;

	case 1:
		if ((ui32BER > 700) || ((ui32BER > 500) && (CN <= 3)))
			ui32Antlvl = prelvl = 0;
		else if ((ui32BER < 300) && (CN > 6))
			ui32Antlvl = prelvl = 2;
		else
			ui32Antlvl = prelvl;
		break;

	case 2:
		if ((ui32BER > 500) || ((ui32BER > 300) && (CN <= 5)))
			ui32Antlvl = prelvl = 1;
		else if ((ui32BER < 100) && (CN >= 9))
			ui32Antlvl = prelvl = 3;
		else
			ui32Antlvl = prelvl;
		break;

	case 3:
		if ((ui32BER > 200) || ((ui32BER > 100) && (CN <= 9)))
			ui32Antlvl = prelvl = 2;
		else if ((ui32BER < 50) && (CN >= 12))
			ui32Antlvl = prelvl = 4;
		else
			ui32Antlvl = prelvl;
		break;

	case 4:
		if ((ui32BER > 100) || (CN <= 14))
			ui32Antlvl = prelvl = 3;
		else
			ui32Antlvl = prelvl;
		break;

	default :
		ui32Antlvl = prelvl = 0;
		break;
	}

    ISDBT_MSG_FC8150_BB("[%s] (PER)%d (BER)%d (RSSI)%d (CN)%d (AGC)%d (Ant)%d\n", __func__, ui32PER, ui32BER, i32RSSI, CN, AGC, ui32Antlvl);
}