static int8 tunerbb_drv_fc8050_check_overrun(uint8 op_mode) { uint16 mfoverStatus; // Patch for BER monitoring 20111115 //uint16 buf_set=0; uint16 veri_val=0; uint8 mask; if(op_mode == FC8050_DAB) { mask = 0x08; } else if(op_mode == FC8050_DMB || op_mode == FC8050_VISUAL) { mask = 0x01; } else { printk("fc8050 invaild op_mode %d\n", op_mode); return FC8050_RESULT_ERROR; /* invaild op_mode */ } // Patch for BER monitoring 20111115 //BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &buf_set); // Patch for BER monitoring 20111115 //if(buf_set & mask) { BBM_WORD_READ(NULL, BBM_BUF_OVERRUN, &mfoverStatus); if(mfoverStatus & mask) { BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, mfoverStatus); BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, 0x0000); BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &veri_val); veri_val &= ~mask; BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val); veri_val |= mask; BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val); fc8050_isr_interruptclear(); printk("======== FC8050 OvernRun and Buffer Reset Done mask (0x%X) over (0x%X) =======\n", mask,mfoverStatus ); } } return FC8050_RESULT_SUCCESS; }
int8 tunerbb_drv_fc8050_get_fic(uint8* buffer, uint32* buffer_size /*, uint8 crc_on_off */) { HANDLE hDevice = NULL; fci_u16 mfIntStatus = 0; fci_u16 size; if(buffer==NULL) return FC8050_RESULT_ERROR; //BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, 0x00); //BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, 0x00); //tunerbb_drv_fc8050_control_fic(1); BBM_WORD_READ(hDevice, BBM_BUF_STATUS, &mfIntStatus); //printk("tunerbb_drv_fc8050_get_fic (0x%x)\n", mfIntStatus); if(mfIntStatus == 0) { //tunerbb_drv_fc8050_control_fic(0); //BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, ENABLE_INT_MASK); //BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, ENABLE_INT_MASK); return FC8050_RESULT_ERROR; } BBM_WORD_WRITE(hDevice, BBM_BUF_STATUS, mfIntStatus); BBM_WORD_WRITE(hDevice, BBM_BUF_STATUS, 0x0000); if(mfIntStatus & 0x0100) { BBM_WORD_READ(hDevice, BBM_BUF_FIC_THR, &size); size += 1; if(size-1) { BBM_DATA(hDevice, BBM_COM_FIC_DATA, buffer, size); *buffer_size=size; } //printk("FC8050 fic data (0x%x,len : %d)\n", *buffer, size); } //tunerbb_drv_fc8050_control_fic(0); //BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, ENABLE_INT_MASK); //BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, ENABLE_INT_MASK); if(mfIntStatus & 0x0100) return FC8050_RESULT_SUCCESS; else return FC8050_RESULT_ERROR; }
static int8 tunerbb_drv_fc8050_check_overrun(uint8 op_mode) { uint16 mfoverStatus; uint16 buf_set=0; uint16 veri_val=0; uint8 mask; if(op_mode == FC8050_DAB) { mask = 0x08; } else if(op_mode == FC8050_DMB || op_mode == FC8050_VISUAL) { mask = 0x01; } else { printk("fc8050 invaild op_mode %d\n", op_mode); return FC8050_RESULT_ERROR; /* invaild op_mode */ } BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &buf_set); if(buf_set & mask) { BBM_WORD_READ(NULL, BBM_BUF_OVERRUN, &mfoverStatus); if(mfoverStatus & mask) { BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, mfoverStatus); BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, 0x0000); BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &veri_val); veri_val &= ~mask; BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val); veri_val |= mask; BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val); fc8050_isr_interruptclear(); printk("++++++++++++++++++++++ fc8050 overrun occured!!! ++++++++++++++++++++++++++\n"); printk("fc8050 overrun and buffer reset done!! mask %x, over %x\n", mask, mfoverStatus); } } return FC8050_RESULT_SUCCESS; }
void tdmb_fc8050_spi_write_read_test(void) { uint16 i; uint32 wdata = 0; uint32 ldata = 0; uint32 data = 0; uint32 temp = 0; #define TEST_CNT 5 tdmb_fc8050_power_on(); for(i=0;i<TEST_CNT;i++) { BBM_WRITE(NULL, 0x05, i & 0xff); BBM_READ(NULL, 0x05, (fci_u8*)&data); printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data); if((i & 0xff) != data) printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data); } for(i=0;i<TEST_CNT;i++) { BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff); BBM_WORD_READ(NULL, 0x0210, (fci_u16*)&wdata); printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata); if((i & 0xffff) != wdata) printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata); } for(i=0;i<TEST_CNT;i++) { BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff); BBM_LONG_READ(NULL, 0x0210, (fci_u32*)&ldata); printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata); if((i & 0xffffffff) != ldata) printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata); } data = 0; for(i=0;i<TEST_CNT;i++) { temp = i&0xff; BBM_TUNER_WRITE(NULL, 0x12, 0x01, (fci_u8*)&temp, 0x01); BBM_TUNER_READ(NULL, 0x12, 0x01, (fci_u8*)&data, 0x01); printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data); if((i & 0xff) != data) printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data); } temp = 0x51; BBM_TUNER_WRITE(NULL, 0x12, 0x01, (fci_u8*)&temp, 0x01 ); tdmb_fc8050_power_off(); }
unsigned char DMBDrv_ScanCh(unsigned long ulFrequency) { esbInfo_t* esb; if(!gInitFlag) return TDMB_FAIL; FIC_DEC_SubChInfoClean(); BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x01ff); if(BBM_TUNER_SET_FREQ(NULL, ulFrequency)) { BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff); return TDMB_FAIL; } if(BBM_SCAN_STATUS(NULL)) { BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff); return TDMB_FAIL; } // wait 1.2 sec for gathering fic information msWait(1200); // 1200 BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff); esb = FIC_DEC_GetEsbInfo(0); if(esb->flag != 99) { FIC_DEC_SubChInfoClean(); return TDMB_FAIL; } if(strlen(esb->label) <= 0) { FIC_DEC_SubChInfoClean(); return TDMB_FAIL; } return TDMB_SUCCESS; }
/*-------------------------------------------------------------------------- int8 tunerbb_drv_fc8050_control_fic(void) (1) fic interrupt control on/off (2) Return Value Sucess : 1 Fail : 0 or negative interger (If there is error code) (3) Argument enable : on/off ---------------------------------------------------------------------------- */ int8 tunerbb_drv_fc8050_control_fic(uint8 enable) { unsigned short mask; BBM_WORD_READ(NULL, BBM_BUF_INT, &mask); if(enable ==1) mask |= 0x100; else mask &= ~0x100; BBM_WORD_WRITE(NULL, BBM_BUF_INT, mask); return FC8050_RESULT_SUCCESS; }
void mmi_bbm_wwrite(int argc, char *argv[]) { u16 dest_addr; u16 dest_data; u16 length; int i; if(argc == 3) { dest_addr = htoi(argv[1]); dest_data = htoi(argv[2]); BBM_WORD_WRITE(hDevice, dest_addr, dest_data); } else if(argc == 4) { dest_addr = htoi(argv[1]); dest_data = htoi(argv[2]); length = htoi(argv[3]); for(i=0; i<length; i+=2) { BBM_WORD_WRITE(hDevice, dest_addr+i, dest_data); } } else { print_log("usage : %s [start addr] [data] [length] ; word write command\n", (int)argv[0]); } }
unsigned char DMBDrv_SetCh(unsigned long ulFrequency, unsigned char ucSubChannel, unsigned char ucSvType) { if(!gInitFlag) return TDMB_FAIL; bfirst = 1; TSBuffpos = 0; MSCBuffpos = 0; mp2len = 0; gCurSvcType = ucSvType; gCurSubChId = ucSubChannel; BBM_VIDEO_DESELECT(NULL, 0, 0, 0); BBM_AUDIO_DESELECT(NULL, 0, 3); BBM_DATA_DESELECT(NULL, 0, 2); BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff); if(BBM_TUNER_SET_FREQ(NULL, ulFrequency) != BBM_OK) { return TDMB_FAIL; } if(ucSvType == 0x18) { BBM_VIDEO_SELECT(NULL, ucSubChannel, 0, 0); } else if(ucSvType == 0x00) { BBM_AUDIO_SELECT(NULL, ucSubChannel, 3); } else { BBM_DATA_SELECT(NULL, ucSubChannel, 2); } #ifdef FEATURE_FC8050_DEBUG if(ucSvType == 0x18) gDmbMode=FC8050_DMB; else if(ucSvType == 0x00) gDmbMode=FC8050_DAB; else gDmbMode=FC8050_DATA; #endif return TDMB_SUCCESS; }
// Modified by somesoo 20100730 for removing green block effect int8 tunerbb_drv_fc8050_multi_set_channel(int32 freq_num, uint8 subch_cnt, uint8 subch_id[ ], uint8 op_mode[ ]) { int8 res = BBM_OK; int32 freq = 0; uint8 dmb_cnt=0; int i; fc8050_service_type svcType = FC8050_SERVICE_MAX; unsigned short mask; // Added by somesoo 20100730 for removing green block effect fc8050_isr_control(0); for(i=0;i<subch_cnt;i++) { serviceType[i] = op_mode[i]; if(FC8050_ENSQUERY != op_mode[i]) tunerbb_drv_fc8050_stop(); else svcType = FC8050_ENSQUERY; } tunerbb_drv_fc8050_control_fic(0); /* Change freq_num(channel num) to frequency */ freq = tunerbb_drv_convert_chnum_to_freq(freq_num); if(freq == 0) { return FC8050_RESULT_ERROR; } res = BBM_TUNER_SET_FREQ(0, freq); if(res) { return FC8050_RESULT_ERROR; } if(svcType == FC8050_ENSQUERY) { if(BBM_SCAN_STATUS(0)) { return FC8050_RESULT_ERROR; } } BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &mask); mask &= 0x100; for(i=0;i<subch_cnt;i++) { switch(serviceType[i]) { case FC8050_DAB: mask |= (1<<DAB_SVC_ID); BBM_AUDIO_SELECT(0, subch_id[i],DAB_SVC_ID); #ifdef STREAM_TS_UPLOAD fc8050_demux_select_channel(subch_id[i], DAB_SVC_ID); #else g_chinfo[subch_id[i]]=DAB_SVC_ID; #endif break; case FC8050_DMB: case FC8050_VISUAL: mask |= (1<<(DMB_SVC_ID+dmb_cnt)); //LGE_BROADCAST_I if(dmb_cnt<2) { BBM_VIDEO_SELECT(0, subch_id[i], DMB_SVC_ID+dmb_cnt, dmb_cnt); #ifdef STREAM_TS_UPLOAD fc8050_demux_select_video(subch_id[i], DMB_SVC_ID+dmb_cnt); #else g_chinfo[subch_id[i]]=dmb_cnt; #endif dmb_cnt++; } else res=BBM_NOK; break; case FC8050_DATA: mask |= (1<<DAT_SVC_ID); BBM_DATA_SELECT(0, subch_id[i], DAT_SVC_ID); #ifdef STREAM_TS_UPLOAD fc8050_demux_select_channel(subch_id[i], DAT_SVC_ID); #else g_chinfo[subch_id[i]]=DAT_SVC_ID; #endif break; case FC8050_ENSQUERY: tunerbb_drv_fc8050_control_fic(1); res = BBM_OK; break; default: res = BBM_NOK; break; } } BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, mask); tot_subch_cnt = subch_cnt; // Added by somesoo 20100730 for removing green block effect if(svcType != FC8050_ENSQUERY) fc8050_isr_control(1); if(res) return FC8050_RESULT_ERROR; else return FC8050_RESULT_SUCCESS; }
/*======================================================= Function : tunerbb_drv_fc8050_init Description : Initializing the FC8050 Chip after power on Parameter : VOID Return Value : SUCCESS : 1 FAIL : 0 or negative interger (If there is error code) when model who edit history ------------------------------------------------------- 2010/05/17 MOBIT prajuna EBI2 configuration 2010/05/31 MOBIT prajuna Removed test code 2010/06/09 MOBIT prajuna TDMB porting(KB3 Rev. A patch) 2010/07/15 MOBIT prajuna TDMB tuning for QSC 2010/07/16 MOBIT somesoo TDMB tuning for QSC with FCI 최규원 과장 2010/07/17 MOBIT somesoo TDMB porting(VG) 2010/08/19 MOBIT prajuna Code review 2010/09/10 MOBIT prajuna TDMB porting(Aloe) ======================================================== */ int8 tunerbb_drv_fc8050_init(void) { uint8 res; /*test*/ /* uint16 i; uint32 wdata = 0; uint32 ldata = 0; uint32 data = 0; uint32 temp = 0; */ /* Common Code */ #if defined(STREAM_SLAVE_PARALLEL_UPLOAD) /* EBI2 Specific Code */ BBM_HOSTIF_SELECT(NULL, BBM_PPI); #elif defined(STREAM_TS_UPLOAD) /* TSIF Specific Code */ BBM_HOSTIF_SELECT(NULL, BBM_I2C); #elif defined(STREAM_SPI_UPLOAD) /* SPI Specific. Code */ BBM_HOSTIF_SELECT(NULL, BBM_SPI); #else #error code not present #endif BBM_FIC_CALLBACK_REGISTER((fci_u32)NULL, tunerbb_drv_fc8050_fic_cb); BBM_MSC_CALLBACK_REGISTER((fci_u32)NULL, tunerbb_drv_fc8050_msc_cb); res = BBM_INIT(NULL); if(res) return FC8050_RESULT_ERROR; else { #if !defined(STREAM_TS_UPLOAD) memset((void*)&g_chinfo, 0xff, sizeof(g_chinfo)); memset((void*)&msc_buffer, 0x00, sizeof(DATA_BUFFER)); memset((void*)&fic_buffer, 0x00, sizeof(DATA_BUFFER)); #endif } res = BBM_TUNER_SELECT(0, FC8050_TUNER, BAND3_TYPE); // res = BBM_PROBE(0); // printk("tunerbb_drv_fc8050_init probe RES = %d\n", res); #if 0 //fc8050 <-> Host(MSM) 간의 Interface TEST를 위한 code /* test */ for(i=0;i<5000;i++) { // dog_kick(); BBM_WRITE(NULL, 0x05, i & 0xff); BBM_READ(NULL, 0x05, &data); if((i & 0xff) != data) printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data); } for(i=0;i<5000;i++) { BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff); BBM_WORD_READ(NULL, 0x0210, &wdata); if((i & 0xffff) != wdata) printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata); } for(i=0;i<5000;i++) { BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff); BBM_LONG_READ(NULL, 0x0210, &ldata); if((i & 0xffffffff) != ldata) printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata); } data = 0; for(i=0;i<5000;i++) { temp = i&0xff; BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01); BBM_TUNER_READ(NULL, 0x12, 0x01, &data, 0x01); if((i & 0xff) != data) printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data); } temp = 0x51; BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01 ); /* test */ #endif if(res) return FC8050_RESULT_ERROR; else return FC8050_RESULT_SUCCESS; }
unsigned char DMBDrv_init(void) { u8 data; u16 wdata; u32 ldata; int i; u8 temp = 0x1e; #ifdef CONFIG_TDMB_SPI if(BBM_HOSTIF_SELECT(NULL, BBM_SPI)) return TDMB_FAIL; #elif defined(CONFIG_TDMB_EBI) if(BBM_HOSTIF_SELECT(NULL, BBM_PPI)) return TDMB_FAIL; #endif if(BBM_PROBE(NULL) != BBM_OK) // check for factory chip interface test { return TDMB_FAIL; } BBM_FIC_CALLBACK_REGISTER(NULL, TDMBDrv_FIC_CALLBACK); BBM_MSC_CALLBACK_REGISTER(NULL, TDMBDrv_MSC_CALLBACK); BBM_INIT(NULL); BBM_TUNER_SELECT(NULL, FC8050_TUNER, BAND3_TYPE); #if 0 BBM_WRITE(NULL, 0x05, 0xa7); BBM_READ(NULL, 0x05, &data); BBM_READ(NULL, 0x12, &data); BBM_WORD_READ(NULL, 0x12, &wdata); BBM_WORD_WRITE(NULL, 0x310, 0x0b); BBM_WORD_READ(NULL, 0x310, &wdata); BBM_WRITE(NULL, 0x312, 0xc0); BBM_READ(NULL, 0x312, &data); BBM_TUNER_READ(NULL, 0x01, 0x01, &data, 0x01); #endif #if 0 for(i=0;i<1000;i++) { // dog_kick(); BBM_WRITE(NULL, 0x05, i & 0xff); BBM_READ(NULL, 0x05, &data); if((i & 0xff) != data) DPRINTK("FC8000 byte test (0x%x,0x%x)\r\n", i & 0xff, data); } for(i=0;i<1000;i++) { BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff); BBM_WORD_READ(NULL, 0x0210, &wdata); if((i & 0xffff) != wdata) DPRINTK("FC8000 word test (0x%x,0x%x)\r\n", i & 0xffff, wdata); } for(i=0;i<1000;i++) { BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff); BBM_LONG_READ(NULL, 0x0210, &ldata); if((i & 0xffffffff) != ldata) DPRINTK("FC8000 long test (0x%x,0x%x)\r\n", i & 0xffffffff, ldata); } for(i=0;i<1000;i++) { temp = i&0xff; BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01); BBM_TUNER_READ(NULL, 0x12, 0x01, &data, 0x01); if((i & 0xff) != data) DPRINTK("FC8000 tuner test (0x%x,0x%x)\r\n", i & 0xff, data); } temp = 0x51; BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01 ); #endif gBer = 3000; gInitFlag = 1; return TDMB_SUCCESS; }