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
}