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