int fc8050_reset(HANDLE hDevice) { TDMB_MSG_FCI_BB("[%s]\n", __func__); bbm_write(hDevice, BBM_COM_RESET, 0xFE); msWait(1); bbm_write(hDevice, BBM_COM_RESET, 0xFF); return BBM_OK; }
int fc8050_init(HANDLE hDevice) { u8 intMask; TDMB_MSG_FCI_BB("[%s]\n", __func__); fc8050_reset(hDevice); fc8050_set_xtal(hDevice); bbm_write(hDevice, BBM_BUF_MISC_CTRL, 0x19); //bbm_write(hDevice, BBM_24M_CLK_EN, 0xff); bbm_write(hDevice, BBM_VT_CONTROL, 0x03); bbm_word_write(hDevice, BBM_SYNC_CNTRL, 0x0020); bbm_write(hDevice, BBM_FIC_CRC_CONTROL, 0x03); bbm_write(hDevice, BBM_BUF_TEST_MODE, 0x08); bbm_write(hDevice, 0x33c, 0x03); #ifdef FC8050_USE_TSIF bbm_write(hDevice, BBM_TS_PAUSE, 0x60); bbm_write(hDevice, BBM_BUF_STS_CLK_DIV, 0x05); #ifdef MSMCHIP bbm_write(hDevice, BBM_BUF_STS_CTRL, 0x88); bbm_write(hDevice, BBM_TS_SELECT, 0xc4); #else bbm_write(hDevice, BBM_BUF_STS_CTRL, 0x02); bbm_write(hDevice, BBM_TS_SELECT, 0xc3); #endif #endif /* FC8050_USE_TSIF */ bbm_write(hDevice, BBM_FFT_MODEM_STSH, 0x03); bbm_write(hDevice, BBM_DIDP_MODE, 0x01); bbm_write(hDevice, BBM_SYNC_DET_CNTRL, 0x01); bbm_word_write(hDevice, BBM_SYNC_DET_MAX_THRL, 0x0A00); bbm_write(hDevice, BBM_SYNC_DET_MODE_ENABLE, 0x01); bbm_write(hDevice, BBM_BUF_CLOCK_EN, 0xff); bbm_write(hDevice, BBM_FFT_SCALEV_IFFT, 0xea); bbm_write(hDevice, BBM_SYNC_FT_RANGE, 0x20); bbm_write(hDevice, BBM_QDD_AGC530_EN, 0x53); bbm_write(hDevice, BBM_QDD_BLOCK_AVG_SIZE, 0x48); bbm_write(hDevice, BBM_QDD_BLOCK_AVG_SIZE_LOCK, 0x49); bbm_word_write(hDevice, BBM_QDD_GAIN_CONSTANT, 0x0303); bbm_write(hDevice, BBM_QDD_DET_CNT_BOUND, 0x60); bbm_write(hDevice, BBM_QDD_REF_AMPL, 0x00); bbm_write(hDevice, BBM_QDD_BW_CTRL_LOCK, 0x50); bbm_write(hDevice, BBM_QDD_DC_CTRL, 0x3f); bbm_write(hDevice, BBM_RS_CONTROL, 0x01); bbm_word_write(hDevice, BBM_RS_BER_PERIOD, 0x14e); #if defined(POWER_SAVE_MODE) bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x06); bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT0, 0x41); bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x06); bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT1, 0xf1); bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x07); bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x1c); #else bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x04); bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT0, 0x21); bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x05); bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT1, 0x21); bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x05); bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x9c); #endif bbm_word_write(hDevice, BBM_BUF_FIC_START, FIC_BUF_START); bbm_word_write(hDevice, BBM_BUF_FIC_END, FIC_BUF_END); bbm_word_write(hDevice, BBM_BUF_FIC_THR, FIC_BUF_THR); bbm_word_write(hDevice, BBM_BUF_CH0_START, CH0_BUF_START); bbm_word_write(hDevice, BBM_BUF_CH0_END, CH0_BUF_END); bbm_word_write(hDevice, BBM_BUF_CH0_THR, CH0_BUF_THR); bbm_word_write(hDevice, BBM_BUF_CH1_START, CH1_BUF_START); bbm_word_write(hDevice, BBM_BUF_CH1_END, CH1_BUF_END); bbm_word_write(hDevice, BBM_BUF_CH1_THR, CH1_BUF_THR); bbm_word_write(hDevice, BBM_BUF_CH2_START, CH2_BUF_START); bbm_word_write(hDevice, BBM_BUF_CH2_END, CH2_BUF_END); bbm_word_write(hDevice, BBM_BUF_CH2_THR, CH2_BUF_THR); bbm_word_write(hDevice, BBM_BUF_CH3_START, CH3_BUF_START); bbm_word_write(hDevice, BBM_BUF_CH3_END, CH3_BUF_END); bbm_word_write(hDevice, BBM_BUF_CH3_THR, CH3_BUF_THR); bbm_word_write(hDevice, BBM_BUF_INT, 0x01ff); bbm_word_write(hDevice, BBM_BUF_ENABLE, 0x01ff); intMask = ENABLE_INT_MASK; bbm_write(hDevice, BBM_COM_INT_ENABLE, intMask); bbm_write(hDevice, BBM_COM_STATUS_ENABLE, intMask); return BBM_OK; }
int fc8050_scan_status(HANDLE hDevice) { int i, res = BBM_NOK; u8 mode = 0, status = 0, sync_status = 0; int slock_cnt, flock_cnt, dlock_cnt; bbm_read(hDevice, BBM_SYNC_DET_CNTRL, &mode); if((mode & 0x01) == 0x01) { slock_cnt = SLOCK_MAX_TIME / LOCK_TIME_TICK; flock_cnt = FLOCK_MAX_TIME / LOCK_TIME_TICK; dlock_cnt = DLOCK_MAX_TIME / LOCK_TIME_TICK; // OFDM Detect for(i = 0; i < slock_cnt; i++) { msWait(LOCK_TIME_TICK); bbm_read(hDevice, BBM_SYNC_DET_STATUS, &status); TDMB_MSG_FCI_BB("[%s] OFDM Detect [%d]\n", __func__, status); if(status & 0x01) break; } if(i == slock_cnt) return BBM_NOK; if((status & 0x02) == 0x00) return BBM_NOK; // FRS for(i += 1; i < flock_cnt; i++) { msWait(LOCK_TIME_TICK); bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); TDMB_MSG_FCI_BB("[%s] FRS Detect [%d]\n", __func__, sync_status); if(sync_status & 0x01) break; } if (i == flock_cnt) return BBM_NOK; // Digital Lock for(i += 1; i < dlock_cnt; i++) { msWait(LOCK_TIME_TICK); bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); TDMB_MSG_FCI_BB("[%s] Digital Detect [%d]\n", __func__, sync_status); if(sync_status & 0x20) return BBM_OK; } } else { dlock_cnt = DLOCK_MAX_TIME / LOCK_TIME_TICK; for(i = 0; i < dlock_cnt; i++) { msWait(LOCK_TIME_TICK); bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); TDMB_MSG_FCI_BB("[%s] Digital Detect [%d]\n", __func__, sync_status); if(sync_status & 0x20) { return BBM_OK; } } } return res; }
int fc8050_demux(u8* data, u32 length, u8** res_ptr, u32* res_size) #endif { int res = BBM_OK; u32 i;//, pos; u8 sync_error = 0; int is_video_data = FALSE; //int fic_len = 0; #ifdef FC8050_USE_TSIF int msc_idx = 0; int dab_len = 0; #endif #ifdef FEATURE_TDMB_DAB_BUF u8* data = NULL; if(serviceType == TDMB_BB_SVC_DAB) { memcpy(dab_buf, data_buf, length); data = dab_buf; } else { data = data_buf; } #endif #ifdef FEATURE_DMB_DATA_DUMP dmb_data_dump(data, length, FILENAME_PRE_DEMUX); #endif for(i = 0; i < length; i += 188) { if(data[i] == SYNC_MASK_FIC) { #ifdef FC8050_USE_TSIF ts_data.fic_size = 0; res = ts_fic_gather(&data[i], 188, ts_data.fic_buf, &ts_data.fic_size); if(ts_data.fic_size) { // FIC데이터는 384 만큼만 한다. memcpy((void*)ts_data.fic_buf, sTSFic.buffer, ts_data.fic_size); } #else res = ts_fic_gather(&data[i], 188); #endif } else if((data[i] == SYNC_MASK_VIDEO) || (data[i] == SYNC_MASK_VIDEO1)) { is_video_data = TRUE; res = ts_dmb_gather(&data[i], 188); #ifdef FC8050_USE_TSIF if(msc_idx != i) { memcpy(&data[msc_idx * 188], &data[i], 188); } msc_idx ++; #endif } else if((data[i] & 0xC0) == 0xC0) { #ifdef FC8050_USE_TSIF ts_data.msc_size = 0; res = ts_nv_gather(&data[i], 188, ts_data.msc_buf, &ts_data.msc_size); if(ts_data.msc_size) { memcpy((void*)&ts_data.msc_buf[dab_len], sTSNVideo[3].buffer, ts_data.msc_size); dab_len += ts_data.msc_size; } #else res = ts_nv_gather(&data[i], 188); #endif } else { //PRINTF(" %02X", data[i]); //TDMB_MSG_FCI_BB("[%s] sync_error \n", __func__); sync_error++; } } #ifdef FC8050_USE_TSIF if(is_video_data) { ts_data.msc_size = msc_idx * 188; } else { ts_data.msc_size = dab_len; } #ifdef FEATURE_DMB_DATA_DUMP dmb_data_dump(ts_data.msc_buf, ts_data.msc_size, FILENAME_POST_DEMUX); #endif //TDMB_MSG_FCI_BB("[%s] msc_size[%d], fic_size[%d], length[%d]\n", __func__, ts_data.msc_size, ts_data.fic_size, length); if(sync_error) { TDMB_MSG_FCI_BB("[%s] sync_error cnt[%d]\n", __func__, sync_error); } if(ts_data.msc_size) { ts_data.type = MSC_DATA; if(ts_data.fic_size) { ts_data.type = FIC_MSC_DATA; } } else if(ts_data.fic_size) { ts_data.type = FIC_DATA; } sync_error_cnt = 0; return ts_data.msc_size; #else if(sync_error > 0) { sync_error_cnt += sync_error; if(sync_error_cnt >= 5) return BBM_E_MUX_SYNC; } else { sync_error_cnt = 0; } fc8050_get_demux_buffer(res_ptr, res_size); return res; #endif }