raontv_isdbt.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. /******************************************************************************
  2. * (c) COPYRIGHT 2010 RAONTECH, Inc. ALL RIGHTS RESERVED.
  3. *
  4. * TITLE : RAONTECH TV ISDB-T services source file.
  5. *
  6. * FILENAME : raontv_isdbt.c
  7. *
  8. * DESCRIPTION :
  9. * Library of routines to initialize, and operate on, the RAONTECH ISDB-T demod.
  10. *
  11. ******************************************************************************/
  12. /******************************************************************************
  13. * REVISION HISTORY
  14. *
  15. * DATE NAME REMARKS
  16. * ---------- ------------- ------------------------------------------------
  17. * 07/26/2013 Yang, Maverick Created.
  18. ******************************************************************************/
  19. #include "raontv_rf.h"
  20. UINT g_dwRtvPrevChNum;
  21. static const RTV_REG_INIT_INFO g_atTopHostInitData[] = {
  22. {0x04, 0x02},
  23. {0x08, 0x17},
  24. {0x09, 0x00},
  25. {0x0A, 0x10},
  26. {0x0B, 0x36},
  27. {0x0D, 0x05},
  28. {0x0E, 0xCB},
  29. {0x10, 0x40},
  30. {0x11, 0x0A},
  31. {0x12, 0x08},
  32. {0x13, 0x3C},
  33. {0x14, 0x50},
  34. {0x15, 0xA0},
  35. {0x16, 0xE0},
  36. {0x17, 0x02},
  37. {0x18, 0xC0},
  38. {0x21, 0x01}
  39. };
  40. static const RTV_REG_INIT_INFO g_atOfdmInitData[] = {
  41. {0x21, 0xFF},
  42. {0x22, 0xFF},
  43. {0x30, 0x28}, //2014-03-14 raontech
  44. {0x34, 0x0F},
  45. {0x35, 0xFF},
  46. {0x36, 0x00},
  47. {0x37, 0x86}, //Locking
  48. {0x39, 0x6A}, //2014-03-14 raontech
  49. {0x3A, 0x5F}, //2014-03-14 raontech
  50. {0x3B, 0x74},
  51. {0x4B, 0x2C},
  52. {0x6D, 0x52},
  53. {0x71, 0xAC},
  54. {0x75, 0x8B},
  55. {0x8E, 0x28} //AGC
  56. };
  57. static const RTV_REG_INIT_INFO g_atFecInitData[] = {
  58. {0x16, 0xFF},
  59. {0x17, 0xFF},
  60. {0x18, 0xFF},
  61. {0x19, 0xFF},
  62. {0x24, 0x01},
  63. {0x4F, 0x00},
  64. {0x53, 0x3F},
  65. {0x83, 0x10},
  66. {0x97, 0xFF},
  67. {0x98, 0xFF},
  68. {0x99, 0xFF},
  69. {0xA7, 0x40},
  70. {0xA8, 0x80},
  71. {0xA9, 0xB9},
  72. {0xAA, 0x80},
  73. {0xAB, 0x80},
  74. {0xFC, 0x00}
  75. };
  76. static void isdbt_UpdateMonitoring(void)
  77. {
  78. RTV_REG_MAP_SEL(OFDM_PAGE);
  79. RTV_REG_MASK_SET(0x25, 0x70, 0x20);
  80. RTV_REG_MASK_SET(0x13, 0x80, 0x80);
  81. RTV_REG_MASK_SET(0x13, 0x80, 0x00);
  82. RTV_REG_MAP_SEL(FEC_PAGE);
  83. RTV_REG_MASK_SET(0x11, 0x04, 0x04);
  84. RTV_REG_MASK_SET(0x11, 0x04, 0x00);
  85. }
  86. static void isdbt_InitTOP_HOST(void)
  87. {
  88. UINT nNumTblEntry;
  89. const RTV_REG_INIT_INFO *ptTopHostInitData;
  90. RTV_REG_MAP_SEL(HOST_PAGE);
  91. /* Set the remained initial values. */
  92. nNumTblEntry = sizeof(g_atTopHostInitData) / sizeof(RTV_REG_INIT_INFO);
  93. ptTopHostInitData = g_atTopHostInitData;
  94. do {
  95. RTV_REG_SET(ptTopHostInitData->bReg, ptTopHostInitData->bVal);
  96. ptTopHostInitData++;
  97. } while (--nNumTblEntry);
  98. }
  99. static void isdbt_InitOFDM(void)
  100. {
  101. UINT nNumTblEntry;
  102. const RTV_REG_INIT_INFO *ptOfdmInitData;
  103. RTV_REG_MAP_SEL(OFDM_PAGE);
  104. // Set the remained initial values.
  105. nNumTblEntry = sizeof(g_atOfdmInitData) / sizeof(RTV_REG_INIT_INFO);
  106. ptOfdmInitData = g_atOfdmInitData;
  107. do {
  108. RTV_REG_SET(ptOfdmInitData->bReg, ptOfdmInitData->bVal);
  109. ptOfdmInitData++;
  110. } while (--nNumTblEntry);
  111. }
  112. static void isdbt_InitFEC(void)
  113. {
  114. UINT nNumTblEntry;
  115. const RTV_REG_INIT_INFO *ptFecInitData;
  116. RTV_REG_MAP_SEL(FEC_PAGE);
  117. nNumTblEntry = sizeof(g_atFecInitData) / sizeof(RTV_REG_INIT_INFO);
  118. ptFecInitData = g_atFecInitData;
  119. do {
  120. RTV_REG_SET(ptFecInitData->bReg, ptFecInitData->bVal);
  121. ptFecInitData++;
  122. } while (--nNumTblEntry);
  123. }
  124. static void isdbt_SoftResetFEC(void)
  125. {
  126. RTV_REG_MAP_SEL(FEC_PAGE);
  127. RTV_REG_MASK_SET(0xFB,0x01,0x01);
  128. RTV_REG_MASK_SET(0xFB,0x01,0x00);
  129. }
  130. static void isdbt_InitDemod(void)
  131. {
  132. RTV_REG_MAP_SEL(HOST_PAGE);
  133. #if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2)
  134. RTV_REG_SET(0x05,0xBE);
  135. #else
  136. RTV_REG_SET(0x05,0x3E);
  137. #endif
  138. isdbt_InitTOP_HOST();
  139. isdbt_InitOFDM();
  140. isdbt_InitFEC();
  141. rtvOEM_ConfigureInterrupt();
  142. #if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2)
  143. RTV_REG_MAP_SEL(FEC_PAGE);
  144. RTV_REG_SET(0x9F, 0x00);
  145. RTV_REG_SET(0xA4, 0x03);
  146. RTV_REG_SET(0xA5, 0x08);
  147. RTV_REG_MASK_SET(0xA9, 0x07, 0x03);
  148. #elif defined(RTV_IF_SERIAL_TSIF) || defined(RTV_IF_SPI_SLAVE)
  149. rtv_ConfigureTsifFormat();
  150. RTV_REG_MASK_SET(0xA9, 0x07, RTV_COMM_CON47_CLK_SEL);
  151. #else
  152. #error "Code not present"
  153. #endif
  154. #ifdef RTV_ERROR_TSP_OUTPUT_DISABLE
  155. RTV_REG_MASK_SET(0xA5, 0x40, 0x40);
  156. #endif
  157. #ifdef RTV_NULL_PID_GENERATE
  158. RTV_REG_MASK_SET(0xA4, 0x02, 0x02);
  159. #endif
  160. isdbt_SoftResetFEC();
  161. }
  162. void rtvISDBT_StandbyMode(int on)
  163. {
  164. RTV_GUARD_LOCK;
  165. RTV_REG_MAP_SEL(RF_PAGE);
  166. if (on)
  167. RTV_REG_MASK_SET(0x27, 0x01, 0x01);
  168. else
  169. RTV_REG_MASK_SET(0x27, 0x01, 0x00);
  170. RTV_GUARD_FREE;
  171. }
  172. UINT rtvISDBT_GetLockStatus(void)
  173. {
  174. UINT OFDM_Lock;
  175. UINT TMCC_lock;
  176. UINT lock_st = 0;
  177. RTV_GUARD_LOCK;
  178. if (g_fRtvChannelChange) {
  179. RTV_GUARD_FREE;
  180. RTV_DBGMSG0("[rtvISDBT_GetLockStatus] RTV Freqency change state! \n");
  181. return 0x0;
  182. }
  183. isdbt_UpdateMonitoring();
  184. RTV_REG_MAP_SEL(OFDM_PAGE);
  185. OFDM_Lock = RTV_REG_GET(0xC0);
  186. if (OFDM_Lock & 0x01)
  187. lock_st = RTV_ISDBT_OFDM_LOCK_MASK;
  188. RTV_REG_MAP_SEL(FEC_PAGE);
  189. TMCC_lock = RTV_REG_GET(0x10) & 0x01;
  190. RTV_GUARD_FREE;
  191. if (TMCC_lock)
  192. lock_st |= RTV_ISDBT_TMCC_LOCK_MASK;
  193. return lock_st;
  194. }
  195. U8 rtvISDBT_GetAGC(void)
  196. {
  197. U8 bAgc;
  198. RTV_GUARD_LOCK;
  199. if (g_fRtvChannelChange) {
  200. RTV_GUARD_FREE;
  201. RTV_DBGMSG0("[rtvISDBT_GetAGC] RTV Freqency change state! \n");
  202. return 0;
  203. }
  204. RTV_REG_MAP_SEL(RF_PAGE);
  205. bAgc = RTV_REG_GET(0x11);
  206. RTV_GUARD_FREE;
  207. return bAgc;
  208. }
  209. //RSSI debugging log enable
  210. //#define DEBUG_LOG_FOR_RSSI_FITTING
  211. #define RSSI_UINT(val) (S32)((val)*RTV_ISDBT_RSSI_DIVIDER)
  212. #define RSSI_RFAGC_VAL(rfagc, coeffi)\
  213. ((rfagc) * RSSI_UINT(coeffi))
  214. #define RSSI_GVBB_VAL(gvbb, coeffi)\
  215. ((gvbb) * RSSI_UINT(coeffi))
  216. S32 rtvISDBT_GetRSSI(void)
  217. {
  218. U8 RD10 = 0, GVBB = 0, LNAGAIN = 0, RFAGC = 0;
  219. S32 nRssi;
  220. RTV_GUARD_LOCK;
  221. if (g_fRtvChannelChange) {
  222. RTV_GUARD_FREE;
  223. RTV_DBGMSG0("[rtvISDBT_GetRSSI] RTV Freqency change state! \n");
  224. return 0;
  225. }
  226. RTV_REG_MAP_SEL(RF_PAGE);
  227. RD10 = RTV_REG_GET(0x10);
  228. GVBB = RTV_REG_GET(0x11);
  229. RTV_GUARD_FREE;
  230. LNAGAIN = ((RD10 & 0x18) >> 3);
  231. RFAGC = (RD10 & 0x07);
  232. switch (LNAGAIN) {
  233. case 0:
  234. nRssi = -(RSSI_RFAGC_VAL(RFAGC, 3.2)
  235. + RSSI_GVBB_VAL(GVBB, 0.55)
  236. + RSSI_UINT(8.6))
  237. + RSSI_UINT(15);
  238. if (RFAGC !=0)
  239. nRssi += RSSI_UINT(7.5);
  240. break;
  241. case 1:
  242. nRssi = -(RSSI_RFAGC_VAL(RFAGC, 3.2)
  243. + RSSI_GVBB_VAL(GVBB, 0.55)
  244. + RSSI_UINT(-16.4))
  245. - RSSI_UINT(7);
  246. break;
  247. case 2:
  248. nRssi = -(RSSI_RFAGC_VAL(RFAGC, 3.2)
  249. + RSSI_GVBB_VAL(GVBB, 0.55)
  250. + RSSI_UINT(-0.6))
  251. - RSSI_UINT(4);
  252. break;
  253. case 3:
  254. nRssi = -(RSSI_RFAGC_VAL(RFAGC, 3.2)
  255. + RSSI_GVBB_VAL(GVBB, 0.55)
  256. + RSSI_UINT(9.6))
  257. - RSSI_UINT(10);
  258. break;
  259. default:
  260. break;
  261. }
  262. #ifdef DEBUG_LOG_FOR_RSSI_FITTING
  263. RTV_DBGMSG2("\n[rtvISDBT_GetRSSI] 0x11(0x%02X), 0x14(0x%02X)\n",
  264. RD10, GVBB);
  265. RTV_DBGMSG3("LNAGAIN(%d), RFAGC(%d) GVBB(%d)\n", LNAGAIN, RFAGC,GVBB);
  266. #endif
  267. return nRssi;
  268. }
  269. U32 rtvISDBT_GetPER(void)
  270. {
  271. U8 rdata0 = 0, rdata1 = 0, TMCCL = 0;
  272. U32 per = 700;
  273. RTV_GUARD_LOCK;
  274. if (g_fRtvChannelChange) {
  275. RTV_GUARD_FREE;
  276. RTV_DBGMSG0("[rtvISDBT_GetPER] RTV Freqency change state! \n");
  277. return 0;
  278. }
  279. isdbt_UpdateMonitoring();
  280. RTV_REG_MAP_SEL(FEC_PAGE);
  281. TMCCL = RTV_REG_GET(0x10);
  282. if (TMCCL & 0x01) {
  283. rdata1 = RTV_REG_GET(0x37);
  284. rdata0 = RTV_REG_GET(0x38);
  285. per = (rdata1 << 8) | rdata0;
  286. }
  287. RTV_GUARD_FREE;
  288. return per;
  289. }
  290. U32 rtvISDBT_GetBER(void)
  291. {
  292. U8 TMCCL = 0, prd0 = 0, prd1 = 0, cnt0 = 0, cnt1 = 0, cnt2 = 0;
  293. U32 count = 0, period, ber = RTV_ISDBT_BER_DIVIDER;
  294. RTV_GUARD_LOCK;
  295. if (g_fRtvChannelChange) {
  296. RTV_GUARD_FREE;
  297. RTV_DBGMSG0("[rtvISDBT_GetBER] RTV Freqency change state! \n");
  298. return 0;
  299. }
  300. isdbt_UpdateMonitoring();
  301. RTV_REG_MAP_SEL(FEC_PAGE);
  302. TMCCL = RTV_REG_GET(0x10);
  303. if (TMCCL & 0x01) {
  304. prd0 = RTV_REG_GET(0x28);
  305. prd1 = RTV_REG_GET(0x29);
  306. period = (prd0<<8) | prd1;
  307. cnt0 = RTV_REG_GET(0x31);
  308. cnt1 = RTV_REG_GET(0x32);
  309. cnt2 = RTV_REG_GET(0x33);
  310. count = ((cnt0&0x7f)<<16) | (cnt1<<8) | cnt2;
  311. } else
  312. period = 0;
  313. RTV_GUARD_FREE;
  314. if (period)
  315. ber = (count * (U32)RTV_ISDBT_BER_DIVIDER) / (period*8*204);
  316. return ber;
  317. }
  318. U32 rtvISDBT_GetCNR(void)
  319. {
  320. U32 Mode;
  321. U32 val;
  322. U32 cn_a = 0;
  323. U32 cn_b = 0;
  324. RTV_GUARD_LOCK;
  325. if (g_fRtvChannelChange) {
  326. RTV_GUARD_FREE;
  327. RTV_DBGMSG0("[rtvISDBT_GetCNR] RTV Freqency change state! \n");
  328. return 0;
  329. }
  330. rtv_UpdateAdj();
  331. isdbt_UpdateMonitoring();
  332. Mode = (RTV_REG_GET(0x7B) & 0x07);
  333. RTV_REG_MAP_SEL(OFDM_PAGE);
  334. RTV_REG_MASK_SET(0x25, 0x70, 0x10);
  335. RTV_REG_MASK_SET(0x13, 0x80, 0x80);
  336. RTV_REG_MASK_SET(0x13, 0x80, 0x00);
  337. val = ((RTV_REG_GET(0xCA)&0xff)<<16)
  338. | ((RTV_REG_GET(0xC9)&0xff)<<8)
  339. | (RTV_REG_GET(0xC8)&0xff);
  340. RTV_GUARD_FREE;
  341. if (Mode == 1) {
  342. /* QPSK */
  343. if (val > 270000) {
  344. cn_a = 0;
  345. cn_b = 0;
  346. return 0;
  347. } else if (val > 258000) {
  348. cn_a = 0;
  349. cn_b = (270000 - val)/1300;
  350. } else if (val > 246000) {
  351. cn_a = 1;
  352. cn_b = (258000 - val)/1300;
  353. } else if (val > 226000) {
  354. cn_a = 2;
  355. cn_b = (246000 - val)/2100;
  356. } else if (val > 206500) {
  357. cn_a = 3;
  358. cn_b = (226000 - val)/2100;
  359. } else if (val > 186500) {
  360. cn_a = 4;
  361. cn_b = (206500 - val)/2200;
  362. } else if (val > 163500) {
  363. cn_a = 5;
  364. cn_b = (186500 - val)/2400;
  365. } else if (val > 142000) {
  366. cn_a = 6;
  367. cn_b = (163500 - val)/2300;
  368. } else if (val > 121000) {
  369. cn_a = 7;
  370. cn_b = (142000 - val)/2300;
  371. } else if (val > 100500) {
  372. cn_a = 8;
  373. cn_b = (121000 - val)/2200;
  374. } else if (val > 83500) {
  375. cn_a = 9;
  376. cn_b = (100500 - val)/1800;
  377. } else if (val > 69000) {
  378. cn_a = 10;
  379. cn_b = (83500 - val)/1550;
  380. } else if (val > 57200) {
  381. cn_a = 11;
  382. cn_b = (69000 - val)/1250;
  383. } else if (val > 47900) {
  384. cn_a = 12;
  385. cn_b = (57200 - val)/1000;
  386. } else if (val > 40100) {
  387. cn_a = 13;
  388. cn_b = (47900 - val)/830;
  389. } else if (val > 33700) {
  390. cn_a = 14;
  391. cn_b = (40100 - val)/680;
  392. } else if (val > 29000) {
  393. cn_a = 15;
  394. cn_b = (33700 - val)/500;
  395. } else if (val > 25600) {
  396. cn_a = 16;
  397. cn_b = (29000 - val)/360;
  398. } else if (val > 22200) {
  399. cn_a = 17;
  400. cn_b = (25600 - val)/360;
  401. } else if (val > 19700) {
  402. cn_a = 18;
  403. cn_b = (22200 - val)/265;
  404. } else if (val > 18000) {
  405. cn_a = 19;
  406. cn_b = (19700 - val)/180;
  407. } else if (val > 16500) {
  408. cn_a = 20;
  409. cn_b = (18000 - val)/160;
  410. } else if (val > 15200) {
  411. cn_a = 21;
  412. cn_b = (16500 - val)/140;
  413. } else if (val > 14100) {
  414. cn_a = 22;
  415. cn_b = (15200 - val)/120;
  416. } else if (val > 13550) {
  417. cn_a = 23;
  418. cn_b = (14100 - val)/60;
  419. } else if (val > 12800) {
  420. cn_a = 24;
  421. cn_b = (13550 - val)/80;
  422. } else if (val > 12300) {
  423. cn_a = 25;
  424. cn_b = (12800 - val)/53;
  425. }
  426. else if (val > 11900) {
  427. cn_a = 26;
  428. cn_b = (12300 - val)/42;
  429. } else if (val > 11600) {
  430. cn_a = 27;
  431. cn_b = (11900 - val)/31;
  432. } else if (val > 11300) {
  433. cn_a = 28;
  434. cn_b = (11600 - val)/31;
  435. } else if (val > 11000) {
  436. cn_a = 29;
  437. cn_b = (11300 - val)/31;
  438. } else if (val > 0) {
  439. cn_a = 30;
  440. cn_b = 0;
  441. }
  442. } else if (Mode == 2) {
  443. /* 16 QAM */
  444. if (val > 353500) {
  445. cn_a = 0;
  446. cn_b = 0;
  447. } else if (val > 353500) {
  448. cn_a = 0;
  449. cn_b = (365000 - val)/124;
  450. } else if (val > 344200) {
  451. cn_a = 1;
  452. cn_b = (353500 - val)/101;
  453. } else if (val > 333200) {
  454. cn_a = 2;
  455. cn_b = (344200 - val)/120;
  456. } else if (val > 325000) {
  457. cn_a = 3;
  458. cn_b = (333200 - val)/90;
  459. } else if (val > 316700) {
  460. cn_a = 4;
  461. cn_b = (325000 - val) / 91;
  462. } else if (val > 308200) {
  463. cn_a = 5;
  464. cn_b = (316700 - val)/93;
  465. } else if (val > 299000) {
  466. cn_a = 6;
  467. cn_b = (308200 - val)/98;
  468. } else if (val > 295000) {
  469. cn_a = 7;
  470. cn_b = (299000 - val)/1050;
  471. } else if (val > 280500) {
  472. cn_a = 8;
  473. cn_b = (295000 - val)/1550;
  474. } else if (val > 264000) {
  475. cn_a = 9;
  476. cn_b = (280500 - val)/1750;
  477. } else if (val > 245000) {
  478. cn_a = 10;
  479. cn_b = (264000 - val)/2050;
  480. } else if (val > 222000) {
  481. cn_a = 11;
  482. cn_b = (245000 - val)/2450;
  483. } else if (val > 197000) {
  484. cn_a = 12;
  485. cn_b = (222000 - val)/2650;
  486. } else if (val > 172000) {
  487. cn_a = 13;
  488. cn_b = (197000 - val)/2650;
  489. } else if (val > 147000) {
  490. cn_a = 14;
  491. cn_b = (172000 - val)/2650;
  492. } else if (val > 125000) {
  493. cn_a = 15;
  494. cn_b = (147000 - val)/2350;
  495. } else if (val > 105000) {
  496. cn_a = 16;
  497. cn_b = (125000 - val)/2150;
  498. } else if (val > 88000) {
  499. cn_a = 17;
  500. cn_b = (105000 - val)/1800;
  501. } else if (val > 75000) {
  502. cn_a = 18;
  503. cn_b = (88000 - val)/1400;
  504. } else if (val > 64000) {
  505. cn_a = 19;
  506. cn_b = (75000 - val)/1180;
  507. } else if (val > 55000) {
  508. cn_a = 20;
  509. cn_b = (64000 - val)/980;
  510. } else if (val > 48000) {
  511. cn_a = 21;
  512. cn_b = (55000 - val)/750;
  513. } else if (val > 42000) {
  514. cn_a = 22;
  515. cn_b = (48000 - val)/640;
  516. } else if (val > 38000) {
  517. cn_a = 23;
  518. cn_b = (42000 - val)/420;
  519. } else if (val > 34900) {
  520. cn_a = 24;
  521. cn_b = (38000 - val)/330;
  522. } else if (val > 32000) {
  523. cn_a = 25;
  524. cn_b = (34900 - val)/310;
  525. } else if (val > 29500) {
  526. cn_a = 26;
  527. cn_b = (32000 - val)/265;
  528. } else if (val > 27100) {
  529. cn_a = 27;
  530. cn_b = (29500 - val)/250;
  531. } else if (val > 26000) {
  532. cn_a = 28;
  533. cn_b = (27100 - val)/118;
  534. } else if (val > 25200) {
  535. cn_a = 29;
  536. cn_b = (26000 - val)/85;
  537. } else if (val > 0) {
  538. cn_a = 30;
  539. cn_b = 0;
  540. }
  541. } else {
  542. cn_a = 0;
  543. cn_b = 0;
  544. return 0;
  545. }
  546. if (cn_b > 1000)
  547. return ((cn_a*(U32)RTV_ISDBT_CNR_DIVIDER) + cn_b);
  548. else if (cn_b > 100)
  549. return ((cn_a*(U32)RTV_ISDBT_CNR_DIVIDER) + (cn_b*10));
  550. else
  551. return ((cn_a*(U32)RTV_ISDBT_CNR_DIVIDER) + (cn_b*100));
  552. }
  553. static UINT g_nIsdbtPrevAntennaLevel;
  554. #define ISDBT_MAX_NUM_ANTENNA_LEVEL 7
  555. UINT rtvISDBT_GetAntennaLevel(U32 dwCNR)
  556. {
  557. UINT nCurLevel = ISDBT_MAX_NUM_ANTENNA_LEVEL-1;
  558. UINT nPrevLevel = g_nIsdbtPrevAntennaLevel;
  559. static const UINT aAntLvlTbl[ISDBT_MAX_NUM_ANTENNA_LEVEL-1]
  560. = {15*RTV_ISDBT_CNR_DIVIDER, /* 6 */
  561. 12*RTV_ISDBT_CNR_DIVIDER, /* 5 */
  562. 11*RTV_ISDBT_CNR_DIVIDER, /* 4 */
  563. 9*RTV_ISDBT_CNR_DIVIDER, /* 5 */
  564. 7*RTV_ISDBT_CNR_DIVIDER, /* 2 */
  565. 4*RTV_ISDBT_CNR_DIVIDER /* 1 */
  566. };
  567. do {
  568. if (dwCNR >= aAntLvlTbl[6-nCurLevel])
  569. break;
  570. } while (--nCurLevel != 0);
  571. if (nCurLevel != nPrevLevel) {
  572. if (nCurLevel < nPrevLevel)
  573. nPrevLevel--;
  574. else
  575. nPrevLevel++;
  576. g_nIsdbtPrevAntennaLevel = nPrevLevel;
  577. }
  578. return nPrevLevel;
  579. }
  580. void rtvISDBT_GetTMCC(RTV_ISDBT_TMCC_INFO *ptTmccInfo)
  581. {
  582. U8 R_Data,tempData;
  583. U8 tempSeg = 0, tempModule = 0, tempCoderate = 0, tempInterl = 0;
  584. if (ptTmccInfo == NULL) {
  585. RTV_DBGMSG0("[rtvISDBT_GetTMCC] RTV Invalid buffer pointer!\n");
  586. return;
  587. }
  588. RTV_GUARD_LOCK;
  589. if (g_fRtvChannelChange) {
  590. RTV_GUARD_FREE;
  591. RTV_DBGMSG0("[rtvISDBT_GetTMCC] RTV Freqency change state! \n");
  592. return;
  593. }
  594. RTV_REG_MAP_SEL(OFDM_PAGE);
  595. tempData = RTV_REG_GET(0xC6);
  596. R_Data = ((tempData & 0x30) >> 2) | ((tempData & 0xC0) >> 2);
  597. switch (R_Data & 0x03) {
  598. case 0:
  599. ptTmccInfo->eGuard = RTV_ISDBT_GUARD_1_32;
  600. break;
  601. case 1:
  602. ptTmccInfo->eGuard = RTV_ISDBT_GUARD_1_16;
  603. break;
  604. case 2:
  605. ptTmccInfo->eGuard = RTV_ISDBT_GUARD_1_8;
  606. break;
  607. case 3:
  608. ptTmccInfo->eGuard = RTV_ISDBT_GUARD_1_4;
  609. break;
  610. default:
  611. break;
  612. }
  613. switch ((R_Data>>2) & 0x03) {
  614. case 0:
  615. ptTmccInfo->eTvMode = RTV_ISDBT_MODE_1;
  616. break;
  617. case 1:
  618. ptTmccInfo->eTvMode = RTV_ISDBT_MODE_2;
  619. break;
  620. case 2:
  621. ptTmccInfo->eTvMode = RTV_ISDBT_MODE_3;
  622. break;
  623. default:
  624. break;
  625. }
  626. RTV_REG_MAP_SEL(FEC_PAGE);
  627. ptTmccInfo->fEWS = (RTV_REG_GET(0x7D)>>4)&0x01; //EWS
  628. R_Data = RTV_REG_GET(0x7B) & 0x3f;
  629. tempCoderate = ((R_Data>>3) & 0x07);
  630. tempModule = (R_Data & 0x07);
  631. R_Data = RTV_REG_GET(0x7C) & 0x7f;
  632. tempInterl = R_Data & 0x07;
  633. tempSeg = (R_Data>>3) & 0x0f;
  634. switch (tempCoderate) {
  635. case 0:
  636. ptTmccInfo->eCodeRate = RTV_CODE_RATE_1_2;
  637. break;
  638. case 1:
  639. ptTmccInfo->eCodeRate = RTV_CODE_RATE_2_3;
  640. break;
  641. case 2:
  642. ptTmccInfo->eCodeRate = RTV_CODE_RATE_3_4;
  643. break;
  644. case 3:
  645. ptTmccInfo->eCodeRate = RTV_CODE_RATE_5_6;
  646. break;
  647. case 4:
  648. ptTmccInfo->eCodeRate = RTV_CODE_RATE_7_8;
  649. break;
  650. default:
  651. break;
  652. }
  653. switch (tempModule) {
  654. case 0:
  655. ptTmccInfo->eModulation = RTV_MOD_DQPSK;
  656. break;
  657. case 1:
  658. ptTmccInfo->eModulation = RTV_MOD_QPSK;
  659. break;
  660. case 2:
  661. ptTmccInfo->eModulation = RTV_MOD_16QAM;
  662. break;
  663. case 3:
  664. ptTmccInfo->eModulation = RTV_MOD_64QAM;
  665. break;
  666. default:
  667. break;
  668. }
  669. switch( ptTmccInfo->eTvMode ) {
  670. case RTV_ISDBT_MODE_3:
  671. switch (tempInterl) {
  672. case 0:
  673. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_0;
  674. break;
  675. case 1:
  676. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_1;
  677. break;
  678. case 2:
  679. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_2;
  680. break;
  681. case 3:
  682. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_4;
  683. break;
  684. case 4:
  685. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_8;
  686. break;
  687. default:
  688. break;
  689. }
  690. break;
  691. case RTV_ISDBT_MODE_2:
  692. switch (tempInterl) {
  693. case 0:
  694. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_0;
  695. break;
  696. case 1:
  697. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_2;
  698. break;
  699. case 2:
  700. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_4;
  701. break;
  702. case 3:
  703. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_8;
  704. break;
  705. case 4:
  706. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_16;
  707. break;
  708. default:
  709. break;
  710. }
  711. break;
  712. case RTV_ISDBT_MODE_1:
  713. switch (tempInterl) {
  714. case 0:
  715. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_0;
  716. break;
  717. case 1:
  718. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_4;
  719. break;
  720. case 2:
  721. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_8;
  722. break;
  723. case 3:
  724. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_16;
  725. break;
  726. case 4:
  727. ptTmccInfo->eInterlv = RTV_ISDBT_INTERLV_32;
  728. break;
  729. default:
  730. break;
  731. }
  732. break;
  733. default:
  734. break;
  735. }
  736. switch (tempSeg) {
  737. case 1:
  738. ptTmccInfo->eSeg = RTV_ISDBT_SEG_1;
  739. break;
  740. case 3:
  741. ptTmccInfo->eSeg = RTV_ISDBT_SEG_3;
  742. break;
  743. default:
  744. ptTmccInfo->eSeg = RTV_ISDBT_SEG_1;
  745. break;
  746. }
  747. RTV_GUARD_FREE;
  748. }
  749. //SCAN debuging log enable
  750. //#define DEBUG_LOG_FOR_SCAN
  751. #define MAX_MON_FSM_MS 100
  752. #define MAX_COARSE_MS 600
  753. #define MAX_OFDM_RETRY_MS 600
  754. #define MAX_TMCC_RETRY_MS 3000
  755. #define MON_FSM_MS_CNT (MAX_MON_FSM_MS / 10)
  756. #define COARSE_MS_CNT (MAX_COARSE_MS / 10)
  757. #define OFDM_RETRY_MS_CNT (MAX_OFDM_RETRY_MS / 10)
  758. #define TMCC_RETRY_MS_CNT (MAX_TMCC_RETRY_MS / 10)
  759. INT rtvISDBT_ScanFrequency(UINT nChNum)
  760. {
  761. INT nRet = RTV_SUCCESS;
  762. UINT dwChannelFreq;
  763. int pwr_threshold = 0;
  764. int peak_pwr = 0;
  765. int peak_pwr2 = 0;
  766. INT sucess_flag = RTV_CHANNEL_NOT_DETECTED;
  767. INT scan_stage = RTV_CHANNEL_NOT_DETECTED;
  768. U8 OFDM_L = 0, Mon_FSM = 0, TMCC_L = 0;
  769. UINT i = MON_FSM_MS_CNT, j = COARSE_MS_CNT;
  770. UINT nOFDM_LockCnt = OFDM_RETRY_MS_CNT, nTMCC_LockCnt = TMCC_RETRY_MS_CNT;
  771. U8 CoarseCheck = 0;
  772. #if defined(__KERNEL__) /* Linux kernel */
  773. unsigned long start_jiffies, end_jiffies;
  774. unsigned long start_jiffies_TMCC, end_jiffies_TMCC;
  775. UINT diff_time = 0;
  776. #endif
  777. // RTV_DBGMSG1("[rtvISDBT_ScanFrequency: %u] Enter...\n", nChNum);
  778. RTV_GUARD_LOCK;
  779. g_fRtvChannelChange = TRUE;
  780. if (g_eRtvCountryBandType != RTV_COUNTRY_BAND_JAPAN)
  781. nChNum -= 1;
  782. if (g_dwRtvPrevChNum != nChNum) {
  783. g_dwRtvPrevChNum = nChNum;
  784. } else {
  785. g_fRtvChannelChange = FALSE;
  786. RTV_GUARD_FREE;
  787. return RTV_SUCCESS;
  788. }
  789. dwChannelFreq = (nChNum * 6000) + 395143;
  790. RTV_REG_MAP_SEL(OFDM_PAGE);
  791. RTV_REG_SET(0x27, 0x6B);
  792. RTV_REG_SET(0x37, 0x87); //87
  793. RTV_REG_SET(0x75, 0x4B);
  794. RTV_REG_SET(0x8C, 0xAC);
  795. RTV_REG_SET(0x30, 0x20);
  796. RTV_REG_SET(0x39, 0x5A);
  797. RTV_REG_SET(0x3A, 0x45);
  798. #if (RTV_SRC_CLK_FREQ_KHz == 19200)
  799. if ((nChNum & 0x01) == 0x00)
  800. RTV_REG_SET(0x8E, 0x58);
  801. #endif
  802. nRet = rtvRF_SetFrequency(RTV_TV_MODE_1SEG, nChNum, dwChannelFreq);
  803. if (nRet != RTV_SUCCESS)
  804. goto ISDBT_SCAN_FREQ_EXIT;
  805. pwr_threshold = 10000;
  806. #if defined(__KERNEL__) /* Linux kernel */
  807. start_jiffies = get_jiffies_64();
  808. #endif
  809. do {
  810. rtv_UpdateAdj();
  811. RTV_REG_MAP_SEL(OFDM_PAGE);
  812. RTV_REG_MASK_SET(0x25, 0x70, 0x20);
  813. RTV_REG_MASK_SET(0x13, 0x80, 0x80);
  814. RTV_REG_MASK_SET(0x13, 0x80, 0x00);
  815. Mon_FSM = (RTV_REG_GET(0xC0)>>4) & 0x07;
  816. peak_pwr = ((RTV_REG_GET(0xCA)&0x3f)<<16)
  817. | ((RTV_REG_GET(0xC9)&0xff)<<8)
  818. | (RTV_REG_GET(0xC8)&0xff);
  819. if ((Mon_FSM >=0x01) && (peak_pwr >= pwr_threshold))
  820. break;
  821. #if defined(__KERNEL__) /* Linux kernel */
  822. end_jiffies = get_jiffies_64();
  823. diff_time = jiffies_to_msecs(end_jiffies - start_jiffies);
  824. if (diff_time >= MAX_MON_FSM_MS)
  825. break;
  826. #endif
  827. RTV_DELAY_MS(10);
  828. } while (--i);
  829. #if (RTV_SRC_CLK_FREQ_KHz == 19200)
  830. if ((nChNum & 0x01) == 0x00)
  831. RTV_REG_SET(0x8E, 0x28);
  832. #endif
  833. RTV_REG_SET(0x27, 0x65); //2014-03-14 raontech
  834. RTV_REG_SET(0x24, 0x0A); //2014-03-14 raontech
  835. RTV_REG_SET(0x29, 0x29); //2014-03-14 raontech
  836. RTV_REG_SET(0x2B, 0x21); //2014-03-14 raontech
  837. RTV_REG_SET(0x37, 0x86);
  838. RTV_REG_SET(0x30, 0x28);
  839. RTV_REG_SET(0x39, 0x6A);
  840. RTV_REG_SET(0x3A, 0x5F);
  841. RTV_REG_MASK_SET(0x10, 0x01, 0x01);
  842. RTV_REG_MASK_SET(0x10, 0x01, 0x00);
  843. if ((peak_pwr >= pwr_threshold) ) {
  844. #if defined(__KERNEL__) /* Linux kernel */
  845. start_jiffies = get_jiffies_64();
  846. #endif
  847. do {
  848. rtv_UpdateAdj();
  849. RTV_REG_MAP_SEL(OFDM_PAGE);
  850. RTV_REG_MASK_SET(0x25, 0x70, 0x20);
  851. RTV_REG_MASK_SET(0x13, 0x80, 0x80);
  852. RTV_REG_MASK_SET(0x13, 0x80, 0x00);
  853. Mon_FSM = (RTV_REG_GET(0xC0)>>4) & 0x07;
  854. peak_pwr2 = ((RTV_REG_GET(0xCA)&0x3f)<<16)
  855. | ((RTV_REG_GET(0xC9)&0xff)<<8)
  856. | (RTV_REG_GET(0xC8)&0xff);
  857. CoarseCheck = (RTV_REG_GET(0xC2) & 0x40) >> 6;
  858. if (Mon_FSM == 0x04)
  859. CoarseCheck = 1;
  860. if ((CoarseCheck == 1) && (peak_pwr2 >= pwr_threshold))
  861. break;
  862. #if defined(__KERNEL__) /* Linux kernel */
  863. end_jiffies = get_jiffies_64();
  864. diff_time = jiffies_to_msecs(end_jiffies - start_jiffies);
  865. if (diff_time >= MAX_COARSE_MS)
  866. break;
  867. #endif
  868. RTV_DELAY_MS(10);
  869. } while (--j);
  870. }
  871. #if defined(__KERNEL__) /* Linux kernel */
  872. // RTV_DBGMSG2("\t@@ MON: i(%u), diff_time(%u)\n", MON_FSM_MS_CNT-i, diff_time);
  873. #endif
  874. if (CoarseCheck == 1){
  875. #if defined(__KERNEL__) /* Linux kernel */
  876. start_jiffies = get_jiffies_64();
  877. #endif
  878. do {
  879. rtv_UpdateAdj();
  880. RTV_REG_MAP_SEL(OFDM_PAGE);
  881. RTV_REG_MASK_SET(0x13, 0x80, 0x80);
  882. RTV_REG_MASK_SET(0x13, 0x80, 0x00);
  883. OFDM_L = RTV_REG_GET(0xC0) & 0x07;
  884. if (OFDM_L == 0x07) {
  885. #if defined(__KERNEL__) /* Linux kernel */
  886. start_jiffies_TMCC = get_jiffies_64();
  887. #endif
  888. do {
  889. rtv_UpdateAdj();
  890. RTV_REG_MAP_SEL(FEC_PAGE);
  891. RTV_REG_MASK_SET(0x11, 0x04, 0x04);
  892. RTV_REG_MASK_SET(0x11, 0x04, 0x00);
  893. TMCC_L = RTV_REG_GET(0x10) & 0x01;
  894. if (TMCC_L) {
  895. U8 part_flag = RTV_REG_GET(0x7C);
  896. if (part_flag & 0x80)
  897. sucess_flag = RTV_SUCCESS;
  898. else
  899. RTV_DBGMSG1("[rtvISDBT_ScanFrequency] (%u) Part Rx OFFed\n",
  900. nChNum);
  901. scan_stage = 0;
  902. goto ISDBT_SCAN_FREQ_EXIT;
  903. }
  904. #if defined(__KERNEL__) /* Linux kernel */
  905. end_jiffies_TMCC = get_jiffies_64();
  906. diff_time
  907. = jiffies_to_msecs(end_jiffies_TMCC-start_jiffies_TMCC);
  908. if (diff_time >= MAX_TMCC_RETRY_MS) {
  909. RTV_DBGMSG3("\t@@ ch(%u), TMCC: nTMCC_LockCnt(%u), diff_time(%u)\n", nChNum, TMCC_RETRY_MS_CNT-nTMCC_LockCnt, diff_time);
  910. scan_stage= -3;
  911. goto ISDBT_SCAN_FREQ_EXIT;
  912. }
  913. #else
  914. if (nTMCC_LockCnt == 1) {
  915. scan_stage= -3;
  916. goto ISDBT_SCAN_FREQ_EXIT;
  917. }
  918. #endif
  919. RTV_DELAY_MS(10);
  920. } while (--nTMCC_LockCnt);
  921. scan_stage = -7;
  922. goto ISDBT_SCAN_FREQ_EXIT;
  923. }
  924. #if defined(__KERNEL__) /* Linux kernel */
  925. end_jiffies = get_jiffies_64();
  926. diff_time = jiffies_to_msecs(end_jiffies - start_jiffies);
  927. if (diff_time >= MAX_OFDM_RETRY_MS) {
  928. //RTV_DBGMSG2("\t@@ OFDM: nOFDM_LockCnt(%u), diff_time(%u)\n", OFDM_RETRY_MS_CNT-nOFDM_LockCnt, diff_time);
  929. scan_stage= -2;
  930. goto ISDBT_SCAN_FREQ_EXIT;
  931. }
  932. #else
  933. if (nOFDM_LockCnt == 1) {
  934. scan_stage= -2;
  935. goto ISDBT_SCAN_FREQ_EXIT;
  936. }
  937. #endif
  938. RTV_DELAY_MS(10);
  939. } while (--nOFDM_LockCnt);
  940. }
  941. else
  942. scan_stage= -1;
  943. ISDBT_SCAN_FREQ_EXIT:
  944. g_fRtvChannelChange = FALSE;
  945. RTV_REG_MAP_SEL(OFDM_PAGE);
  946. RTV_REG_SET(0x27, 0x5B); //2014-03-14 raontech
  947. RTV_REG_SET(0x24, 0x08); //2014-03-14 raontech
  948. RTV_REG_SET(0x29, 0x69); //2014-03-14 raontech
  949. RTV_REG_SET(0x2B, 0x61); //2014-03-14 raontech
  950. RTV_REG_SET(0x75, 0x8B);
  951. RTV_REG_SET(0x8C, 0x5C); //2014-03-14 raontech
  952. RTV_GUARD_FREE;
  953. #ifdef DEBUG_LOG_FOR_SCAN
  954. RTV_DBGMSG3("[new rtvISDBT_ScanFrequency: %u #(%u)] Power_Peak(%d)\n",
  955. dwChannelFreq, nChNum, peak_pwr);
  956. RTV_DBGMSG3("\t CNT(%d), COARSE = %d, CNT = %d\n", MON_FSM_MS_CNT - i, CoarseCheck, COARSE_MS_CNT - j);
  957. RTV_DBGMSG3("\tOFDML = %d, OFDM_L_Cnt = %d SCAN Stage : %d\n", OFDM_L, OFDM_RETRY_MS_CNT - nOFDM_LockCnt,scan_stage);
  958. RTV_DBGMSG3("\tTMCCL = %d, TMCC_L_Cnt = %d Lock Result : %d\n\n", TMCC_L, TMCC_RETRY_MS_CNT - nTMCC_LockCnt,sucess_flag);
  959. #endif
  960. return sucess_flag;
  961. }
  962. void rtvISDBT_DisableStreamOut(void)
  963. {
  964. RTV_GUARD_LOCK;
  965. rtv_StreamDisable(RTV_TV_MODE_1SEG);
  966. RTV_GUARD_FREE;
  967. }
  968. void rtvISDBT_EnableStreamOut(void)
  969. {
  970. RTV_GUARD_LOCK;
  971. rtv_StreamEnable();
  972. RTV_GUARD_FREE;
  973. }
  974. INT rtvISDBT_SetFrequency(UINT nChNum)
  975. {
  976. INT nRet;
  977. UINT dwChannelFreq;
  978. RTV_GUARD_LOCK;
  979. if (g_eRtvCountryBandType != RTV_COUNTRY_BAND_JAPAN)
  980. nChNum -= 1;
  981. dwChannelFreq = (nChNum * 6000) + 395143;
  982. nRet = rtvRF_SetFrequency(RTV_TV_MODE_1SEG, nChNum, dwChannelFreq);
  983. RTV_GUARD_FREE;
  984. return nRet;
  985. }
  986. void rtvISDBT_SwReset(void)
  987. {
  988. RTV_GUARD_LOCK;
  989. RTV_REG_MAP_SEL(OFDM_PAGE);
  990. RTV_REG_MASK_SET(0x10,0x01,0x01);
  991. RTV_REG_MASK_SET(0x10,0x01,0x00);
  992. RTV_REG_MAP_SEL(FEC_PAGE);
  993. RTV_REG_MASK_SET(0xFB,0x01,0x01);
  994. RTV_REG_MASK_SET(0xFB,0x01,0x00);
  995. RTV_GUARD_FREE;
  996. }
  997. INT rtvISDBT_Initialize(E_RTV_COUNTRY_BAND_TYPE eRtvCountryBandType,
  998. UINT nThresholdSize)
  999. {
  1000. INT nRet;
  1001. switch (eRtvCountryBandType) {
  1002. case RTV_COUNTRY_BAND_JAPAN:
  1003. case RTV_COUNTRY_BAND_BRAZIL:
  1004. case RTV_COUNTRY_BAND_ARGENTINA:
  1005. break;
  1006. default:
  1007. return RTV_INVAILD_COUNTRY_BAND;
  1008. }
  1009. g_eRtvCountryBandType = eRtvCountryBandType;
  1010. if ((nThresholdSize % RTV_TS_PACKET_SIZE) != 0) {
  1011. RTV_DBGMSG0("[rtvISDBT_Initialize] The size of TS data should 188 align!\n");
  1012. return RTV_INVAILD_THRESHOLD_SIZE;
  1013. }
  1014. #if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2)
  1015. if (nThresholdSize > (RTV_TS_PACKET_SIZE * 64)) {
  1016. RTV_DBGMSG0("[rtvISDBT_Initialize] Maximum TSP size must be less than (188 * 64) bytes\n");
  1017. return RTV_INVAILD_THRESHOLD_SIZE;
  1018. }
  1019. #else
  1020. /* TSIF */
  1021. if (nThresholdSize > (RTV_TS_PACKET_SIZE * 16)) {
  1022. RTV_DBGMSG0("[rtvISDBT_Initialize] Maximum TSP size must be less than (188 * 16) bytes\n");
  1023. return RTV_INVAILD_THRESHOLD_SIZE;
  1024. }
  1025. #endif
  1026. g_dwRtvPrevChNum = 0;
  1027. g_nRtvMscThresholdSize = nThresholdSize;
  1028. g_nIsdbtPrevAntennaLevel = 0;
  1029. g_bAdjId = 0x8C;
  1030. g_bAdjSat = 0x7C;
  1031. g_bAdjRefL = 0x4F;
  1032. nRet = rtv_InitSystem(RTV_TV_MODE_1SEG, RTV_ADC_CLK_FREQ_8_MHz);
  1033. if(nRet != RTV_SUCCESS)
  1034. return nRet;
  1035. /* Must after rtv_InitSystem() */
  1036. isdbt_InitDemod();
  1037. nRet = rtvRF_Initilize(RTV_TV_MODE_1SEG);
  1038. if(nRet != RTV_SUCCESS)
  1039. return nRet;
  1040. RTV_DELAY_MS(100);
  1041. RTV_REG_MAP_SEL(RF_PAGE);
  1042. RTV_REG_SET(0x8F, 0x1C);
  1043. return RTV_SUCCESS;
  1044. }