dmbdrv_wrap_fc8080.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. /*
  2. * Copyright(c) 2008 SEC Corp. All Rights Reserved
  3. *
  4. * File name : DMBDrv_wrap_FC8080.c
  5. *
  6. * Description : fc8080 tuner control driver
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. *
  21. * History :
  22. * ----------------------------------------------------------------------
  23. * 2009/01/19 changsul.park initial
  24. * 2009/09/23 jason porting QSC6270
  25. */
  26. #include "dmbdrv_wrap_fc8080.h"
  27. #include "fci_types.h"
  28. #include "bbm.h"
  29. #include "fci_oal.h"
  30. #include "fc8080_demux.h"
  31. #include "fic.h"
  32. #include "fci_tun.h"
  33. #include "fc8080_regs.h"
  34. #include "tdmb.h"
  35. struct sub_channel_info_type dmb_subchannel_info;
  36. struct sub_channel_info_type dab_subchannel_info;
  37. struct sub_channel_info_type dat_subchannel_info;
  38. static u32 saved_ber = 3000;
  39. static u32 dmb_initialize;
  40. unsigned char current_service_type = 0x18;
  41. unsigned char current_subchannel_id;
  42. int tdmb_interrupt_fic_callback(u32 userdata, u8 *data, int length)
  43. {
  44. fic_decoder_put((struct fic *)data, length);
  45. return 0;
  46. }
  47. #ifdef FEATURE_FC8080_DEBUG
  48. #define FC8080_DMB 0x01
  49. #define FC8080_DATA 0x08
  50. #define FC8080_DAB 0x04
  51. u16 dmb_mode = FC8080_DMB;
  52. #endif
  53. int tdmb_interrupt_msc_callback(
  54. u32 userdata, u8 subchannel_id, u8 *data, int length)
  55. {
  56. tdmb_store_data(&data[0], length);
  57. return 0;
  58. }
  59. static int viterbi_rt_ber_read(unsigned int *ber)
  60. {
  61. u32 dmp_ber_rxd_bits;
  62. u32 dmp_ber_err_bits;
  63. bbm_com_write(NULL, 0xe01, 0x0f);
  64. bbm_com_long_read(NULL, 0xe40, &dmp_ber_rxd_bits);
  65. bbm_com_long_read(NULL, 0xe44, &dmp_ber_err_bits);
  66. if (dmp_ber_rxd_bits)
  67. *ber = (dmp_ber_err_bits * 10000) / dmp_ber_rxd_bits;
  68. else
  69. *ber = 3000;
  70. print_log(NULL, "BER : %d \n", *ber);
  71. return BBM_OK;
  72. }
  73. static int get_signal_level(u32 ber, u8 *level)
  74. {
  75. if (ber >= 900)
  76. *level = 0;
  77. else if ((ber >= 800) && (ber < 900))
  78. *level = 1;
  79. else if ((ber >= 700) && (ber < 800))
  80. *level = 2;
  81. else if ((ber >= 600) && (ber < 700))
  82. *level = 3;
  83. else if ((ber >= 500) && (ber < 600))
  84. *level = 4;
  85. else if ((ber >= 400) && (ber < 500))
  86. *level = 5;
  87. else if (ber < 400)
  88. *level = 6;
  89. return BBM_OK;
  90. }
  91. void dmb_drv_channel_deselect_all(void)
  92. {
  93. bbm_com_video_deselect(NULL, 0, 0, 0);
  94. bbm_com_audio_deselect(NULL, 0, 1);
  95. bbm_com_data_deselect(NULL, 0, 2);
  96. ms_wait(100);
  97. #if defined(CONFIG_TDMB_TSIF_SLSI) || defined(CONFIG_TDMB_TSIF_QC)
  98. fc8080_demux_deselect_video(current_subchannel_id, 0);
  99. fc8080_demux_deselect_channel(current_subchannel_id, 0);
  100. #endif
  101. }
  102. #if defined(CONFIG_TDMB_TSIF_SLSI) || defined(CONFIG_TDMB_TSIF_QC)
  103. void dmb_drv_isr(u8 *data, u32 length)
  104. {
  105. fc8080_demux(data, length);
  106. }
  107. #else
  108. void dmb_drv_isr()
  109. {
  110. bbm_com_isr(NULL);
  111. }
  112. #endif
  113. unsigned char dmb_drv_init(unsigned long param)
  114. {
  115. #ifdef FEATURE_INTERFACE_TEST_MODE
  116. int i;
  117. u8 data;
  118. u16 wdata;
  119. u32 ldata;
  120. u8 temp = 0x1e;
  121. #endif
  122. #ifdef CONFIG_TDMB_SPI
  123. if (bbm_com_hostif_select(NULL, BBM_SPI, param))
  124. return TDMB_FAIL;
  125. #elif defined(CONFIG_TDMB_EBI)
  126. if (bbm_com_hostif_select(NULL, BBM_PPI, param))
  127. return TDMB_FAIL;
  128. #elif defined(CONFIG_TDMB_TSIF_SLSI) || defined(CONFIG_TDMB_TSIF_QC)
  129. if (bbm_com_hostif_select(NULL, BBM_I2C, param))
  130. return TDMB_FAIL;
  131. #endif
  132. /* check for factory chip interface test */
  133. if (bbm_com_probe(NULL) != BBM_OK) {
  134. DPRINTK("%s : BBM_PROBE fail\n", __func__);
  135. return TDMB_FAIL;
  136. }
  137. #if defined(CONFIG_TDMB_TSIF_SLSI) || defined(CONFIG_TDMB_TSIF_QC)
  138. fc8080_demux_fic_callback_register(
  139. (u32)NULL, tdmb_interrupt_fic_callback);
  140. fc8080_demux_msc_callback_register(
  141. (u32)NULL, tdmb_interrupt_msc_callback);
  142. #else
  143. bbm_com_fic_callback_register(0, tdmb_interrupt_fic_callback);
  144. bbm_com_msc_callback_register(0, tdmb_interrupt_msc_callback);
  145. #endif
  146. bbm_com_init(NULL);
  147. bbm_com_tuner_select(NULL, FC8080_TUNER, BAND3_TYPE);
  148. #ifdef FEATURE_INTERFACE_TEST_MODE
  149. for (i = 0; i < 1000; i++) {
  150. bbm_com_write(NULL, 0xa4, i & 0xff);
  151. bbm_com_read(NULL, 0xa4, &data);
  152. if ((i & 0xff) != data)
  153. DPRINTK("FC8080 byte test (0x%x,0x%x)\r\n"
  154. , i & 0xff, data);
  155. }
  156. for (i = 0; i < 1000; i++) {
  157. bbm_com_word_write(NULL, 0xa4, i & 0xffff);
  158. bbm_com_word_read(NULL, 0xa4, &wdata);
  159. if ((i & 0xffff) != wdata)
  160. DPRINTK("FC8080 word test (0x%x,0x%x)\r\n"
  161. , i & 0xffff, wdata);
  162. }
  163. for (i = 0; i < 1000; i++) {
  164. bbm_com_long_write(NULL, 0xa4, i & 0xffffffff);
  165. bbm_com_long_read(NULL, 0xa4, &ldata);
  166. if ((i & 0xffffffff) != ldata)
  167. DPRINTK("FC8080 long test (0x%x,0x%x)\r\n"
  168. , i & 0xffffffff, ldata);
  169. }
  170. for (i = 0; i < 1000; i++) {
  171. temp = i&0xff;
  172. bbm_com_tuner_write(NULL, 0x13, 0x01, &temp, 0x01);
  173. bbm_com_tuner_read(NULL, 0x13, 0x01, &data, 0x01);
  174. if ((i & 0xff) != data)
  175. DPRINTK("FC8080 tuner test (0x%x,0x%x)\r\n"
  176. , i & 0xff, data);
  177. }
  178. #endif
  179. saved_ber = 3000;
  180. dmb_initialize = 1;
  181. return TDMB_SUCCESS;
  182. }
  183. unsigned char dmb_drv_deinit(void)
  184. {
  185. dmb_initialize = 0;
  186. dmb_drv_channel_deselect_all();
  187. bbm_com_deinit(NULL);
  188. bbm_com_fic_callback_deregister(NULL);
  189. bbm_com_msc_callback_deregister(NULL);
  190. bbm_com_hostif_deselect(NULL);
  191. return TDMB_SUCCESS;
  192. }
  193. #ifdef FIC_USE_I2C
  194. void dmb_drv_get_fic(void)
  195. {
  196. u8 i;
  197. u8 lmode;
  198. u16 mfIntStatus = 0;
  199. u8 buf[FIC_BUF_LENGTH / 2];
  200. bbm_com_read(NULL, BBM_TSO_SELREG, &lmode);
  201. bbm_com_write(NULL, BBM_TSO_SELREG, lmode &= ~0x40);
  202. bbm_com_word_write(NULL, BBM_BUF_ENABLE, 0x0100);
  203. for (i = 0; i < 24; i++) {
  204. bbm_com_word_read(NULL, BBM_BUF_STATUS, &mfIntStatus);
  205. if (mfIntStatus & 0x0100) {
  206. bbm_com_word_write(NULL, BBM_BUF_STATUS, mfIntStatus);
  207. bbm_com_data(NULL, BBM_FIC_I2C_RD
  208. , &buf[0], FIC_BUF_LENGTH / 2);
  209. fic_decoder_put((struct fic *)&buf[0]
  210. , FIC_BUF_LENGTH / 2);
  211. print_log(NULL, "fic_decoder_put 0x%x \n", buf[0]);
  212. }
  213. ms_wait(50);
  214. }
  215. bbm_com_word_write(NULL, BBM_BUF_ENABLE, 0x0000);
  216. bbm_com_write(NULL, BBM_TSO_SELREG, lmode);
  217. }
  218. #endif
  219. unsigned char dmb_drv_scan_ch(unsigned long frequency)
  220. {
  221. struct esbinfo_t *esb;
  222. if (!dmb_initialize)
  223. return TDMB_FAIL;
  224. if (bbm_com_tuner_set_freq(NULL, frequency))
  225. return TDMB_FAIL;
  226. fic_decoder_subchannel_info_clean();
  227. if (bbm_com_scan_status(NULL)) {
  228. bbm_com_word_write(NULL, BBM_BUF_ENABLE, 0x0000);
  229. return TDMB_FAIL;
  230. }
  231. #ifdef FIC_USE_I2C
  232. dmb_drv_get_fic();
  233. #else
  234. bbm_com_word_write(NULL, BBM_BUF_ENABLE, 0x0100);
  235. /* wait 1.2 sec for gathering fic information */
  236. ms_wait(1200);
  237. bbm_com_word_write(NULL, BBM_BUF_ENABLE, 0x0000);
  238. #endif
  239. esb = fic_decoder_get_ensemble_info(0);
  240. if (esb->flag != 99) {
  241. print_log(NULL, "ESB ERROR \n");
  242. fic_decoder_subchannel_info_clean();
  243. return TDMB_FAIL;
  244. }
  245. if (strnlen(esb->label, sizeof(esb->label)) <= 0) {
  246. fic_decoder_subchannel_info_clean();
  247. print_log(NULL, "label ERROR \n");
  248. return TDMB_FAIL;
  249. }
  250. return TDMB_SUCCESS;
  251. }
  252. int dmb_drv_get_dmb_sub_ch_cnt()
  253. {
  254. int i, n;
  255. if (!dmb_initialize)
  256. return 0;
  257. n = 0;
  258. for (i = 0; i < MAX_SVC_NUM; i++) {
  259. struct service_info_t *svc_info;
  260. svc_info = fic_decoder_get_service_info_list(i);
  261. if ((svc_info->flag & 0x07) == 0x07) {
  262. if ((svc_info->tmid == 0x01)
  263. && (svc_info->dscty == 0x18))
  264. n++;
  265. }
  266. }
  267. return n;
  268. }
  269. int dmb_drv_get_dab_sub_ch_cnt()
  270. {
  271. int i, n;
  272. if (!dmb_initialize)
  273. return 0;
  274. n = 0;
  275. for (i = 0; i < MAX_SVC_NUM; i++) {
  276. struct service_info_t *svc_info;
  277. svc_info = fic_decoder_get_service_info_list(i);
  278. if ((svc_info->flag & 0x07) == 0x07) {
  279. if ((svc_info->tmid == 0x00)
  280. && (svc_info->ascty == 0x00))
  281. n++;
  282. }
  283. }
  284. return n;
  285. }
  286. int dmb_drv_get_dat_sub_ch_cnt(void)
  287. {
  288. int i, n;
  289. if (!dmb_initialize)
  290. return 0;
  291. n = 0;
  292. for (i = 0; i < MAX_SVC_NUM; i++) {
  293. struct service_info_t *svc_info;
  294. svc_info = fic_decoder_get_service_info_list(i);
  295. if ((svc_info->flag & 0x07) == 0x07) {
  296. if (svc_info->tmid == 0x03)
  297. n++;
  298. }
  299. }
  300. return n;
  301. }
  302. char *dmb_drv_get_ensemble_label()
  303. {
  304. struct esbinfo_t *esb;
  305. if (!dmb_initialize)
  306. return NULL;
  307. esb = fic_decoder_get_ensemble_info(0);
  308. if (esb->flag == 99)
  309. return (char *)esb->label;
  310. return NULL;
  311. }
  312. char *dmb_drv_get_sub_ch_dmb_label(int subchannel_count)
  313. {
  314. int i, n;
  315. char *label = NULL;
  316. if (!dmb_initialize)
  317. return NULL;
  318. n = 0;
  319. for (i = 0; i < MAX_SVC_NUM; i++) {
  320. struct service_info_t *svc_info;
  321. svc_info = fic_decoder_get_service_info_list(i);
  322. if ((svc_info->flag & 0x07) == 0x07) {
  323. if ((svc_info->tmid == 0x01)
  324. && (svc_info->dscty == 0x18)) {
  325. if (n == subchannel_count) {
  326. label = (char *) svc_info->label;
  327. break;
  328. }
  329. n++;
  330. }
  331. }
  332. }
  333. return label;
  334. }
  335. char *dmb_drv_get_sub_ch_dab_label(int subchannel_count)
  336. {
  337. int i, n;
  338. char *label = NULL;
  339. if (!dmb_initialize)
  340. return NULL;
  341. n = 0;
  342. for (i = 0; i < MAX_SVC_NUM; i++) {
  343. struct service_info_t *svc_info;
  344. svc_info = fic_decoder_get_service_info_list(i);
  345. if ((svc_info->flag & 0x07) == 0x07) {
  346. if ((svc_info->tmid == 0x00)
  347. && (svc_info->ascty == 0x00)) {
  348. if (n == subchannel_count) {
  349. label = (char *) svc_info->label;
  350. break;
  351. }
  352. n++;
  353. }
  354. }
  355. }
  356. return label;
  357. }
  358. char *dmb_drv_get_sub_ch_dat_label(int subchannel_count)
  359. {
  360. int i, n;
  361. char *label = NULL;
  362. if (!dmb_initialize)
  363. return NULL;
  364. n = 0;
  365. for (i = 0; i < MAX_SVC_NUM; i++) {
  366. struct service_info_t *svc_info;
  367. svc_info = fic_decoder_get_service_info_list(i);
  368. if ((svc_info->flag & 0x07) == 0x07) {
  369. if (svc_info->tmid == 0x03) {
  370. if (n == subchannel_count) {
  371. label = (char *) svc_info->label;
  372. break;
  373. }
  374. n++;
  375. }
  376. }
  377. }
  378. return label;
  379. }
  380. struct sub_channel_info_type *dmb_drv_get_fic_dmb(int subchannel_count)
  381. {
  382. int i, n, j;
  383. struct esbinfo_t *esb;
  384. struct service_info_t *svc_info;
  385. u8 num_of_user_appl;
  386. if (!dmb_initialize)
  387. return NULL;
  388. memset((void *)&dmb_subchannel_info, 0, sizeof(dmb_subchannel_info));
  389. n = 0;
  390. for (i = 0; i < MAX_SVC_NUM; i++) {
  391. svc_info = fic_decoder_get_service_info_list(i);
  392. if ((svc_info->flag & 0x07) == 0x07) {
  393. if ((svc_info->tmid == 0x01)
  394. && (svc_info->dscty == 0x18)) {
  395. if (n == subchannel_count) {
  396. dmb_subchannel_info.ucSubchID
  397. = svc_info->sub_channel_id;
  398. dmb_subchannel_info.uiStartAddress
  399. = 0;
  400. dmb_subchannel_info.ucTMId
  401. = svc_info->tmid;
  402. dmb_subchannel_info.ucServiceType
  403. = svc_info->dscty;
  404. dmb_subchannel_info.ulServiceID
  405. = svc_info->sid;
  406. dmb_subchannel_info.scids
  407. = svc_info->scids;
  408. num_of_user_appl =
  409. svc_info->num_of_user_appl;
  410. dmb_subchannel_info.num_of_user_appl
  411. = num_of_user_appl;
  412. for (j = 0; j < num_of_user_appl; j++) {
  413. dmb_subchannel_info.
  414. user_appl_type[j]
  415. = svc_info->user_appl_type[j];
  416. dmb_subchannel_info.
  417. user_appl_length[j]
  418. = svc_info->user_appl_length[j];
  419. memcpy(
  420. &dmb_subchannel_info.
  421. user_appl_data[j][0]
  422. , &svc_info->
  423. user_appl_data[j][0]
  424. , dmb_subchannel_info.
  425. user_appl_length[j]);
  426. }
  427. esb = fic_decoder_get_ensemble_info(0);
  428. if (esb->flag == 99)
  429. dmb_subchannel_info.uiEnsembleID
  430. = esb->eid;
  431. else
  432. dmb_subchannel_info.uiEnsembleID
  433. = 0;
  434. dmb_subchannel_info.ecc = esb->ecc;
  435. break;
  436. }
  437. n++;
  438. }
  439. }
  440. }
  441. return &dmb_subchannel_info;
  442. }
  443. struct sub_channel_info_type *dmb_drv_get_fic_dab(int subchannel_count)
  444. {
  445. int i, n;
  446. struct esbinfo_t *esb;
  447. struct service_info_t *svc_info;
  448. if (!dmb_initialize)
  449. return NULL;
  450. memset((void *)&dab_subchannel_info, 0, sizeof(dab_subchannel_info));
  451. n = 0;
  452. for (i = 0; i < MAX_SVC_NUM; i++) {
  453. svc_info = fic_decoder_get_service_info_list(i);
  454. if ((svc_info->flag & 0x07) == 0x07) {
  455. if ((svc_info->tmid == 0x00)
  456. && (svc_info->ascty == 0x00)) {
  457. if (n == subchannel_count) {
  458. dab_subchannel_info.ucSubchID =
  459. svc_info->sub_channel_id;
  460. dab_subchannel_info.uiStartAddress = 0;
  461. dab_subchannel_info.ucTMId
  462. = svc_info->tmid;
  463. dab_subchannel_info.ucServiceType =
  464. svc_info->ascty;
  465. dab_subchannel_info.ulServiceID =
  466. svc_info->sid;
  467. dab_subchannel_info.scids =
  468. svc_info->scids;
  469. esb = fic_decoder_get_ensemble_info(0);
  470. if (esb->flag == 99)
  471. dmb_subchannel_info.uiEnsembleID
  472. = esb->eid;
  473. else
  474. dmb_subchannel_info.uiEnsembleID
  475. = 0;
  476. dab_subchannel_info.ecc = esb->ecc;
  477. break;
  478. }
  479. n++;
  480. }
  481. }
  482. }
  483. return &dab_subchannel_info;
  484. }
  485. struct sub_channel_info_type *dmb_drv_get_fic_dat(int subchannel_count)
  486. {
  487. int i, n, j;
  488. struct esbinfo_t *esb;
  489. struct service_info_t *svc_info;
  490. u8 num_of_user_appl;
  491. struct scInfo_t *pScInfo;
  492. if (!dmb_initialize)
  493. return NULL;
  494. memset((void *)&dat_subchannel_info, 0, sizeof(dat_subchannel_info));
  495. n = 0;
  496. for (i = 0; i < MAX_SVC_NUM; i++) {
  497. svc_info = fic_decoder_get_service_info_list(i);
  498. if ((svc_info->flag & 0x07) == 0x07) {
  499. if (svc_info->tmid == 0x03) {
  500. if (n == subchannel_count) {
  501. dat_subchannel_info.ucSubchID =
  502. svc_info->sub_channel_id;
  503. dat_subchannel_info.uiStartAddress = 0;
  504. dat_subchannel_info.ucTMId
  505. = svc_info->tmid;
  506. pScInfo = get_sc_info(svc_info->scid);
  507. dat_subchannel_info.ucServiceType =
  508. pScInfo->dscty;
  509. dat_subchannel_info.ulServiceID =
  510. svc_info->sid;
  511. dat_subchannel_info.scids =
  512. svc_info->scids;
  513. num_of_user_appl =
  514. svc_info->num_of_user_appl;
  515. dat_subchannel_info.num_of_user_appl
  516. = num_of_user_appl;
  517. for (j = 0; j < num_of_user_appl; j++) {
  518. dat_subchannel_info.
  519. user_appl_type[j]
  520. = svc_info->user_appl_type[j];
  521. dat_subchannel_info.
  522. user_appl_length[j]
  523. = svc_info->user_appl_length[j];
  524. memcpy(
  525. &dat_subchannel_info.
  526. user_appl_data[j][0]
  527. , &svc_info->
  528. user_appl_data[j][0]
  529. , dat_subchannel_info.
  530. user_appl_length[j]);
  531. }
  532. esb = fic_decoder_get_ensemble_info(0);
  533. if (esb->flag == 99)
  534. dat_subchannel_info.uiEnsembleID
  535. = esb->eid;
  536. else
  537. dat_subchannel_info.uiEnsembleID
  538. = 0;
  539. dat_subchannel_info.ecc = esb->ecc;
  540. break;
  541. }
  542. n++;
  543. }
  544. }
  545. }
  546. return &dat_subchannel_info;
  547. }
  548. #ifdef FEATURE_FC8080_DEBUG
  549. void dmb_drv_check_overrun(u8 reset)
  550. {
  551. u16 overrun;
  552. u16 temp = 0;
  553. bbm_com_word_read(NULL, BBM_BUF_OVERRUN, &overrun);
  554. if (overrun & dmb_mode) {
  555. /* overrun clear */
  556. bbm_com_word_write(NULL, BBM_BUF_OVERRUN, overrun);
  557. if (reset) {
  558. /* buffer restore */
  559. bbm_com_word_read(NULL, BBM_BUF_ENABLE, &temp);
  560. temp &= ~dmb_mode;
  561. bbm_com_word_write(NULL, BBM_BUF_ENABLE, temp);
  562. temp |= dmb_mode;
  563. bbm_com_word_write(NULL, BBM_BUF_ENABLE, temp);
  564. }
  565. DPRINTK("fc8080 Overrun occured\n");
  566. }
  567. }
  568. #endif
  569. unsigned char dmb_drv_set_ch(
  570. unsigned long frequency
  571. , unsigned char subchannel
  572. , unsigned char sevice_type)
  573. {
  574. if (!dmb_initialize)
  575. return TDMB_FAIL;
  576. current_service_type = sevice_type;
  577. current_subchannel_id = subchannel;
  578. dmb_drv_channel_deselect_all();
  579. if (bbm_com_tuner_set_freq(NULL, frequency) != BBM_OK)
  580. return TDMB_FAIL;
  581. if (sevice_type == 0x18)
  582. bbm_com_video_select(NULL, subchannel, 0, 0);
  583. else if (sevice_type == 0x00)
  584. bbm_com_audio_select(NULL, subchannel, 1);
  585. else
  586. bbm_com_data_select(NULL, subchannel, 2);
  587. #if defined(CONFIG_TDMB_TSIF_SLSI) || defined(CONFIG_TDMB_TSIF_QC)
  588. if (sevice_type == 0x18)
  589. fc8080_demux_select_video(subchannel, 0);
  590. else if (sevice_type == 0x00)
  591. fc8080_demux_select_channel(subchannel, 1);
  592. else
  593. fc8080_demux_select_channel(subchannel, 2);
  594. #endif
  595. #ifdef FEATURE_FC8080_DEBUG
  596. if (sevice_type == 0x18)
  597. dmb_mode = FC8080_DMB;
  598. else if (sevice_type == 0x00)
  599. dmb_mode = FC8080_DAB;
  600. else
  601. dmb_mode = FC8080_DATA;
  602. #endif
  603. return TDMB_SUCCESS;
  604. }
  605. unsigned char dmb_drv_set_ch_factory(
  606. unsigned long frequency
  607. , unsigned char subchannel
  608. , unsigned char sevice_type)
  609. {
  610. if (!dmb_initialize)
  611. return TDMB_FAIL;
  612. current_service_type = sevice_type;
  613. current_subchannel_id = subchannel;
  614. dmb_drv_channel_deselect_all();
  615. if (bbm_com_tuner_set_freq(NULL, frequency) != BBM_OK)
  616. return TDMB_FAIL;
  617. if (bbm_com_scan_status(NULL)) {
  618. DPRINTK("%s scan fail\n", __func__);
  619. return TDMB_FAIL;
  620. }
  621. if (sevice_type == 0x18)
  622. bbm_com_video_select(NULL, subchannel, 0, 0);
  623. else if (sevice_type == 0x00)
  624. bbm_com_audio_select(NULL, subchannel, 1);
  625. else
  626. bbm_com_data_select(NULL, subchannel, 2);
  627. #ifdef FEATURE_FC8080_DEBUG
  628. if (sevice_type == 0x18)
  629. dmb_mode = FC8080_DMB;
  630. else if (sevice_type == 0x00)
  631. dmb_mode = FC8080_DAB;
  632. else
  633. dmb_mode = FC8080_DATA;
  634. #endif
  635. return TDMB_SUCCESS;
  636. }
  637. unsigned short dmb_drv_get_ber()
  638. {
  639. return saved_ber;
  640. }
  641. unsigned char dmb_drv_get_ant(void)
  642. {
  643. u8 level = 0;
  644. unsigned int ber;
  645. if (!dmb_initialize) {
  646. saved_ber = 3000;
  647. return 0;
  648. }
  649. if (viterbi_rt_ber_read(&ber)) {
  650. saved_ber = 3000;
  651. return 0;
  652. }
  653. if (ber <= 20)
  654. ber = 0;
  655. saved_ber = ber;
  656. if (get_signal_level(ber, &level))
  657. return 0;
  658. #ifdef FEATURE_FC8080_DEBUG
  659. dmb_drv_check_overrun(1);
  660. #endif
  661. return level;
  662. }
  663. signed short dmb_drv_get_rssi()
  664. {
  665. s32 rssi;
  666. if (!dmb_initialize) {
  667. rssi = -110;
  668. return rssi;
  669. }
  670. bbm_com_tuner_get_rssi(NULL, &rssi);
  671. return (signed short)rssi;
  672. }