Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
af9005-fe.c
Go to the documentation of this file.
1 /* Frontend part of the Linux driver for the Afatech 9005
2  * USB1.1 DVB-T receiver.
3  *
4  * Copyright (C) 2007 Luca Olivetti ([email protected])
5  *
6  * Thanks to Afatech who kindly provided information.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  * see Documentation/dvb/README.dvb-usb for more information
23  */
24 #include "af9005.h"
25 #include "af9005-script.h"
26 #include "mt2060.h"
27 #include "qt1010.h"
28 #include <asm/div64.h>
29 
31  struct dvb_usb_device *d;
33 
34  /* retraining parameters */
46 
47  /* statistics */
55 
56  int opened;
57  int strong;
58  unsigned long next_status_check;
60 };
61 
62 static int af9005_write_word_agc(struct dvb_usb_device *d, u16 reghi,
63  u16 reglo, u8 pos, u8 len, u16 value)
64 {
65  int ret;
66 
67  if ((ret = af9005_write_ofdm_register(d, reglo, (u8) (value & 0xff))))
68  return ret;
69  return af9005_write_register_bits(d, reghi, pos, len,
70  (u8) ((value & 0x300) >> 8));
71 }
72 
73 static int af9005_read_word_agc(struct dvb_usb_device *d, u16 reghi,
74  u16 reglo, u8 pos, u8 len, u16 * value)
75 {
76  int ret;
77  u8 temp0, temp1;
78 
79  if ((ret = af9005_read_ofdm_register(d, reglo, &temp0)))
80  return ret;
81  if ((ret = af9005_read_ofdm_register(d, reghi, &temp1)))
82  return ret;
83  switch (pos) {
84  case 0:
85  *value = ((u16) (temp1 & 0x03) << 8) + (u16) temp0;
86  break;
87  case 2:
88  *value = ((u16) (temp1 & 0x0C) << 6) + (u16) temp0;
89  break;
90  case 4:
91  *value = ((u16) (temp1 & 0x30) << 4) + (u16) temp0;
92  break;
93  case 6:
94  *value = ((u16) (temp1 & 0xC0) << 2) + (u16) temp0;
95  break;
96  default:
97  err("invalid pos in read word agc");
98  return -EINVAL;
99  }
100  return 0;
101 
102 }
103 
104 static int af9005_is_fecmon_available(struct dvb_frontend *fe, int *available)
105 {
106  struct af9005_fe_state *state = fe->demodulator_priv;
107  int ret;
108  u8 temp;
109 
110  *available = false;
111 
114  fec_vtb_rsd_mon_en_len, &temp);
115  if (ret)
116  return ret;
117  if (temp & 1) {
118  ret =
122  reg_ofsm_read_rbc_en_len, &temp);
123  if (ret)
124  return ret;
125  if ((temp & 1) == 0)
126  *available = true;
127 
128  }
129  return 0;
130 }
131 
132 static int af9005_get_post_vit_err_cw_count(struct dvb_frontend *fe,
133  u32 * post_err_count,
134  u32 * post_cw_count,
135  u16 * abort_count)
136 {
137  struct af9005_fe_state *state = fe->demodulator_priv;
138  int ret;
139  u32 err_count;
140  u32 cw_count;
141  u8 temp, temp0, temp1, temp2;
142  u16 loc_abort_count;
143 
144  *post_err_count = 0;
145  *post_cw_count = 0;
146 
147  /* check if error bit count is ready */
148  ret =
151  &temp);
152  if (ret)
153  return ret;
154  if (!temp) {
155  deb_info("rsd counter not ready\n");
156  return 100;
157  }
158  /* get abort count */
159  ret =
162  &temp0);
163  if (ret)
164  return ret;
165  ret =
168  &temp1);
169  if (ret)
170  return ret;
171  loc_abort_count = ((u16) temp1 << 8) + temp0;
172 
173  /* get error count */
174  ret =
176  &temp0);
177  if (ret)
178  return ret;
179  ret =
181  &temp1);
182  if (ret)
183  return ret;
184  ret =
186  &temp2);
187  if (ret)
188  return ret;
189  err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
190  *post_err_count = err_count - (u32) loc_abort_count *8 * 8;
191 
192  /* get RSD packet number */
193  ret =
195  &temp0);
196  if (ret)
197  return ret;
198  ret =
200  &temp1);
201  if (ret)
202  return ret;
203  cw_count = ((u32) temp1 << 8) + temp0;
204  if (cw_count == 0) {
205  err("wrong RSD packet count");
206  return -EIO;
207  }
208  deb_info("POST abort count %d err count %d rsd packets %d\n",
209  loc_abort_count, err_count, cw_count);
210  *post_cw_count = cw_count - (u32) loc_abort_count;
211  *abort_count = loc_abort_count;
212  return 0;
213 
214 }
215 
216 static int af9005_get_post_vit_ber(struct dvb_frontend *fe,
217  u32 * post_err_count, u32 * post_cw_count,
218  u16 * abort_count)
219 {
220  u32 loc_cw_count = 0, loc_err_count;
221  u16 loc_abort_count = 0;
222  int ret;
223 
224  ret =
225  af9005_get_post_vit_err_cw_count(fe, &loc_err_count, &loc_cw_count,
226  &loc_abort_count);
227  if (ret)
228  return ret;
229  *post_err_count = loc_err_count;
230  *post_cw_count = loc_cw_count * 204 * 8;
231  *abort_count = loc_abort_count;
232 
233  return 0;
234 }
235 
236 static int af9005_get_pre_vit_err_bit_count(struct dvb_frontend *fe,
237  u32 * pre_err_count,
238  u32 * pre_bit_count)
239 {
240  struct af9005_fe_state *state = fe->demodulator_priv;
241  u8 temp, temp0, temp1, temp2;
242  u32 super_frame_count, x, bits;
243  int ret;
244 
245  ret =
248  &temp);
249  if (ret)
250  return ret;
251  if (!temp) {
252  deb_info("viterbi counter not ready\n");
253  return 101; /* ERR_APO_VTB_COUNTER_NOT_READY; */
254  }
255  ret =
257  &temp0);
258  if (ret)
259  return ret;
260  ret =
262  &temp1);
263  if (ret)
264  return ret;
265  ret =
267  &temp2);
268  if (ret)
269  return ret;
270  *pre_err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
271 
272  ret =
274  &temp0);
275  if (ret)
276  return ret;
277  ret =
279  &temp1);
280  if (ret)
281  return ret;
282  super_frame_count = ((u32) temp1 << 8) + temp0;
283  if (super_frame_count == 0) {
284  deb_info("super frame count 0\n");
285  return 102;
286  }
287 
288  /* read fft mode */
289  ret =
292  &temp);
293  if (ret)
294  return ret;
295  if (temp == 0) {
296  /* 2K */
297  x = 1512;
298  } else if (temp == 1) {
299  /* 8k */
300  x = 6048;
301  } else {
302  err("Invalid fft mode");
303  return -EINVAL;
304  }
305 
306  /* read modulation mode */
307  ret =
310  &temp);
311  if (ret)
312  return ret;
313  switch (temp) {
314  case 0: /* QPSK */
315  bits = 2;
316  break;
317  case 1: /* QAM_16 */
318  bits = 4;
319  break;
320  case 2: /* QAM_64 */
321  bits = 6;
322  break;
323  default:
324  err("invalid modulation mode");
325  return -EINVAL;
326  }
327  *pre_bit_count = super_frame_count * 68 * 4 * x * bits;
328  deb_info("PRE err count %d frame count %d bit count %d\n",
329  *pre_err_count, super_frame_count, *pre_bit_count);
330  return 0;
331 }
332 
333 static int af9005_reset_pre_viterbi(struct dvb_frontend *fe)
334 {
335  struct af9005_fe_state *state = fe->demodulator_priv;
336  int ret;
337 
338  /* set super frame count to 1 */
339  ret =
341  1 & 0xff);
342  if (ret)
343  return ret;
345  1 >> 8);
346  if (ret)
347  return ret;
348  /* reset pre viterbi error count */
349  ret =
352  1);
353 
354  return ret;
355 }
356 
357 static int af9005_reset_post_viterbi(struct dvb_frontend *fe)
358 {
359  struct af9005_fe_state *state = fe->demodulator_priv;
360  int ret;
361 
362  /* set packet unit */
363  ret =
365  10000 & 0xff);
366  if (ret)
367  return ret;
368  ret =
370  10000 >> 8);
371  if (ret)
372  return ret;
373  /* reset post viterbi error count */
374  ret =
377  1);
378 
379  return ret;
380 }
381 
382 static int af9005_get_statistic(struct dvb_frontend *fe)
383 {
384  struct af9005_fe_state *state = fe->demodulator_priv;
385  int ret, fecavailable;
386  u64 numerator, denominator;
387 
388  deb_info("GET STATISTIC\n");
389  ret = af9005_is_fecmon_available(fe, &fecavailable);
390  if (ret)
391  return ret;
392  if (!fecavailable) {
393  deb_info("fecmon not available\n");
394  return 0;
395  }
396 
397  ret = af9005_get_pre_vit_err_bit_count(fe, &state->pre_vit_error_count,
398  &state->pre_vit_bit_count);
399  if (ret == 0) {
400  af9005_reset_pre_viterbi(fe);
401  if (state->pre_vit_bit_count > 0) {
402  /* according to v 0.0.4 of the dvb api ber should be a multiple
403  of 10E-9 so we have to multiply the error count by
404  10E9=1000000000 */
405  numerator =
406  (u64) state->pre_vit_error_count * (u64) 1000000000;
407  denominator = (u64) state->pre_vit_bit_count;
408  state->ber = do_div(numerator, denominator);
409  } else {
410  state->ber = 0xffffffff;
411  }
412  }
413 
414  ret = af9005_get_post_vit_ber(fe, &state->post_vit_error_count,
415  &state->post_vit_bit_count,
416  &state->abort_count);
417  if (ret == 0) {
418  ret = af9005_reset_post_viterbi(fe);
419  state->unc += state->abort_count;
420  if (ret)
421  return ret;
422  }
423  return 0;
424 }
425 
426 static int af9005_fe_refresh_state(struct dvb_frontend *fe)
427 {
428  struct af9005_fe_state *state = fe->demodulator_priv;
429  if (time_after(jiffies, state->next_status_check)) {
430  deb_info("REFRESH STATE\n");
431 
432  /* statistics */
433  if (af9005_get_statistic(fe))
434  err("get_statistic_failed");
435  state->next_status_check = jiffies + 250 * HZ / 1000;
436  }
437  return 0;
438 }
439 
440 static int af9005_fe_read_status(struct dvb_frontend *fe, fe_status_t * stat)
441 {
442  struct af9005_fe_state *state = fe->demodulator_priv;
443  u8 temp;
444  int ret;
445 
446  if (fe->ops.tuner_ops.release == NULL)
447  return -ENODEV;
448 
449  *stat = 0;
451  agc_lock_pos, agc_lock_len, &temp);
452  if (ret)
453  return ret;
454  if (temp)
455  *stat |= FE_HAS_SIGNAL;
456 
459  &temp);
460  if (ret)
461  return ret;
462  if (temp)
463  *stat |= FE_HAS_CARRIER;
464 
465  ret = af9005_read_register_bits(state->d,
469  if (ret)
470  return ret;
471  if (temp)
473  if (state->opened)
474  af9005_led_control(state->d, *stat & FE_HAS_LOCK);
475 
476  ret =
480  if (ret)
481  return ret;
482  if (temp != state->strong) {
483  deb_info("adjust for strong signal %d\n", temp);
484  state->strong = temp;
485  }
486  return 0;
487 }
488 
489 static int af9005_fe_read_ber(struct dvb_frontend *fe, u32 * ber)
490 {
491  struct af9005_fe_state *state = fe->demodulator_priv;
492  if (fe->ops.tuner_ops.release == NULL)
493  return -ENODEV;
494  af9005_fe_refresh_state(fe);
495  *ber = state->ber;
496  return 0;
497 }
498 
499 static int af9005_fe_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
500 {
501  struct af9005_fe_state *state = fe->demodulator_priv;
502  if (fe->ops.tuner_ops.release == NULL)
503  return -ENODEV;
504  af9005_fe_refresh_state(fe);
505  *unc = state->unc;
506  return 0;
507 }
508 
509 static int af9005_fe_read_signal_strength(struct dvb_frontend *fe,
510  u16 * strength)
511 {
512  struct af9005_fe_state *state = fe->demodulator_priv;
513  int ret;
514  u8 if_gain, rf_gain;
515 
516  if (fe->ops.tuner_ops.release == NULL)
517  return -ENODEV;
518  ret =
520  &rf_gain);
521  if (ret)
522  return ret;
523  ret =
525  &if_gain);
526  if (ret)
527  return ret;
528  /* this value has no real meaning, but i don't have the tables that relate
529  the rf and if gain with the dbm, so I just scale the value */
530  *strength = (512 - rf_gain - if_gain) << 7;
531  return 0;
532 }
533 
534 static int af9005_fe_read_snr(struct dvb_frontend *fe, u16 * snr)
535 {
536  /* the snr can be derived from the ber and the modulation
537  but I don't think this kind of complex calculations belong
538  in the driver. I may be wrong.... */
539  return -ENOSYS;
540 }
541 
542 static int af9005_fe_program_cfoe(struct dvb_usb_device *d, u32 bw)
543 {
544  u8 temp0, temp1, temp2, temp3, buf[4];
545  int ret;
546  u32 NS_coeff1_2048Nu;
547  u32 NS_coeff1_8191Nu;
548  u32 NS_coeff1_8192Nu;
549  u32 NS_coeff1_8193Nu;
550  u32 NS_coeff2_2k;
551  u32 NS_coeff2_8k;
552 
553  switch (bw) {
554  case 6000000:
555  NS_coeff1_2048Nu = 0x2ADB6DC;
556  NS_coeff1_8191Nu = 0xAB7313;
557  NS_coeff1_8192Nu = 0xAB6DB7;
558  NS_coeff1_8193Nu = 0xAB685C;
559  NS_coeff2_2k = 0x156DB6E;
560  NS_coeff2_8k = 0x55B6DC;
561  break;
562 
563  case 7000000:
564  NS_coeff1_2048Nu = 0x3200001;
565  NS_coeff1_8191Nu = 0xC80640;
566  NS_coeff1_8192Nu = 0xC80000;
567  NS_coeff1_8193Nu = 0xC7F9C0;
568  NS_coeff2_2k = 0x1900000;
569  NS_coeff2_8k = 0x640000;
570  break;
571 
572  case 8000000:
573  NS_coeff1_2048Nu = 0x3924926;
574  NS_coeff1_8191Nu = 0xE4996E;
575  NS_coeff1_8192Nu = 0xE49249;
576  NS_coeff1_8193Nu = 0xE48B25;
577  NS_coeff2_2k = 0x1C92493;
578  NS_coeff2_8k = 0x724925;
579  break;
580  default:
581  err("Invalid bandwidth %d.", bw);
582  return -EINVAL;
583  }
584 
585  /*
586  * write NS_coeff1_2048Nu
587  */
588 
589  temp0 = (u8) (NS_coeff1_2048Nu & 0x000000FF);
590  temp1 = (u8) ((NS_coeff1_2048Nu & 0x0000FF00) >> 8);
591  temp2 = (u8) ((NS_coeff1_2048Nu & 0x00FF0000) >> 16);
592  temp3 = (u8) ((NS_coeff1_2048Nu & 0x03000000) >> 24);
593 
594  /* big endian to make 8051 happy */
595  buf[0] = temp3;
596  buf[1] = temp2;
597  buf[2] = temp1;
598  buf[3] = temp0;
599 
600  /* cfoe_NS_2k_coeff1_25_24 */
601  ret = af9005_write_ofdm_register(d, 0xAE00, buf[0]);
602  if (ret)
603  return ret;
604 
605  /* cfoe_NS_2k_coeff1_23_16 */
606  ret = af9005_write_ofdm_register(d, 0xAE01, buf[1]);
607  if (ret)
608  return ret;
609 
610  /* cfoe_NS_2k_coeff1_15_8 */
611  ret = af9005_write_ofdm_register(d, 0xAE02, buf[2]);
612  if (ret)
613  return ret;
614 
615  /* cfoe_NS_2k_coeff1_7_0 */
616  ret = af9005_write_ofdm_register(d, 0xAE03, buf[3]);
617  if (ret)
618  return ret;
619 
620  /*
621  * write NS_coeff2_2k
622  */
623 
624  temp0 = (u8) ((NS_coeff2_2k & 0x0000003F));
625  temp1 = (u8) ((NS_coeff2_2k & 0x00003FC0) >> 6);
626  temp2 = (u8) ((NS_coeff2_2k & 0x003FC000) >> 14);
627  temp3 = (u8) ((NS_coeff2_2k & 0x01C00000) >> 22);
628 
629  /* big endian to make 8051 happy */
630  buf[0] = temp3;
631  buf[1] = temp2;
632  buf[2] = temp1;
633  buf[3] = temp0;
634 
635  ret = af9005_write_ofdm_register(d, 0xAE04, buf[0]);
636  if (ret)
637  return ret;
638 
639  ret = af9005_write_ofdm_register(d, 0xAE05, buf[1]);
640  if (ret)
641  return ret;
642 
643  ret = af9005_write_ofdm_register(d, 0xAE06, buf[2]);
644  if (ret)
645  return ret;
646 
647  ret = af9005_write_ofdm_register(d, 0xAE07, buf[3]);
648  if (ret)
649  return ret;
650 
651  /*
652  * write NS_coeff1_8191Nu
653  */
654 
655  temp0 = (u8) ((NS_coeff1_8191Nu & 0x000000FF));
656  temp1 = (u8) ((NS_coeff1_8191Nu & 0x0000FF00) >> 8);
657  temp2 = (u8) ((NS_coeff1_8191Nu & 0x00FFC000) >> 16);
658  temp3 = (u8) ((NS_coeff1_8191Nu & 0x03000000) >> 24);
659 
660  /* big endian to make 8051 happy */
661  buf[0] = temp3;
662  buf[1] = temp2;
663  buf[2] = temp1;
664  buf[3] = temp0;
665 
666  ret = af9005_write_ofdm_register(d, 0xAE08, buf[0]);
667  if (ret)
668  return ret;
669 
670  ret = af9005_write_ofdm_register(d, 0xAE09, buf[1]);
671  if (ret)
672  return ret;
673 
674  ret = af9005_write_ofdm_register(d, 0xAE0A, buf[2]);
675  if (ret)
676  return ret;
677 
678  ret = af9005_write_ofdm_register(d, 0xAE0B, buf[3]);
679  if (ret)
680  return ret;
681 
682  /*
683  * write NS_coeff1_8192Nu
684  */
685 
686  temp0 = (u8) (NS_coeff1_8192Nu & 0x000000FF);
687  temp1 = (u8) ((NS_coeff1_8192Nu & 0x0000FF00) >> 8);
688  temp2 = (u8) ((NS_coeff1_8192Nu & 0x00FFC000) >> 16);
689  temp3 = (u8) ((NS_coeff1_8192Nu & 0x03000000) >> 24);
690 
691  /* big endian to make 8051 happy */
692  buf[0] = temp3;
693  buf[1] = temp2;
694  buf[2] = temp1;
695  buf[3] = temp0;
696 
697  ret = af9005_write_ofdm_register(d, 0xAE0C, buf[0]);
698  if (ret)
699  return ret;
700 
701  ret = af9005_write_ofdm_register(d, 0xAE0D, buf[1]);
702  if (ret)
703  return ret;
704 
705  ret = af9005_write_ofdm_register(d, 0xAE0E, buf[2]);
706  if (ret)
707  return ret;
708 
709  ret = af9005_write_ofdm_register(d, 0xAE0F, buf[3]);
710  if (ret)
711  return ret;
712 
713  /*
714  * write NS_coeff1_8193Nu
715  */
716 
717  temp0 = (u8) ((NS_coeff1_8193Nu & 0x000000FF));
718  temp1 = (u8) ((NS_coeff1_8193Nu & 0x0000FF00) >> 8);
719  temp2 = (u8) ((NS_coeff1_8193Nu & 0x00FFC000) >> 16);
720  temp3 = (u8) ((NS_coeff1_8193Nu & 0x03000000) >> 24);
721 
722  /* big endian to make 8051 happy */
723  buf[0] = temp3;
724  buf[1] = temp2;
725  buf[2] = temp1;
726  buf[3] = temp0;
727 
728  ret = af9005_write_ofdm_register(d, 0xAE10, buf[0]);
729  if (ret)
730  return ret;
731 
732  ret = af9005_write_ofdm_register(d, 0xAE11, buf[1]);
733  if (ret)
734  return ret;
735 
736  ret = af9005_write_ofdm_register(d, 0xAE12, buf[2]);
737  if (ret)
738  return ret;
739 
740  ret = af9005_write_ofdm_register(d, 0xAE13, buf[3]);
741  if (ret)
742  return ret;
743 
744  /*
745  * write NS_coeff2_8k
746  */
747 
748  temp0 = (u8) ((NS_coeff2_8k & 0x0000003F));
749  temp1 = (u8) ((NS_coeff2_8k & 0x00003FC0) >> 6);
750  temp2 = (u8) ((NS_coeff2_8k & 0x003FC000) >> 14);
751  temp3 = (u8) ((NS_coeff2_8k & 0x01C00000) >> 22);
752 
753  /* big endian to make 8051 happy */
754  buf[0] = temp3;
755  buf[1] = temp2;
756  buf[2] = temp1;
757  buf[3] = temp0;
758 
759  ret = af9005_write_ofdm_register(d, 0xAE14, buf[0]);
760  if (ret)
761  return ret;
762 
763  ret = af9005_write_ofdm_register(d, 0xAE15, buf[1]);
764  if (ret)
765  return ret;
766 
767  ret = af9005_write_ofdm_register(d, 0xAE16, buf[2]);
768  if (ret)
769  return ret;
770 
771  ret = af9005_write_ofdm_register(d, 0xAE17, buf[3]);
772  return ret;
773 
774 }
775 
776 static int af9005_fe_select_bw(struct dvb_usb_device *d, u32 bw)
777 {
778  u8 temp;
779  switch (bw) {
780  case 6000000:
781  temp = 0;
782  break;
783  case 7000000:
784  temp = 1;
785  break;
786  case 8000000:
787  temp = 2;
788  break;
789  default:
790  err("Invalid bandwidth %d.", bw);
791  return -EINVAL;
792  }
794  reg_bw_len, temp);
795 }
796 
797 static int af9005_fe_power(struct dvb_frontend *fe, int on)
798 {
799  struct af9005_fe_state *state = fe->demodulator_priv;
800  u8 temp = on;
801  int ret;
802  deb_info("power %s tuner\n", on ? "on" : "off");
803  ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
804  return ret;
805 }
806 
807 static struct mt2060_config af9005_mt2060_config = {
808  0xC0
809 };
810 
811 static struct qt1010_config af9005_qt1010_config = {
812  0xC4
813 };
814 
815 static int af9005_fe_init(struct dvb_frontend *fe)
816 {
817  struct af9005_fe_state *state = fe->demodulator_priv;
818  struct dvb_usb_adapter *adap = fe->dvb->priv;
819  int ret, i, scriptlen;
820  u8 temp, temp0 = 0, temp1 = 0, temp2 = 0;
821  u8 buf[2];
822  u16 if1;
823 
824  deb_info("in af9005_fe_init\n");
825 
826  /* reset */
827  deb_info("reset\n");
828  if ((ret =
830  4, 1, 0x01)))
831  return ret;
832  if ((ret = af9005_write_ofdm_register(state->d, APO_REG_RESET, 0)))
833  return ret;
834  /* clear ofdm reset */
835  deb_info("clear ofdm reset\n");
836  for (i = 0; i < 150; i++) {
837  if ((ret =
839  xd_I2C_reg_ofdm_rst, &temp)))
840  return ret;
841  if (temp & (regmask[reg_ofdm_rst_len - 1] << reg_ofdm_rst_pos))
842  break;
843  msleep(10);
844  }
845  if (i == 150)
846  return -ETIMEDOUT;
847 
848  /*FIXME in the dump
849  write B200 A9
850  write xd_g_reg_ofsm_clk 7
851  read eepr c6 (2)
852  read eepr c7 (2)
853  misc ctrl 3 -> 1
854  read eepr ca (6)
855  write xd_g_reg_ofsm_clk 0
856  write B200 a1
857  */
858  ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa9);
859  if (ret)
860  return ret;
861  ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x07);
862  if (ret)
863  return ret;
864  temp = 0x01;
865  ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
866  if (ret)
867  return ret;
868  ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x00);
869  if (ret)
870  return ret;
871  ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa1);
872  if (ret)
873  return ret;
874 
876  if ((ret =
878  reg_ofdm_rst_pos, reg_ofdm_rst_len, 1)))
879  return ret;
881  reg_ofdm_rst_pos, reg_ofdm_rst_len, 0);
882 
883  if (ret)
884  return ret;
885  /* don't know what register aefc is, but this is what the windows driver does */
886  ret = af9005_write_ofdm_register(state->d, 0xaefc, 0);
887  if (ret)
888  return ret;
889 
890  /* set stand alone chip */
891  deb_info("set stand alone chip\n");
892  if ((ret =
896  return ret;
897 
898  /* set dca upper & lower chip */
899  deb_info("set dca upper & lower chip\n");
900  if ((ret =
904  return ret;
905  if ((ret =
909  return ret;
910 
911  /* set 2wire master clock to 0x14 (for 60KHz) */
912  deb_info("set 2wire master clock to 0x14 (for 60KHz)\n");
913  if ((ret =
915  return ret;
916 
917  /* clear dca enable chip */
918  deb_info("clear dca enable chip\n");
919  if ((ret =
922  return ret;
923  /* FIXME these are register bits, but I don't know which ones */
924  ret = af9005_write_ofdm_register(state->d, 0xa16c, 1);
925  if (ret)
926  return ret;
927  ret = af9005_write_ofdm_register(state->d, 0xa3c1, 0);
928  if (ret)
929  return ret;
930 
931  /* init other parameters: program cfoe and select bandwidth */
932  deb_info("program cfoe\n");
933  ret = af9005_fe_program_cfoe(state->d, 6000000);
934  if (ret)
935  return ret;
936  /* set read-update bit for modulation */
937  deb_info("set read-update bit for modulation\n");
938  if ((ret =
942  return ret;
943 
944  /* sample code has a set MPEG TS code here
945  but sniffing reveals that it doesn't do it */
946 
947  /* set read-update bit to 1 for DCA modulation */
948  deb_info("set read-update bit 1 for DCA modulation\n");
949  if ((ret =
953  return ret;
954 
955  /* enable fec monitor */
956  deb_info("enable fec monitor\n");
957  if ((ret =
961  return ret;
962 
963  /* FIXME should be register bits, I don't know which ones */
964  ret = af9005_write_ofdm_register(state->d, 0xa601, 0);
965 
966  /* set api_retrain_never_freeze */
967  deb_info("set api_retrain_never_freeze\n");
968  if ((ret = af9005_write_ofdm_register(state->d, 0xaefb, 0x01)))
969  return ret;
970 
971  /* load init script */
972  deb_info("load init script\n");
973  scriptlen = sizeof(script) / sizeof(RegDesc);
974  for (i = 0; i < scriptlen; i++) {
975  if ((ret =
976  af9005_write_register_bits(state->d, script[i].reg,
977  script[i].pos,
978  script[i].len, script[i].val)))
979  return ret;
980  /* save 3 bytes of original fcw */
981  if (script[i].reg == 0xae18)
982  temp2 = script[i].val;
983  if (script[i].reg == 0xae19)
984  temp1 = script[i].val;
985  if (script[i].reg == 0xae1a)
986  temp0 = script[i].val;
987 
988  /* save original unplug threshold */
989  if (script[i].reg == xd_p_reg_unplug_th)
990  state->original_if_unplug_th = script[i].val;
992  state->original_rf_unplug_th = script[i].val;
994  state->original_dtop_if_unplug_th = script[i].val;
996  state->original_dtop_rf_unplug_th = script[i].val;
997 
998  }
999  state->original_fcw =
1000  ((u32) temp2 << 16) + ((u32) temp1 << 8) + (u32) temp0;
1001 
1002 
1003  /* save original TOPs */
1004  deb_info("save original TOPs\n");
1005 
1006  /* RF TOP */
1007  ret =
1008  af9005_read_word_agc(state->d,
1011  &state->original_rf_top);
1012  if (ret)
1013  return ret;
1014 
1015  /* IF TOP */
1016  ret =
1017  af9005_read_word_agc(state->d,
1020  &state->original_if_top);
1021  if (ret)
1022  return ret;
1023 
1024  /* ACI 0 IF TOP */
1025  ret =
1026  af9005_read_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
1027  &state->original_aci0_if_top);
1028  if (ret)
1029  return ret;
1030 
1031  /* ACI 1 IF TOP */
1032  ret =
1033  af9005_read_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
1034  &state->original_aci1_if_top);
1035  if (ret)
1036  return ret;
1037 
1038  /* attach tuner and init */
1039  if (fe->ops.tuner_ops.release == NULL) {
1040  /* read tuner and board id from eeprom */
1041  ret = af9005_read_eeprom(adap->dev, 0xc6, buf, 2);
1042  if (ret) {
1043  err("Impossible to read EEPROM\n");
1044  return ret;
1045  }
1046  deb_info("Tuner id %d, board id %d\n", buf[0], buf[1]);
1047  switch (buf[0]) {
1048  case 2: /* MT2060 */
1049  /* read if1 from eeprom */
1050  ret = af9005_read_eeprom(adap->dev, 0xc8, buf, 2);
1051  if (ret) {
1052  err("Impossible to read EEPROM\n");
1053  return ret;
1054  }
1055  if1 = (u16) (buf[0] << 8) + buf[1];
1056  if (dvb_attach(mt2060_attach, fe, &adap->dev->i2c_adap,
1057  &af9005_mt2060_config, if1) == NULL) {
1058  deb_info("MT2060 attach failed\n");
1059  return -ENODEV;
1060  }
1061  break;
1062  case 3: /* QT1010 */
1063  case 9: /* QT1010B */
1064  if (dvb_attach(qt1010_attach, fe, &adap->dev->i2c_adap,
1065  &af9005_qt1010_config) ==NULL) {
1066  deb_info("QT1010 attach failed\n");
1067  return -ENODEV;
1068  }
1069  break;
1070  default:
1071  err("Unsupported tuner type %d", buf[0]);
1072  return -ENODEV;
1073  }
1074  ret = fe->ops.tuner_ops.init(fe);
1075  if (ret)
1076  return ret;
1077  }
1078 
1079  deb_info("profit!\n");
1080  return 0;
1081 }
1082 
1083 static int af9005_fe_sleep(struct dvb_frontend *fe)
1084 {
1085  return af9005_fe_power(fe, 0);
1086 }
1087 
1088 static int af9005_ts_bus_ctrl(struct dvb_frontend *fe, int acquire)
1089 {
1090  struct af9005_fe_state *state = fe->demodulator_priv;
1091 
1092  if (acquire) {
1093  state->opened++;
1094  } else {
1095 
1096  state->opened--;
1097  if (!state->opened)
1098  af9005_led_control(state->d, 0);
1099  }
1100  return 0;
1101 }
1102 
1103 static int af9005_fe_set_frontend(struct dvb_frontend *fe)
1104 {
1105  struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1106  struct af9005_fe_state *state = fe->demodulator_priv;
1107  int ret;
1108  u8 temp, temp0, temp1, temp2;
1109 
1110  deb_info("af9005_fe_set_frontend freq %d bw %d\n", fep->frequency,
1111  fep->bandwidth_hz);
1112  if (fe->ops.tuner_ops.release == NULL) {
1113  err("Tuner not attached");
1114  return -ENODEV;
1115  }
1116 
1117  deb_info("turn off led\n");
1118  /* not in the log */
1119  ret = af9005_led_control(state->d, 0);
1120  if (ret)
1121  return ret;
1122  /* not sure about the bits */
1123  ret = af9005_write_register_bits(state->d, XD_MP2IF_MISC, 2, 1, 0);
1124  if (ret)
1125  return ret;
1126 
1127  /* set FCW to default value */
1128  deb_info("set FCW to default value\n");
1129  temp0 = (u8) (state->original_fcw & 0x000000ff);
1130  temp1 = (u8) ((state->original_fcw & 0x0000ff00) >> 8);
1131  temp2 = (u8) ((state->original_fcw & 0x00ff0000) >> 16);
1132  ret = af9005_write_ofdm_register(state->d, 0xae1a, temp0);
1133  if (ret)
1134  return ret;
1135  ret = af9005_write_ofdm_register(state->d, 0xae19, temp1);
1136  if (ret)
1137  return ret;
1138  ret = af9005_write_ofdm_register(state->d, 0xae18, temp2);
1139  if (ret)
1140  return ret;
1141 
1142  /* restore original TOPs */
1143  deb_info("restore original TOPs\n");
1144  ret =
1145  af9005_write_word_agc(state->d,
1148  state->original_rf_top);
1149  if (ret)
1150  return ret;
1151  ret =
1152  af9005_write_word_agc(state->d,
1155  state->original_if_top);
1156  if (ret)
1157  return ret;
1158  ret =
1159  af9005_write_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
1160  state->original_aci0_if_top);
1161  if (ret)
1162  return ret;
1163  ret =
1164  af9005_write_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
1165  state->original_aci1_if_top);
1166  if (ret)
1167  return ret;
1168 
1169  /* select bandwidth */
1170  deb_info("select bandwidth");
1171  ret = af9005_fe_select_bw(state->d, fep->bandwidth_hz);
1172  if (ret)
1173  return ret;
1174  ret = af9005_fe_program_cfoe(state->d, fep->bandwidth_hz);
1175  if (ret)
1176  return ret;
1177 
1178  /* clear easy mode flag */
1179  deb_info("clear easy mode flag\n");
1180  ret = af9005_write_ofdm_register(state->d, 0xaefd, 0);
1181  if (ret)
1182  return ret;
1183 
1184  /* set unplug threshold to original value */
1185  deb_info("set unplug threshold to original value\n");
1186  ret =
1188  state->original_if_unplug_th);
1189  if (ret)
1190  return ret;
1191  /* set tuner */
1192  deb_info("set tuner\n");
1193  ret = fe->ops.tuner_ops.set_params(fe);
1194  if (ret)
1195  return ret;
1196 
1197  /* trigger ofsm */
1198  deb_info("trigger ofsm\n");
1199  temp = 0;
1200  ret = af9005_write_tuner_registers(state->d, 0xffff, &temp, 1);
1201  if (ret)
1202  return ret;
1203 
1204  /* clear retrain and freeze flag */
1205  deb_info("clear retrain and freeze flag\n");
1206  ret =
1210  if (ret)
1211  return ret;
1212 
1213  /* reset pre viterbi and post viterbi registers and statistics */
1214  af9005_reset_pre_viterbi(fe);
1215  af9005_reset_post_viterbi(fe);
1216  state->pre_vit_error_count = 0;
1217  state->pre_vit_bit_count = 0;
1218  state->ber = 0;
1219  state->post_vit_error_count = 0;
1220  /* state->unc = 0; commented out since it should be ever increasing */
1221  state->abort_count = 0;
1222 
1223  state->next_status_check = jiffies;
1224  state->strong = -1;
1225 
1226  return 0;
1227 }
1228 
1229 static int af9005_fe_get_frontend(struct dvb_frontend *fe)
1230 {
1231  struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1232  struct af9005_fe_state *state = fe->demodulator_priv;
1233  int ret;
1234  u8 temp;
1235 
1236  /* mode */
1237  ret =
1240  &temp);
1241  if (ret)
1242  return ret;
1243  deb_info("===== fe_get_frontend_legacy = =============\n");
1244  deb_info("CONSTELLATION ");
1245  switch (temp) {
1246  case 0:
1247  fep->modulation = QPSK;
1248  deb_info("QPSK\n");
1249  break;
1250  case 1:
1251  fep->modulation = QAM_16;
1252  deb_info("QAM_16\n");
1253  break;
1254  case 2:
1255  fep->modulation = QAM_64;
1256  deb_info("QAM_64\n");
1257  break;
1258  }
1259 
1260  /* tps hierarchy and alpha value */
1261  ret =
1264  &temp);
1265  if (ret)
1266  return ret;
1267  deb_info("HIERARCHY ");
1268  switch (temp) {
1269  case 0:
1270  fep->hierarchy = HIERARCHY_NONE;
1271  deb_info("NONE\n");
1272  break;
1273  case 1:
1274  fep->hierarchy = HIERARCHY_1;
1275  deb_info("1\n");
1276  break;
1277  case 2:
1278  fep->hierarchy = HIERARCHY_2;
1279  deb_info("2\n");
1280  break;
1281  case 3:
1282  fep->hierarchy = HIERARCHY_4;
1283  deb_info("4\n");
1284  break;
1285  }
1286 
1287  /* high/low priority */
1288  ret =
1291  if (ret)
1292  return ret;
1293  /* if temp is set = high priority */
1294  deb_info("PRIORITY %s\n", temp ? "high" : "low");
1295 
1296  /* high coderate */
1297  ret =
1300  &temp);
1301  if (ret)
1302  return ret;
1303  deb_info("CODERATE HP ");
1304  switch (temp) {
1305  case 0:
1306  fep->code_rate_HP = FEC_1_2;
1307  deb_info("FEC_1_2\n");
1308  break;
1309  case 1:
1310  fep->code_rate_HP = FEC_2_3;
1311  deb_info("FEC_2_3\n");
1312  break;
1313  case 2:
1314  fep->code_rate_HP = FEC_3_4;
1315  deb_info("FEC_3_4\n");
1316  break;
1317  case 3:
1318  fep->code_rate_HP = FEC_5_6;
1319  deb_info("FEC_5_6\n");
1320  break;
1321  case 4:
1322  fep->code_rate_HP = FEC_7_8;
1323  deb_info("FEC_7_8\n");
1324  break;
1325  }
1326 
1327  /* low coderate */
1328  ret =
1331  &temp);
1332  if (ret)
1333  return ret;
1334  deb_info("CODERATE LP ");
1335  switch (temp) {
1336  case 0:
1337  fep->code_rate_LP = FEC_1_2;
1338  deb_info("FEC_1_2\n");
1339  break;
1340  case 1:
1341  fep->code_rate_LP = FEC_2_3;
1342  deb_info("FEC_2_3\n");
1343  break;
1344  case 2:
1345  fep->code_rate_LP = FEC_3_4;
1346  deb_info("FEC_3_4\n");
1347  break;
1348  case 3:
1349  fep->code_rate_LP = FEC_5_6;
1350  deb_info("FEC_5_6\n");
1351  break;
1352  case 4:
1353  fep->code_rate_LP = FEC_7_8;
1354  deb_info("FEC_7_8\n");
1355  break;
1356  }
1357 
1358  /* guard interval */
1359  ret =
1362  if (ret)
1363  return ret;
1364  deb_info("GUARD INTERVAL ");
1365  switch (temp) {
1366  case 0:
1368  deb_info("1_32\n");
1369  break;
1370  case 1:
1372  deb_info("1_16\n");
1373  break;
1374  case 2:
1376  deb_info("1_8\n");
1377  break;
1378  case 3:
1380  deb_info("1_4\n");
1381  break;
1382  }
1383 
1384  /* fft */
1385  ret =
1388  &temp);
1389  if (ret)
1390  return ret;
1391  deb_info("TRANSMISSION MODE ");
1392  switch (temp) {
1393  case 0:
1395  deb_info("2K\n");
1396  break;
1397  case 1:
1399  deb_info("8K\n");
1400  break;
1401  }
1402 
1403  /* bandwidth */
1404  ret =
1406  reg_bw_len, &temp);
1407  deb_info("BANDWIDTH ");
1408  switch (temp) {
1409  case 0:
1410  fep->bandwidth_hz = 6000000;
1411  deb_info("6\n");
1412  break;
1413  case 1:
1414  fep->bandwidth_hz = 7000000;
1415  deb_info("7\n");
1416  break;
1417  case 2:
1418  fep->bandwidth_hz = 8000000;
1419  deb_info("8\n");
1420  break;
1421  }
1422  return 0;
1423 }
1424 
1425 static void af9005_fe_release(struct dvb_frontend *fe)
1426 {
1427  struct af9005_fe_state *state =
1428  (struct af9005_fe_state *)fe->demodulator_priv;
1429  kfree(state);
1430 }
1431 
1432 static struct dvb_frontend_ops af9005_fe_ops;
1433 
1435 {
1436  struct af9005_fe_state *state = NULL;
1437 
1438  /* allocate memory for the internal state */
1439  state = kzalloc(sizeof(struct af9005_fe_state), GFP_KERNEL);
1440  if (state == NULL)
1441  goto error;
1442 
1443  deb_info("attaching frontend af9005\n");
1444 
1445  state->d = d;
1446  state->opened = 0;
1447 
1448  memcpy(&state->frontend.ops, &af9005_fe_ops,
1449  sizeof(struct dvb_frontend_ops));
1450  state->frontend.demodulator_priv = state;
1451 
1452  return &state->frontend;
1453  error:
1454  return NULL;
1455 }
1456 
1457 static struct dvb_frontend_ops af9005_fe_ops = {
1458  .delsys = { SYS_DVBT },
1459  .info = {
1460  .name = "AF9005 USB DVB-T",
1461  .frequency_min = 44250000,
1462  .frequency_max = 867250000,
1463  .frequency_stepsize = 250000,
1464  .caps = FE_CAN_INVERSION_AUTO |
1471  },
1472 
1473  .release = af9005_fe_release,
1474 
1475  .init = af9005_fe_init,
1476  .sleep = af9005_fe_sleep,
1477  .ts_bus_ctrl = af9005_ts_bus_ctrl,
1478 
1479  .set_frontend = af9005_fe_set_frontend,
1480  .get_frontend = af9005_fe_get_frontend,
1481 
1482  .read_status = af9005_fe_read_status,
1483  .read_ber = af9005_fe_read_ber,
1484  .read_signal_strength = af9005_fe_read_signal_strength,
1485  .read_snr = af9005_fe_read_snr,
1486  .read_ucblocks = af9005_fe_read_unc_blocks,
1487 };