af9005-fe.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* Frontend part of the Linux driver for the Afatech 9005
  3. * USB1.1 DVB-T receiver.
  4. *
  5. * Copyright (C) 2007 Luca Olivetti ([email protected])
  6. *
  7. * Thanks to Afatech who kindly provided information.
  8. *
  9. * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
  10. */
  11. #include "af9005.h"
  12. #include "af9005-script.h"
  13. #include "mt2060.h"
  14. #include "qt1010.h"
  15. #include <asm/div64.h>
  16. struct af9005_fe_state {
  17. struct dvb_usb_device *d;
  18. enum fe_status stat;
  19. /* retraining parameters */
  20. u32 original_fcw;
  21. u16 original_rf_top;
  22. u16 original_if_top;
  23. u16 original_if_min;
  24. u16 original_aci0_if_top;
  25. u16 original_aci1_if_top;
  26. u16 original_aci0_if_min;
  27. u8 original_if_unplug_th;
  28. u8 original_rf_unplug_th;
  29. u8 original_dtop_if_unplug_th;
  30. u8 original_dtop_rf_unplug_th;
  31. /* statistics */
  32. u32 pre_vit_error_count;
  33. u32 pre_vit_bit_count;
  34. u32 ber;
  35. u32 post_vit_error_count;
  36. u32 post_vit_bit_count;
  37. u32 unc;
  38. u16 abort_count;
  39. int opened;
  40. int strong;
  41. unsigned long next_status_check;
  42. struct dvb_frontend frontend;
  43. };
  44. static int af9005_write_word_agc(struct dvb_usb_device *d, u16 reghi,
  45. u16 reglo, u8 pos, u8 len, u16 value)
  46. {
  47. int ret;
  48. if ((ret = af9005_write_ofdm_register(d, reglo, (u8) (value & 0xff))))
  49. return ret;
  50. return af9005_write_register_bits(d, reghi, pos, len,
  51. (u8) ((value & 0x300) >> 8));
  52. }
  53. static int af9005_read_word_agc(struct dvb_usb_device *d, u16 reghi,
  54. u16 reglo, u8 pos, u8 len, u16 * value)
  55. {
  56. int ret;
  57. u8 temp0, temp1;
  58. if ((ret = af9005_read_ofdm_register(d, reglo, &temp0)))
  59. return ret;
  60. if ((ret = af9005_read_ofdm_register(d, reghi, &temp1)))
  61. return ret;
  62. switch (pos) {
  63. case 0:
  64. *value = ((u16) (temp1 & 0x03) << 8) + (u16) temp0;
  65. break;
  66. case 2:
  67. *value = ((u16) (temp1 & 0x0C) << 6) + (u16) temp0;
  68. break;
  69. case 4:
  70. *value = ((u16) (temp1 & 0x30) << 4) + (u16) temp0;
  71. break;
  72. case 6:
  73. *value = ((u16) (temp1 & 0xC0) << 2) + (u16) temp0;
  74. break;
  75. default:
  76. err("invalid pos in read word agc");
  77. return -EINVAL;
  78. }
  79. return 0;
  80. }
  81. static int af9005_is_fecmon_available(struct dvb_frontend *fe, int *available)
  82. {
  83. struct af9005_fe_state *state = fe->demodulator_priv;
  84. int ret;
  85. u8 temp;
  86. *available = false;
  87. ret = af9005_read_register_bits(state->d, xd_p_fec_vtb_rsd_mon_en,
  88. fec_vtb_rsd_mon_en_pos,
  89. fec_vtb_rsd_mon_en_len, &temp);
  90. if (ret)
  91. return ret;
  92. if (temp & 1) {
  93. ret =
  94. af9005_read_register_bits(state->d,
  95. xd_p_reg_ofsm_read_rbc_en,
  96. reg_ofsm_read_rbc_en_pos,
  97. reg_ofsm_read_rbc_en_len, &temp);
  98. if (ret)
  99. return ret;
  100. if ((temp & 1) == 0)
  101. *available = true;
  102. }
  103. return 0;
  104. }
  105. static int af9005_get_post_vit_err_cw_count(struct dvb_frontend *fe,
  106. u32 * post_err_count,
  107. u32 * post_cw_count,
  108. u16 * abort_count)
  109. {
  110. struct af9005_fe_state *state = fe->demodulator_priv;
  111. int ret;
  112. u32 err_count;
  113. u32 cw_count;
  114. u8 temp, temp0, temp1, temp2;
  115. u16 loc_abort_count;
  116. *post_err_count = 0;
  117. *post_cw_count = 0;
  118. /* check if error bit count is ready */
  119. ret =
  120. af9005_read_register_bits(state->d, xd_r_fec_rsd_ber_rdy,
  121. fec_rsd_ber_rdy_pos, fec_rsd_ber_rdy_len,
  122. &temp);
  123. if (ret)
  124. return ret;
  125. if (!temp) {
  126. deb_info("rsd counter not ready\n");
  127. return 100;
  128. }
  129. /* get abort count */
  130. ret =
  131. af9005_read_ofdm_register(state->d,
  132. xd_r_fec_rsd_abort_packet_cnt_7_0,
  133. &temp0);
  134. if (ret)
  135. return ret;
  136. ret =
  137. af9005_read_ofdm_register(state->d,
  138. xd_r_fec_rsd_abort_packet_cnt_15_8,
  139. &temp1);
  140. if (ret)
  141. return ret;
  142. loc_abort_count = ((u16) temp1 << 8) + temp0;
  143. /* get error count */
  144. ret =
  145. af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_7_0,
  146. &temp0);
  147. if (ret)
  148. return ret;
  149. ret =
  150. af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_15_8,
  151. &temp1);
  152. if (ret)
  153. return ret;
  154. ret =
  155. af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_23_16,
  156. &temp2);
  157. if (ret)
  158. return ret;
  159. err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
  160. *post_err_count = err_count - (u32) loc_abort_count *8 * 8;
  161. /* get RSD packet number */
  162. ret =
  163. af9005_read_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_7_0,
  164. &temp0);
  165. if (ret)
  166. return ret;
  167. ret =
  168. af9005_read_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_15_8,
  169. &temp1);
  170. if (ret)
  171. return ret;
  172. cw_count = ((u32) temp1 << 8) + temp0;
  173. if (cw_count == 0) {
  174. err("wrong RSD packet count");
  175. return -EIO;
  176. }
  177. deb_info("POST abort count %d err count %d rsd packets %d\n",
  178. loc_abort_count, err_count, cw_count);
  179. *post_cw_count = cw_count - (u32) loc_abort_count;
  180. *abort_count = loc_abort_count;
  181. return 0;
  182. }
  183. static int af9005_get_post_vit_ber(struct dvb_frontend *fe,
  184. u32 * post_err_count, u32 * post_cw_count,
  185. u16 * abort_count)
  186. {
  187. u32 loc_cw_count = 0, loc_err_count;
  188. u16 loc_abort_count = 0;
  189. int ret;
  190. ret =
  191. af9005_get_post_vit_err_cw_count(fe, &loc_err_count, &loc_cw_count,
  192. &loc_abort_count);
  193. if (ret)
  194. return ret;
  195. *post_err_count = loc_err_count;
  196. *post_cw_count = loc_cw_count * 204 * 8;
  197. *abort_count = loc_abort_count;
  198. return 0;
  199. }
  200. static int af9005_get_pre_vit_err_bit_count(struct dvb_frontend *fe,
  201. u32 * pre_err_count,
  202. u32 * pre_bit_count)
  203. {
  204. struct af9005_fe_state *state = fe->demodulator_priv;
  205. u8 temp, temp0, temp1, temp2;
  206. u32 super_frame_count, x, bits;
  207. int ret;
  208. ret =
  209. af9005_read_register_bits(state->d, xd_r_fec_vtb_ber_rdy,
  210. fec_vtb_ber_rdy_pos, fec_vtb_ber_rdy_len,
  211. &temp);
  212. if (ret)
  213. return ret;
  214. if (!temp) {
  215. deb_info("viterbi counter not ready\n");
  216. return 101; /* ERR_APO_VTB_COUNTER_NOT_READY; */
  217. }
  218. ret =
  219. af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_7_0,
  220. &temp0);
  221. if (ret)
  222. return ret;
  223. ret =
  224. af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_15_8,
  225. &temp1);
  226. if (ret)
  227. return ret;
  228. ret =
  229. af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_23_16,
  230. &temp2);
  231. if (ret)
  232. return ret;
  233. *pre_err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
  234. ret =
  235. af9005_read_ofdm_register(state->d, xd_p_fec_super_frm_unit_7_0,
  236. &temp0);
  237. if (ret)
  238. return ret;
  239. ret =
  240. af9005_read_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
  241. &temp1);
  242. if (ret)
  243. return ret;
  244. super_frame_count = ((u32) temp1 << 8) + temp0;
  245. if (super_frame_count == 0) {
  246. deb_info("super frame count 0\n");
  247. return 102;
  248. }
  249. /* read fft mode */
  250. ret =
  251. af9005_read_register_bits(state->d, xd_g_reg_tpsd_txmod,
  252. reg_tpsd_txmod_pos, reg_tpsd_txmod_len,
  253. &temp);
  254. if (ret)
  255. return ret;
  256. if (temp == 0) {
  257. /* 2K */
  258. x = 1512;
  259. } else if (temp == 1) {
  260. /* 8k */
  261. x = 6048;
  262. } else {
  263. err("Invalid fft mode");
  264. return -EINVAL;
  265. }
  266. /* read modulation mode */
  267. ret =
  268. af9005_read_register_bits(state->d, xd_g_reg_tpsd_const,
  269. reg_tpsd_const_pos, reg_tpsd_const_len,
  270. &temp);
  271. if (ret)
  272. return ret;
  273. switch (temp) {
  274. case 0: /* QPSK */
  275. bits = 2;
  276. break;
  277. case 1: /* QAM_16 */
  278. bits = 4;
  279. break;
  280. case 2: /* QAM_64 */
  281. bits = 6;
  282. break;
  283. default:
  284. err("invalid modulation mode");
  285. return -EINVAL;
  286. }
  287. *pre_bit_count = super_frame_count * 68 * 4 * x * bits;
  288. deb_info("PRE err count %d frame count %d bit count %d\n",
  289. *pre_err_count, super_frame_count, *pre_bit_count);
  290. return 0;
  291. }
  292. static int af9005_reset_pre_viterbi(struct dvb_frontend *fe)
  293. {
  294. struct af9005_fe_state *state = fe->demodulator_priv;
  295. int ret;
  296. /* set super frame count to 1 */
  297. ret =
  298. af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_7_0,
  299. 1 & 0xff);
  300. if (ret)
  301. return ret;
  302. ret = af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
  303. 1 >> 8);
  304. if (ret)
  305. return ret;
  306. /* reset pre viterbi error count */
  307. ret =
  308. af9005_write_register_bits(state->d, xd_p_fec_vtb_ber_rst,
  309. fec_vtb_ber_rst_pos, fec_vtb_ber_rst_len,
  310. 1);
  311. return ret;
  312. }
  313. static int af9005_reset_post_viterbi(struct dvb_frontend *fe)
  314. {
  315. struct af9005_fe_state *state = fe->demodulator_priv;
  316. int ret;
  317. /* set packet unit */
  318. ret =
  319. af9005_write_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_7_0,
  320. 10000 & 0xff);
  321. if (ret)
  322. return ret;
  323. ret =
  324. af9005_write_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_15_8,
  325. 10000 >> 8);
  326. if (ret)
  327. return ret;
  328. /* reset post viterbi error count */
  329. ret =
  330. af9005_write_register_bits(state->d, xd_p_fec_rsd_ber_rst,
  331. fec_rsd_ber_rst_pos, fec_rsd_ber_rst_len,
  332. 1);
  333. return ret;
  334. }
  335. static int af9005_get_statistic(struct dvb_frontend *fe)
  336. {
  337. struct af9005_fe_state *state = fe->demodulator_priv;
  338. int ret, fecavailable;
  339. u64 numerator, denominator;
  340. deb_info("GET STATISTIC\n");
  341. ret = af9005_is_fecmon_available(fe, &fecavailable);
  342. if (ret)
  343. return ret;
  344. if (!fecavailable) {
  345. deb_info("fecmon not available\n");
  346. return 0;
  347. }
  348. ret = af9005_get_pre_vit_err_bit_count(fe, &state->pre_vit_error_count,
  349. &state->pre_vit_bit_count);
  350. if (ret == 0) {
  351. af9005_reset_pre_viterbi(fe);
  352. if (state->pre_vit_bit_count > 0) {
  353. /* according to v 0.0.4 of the dvb api ber should be a multiple
  354. of 10E-9 so we have to multiply the error count by
  355. 10E9=1000000000 */
  356. numerator =
  357. (u64) state->pre_vit_error_count * (u64) 1000000000;
  358. denominator = (u64) state->pre_vit_bit_count;
  359. state->ber = do_div(numerator, denominator);
  360. } else {
  361. state->ber = 0xffffffff;
  362. }
  363. }
  364. ret = af9005_get_post_vit_ber(fe, &state->post_vit_error_count,
  365. &state->post_vit_bit_count,
  366. &state->abort_count);
  367. if (ret == 0) {
  368. ret = af9005_reset_post_viterbi(fe);
  369. state->unc += state->abort_count;
  370. if (ret)
  371. return ret;
  372. }
  373. return 0;
  374. }
  375. static int af9005_fe_refresh_state(struct dvb_frontend *fe)
  376. {
  377. struct af9005_fe_state *state = fe->demodulator_priv;
  378. if (time_after(jiffies, state->next_status_check)) {
  379. deb_info("REFRESH STATE\n");
  380. /* statistics */
  381. if (af9005_get_statistic(fe))
  382. err("get_statistic_failed");
  383. state->next_status_check = jiffies + 250 * HZ / 1000;
  384. }
  385. return 0;
  386. }
  387. static int af9005_fe_read_status(struct dvb_frontend *fe,
  388. enum fe_status *stat)
  389. {
  390. struct af9005_fe_state *state = fe->demodulator_priv;
  391. u8 temp;
  392. int ret;
  393. if (fe->ops.tuner_ops.release == NULL)
  394. return -ENODEV;
  395. *stat = 0;
  396. ret = af9005_read_register_bits(state->d, xd_p_agc_lock,
  397. agc_lock_pos, agc_lock_len, &temp);
  398. if (ret)
  399. return ret;
  400. if (temp)
  401. *stat |= FE_HAS_SIGNAL;
  402. ret = af9005_read_register_bits(state->d, xd_p_fd_tpsd_lock,
  403. fd_tpsd_lock_pos, fd_tpsd_lock_len,
  404. &temp);
  405. if (ret)
  406. return ret;
  407. if (temp)
  408. *stat |= FE_HAS_CARRIER;
  409. ret = af9005_read_register_bits(state->d,
  410. xd_r_mp2if_sync_byte_locked,
  411. mp2if_sync_byte_locked_pos,
  412. mp2if_sync_byte_locked_pos, &temp);
  413. if (ret)
  414. return ret;
  415. if (temp)
  416. *stat |= FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_LOCK;
  417. if (state->opened)
  418. af9005_led_control(state->d, *stat & FE_HAS_LOCK);
  419. ret =
  420. af9005_read_register_bits(state->d, xd_p_reg_strong_sginal_detected,
  421. reg_strong_sginal_detected_pos,
  422. reg_strong_sginal_detected_len, &temp);
  423. if (ret)
  424. return ret;
  425. if (temp != state->strong) {
  426. deb_info("adjust for strong signal %d\n", temp);
  427. state->strong = temp;
  428. }
  429. return 0;
  430. }
  431. static int af9005_fe_read_ber(struct dvb_frontend *fe, u32 * ber)
  432. {
  433. struct af9005_fe_state *state = fe->demodulator_priv;
  434. if (fe->ops.tuner_ops.release == NULL)
  435. return -ENODEV;
  436. af9005_fe_refresh_state(fe);
  437. *ber = state->ber;
  438. return 0;
  439. }
  440. static int af9005_fe_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
  441. {
  442. struct af9005_fe_state *state = fe->demodulator_priv;
  443. if (fe->ops.tuner_ops.release == NULL)
  444. return -ENODEV;
  445. af9005_fe_refresh_state(fe);
  446. *unc = state->unc;
  447. return 0;
  448. }
  449. static int af9005_fe_read_signal_strength(struct dvb_frontend *fe,
  450. u16 * strength)
  451. {
  452. struct af9005_fe_state *state = fe->demodulator_priv;
  453. int ret;
  454. u8 if_gain, rf_gain;
  455. if (fe->ops.tuner_ops.release == NULL)
  456. return -ENODEV;
  457. ret =
  458. af9005_read_ofdm_register(state->d, xd_r_reg_aagc_rf_gain,
  459. &rf_gain);
  460. if (ret)
  461. return ret;
  462. ret =
  463. af9005_read_ofdm_register(state->d, xd_r_reg_aagc_if_gain,
  464. &if_gain);
  465. if (ret)
  466. return ret;
  467. /* this value has no real meaning, but i don't have the tables that relate
  468. the rf and if gain with the dbm, so I just scale the value */
  469. *strength = (512 - rf_gain - if_gain) << 7;
  470. return 0;
  471. }
  472. static int af9005_fe_read_snr(struct dvb_frontend *fe, u16 * snr)
  473. {
  474. /* the snr can be derived from the ber and the modulation
  475. but I don't think this kind of complex calculations belong
  476. in the driver. I may be wrong.... */
  477. return -ENOSYS;
  478. }
  479. static int af9005_fe_program_cfoe(struct dvb_usb_device *d, u32 bw)
  480. {
  481. u8 temp0, temp1, temp2, temp3, buf[4];
  482. int ret;
  483. u32 NS_coeff1_2048Nu;
  484. u32 NS_coeff1_8191Nu;
  485. u32 NS_coeff1_8192Nu;
  486. u32 NS_coeff1_8193Nu;
  487. u32 NS_coeff2_2k;
  488. u32 NS_coeff2_8k;
  489. switch (bw) {
  490. case 6000000:
  491. NS_coeff1_2048Nu = 0x2ADB6DC;
  492. NS_coeff1_8191Nu = 0xAB7313;
  493. NS_coeff1_8192Nu = 0xAB6DB7;
  494. NS_coeff1_8193Nu = 0xAB685C;
  495. NS_coeff2_2k = 0x156DB6E;
  496. NS_coeff2_8k = 0x55B6DC;
  497. break;
  498. case 7000000:
  499. NS_coeff1_2048Nu = 0x3200001;
  500. NS_coeff1_8191Nu = 0xC80640;
  501. NS_coeff1_8192Nu = 0xC80000;
  502. NS_coeff1_8193Nu = 0xC7F9C0;
  503. NS_coeff2_2k = 0x1900000;
  504. NS_coeff2_8k = 0x640000;
  505. break;
  506. case 8000000:
  507. NS_coeff1_2048Nu = 0x3924926;
  508. NS_coeff1_8191Nu = 0xE4996E;
  509. NS_coeff1_8192Nu = 0xE49249;
  510. NS_coeff1_8193Nu = 0xE48B25;
  511. NS_coeff2_2k = 0x1C92493;
  512. NS_coeff2_8k = 0x724925;
  513. break;
  514. default:
  515. err("Invalid bandwidth %d.", bw);
  516. return -EINVAL;
  517. }
  518. /*
  519. * write NS_coeff1_2048Nu
  520. */
  521. temp0 = (u8) (NS_coeff1_2048Nu & 0x000000FF);
  522. temp1 = (u8) ((NS_coeff1_2048Nu & 0x0000FF00) >> 8);
  523. temp2 = (u8) ((NS_coeff1_2048Nu & 0x00FF0000) >> 16);
  524. temp3 = (u8) ((NS_coeff1_2048Nu & 0x03000000) >> 24);
  525. /* big endian to make 8051 happy */
  526. buf[0] = temp3;
  527. buf[1] = temp2;
  528. buf[2] = temp1;
  529. buf[3] = temp0;
  530. /* cfoe_NS_2k_coeff1_25_24 */
  531. ret = af9005_write_ofdm_register(d, 0xAE00, buf[0]);
  532. if (ret)
  533. return ret;
  534. /* cfoe_NS_2k_coeff1_23_16 */
  535. ret = af9005_write_ofdm_register(d, 0xAE01, buf[1]);
  536. if (ret)
  537. return ret;
  538. /* cfoe_NS_2k_coeff1_15_8 */
  539. ret = af9005_write_ofdm_register(d, 0xAE02, buf[2]);
  540. if (ret)
  541. return ret;
  542. /* cfoe_NS_2k_coeff1_7_0 */
  543. ret = af9005_write_ofdm_register(d, 0xAE03, buf[3]);
  544. if (ret)
  545. return ret;
  546. /*
  547. * write NS_coeff2_2k
  548. */
  549. temp0 = (u8) ((NS_coeff2_2k & 0x0000003F));
  550. temp1 = (u8) ((NS_coeff2_2k & 0x00003FC0) >> 6);
  551. temp2 = (u8) ((NS_coeff2_2k & 0x003FC000) >> 14);
  552. temp3 = (u8) ((NS_coeff2_2k & 0x01C00000) >> 22);
  553. /* big endian to make 8051 happy */
  554. buf[0] = temp3;
  555. buf[1] = temp2;
  556. buf[2] = temp1;
  557. buf[3] = temp0;
  558. ret = af9005_write_ofdm_register(d, 0xAE04, buf[0]);
  559. if (ret)
  560. return ret;
  561. ret = af9005_write_ofdm_register(d, 0xAE05, buf[1]);
  562. if (ret)
  563. return ret;
  564. ret = af9005_write_ofdm_register(d, 0xAE06, buf[2]);
  565. if (ret)
  566. return ret;
  567. ret = af9005_write_ofdm_register(d, 0xAE07, buf[3]);
  568. if (ret)
  569. return ret;
  570. /*
  571. * write NS_coeff1_8191Nu
  572. */
  573. temp0 = (u8) ((NS_coeff1_8191Nu & 0x000000FF));
  574. temp1 = (u8) ((NS_coeff1_8191Nu & 0x0000FF00) >> 8);
  575. temp2 = (u8) ((NS_coeff1_8191Nu & 0x00FFC000) >> 16);
  576. temp3 = (u8) ((NS_coeff1_8191Nu & 0x03000000) >> 24);
  577. /* big endian to make 8051 happy */
  578. buf[0] = temp3;
  579. buf[1] = temp2;
  580. buf[2] = temp1;
  581. buf[3] = temp0;
  582. ret = af9005_write_ofdm_register(d, 0xAE08, buf[0]);
  583. if (ret)
  584. return ret;
  585. ret = af9005_write_ofdm_register(d, 0xAE09, buf[1]);
  586. if (ret)
  587. return ret;
  588. ret = af9005_write_ofdm_register(d, 0xAE0A, buf[2]);
  589. if (ret)
  590. return ret;
  591. ret = af9005_write_ofdm_register(d, 0xAE0B, buf[3]);
  592. if (ret)
  593. return ret;
  594. /*
  595. * write NS_coeff1_8192Nu
  596. */
  597. temp0 = (u8) (NS_coeff1_8192Nu & 0x000000FF);
  598. temp1 = (u8) ((NS_coeff1_8192Nu & 0x0000FF00) >> 8);
  599. temp2 = (u8) ((NS_coeff1_8192Nu & 0x00FFC000) >> 16);
  600. temp3 = (u8) ((NS_coeff1_8192Nu & 0x03000000) >> 24);
  601. /* big endian to make 8051 happy */
  602. buf[0] = temp3;
  603. buf[1] = temp2;
  604. buf[2] = temp1;
  605. buf[3] = temp0;
  606. ret = af9005_write_ofdm_register(d, 0xAE0C, buf[0]);
  607. if (ret)
  608. return ret;
  609. ret = af9005_write_ofdm_register(d, 0xAE0D, buf[1]);
  610. if (ret)
  611. return ret;
  612. ret = af9005_write_ofdm_register(d, 0xAE0E, buf[2]);
  613. if (ret)
  614. return ret;
  615. ret = af9005_write_ofdm_register(d, 0xAE0F, buf[3]);
  616. if (ret)
  617. return ret;
  618. /*
  619. * write NS_coeff1_8193Nu
  620. */
  621. temp0 = (u8) ((NS_coeff1_8193Nu & 0x000000FF));
  622. temp1 = (u8) ((NS_coeff1_8193Nu & 0x0000FF00) >> 8);
  623. temp2 = (u8) ((NS_coeff1_8193Nu & 0x00FFC000) >> 16);
  624. temp3 = (u8) ((NS_coeff1_8193Nu & 0x03000000) >> 24);
  625. /* big endian to make 8051 happy */
  626. buf[0] = temp3;
  627. buf[1] = temp2;
  628. buf[2] = temp1;
  629. buf[3] = temp0;
  630. ret = af9005_write_ofdm_register(d, 0xAE10, buf[0]);
  631. if (ret)
  632. return ret;
  633. ret = af9005_write_ofdm_register(d, 0xAE11, buf[1]);
  634. if (ret)
  635. return ret;
  636. ret = af9005_write_ofdm_register(d, 0xAE12, buf[2]);
  637. if (ret)
  638. return ret;
  639. ret = af9005_write_ofdm_register(d, 0xAE13, buf[3]);
  640. if (ret)
  641. return ret;
  642. /*
  643. * write NS_coeff2_8k
  644. */
  645. temp0 = (u8) ((NS_coeff2_8k & 0x0000003F));
  646. temp1 = (u8) ((NS_coeff2_8k & 0x00003FC0) >> 6);
  647. temp2 = (u8) ((NS_coeff2_8k & 0x003FC000) >> 14);
  648. temp3 = (u8) ((NS_coeff2_8k & 0x01C00000) >> 22);
  649. /* big endian to make 8051 happy */
  650. buf[0] = temp3;
  651. buf[1] = temp2;
  652. buf[2] = temp1;
  653. buf[3] = temp0;
  654. ret = af9005_write_ofdm_register(d, 0xAE14, buf[0]);
  655. if (ret)
  656. return ret;
  657. ret = af9005_write_ofdm_register(d, 0xAE15, buf[1]);
  658. if (ret)
  659. return ret;
  660. ret = af9005_write_ofdm_register(d, 0xAE16, buf[2]);
  661. if (ret)
  662. return ret;
  663. ret = af9005_write_ofdm_register(d, 0xAE17, buf[3]);
  664. return ret;
  665. }
  666. static int af9005_fe_select_bw(struct dvb_usb_device *d, u32 bw)
  667. {
  668. u8 temp;
  669. switch (bw) {
  670. case 6000000:
  671. temp = 0;
  672. break;
  673. case 7000000:
  674. temp = 1;
  675. break;
  676. case 8000000:
  677. temp = 2;
  678. break;
  679. default:
  680. err("Invalid bandwidth %d.", bw);
  681. return -EINVAL;
  682. }
  683. return af9005_write_register_bits(d, xd_g_reg_bw, reg_bw_pos,
  684. reg_bw_len, temp);
  685. }
  686. static int af9005_fe_power(struct dvb_frontend *fe, int on)
  687. {
  688. struct af9005_fe_state *state = fe->demodulator_priv;
  689. u8 temp = on;
  690. int ret;
  691. deb_info("power %s tuner\n", on ? "on" : "off");
  692. ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
  693. return ret;
  694. }
  695. static struct mt2060_config af9005_mt2060_config = {
  696. 0xC0
  697. };
  698. static struct qt1010_config af9005_qt1010_config = {
  699. 0xC4
  700. };
  701. static int af9005_fe_init(struct dvb_frontend *fe)
  702. {
  703. struct af9005_fe_state *state = fe->demodulator_priv;
  704. struct dvb_usb_adapter *adap = fe->dvb->priv;
  705. int ret, i, scriptlen;
  706. u8 temp, temp0 = 0, temp1 = 0, temp2 = 0;
  707. u8 buf[2];
  708. u16 if1;
  709. deb_info("in af9005_fe_init\n");
  710. /* reset */
  711. deb_info("reset\n");
  712. if ((ret =
  713. af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst_en,
  714. 4, 1, 0x01)))
  715. return ret;
  716. if ((ret = af9005_write_ofdm_register(state->d, APO_REG_RESET, 0)))
  717. return ret;
  718. /* clear ofdm reset */
  719. deb_info("clear ofdm reset\n");
  720. for (i = 0; i < 150; i++) {
  721. if ((ret =
  722. af9005_read_ofdm_register(state->d,
  723. xd_I2C_reg_ofdm_rst, &temp)))
  724. return ret;
  725. if (temp & (regmask[reg_ofdm_rst_len - 1] << reg_ofdm_rst_pos))
  726. break;
  727. msleep(10);
  728. }
  729. if (i == 150)
  730. return -ETIMEDOUT;
  731. /*FIXME in the dump
  732. write B200 A9
  733. write xd_g_reg_ofsm_clk 7
  734. read eepr c6 (2)
  735. read eepr c7 (2)
  736. misc ctrl 3 -> 1
  737. read eepr ca (6)
  738. write xd_g_reg_ofsm_clk 0
  739. write B200 a1
  740. */
  741. ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa9);
  742. if (ret)
  743. return ret;
  744. ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x07);
  745. if (ret)
  746. return ret;
  747. temp = 0x01;
  748. ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
  749. if (ret)
  750. return ret;
  751. ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x00);
  752. if (ret)
  753. return ret;
  754. ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa1);
  755. if (ret)
  756. return ret;
  757. temp = regmask[reg_ofdm_rst_len - 1] << reg_ofdm_rst_pos;
  758. if ((ret =
  759. af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
  760. reg_ofdm_rst_pos, reg_ofdm_rst_len, 1)))
  761. return ret;
  762. ret = af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
  763. reg_ofdm_rst_pos, reg_ofdm_rst_len, 0);
  764. if (ret)
  765. return ret;
  766. /* don't know what register aefc is, but this is what the windows driver does */
  767. ret = af9005_write_ofdm_register(state->d, 0xaefc, 0);
  768. if (ret)
  769. return ret;
  770. /* set stand alone chip */
  771. deb_info("set stand alone chip\n");
  772. if ((ret =
  773. af9005_write_register_bits(state->d, xd_p_reg_dca_stand_alone,
  774. reg_dca_stand_alone_pos,
  775. reg_dca_stand_alone_len, 1)))
  776. return ret;
  777. /* set dca upper & lower chip */
  778. deb_info("set dca upper & lower chip\n");
  779. if ((ret =
  780. af9005_write_register_bits(state->d, xd_p_reg_dca_upper_chip,
  781. reg_dca_upper_chip_pos,
  782. reg_dca_upper_chip_len, 0)))
  783. return ret;
  784. if ((ret =
  785. af9005_write_register_bits(state->d, xd_p_reg_dca_lower_chip,
  786. reg_dca_lower_chip_pos,
  787. reg_dca_lower_chip_len, 0)))
  788. return ret;
  789. /* set 2wire master clock to 0x14 (for 60KHz) */
  790. deb_info("set 2wire master clock to 0x14 (for 60KHz)\n");
  791. if ((ret =
  792. af9005_write_ofdm_register(state->d, xd_I2C_i2c_m_period, 0x14)))
  793. return ret;
  794. /* clear dca enable chip */
  795. deb_info("clear dca enable chip\n");
  796. if ((ret =
  797. af9005_write_register_bits(state->d, xd_p_reg_dca_en,
  798. reg_dca_en_pos, reg_dca_en_len, 0)))
  799. return ret;
  800. /* FIXME these are register bits, but I don't know which ones */
  801. ret = af9005_write_ofdm_register(state->d, 0xa16c, 1);
  802. if (ret)
  803. return ret;
  804. ret = af9005_write_ofdm_register(state->d, 0xa3c1, 0);
  805. if (ret)
  806. return ret;
  807. /* init other parameters: program cfoe and select bandwidth */
  808. deb_info("program cfoe\n");
  809. ret = af9005_fe_program_cfoe(state->d, 6000000);
  810. if (ret)
  811. return ret;
  812. /* set read-update bit for modulation */
  813. deb_info("set read-update bit for modulation\n");
  814. if ((ret =
  815. af9005_write_register_bits(state->d, xd_p_reg_feq_read_update,
  816. reg_feq_read_update_pos,
  817. reg_feq_read_update_len, 1)))
  818. return ret;
  819. /* sample code has a set MPEG TS code here
  820. but sniffing reveals that it doesn't do it */
  821. /* set read-update bit to 1 for DCA modulation */
  822. deb_info("set read-update bit 1 for DCA modulation\n");
  823. if ((ret =
  824. af9005_write_register_bits(state->d, xd_p_reg_dca_read_update,
  825. reg_dca_read_update_pos,
  826. reg_dca_read_update_len, 1)))
  827. return ret;
  828. /* enable fec monitor */
  829. deb_info("enable fec monitor\n");
  830. if ((ret =
  831. af9005_write_register_bits(state->d, xd_p_fec_vtb_rsd_mon_en,
  832. fec_vtb_rsd_mon_en_pos,
  833. fec_vtb_rsd_mon_en_len, 1)))
  834. return ret;
  835. /* FIXME should be register bits, I don't know which ones */
  836. ret = af9005_write_ofdm_register(state->d, 0xa601, 0);
  837. /* set api_retrain_never_freeze */
  838. deb_info("set api_retrain_never_freeze\n");
  839. if ((ret = af9005_write_ofdm_register(state->d, 0xaefb, 0x01)))
  840. return ret;
  841. /* load init script */
  842. deb_info("load init script\n");
  843. scriptlen = sizeof(script) / sizeof(RegDesc);
  844. for (i = 0; i < scriptlen; i++) {
  845. if ((ret =
  846. af9005_write_register_bits(state->d, script[i].reg,
  847. script[i].pos,
  848. script[i].len, script[i].val)))
  849. return ret;
  850. /* save 3 bytes of original fcw */
  851. if (script[i].reg == 0xae18)
  852. temp2 = script[i].val;
  853. if (script[i].reg == 0xae19)
  854. temp1 = script[i].val;
  855. if (script[i].reg == 0xae1a)
  856. temp0 = script[i].val;
  857. /* save original unplug threshold */
  858. if (script[i].reg == xd_p_reg_unplug_th)
  859. state->original_if_unplug_th = script[i].val;
  860. if (script[i].reg == xd_p_reg_unplug_rf_gain_th)
  861. state->original_rf_unplug_th = script[i].val;
  862. if (script[i].reg == xd_p_reg_unplug_dtop_if_gain_th)
  863. state->original_dtop_if_unplug_th = script[i].val;
  864. if (script[i].reg == xd_p_reg_unplug_dtop_rf_gain_th)
  865. state->original_dtop_rf_unplug_th = script[i].val;
  866. }
  867. state->original_fcw =
  868. ((u32) temp2 << 16) + ((u32) temp1 << 8) + (u32) temp0;
  869. /* save original TOPs */
  870. deb_info("save original TOPs\n");
  871. /* RF TOP */
  872. ret =
  873. af9005_read_word_agc(state->d,
  874. xd_p_reg_aagc_rf_top_numerator_9_8,
  875. xd_p_reg_aagc_rf_top_numerator_7_0, 0, 2,
  876. &state->original_rf_top);
  877. if (ret)
  878. return ret;
  879. /* IF TOP */
  880. ret =
  881. af9005_read_word_agc(state->d,
  882. xd_p_reg_aagc_if_top_numerator_9_8,
  883. xd_p_reg_aagc_if_top_numerator_7_0, 0, 2,
  884. &state->original_if_top);
  885. if (ret)
  886. return ret;
  887. /* ACI 0 IF TOP */
  888. ret =
  889. af9005_read_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
  890. &state->original_aci0_if_top);
  891. if (ret)
  892. return ret;
  893. /* ACI 1 IF TOP */
  894. ret =
  895. af9005_read_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
  896. &state->original_aci1_if_top);
  897. if (ret)
  898. return ret;
  899. /* attach tuner and init */
  900. if (fe->ops.tuner_ops.release == NULL) {
  901. /* read tuner and board id from eeprom */
  902. ret = af9005_read_eeprom(adap->dev, 0xc6, buf, 2);
  903. if (ret) {
  904. err("Impossible to read EEPROM\n");
  905. return ret;
  906. }
  907. deb_info("Tuner id %d, board id %d\n", buf[0], buf[1]);
  908. switch (buf[0]) {
  909. case 2: /* MT2060 */
  910. /* read if1 from eeprom */
  911. ret = af9005_read_eeprom(adap->dev, 0xc8, buf, 2);
  912. if (ret) {
  913. err("Impossible to read EEPROM\n");
  914. return ret;
  915. }
  916. if1 = (u16) (buf[0] << 8) + buf[1];
  917. if (dvb_attach(mt2060_attach, fe, &adap->dev->i2c_adap,
  918. &af9005_mt2060_config, if1) == NULL) {
  919. deb_info("MT2060 attach failed\n");
  920. return -ENODEV;
  921. }
  922. break;
  923. case 3: /* QT1010 */
  924. case 9: /* QT1010B */
  925. if (dvb_attach(qt1010_attach, fe, &adap->dev->i2c_adap,
  926. &af9005_qt1010_config) ==NULL) {
  927. deb_info("QT1010 attach failed\n");
  928. return -ENODEV;
  929. }
  930. break;
  931. default:
  932. err("Unsupported tuner type %d", buf[0]);
  933. return -ENODEV;
  934. }
  935. ret = fe->ops.tuner_ops.init(fe);
  936. if (ret)
  937. return ret;
  938. }
  939. deb_info("profit!\n");
  940. return 0;
  941. }
  942. static int af9005_fe_sleep(struct dvb_frontend *fe)
  943. {
  944. return af9005_fe_power(fe, 0);
  945. }
  946. static int af9005_ts_bus_ctrl(struct dvb_frontend *fe, int acquire)
  947. {
  948. struct af9005_fe_state *state = fe->demodulator_priv;
  949. if (acquire) {
  950. state->opened++;
  951. } else {
  952. state->opened--;
  953. if (!state->opened)
  954. af9005_led_control(state->d, 0);
  955. }
  956. return 0;
  957. }
  958. static int af9005_fe_set_frontend(struct dvb_frontend *fe)
  959. {
  960. struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
  961. struct af9005_fe_state *state = fe->demodulator_priv;
  962. int ret;
  963. u8 temp, temp0, temp1, temp2;
  964. deb_info("af9005_fe_set_frontend freq %d bw %d\n", fep->frequency,
  965. fep->bandwidth_hz);
  966. if (fe->ops.tuner_ops.release == NULL) {
  967. err("Tuner not attached");
  968. return -ENODEV;
  969. }
  970. deb_info("turn off led\n");
  971. /* not in the log */
  972. ret = af9005_led_control(state->d, 0);
  973. if (ret)
  974. return ret;
  975. /* not sure about the bits */
  976. ret = af9005_write_register_bits(state->d, XD_MP2IF_MISC, 2, 1, 0);
  977. if (ret)
  978. return ret;
  979. /* set FCW to default value */
  980. deb_info("set FCW to default value\n");
  981. temp0 = (u8) (state->original_fcw & 0x000000ff);
  982. temp1 = (u8) ((state->original_fcw & 0x0000ff00) >> 8);
  983. temp2 = (u8) ((state->original_fcw & 0x00ff0000) >> 16);
  984. ret = af9005_write_ofdm_register(state->d, 0xae1a, temp0);
  985. if (ret)
  986. return ret;
  987. ret = af9005_write_ofdm_register(state->d, 0xae19, temp1);
  988. if (ret)
  989. return ret;
  990. ret = af9005_write_ofdm_register(state->d, 0xae18, temp2);
  991. if (ret)
  992. return ret;
  993. /* restore original TOPs */
  994. deb_info("restore original TOPs\n");
  995. ret =
  996. af9005_write_word_agc(state->d,
  997. xd_p_reg_aagc_rf_top_numerator_9_8,
  998. xd_p_reg_aagc_rf_top_numerator_7_0, 0, 2,
  999. state->original_rf_top);
  1000. if (ret)
  1001. return ret;
  1002. ret =
  1003. af9005_write_word_agc(state->d,
  1004. xd_p_reg_aagc_if_top_numerator_9_8,
  1005. xd_p_reg_aagc_if_top_numerator_7_0, 0, 2,
  1006. state->original_if_top);
  1007. if (ret)
  1008. return ret;
  1009. ret =
  1010. af9005_write_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
  1011. state->original_aci0_if_top);
  1012. if (ret)
  1013. return ret;
  1014. ret =
  1015. af9005_write_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
  1016. state->original_aci1_if_top);
  1017. if (ret)
  1018. return ret;
  1019. /* select bandwidth */
  1020. deb_info("select bandwidth");
  1021. ret = af9005_fe_select_bw(state->d, fep->bandwidth_hz);
  1022. if (ret)
  1023. return ret;
  1024. ret = af9005_fe_program_cfoe(state->d, fep->bandwidth_hz);
  1025. if (ret)
  1026. return ret;
  1027. /* clear easy mode flag */
  1028. deb_info("clear easy mode flag\n");
  1029. ret = af9005_write_ofdm_register(state->d, 0xaefd, 0);
  1030. if (ret)
  1031. return ret;
  1032. /* set unplug threshold to original value */
  1033. deb_info("set unplug threshold to original value\n");
  1034. ret =
  1035. af9005_write_ofdm_register(state->d, xd_p_reg_unplug_th,
  1036. state->original_if_unplug_th);
  1037. if (ret)
  1038. return ret;
  1039. /* set tuner */
  1040. deb_info("set tuner\n");
  1041. ret = fe->ops.tuner_ops.set_params(fe);
  1042. if (ret)
  1043. return ret;
  1044. /* trigger ofsm */
  1045. deb_info("trigger ofsm\n");
  1046. temp = 0;
  1047. ret = af9005_write_tuner_registers(state->d, 0xffff, &temp, 1);
  1048. if (ret)
  1049. return ret;
  1050. /* clear retrain and freeze flag */
  1051. deb_info("clear retrain and freeze flag\n");
  1052. ret =
  1053. af9005_write_register_bits(state->d,
  1054. xd_p_reg_api_retrain_request,
  1055. reg_api_retrain_request_pos, 2, 0);
  1056. if (ret)
  1057. return ret;
  1058. /* reset pre viterbi and post viterbi registers and statistics */
  1059. af9005_reset_pre_viterbi(fe);
  1060. af9005_reset_post_viterbi(fe);
  1061. state->pre_vit_error_count = 0;
  1062. state->pre_vit_bit_count = 0;
  1063. state->ber = 0;
  1064. state->post_vit_error_count = 0;
  1065. /* state->unc = 0; commented out since it should be ever increasing */
  1066. state->abort_count = 0;
  1067. state->next_status_check = jiffies;
  1068. state->strong = -1;
  1069. return 0;
  1070. }
  1071. static int af9005_fe_get_frontend(struct dvb_frontend *fe,
  1072. struct dtv_frontend_properties *fep)
  1073. {
  1074. struct af9005_fe_state *state = fe->demodulator_priv;
  1075. int ret;
  1076. u8 temp;
  1077. /* mode */
  1078. ret =
  1079. af9005_read_register_bits(state->d, xd_g_reg_tpsd_const,
  1080. reg_tpsd_const_pos, reg_tpsd_const_len,
  1081. &temp);
  1082. if (ret)
  1083. return ret;
  1084. deb_info("===== fe_get_frontend_legacy = =============\n");
  1085. deb_info("CONSTELLATION ");
  1086. switch (temp) {
  1087. case 0:
  1088. fep->modulation = QPSK;
  1089. deb_info("QPSK\n");
  1090. break;
  1091. case 1:
  1092. fep->modulation = QAM_16;
  1093. deb_info("QAM_16\n");
  1094. break;
  1095. case 2:
  1096. fep->modulation = QAM_64;
  1097. deb_info("QAM_64\n");
  1098. break;
  1099. }
  1100. /* tps hierarchy and alpha value */
  1101. ret =
  1102. af9005_read_register_bits(state->d, xd_g_reg_tpsd_hier,
  1103. reg_tpsd_hier_pos, reg_tpsd_hier_len,
  1104. &temp);
  1105. if (ret)
  1106. return ret;
  1107. deb_info("HIERARCHY ");
  1108. switch (temp) {
  1109. case 0:
  1110. fep->hierarchy = HIERARCHY_NONE;
  1111. deb_info("NONE\n");
  1112. break;
  1113. case 1:
  1114. fep->hierarchy = HIERARCHY_1;
  1115. deb_info("1\n");
  1116. break;
  1117. case 2:
  1118. fep->hierarchy = HIERARCHY_2;
  1119. deb_info("2\n");
  1120. break;
  1121. case 3:
  1122. fep->hierarchy = HIERARCHY_4;
  1123. deb_info("4\n");
  1124. break;
  1125. }
  1126. /* high/low priority */
  1127. ret =
  1128. af9005_read_register_bits(state->d, xd_g_reg_dec_pri,
  1129. reg_dec_pri_pos, reg_dec_pri_len, &temp);
  1130. if (ret)
  1131. return ret;
  1132. /* if temp is set = high priority */
  1133. deb_info("PRIORITY %s\n", temp ? "high" : "low");
  1134. /* high coderate */
  1135. ret =
  1136. af9005_read_register_bits(state->d, xd_g_reg_tpsd_hpcr,
  1137. reg_tpsd_hpcr_pos, reg_tpsd_hpcr_len,
  1138. &temp);
  1139. if (ret)
  1140. return ret;
  1141. deb_info("CODERATE HP ");
  1142. switch (temp) {
  1143. case 0:
  1144. fep->code_rate_HP = FEC_1_2;
  1145. deb_info("FEC_1_2\n");
  1146. break;
  1147. case 1:
  1148. fep->code_rate_HP = FEC_2_3;
  1149. deb_info("FEC_2_3\n");
  1150. break;
  1151. case 2:
  1152. fep->code_rate_HP = FEC_3_4;
  1153. deb_info("FEC_3_4\n");
  1154. break;
  1155. case 3:
  1156. fep->code_rate_HP = FEC_5_6;
  1157. deb_info("FEC_5_6\n");
  1158. break;
  1159. case 4:
  1160. fep->code_rate_HP = FEC_7_8;
  1161. deb_info("FEC_7_8\n");
  1162. break;
  1163. }
  1164. /* low coderate */
  1165. ret =
  1166. af9005_read_register_bits(state->d, xd_g_reg_tpsd_lpcr,
  1167. reg_tpsd_lpcr_pos, reg_tpsd_lpcr_len,
  1168. &temp);
  1169. if (ret)
  1170. return ret;
  1171. deb_info("CODERATE LP ");
  1172. switch (temp) {
  1173. case 0:
  1174. fep->code_rate_LP = FEC_1_2;
  1175. deb_info("FEC_1_2\n");
  1176. break;
  1177. case 1:
  1178. fep->code_rate_LP = FEC_2_3;
  1179. deb_info("FEC_2_3\n");
  1180. break;
  1181. case 2:
  1182. fep->code_rate_LP = FEC_3_4;
  1183. deb_info("FEC_3_4\n");
  1184. break;
  1185. case 3:
  1186. fep->code_rate_LP = FEC_5_6;
  1187. deb_info("FEC_5_6\n");
  1188. break;
  1189. case 4:
  1190. fep->code_rate_LP = FEC_7_8;
  1191. deb_info("FEC_7_8\n");
  1192. break;
  1193. }
  1194. /* guard interval */
  1195. ret =
  1196. af9005_read_register_bits(state->d, xd_g_reg_tpsd_gi,
  1197. reg_tpsd_gi_pos, reg_tpsd_gi_len, &temp);
  1198. if (ret)
  1199. return ret;
  1200. deb_info("GUARD INTERVAL ");
  1201. switch (temp) {
  1202. case 0:
  1203. fep->guard_interval = GUARD_INTERVAL_1_32;
  1204. deb_info("1_32\n");
  1205. break;
  1206. case 1:
  1207. fep->guard_interval = GUARD_INTERVAL_1_16;
  1208. deb_info("1_16\n");
  1209. break;
  1210. case 2:
  1211. fep->guard_interval = GUARD_INTERVAL_1_8;
  1212. deb_info("1_8\n");
  1213. break;
  1214. case 3:
  1215. fep->guard_interval = GUARD_INTERVAL_1_4;
  1216. deb_info("1_4\n");
  1217. break;
  1218. }
  1219. /* fft */
  1220. ret =
  1221. af9005_read_register_bits(state->d, xd_g_reg_tpsd_txmod,
  1222. reg_tpsd_txmod_pos, reg_tpsd_txmod_len,
  1223. &temp);
  1224. if (ret)
  1225. return ret;
  1226. deb_info("TRANSMISSION MODE ");
  1227. switch (temp) {
  1228. case 0:
  1229. fep->transmission_mode = TRANSMISSION_MODE_2K;
  1230. deb_info("2K\n");
  1231. break;
  1232. case 1:
  1233. fep->transmission_mode = TRANSMISSION_MODE_8K;
  1234. deb_info("8K\n");
  1235. break;
  1236. }
  1237. /* bandwidth */
  1238. ret =
  1239. af9005_read_register_bits(state->d, xd_g_reg_bw, reg_bw_pos,
  1240. reg_bw_len, &temp);
  1241. deb_info("BANDWIDTH ");
  1242. switch (temp) {
  1243. case 0:
  1244. fep->bandwidth_hz = 6000000;
  1245. deb_info("6\n");
  1246. break;
  1247. case 1:
  1248. fep->bandwidth_hz = 7000000;
  1249. deb_info("7\n");
  1250. break;
  1251. case 2:
  1252. fep->bandwidth_hz = 8000000;
  1253. deb_info("8\n");
  1254. break;
  1255. }
  1256. return 0;
  1257. }
  1258. static void af9005_fe_release(struct dvb_frontend *fe)
  1259. {
  1260. struct af9005_fe_state *state =
  1261. (struct af9005_fe_state *)fe->demodulator_priv;
  1262. kfree(state);
  1263. }
  1264. static const struct dvb_frontend_ops af9005_fe_ops;
  1265. struct dvb_frontend *af9005_fe_attach(struct dvb_usb_device *d)
  1266. {
  1267. struct af9005_fe_state *state = NULL;
  1268. /* allocate memory for the internal state */
  1269. state = kzalloc(sizeof(struct af9005_fe_state), GFP_KERNEL);
  1270. if (state == NULL)
  1271. goto error;
  1272. deb_info("attaching frontend af9005\n");
  1273. state->d = d;
  1274. state->opened = 0;
  1275. memcpy(&state->frontend.ops, &af9005_fe_ops,
  1276. sizeof(struct dvb_frontend_ops));
  1277. state->frontend.demodulator_priv = state;
  1278. return &state->frontend;
  1279. error:
  1280. return NULL;
  1281. }
  1282. static const struct dvb_frontend_ops af9005_fe_ops = {
  1283. .delsys = { SYS_DVBT },
  1284. .info = {
  1285. .name = "AF9005 USB DVB-T",
  1286. .frequency_min_hz = 44250 * kHz,
  1287. .frequency_max_hz = 867250 * kHz,
  1288. .frequency_stepsize_hz = 250 * kHz,
  1289. .caps = FE_CAN_INVERSION_AUTO |
  1290. FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
  1291. FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
  1292. FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
  1293. FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO |
  1294. FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER |
  1295. FE_CAN_HIERARCHY_AUTO,
  1296. },
  1297. .release = af9005_fe_release,
  1298. .init = af9005_fe_init,
  1299. .sleep = af9005_fe_sleep,
  1300. .ts_bus_ctrl = af9005_ts_bus_ctrl,
  1301. .set_frontend = af9005_fe_set_frontend,
  1302. .get_frontend = af9005_fe_get_frontend,
  1303. .read_status = af9005_fe_read_status,
  1304. .read_ber = af9005_fe_read_ber,
  1305. .read_signal_strength = af9005_fe_read_signal_strength,
  1306. .read_snr = af9005_fe_read_snr,
  1307. .read_ucblocks = af9005_fe_read_unc_blocks,
  1308. };