static void tcpal_work_read_fic(struct work_struct *_param) { s32 size = TCBD_FIC_SIZE, ret; u8 buff[TCBD_FIC_SIZE]; u64 diff; struct tcbd_irq_data *irq_data = container_of(_param, struct tcbd_irq_data, work); struct tcbd_device *device = irq_data->device; diff = tcpal_diff_time(irq_data->start_tick); tcbd_debug(DEBUG_INTRRUPT, "work delay :%d\n", (u32)diff); ret = tcbd_read_fic_data(device, buff, size); if (ret < 0) { tcbd_debug(DEBUG_ERROR, "failed to read fic! %d\n", ret); goto exit_work; } #ifndef CONFIG_SKY_TDMB tcbd_enqueue_data(buff, size, 0, 1); #endif if (!start_tune) /* set by tune_frequency*/ goto exit_work; ret = tcc_fic_run_decoder(buff, MAX_FIC_SIZE); if (ret > 0) { tcc_fic_get_ensbl_info(1); start_tune = 0; tcc_fic_parser_init(); } exit_work: enable_irq(irq_data->tcbd_irq); }
static s32 tcpal_irq_stream_callback( #endif s32 _dev_idx, u8 *_stream, s32 _size, u8 _subch_id, u8 _type) { /*static u64 time = 0;*/ /*struct tcbd_status_data status;*/ #if 0 //ndef CONFIG_SKY_TDMB s32 ret, i = 0; #endif switch (_type) { case 0: /*MSC*/ /* write your own code!!*/ case 1: /*FIC*/ /* write your own code!!*/ #ifdef CONFIG_SKY_TDMB tcc3170_put_data(_stream, _size, _type); #endif #if 0 //ndef CONFIG_SKY_TDMB if (!start_tune) /* set by tune_frequency*/ goto skip_fic_parse; for (i = 0; i < _size/TCBD_FIC_SIZE; i++) { ret = tcc_fic_run_decoder(_stream + (i * TCBD_FIC_SIZE), MAX_FIC_SIZE); if (ret > 0) { tcc_fic_get_ensbl_info(1); start_tune = 0; tcc_fic_parser_init(); } } /*tcbd_read_signal_info(tcbd_irq_handler_data.device, &status); tcbd_debug(DEBUG_ERROR, "PCBER:%d, SNR:%d, RSSI:%d, VBER:%d, TSPER:%d\n", status.pcber, status.snr, status.rssi, status.vber, status.tsper);*/ /*if (tcpal_diff_time(time) > 1000) { tcbd_check_dsp_status(tcbd_irq_handler_data.device); time = tcpal_get_time(); }*/ skip_fic_parse: tcbd_enqueue_data(_stream, _size, _subch_id, _type); #endif break; case 2: /*STATUS*/ tcbd_debug(DEBUG_STATUS, "status size:%d\n", _size); tcbd_update_status(_stream, _size, NULL); break; default: break; } return 0; }
static s32 __stream_callback( s32 _dev_idx, u8 *_stream, s32 _size, u8 _subch_id, u8 _type) { u8 *stream; s32 size; s32 ret, i = 0; #ifdef __CALLBACK_BUFFER_HEADER__ stream = _stream + SIZE_BUFF_HEADER; size = _size - SIZE_BUFF_HEADER; #else stream = _stream; size = _size; #endif /* DPRINTK("%s : _type %d size %d\n", __func__, _type, size); */ switch (_type) { case DATA_TYPE_FIC: /*FIC*/ for (i = 0; i < size/TCBD_FIC_SIZE; i++) { ret = tcc_fic_run_decoder(stream + (i*TCBD_FIC_SIZE), MAX_FIC_SIZE); if (ret > 0) scan_done = true; } break; case DATA_TYPE_MSC: /*MSC*/ tdmb_store_data(stream, size); break; case DATA_TYPE_STATUS: /*STATUS*/ tcbd_update_status(stream, size, NULL); default: break; } return 0; }