//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); }