1 /* DVB USB compliant linux driver for 2 * 3 * DM04/QQBOX DVB-S USB BOX LME2510C + SHARP:BS2F7HZ7395 4 * LME2510C + LG TDQY-P001F 5 * LME2510C + BS2F7HZ0194 6 * LME2510 + LG TDQY-P001F 7 * LME2510 + BS2F7HZ0194 8 * 9 * MVB7395 (LME2510C+SHARP:BS2F7HZ7395) 10 * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V) 11 * 12 * MV001F (LME2510+LGTDQY-P001F) 13 * LG TDQY - P001F =(TDA8263 + TDA10086H) 14 * 15 * MVB0001F (LME2510C+LGTDQT-P001F) 16 * 17 * MV0194 (LME2510+SHARP:BS2F7HZ0194) 18 * SHARP:BS2F7HZ0194 = (STV0299+IX2410) 19 * 20 * MVB0194 (LME2510C+SHARP0194) 21 * 22 * LME2510C + M88RS2000 23 * 24 * For firmware see Documentation/dvb/lmedm04.txt 25 * 26 * I2C addresses: 27 * 0xd0 - STV0288 - Demodulator 28 * 0xc0 - Sharp IX2505V - Tuner 29 * -- 30 * 0x1c - TDA10086 - Demodulator 31 * 0xc0 - TDA8263 - Tuner 32 * -- 33 * 0xd0 - STV0299 - Demodulator 34 * 0xc0 - IX2410 - Tuner 35 * 36 * 37 * VID = 3344 PID LME2510=1122 LME2510C=1120 38 * 39 * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com) 40 * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd. 41 * 42 * This program is free software; you can redistribute it and/or modify 43 * it under the terms of the GNU General Public License Version 2, as 44 * published by the Free Software Foundation. 45 * 46 * This program is distributed in the hope that it will be useful, 47 * but WITHOUT ANY WARRANTY; without even the implied warranty of 48 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 49 * GNU General Public License for more details. 50 * 51 * You should have received a copy of the GNU General Public License 52 * along with this program; if not, write to the Free Software 53 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 54 * 55 * 56 * see Documentation/dvb/README.dvb-usb for more information 57 * 58 * Known Issues : 59 * LME2510: Non Intel USB chipsets fail to maintain High Speed on 60 * Boot or Hot Plug. 61 * 62 * QQbox suffers from noise on LNB voltage. 63 * 64 * LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system 65 * with other tuners. After a cold reset streaming will not start. 66 * 67 * M88RS2000 suffers from loss of lock. 68 */ 69 #define DVB_USB_LOG_PREFIX "LME2510(C)" 70 #include <linux/usb.h> 71 #include <linux/usb/input.h> 72 #include <media/rc-core.h> 73 74 #include "dvb_usb.h" 75 #include "lmedm04.h" 76 #include "tda826x.h" 77 #include "tda10086.h" 78 #include "stv0288.h" 79 #include "ix2505v.h" 80 #include "stv0299.h" 81 #include "dvb-pll.h" 82 #include "z0194a.h" 83 #include "m88rs2000.h" 84 #include "ts2020.h" 85 86 87 #define LME2510_C_S7395 "dvb-usb-lme2510c-s7395.fw"; 88 #define LME2510_C_LG "dvb-usb-lme2510c-lg.fw"; 89 #define LME2510_C_S0194 "dvb-usb-lme2510c-s0194.fw"; 90 #define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw"; 91 #define LME2510_LG "dvb-usb-lme2510-lg.fw"; 92 #define LME2510_S0194 "dvb-usb-lme2510-s0194.fw"; 93 94 /* debug */ 95 static int dvb_usb_lme2510_debug; 96 #define lme_debug(var, level, args...) do { \ 97 if ((var >= level)) \ 98 pr_debug(DVB_USB_LOG_PREFIX": " args); \ 99 } while (0) 100 #define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args) 101 #define debug_data_snipet(level, name, p) \ 102 deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \ 103 *p, *(p+1), *(p+2), *(p+3), *(p+4), \ 104 *(p+5), *(p+6), *(p+7)); 105 #define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args) 106 107 module_param_named(debug, dvb_usb_lme2510_debug, int, 0644); 108 MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."); 109 110 static int dvb_usb_lme2510_firmware; 111 module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644); 112 MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG"); 113 114 static int pid_filter; 115 module_param_named(pid, pid_filter, int, 0644); 116 MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on"); 117 118 119 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 120 121 #define TUNER_DEFAULT 0x0 122 #define TUNER_LG 0x1 123 #define TUNER_S7395 0x2 124 #define TUNER_S0194 0x3 125 #define TUNER_RS2000 0x4 126 127 struct lme2510_state { 128 unsigned long int_urb_due; 129 u8 id; 130 u8 tuner_config; 131 u8 signal_lock; 132 u8 signal_level; 133 u8 signal_sn; 134 u8 time_key; 135 u8 i2c_talk_onoff; 136 u8 i2c_gate; 137 u8 i2c_tuner_gate_w; 138 u8 i2c_tuner_gate_r; 139 u8 i2c_tuner_addr; 140 u8 stream_on; 141 u8 pid_size; 142 u8 pid_off; 143 void *buffer; 144 struct urb *lme_urb; 145 void *usb_buffer; 146 int (*fe_set_voltage)(struct dvb_frontend *, fe_sec_voltage_t); 147 u8 dvb_usb_lme2510_firmware; 148 }; 149 150 static int lme2510_bulk_write(struct usb_device *dev, 151 u8 *snd, int len, u8 pipe) 152 { 153 int ret, actual_l; 154 155 ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe), 156 snd, len , &actual_l, 100); 157 return ret; 158 } 159 160 static int lme2510_bulk_read(struct usb_device *dev, 161 u8 *rev, int len, u8 pipe) 162 { 163 int ret, actual_l; 164 165 ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe), 166 rev, len , &actual_l, 200); 167 return ret; 168 } 169 170 static int lme2510_usb_talk(struct dvb_usb_device *d, 171 u8 *wbuf, int wlen, u8 *rbuf, int rlen) 172 { 173 struct lme2510_state *st = d->priv; 174 u8 *buff; 175 int ret = 0; 176 177 if (st->usb_buffer == NULL) { 178 st->usb_buffer = kmalloc(64, GFP_KERNEL); 179 if (st->usb_buffer == NULL) { 180 info("MEM Error no memory"); 181 return -ENOMEM; 182 } 183 } 184 buff = st->usb_buffer; 185 186 ret = mutex_lock_interruptible(&d->usb_mutex); 187 188 if (ret < 0) 189 return -EAGAIN; 190 191 /* the read/write capped at 64 */ 192 memcpy(buff, wbuf, (wlen < 64) ? wlen : 64); 193 194 ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01); 195 196 ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ? 197 rlen : 64 , 0x01); 198 199 if (rlen > 0) 200 memcpy(rbuf, buff, rlen); 201 202 mutex_unlock(&d->usb_mutex); 203 204 return (ret < 0) ? -ENODEV : 0; 205 } 206 207 static int lme2510_stream_restart(struct dvb_usb_device *d) 208 { 209 struct lme2510_state *st = d->priv; 210 u8 all_pids[] = LME_ALL_PIDS; 211 u8 stream_on[] = LME_ST_ON_W; 212 int ret; 213 u8 rbuff[1]; 214 if (st->pid_off) 215 ret = lme2510_usb_talk(d, all_pids, sizeof(all_pids), 216 rbuff, sizeof(rbuff)); 217 /*Restart Stream Command*/ 218 ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on), 219 rbuff, sizeof(rbuff)); 220 return ret; 221 } 222 223 static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out) 224 { 225 struct lme2510_state *st = d->priv; 226 static u8 pid_buff[] = LME_ZERO_PID; 227 static u8 rbuf[1]; 228 u8 pid_no = index * 2; 229 u8 pid_len = pid_no + 2; 230 int ret = 0; 231 deb_info(1, "PID Setting Pid %04x", pid_out); 232 233 if (st->pid_size == 0) 234 ret |= lme2510_stream_restart(d); 235 236 pid_buff[2] = pid_no; 237 pid_buff[3] = (u8)pid_out & 0xff; 238 pid_buff[4] = pid_no + 1; 239 pid_buff[5] = (u8)(pid_out >> 8); 240 241 if (pid_len > st->pid_size) 242 st->pid_size = pid_len; 243 pid_buff[7] = 0x80 + st->pid_size; 244 245 ret |= lme2510_usb_talk(d, pid_buff , 246 sizeof(pid_buff) , rbuf, sizeof(rbuf)); 247 248 if (st->stream_on) 249 ret |= lme2510_stream_restart(d); 250 251 return ret; 252 } 253 254 static void lme2510_int_response(struct urb *lme_urb) 255 { 256 struct dvb_usb_adapter *adap = lme_urb->context; 257 struct lme2510_state *st = adap_to_priv(adap); 258 static u8 *ibuf, *rbuf; 259 int i = 0, offset; 260 u32 key; 261 262 switch (lme_urb->status) { 263 case 0: 264 case -ETIMEDOUT: 265 break; 266 case -ECONNRESET: 267 case -ENOENT: 268 case -ESHUTDOWN: 269 return; 270 default: 271 info("Error %x", lme_urb->status); 272 break; 273 } 274 275 rbuf = (u8 *) lme_urb->transfer_buffer; 276 277 offset = ((lme_urb->actual_length/8) > 4) 278 ? 4 : (lme_urb->actual_length/8) ; 279 280 for (i = 0; i < offset; ++i) { 281 ibuf = (u8 *)&rbuf[i*8]; 282 deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x", 283 offset, i, ibuf[0], ibuf[1]); 284 285 switch (ibuf[0]) { 286 case 0xaa: 287 debug_data_snipet(1, "INT Remote data snipet", ibuf); 288 if ((ibuf[4] + ibuf[5]) == 0xff) { 289 key = RC_SCANCODE_NECX((ibuf[2] ^ 0xff) << 8 | 290 (ibuf[3] > 0) ? (ibuf[3] ^ 0xff) : 0, 291 ibuf[5]); 292 deb_info(1, "INT Key =%08x", key); 293 if (adap_to_d(adap)->rc_dev != NULL) 294 rc_keydown(adap_to_d(adap)->rc_dev, 295 RC_TYPE_NEC, key, 0); 296 } 297 break; 298 case 0xbb: 299 switch (st->tuner_config) { 300 case TUNER_LG: 301 if (ibuf[2] > 0) 302 st->signal_lock = ibuf[2]; 303 st->signal_level = ibuf[4]; 304 st->signal_sn = ibuf[3]; 305 st->time_key = ibuf[7]; 306 break; 307 case TUNER_S7395: 308 case TUNER_S0194: 309 /* Tweak for earlier firmware*/ 310 if (ibuf[1] == 0x03) { 311 if (ibuf[2] > 1) 312 st->signal_lock = ibuf[2]; 313 st->signal_level = ibuf[3]; 314 st->signal_sn = ibuf[4]; 315 } else { 316 st->signal_level = ibuf[4]; 317 st->signal_sn = ibuf[5]; 318 st->signal_lock = 319 (st->signal_lock & 0xf7) + 320 ((ibuf[2] & 0x01) << 0x03); 321 } 322 break; 323 case TUNER_RS2000: 324 if (ibuf[2] & 0x1) 325 st->signal_lock = 0xff; 326 else 327 st->signal_lock = 0x00; 328 st->signal_level = ibuf[5]; 329 st->signal_sn = ibuf[4]; 330 st->time_key = ibuf[7]; 331 default: 332 break; 333 } 334 debug_data_snipet(5, "INT Remote data snipet in", ibuf); 335 break; 336 case 0xcc: 337 debug_data_snipet(1, "INT Control data snipet", ibuf); 338 break; 339 default: 340 debug_data_snipet(1, "INT Unknown data snipet", ibuf); 341 break; 342 } 343 } 344 345 usb_submit_urb(lme_urb, GFP_ATOMIC); 346 347 /* interrupt urb is due every 48 msecs while streaming 348 * add 12msecs for system lag */ 349 st->int_urb_due = jiffies + msecs_to_jiffies(60); 350 } 351 352 static int lme2510_int_read(struct dvb_usb_adapter *adap) 353 { 354 struct dvb_usb_device *d = adap_to_d(adap); 355 struct lme2510_state *lme_int = adap_to_priv(adap); 356 357 lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC); 358 359 if (lme_int->lme_urb == NULL) 360 return -ENOMEM; 361 362 lme_int->buffer = usb_alloc_coherent(d->udev, 128, GFP_ATOMIC, 363 &lme_int->lme_urb->transfer_dma); 364 365 if (lme_int->buffer == NULL) 366 return -ENOMEM; 367 368 usb_fill_int_urb(lme_int->lme_urb, 369 d->udev, 370 usb_rcvintpipe(d->udev, 0xa), 371 lme_int->buffer, 372 128, 373 lme2510_int_response, 374 adap, 375 8); 376 377 lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 378 379 usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC); 380 info("INT Interrupt Service Started"); 381 382 return 0; 383 } 384 385 static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) 386 { 387 struct dvb_usb_device *d = adap_to_d(adap); 388 struct lme2510_state *st = adap_to_priv(adap); 389 static u8 clear_pid_reg[] = LME_ALL_PIDS; 390 static u8 rbuf[1]; 391 int ret = 0; 392 393 deb_info(1, "PID Clearing Filter"); 394 395 mutex_lock(&d->i2c_mutex); 396 397 if (!onoff) { 398 ret |= lme2510_usb_talk(d, clear_pid_reg, 399 sizeof(clear_pid_reg), rbuf, sizeof(rbuf)); 400 st->pid_off = true; 401 } else 402 st->pid_off = false; 403 404 st->pid_size = 0; 405 406 mutex_unlock(&d->i2c_mutex); 407 408 return 0; 409 } 410 411 static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, 412 int onoff) 413 { 414 struct dvb_usb_device *d = adap_to_d(adap); 415 int ret = 0; 416 417 deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__, 418 pid, index, onoff); 419 420 if (onoff) { 421 mutex_lock(&d->i2c_mutex); 422 ret |= lme2510_enable_pid(d, index, pid); 423 mutex_unlock(&d->i2c_mutex); 424 } 425 426 427 return ret; 428 } 429 430 431 static int lme2510_return_status(struct dvb_usb_device *d) 432 { 433 int ret = 0; 434 u8 *data; 435 436 data = kzalloc(10, GFP_KERNEL); 437 if (!data) 438 return -ENOMEM; 439 440 ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), 441 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200); 442 info("Firmware Status: %x (%x)", ret , data[2]); 443 444 ret = (ret < 0) ? -ENODEV : data[2]; 445 kfree(data); 446 return ret; 447 } 448 449 static int lme2510_msg(struct dvb_usb_device *d, 450 u8 *wbuf, int wlen, u8 *rbuf, int rlen) 451 { 452 int ret = 0; 453 struct lme2510_state *st = d->priv; 454 455 if (st->i2c_talk_onoff == 1) { 456 457 ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen); 458 459 switch (st->tuner_config) { 460 case TUNER_LG: 461 if (wbuf[2] == 0x1c) { 462 if (wbuf[3] == 0x0e) { 463 st->signal_lock = rbuf[1]; 464 if ((st->stream_on & 1) && 465 (st->signal_lock & 0x10)) { 466 lme2510_stream_restart(d); 467 st->i2c_talk_onoff = 0; 468 } 469 msleep(80); 470 } 471 } 472 break; 473 case TUNER_S7395: 474 if (wbuf[2] == 0xd0) { 475 if (wbuf[3] == 0x24) { 476 st->signal_lock = rbuf[1]; 477 if ((st->stream_on & 1) && 478 (st->signal_lock & 0x8)) { 479 lme2510_stream_restart(d); 480 st->i2c_talk_onoff = 0; 481 } 482 } 483 } 484 break; 485 case TUNER_S0194: 486 if (wbuf[2] == 0xd0) { 487 if (wbuf[3] == 0x1b) { 488 st->signal_lock = rbuf[1]; 489 if ((st->stream_on & 1) && 490 (st->signal_lock & 0x8)) { 491 lme2510_stream_restart(d); 492 st->i2c_talk_onoff = 0; 493 } 494 } 495 } 496 break; 497 case TUNER_RS2000: 498 default: 499 break; 500 } 501 } else { 502 /* TODO rewrite this section */ 503 switch (st->tuner_config) { 504 case TUNER_LG: 505 switch (wbuf[3]) { 506 case 0x0e: 507 rbuf[0] = 0x55; 508 rbuf[1] = st->signal_lock; 509 break; 510 case 0x43: 511 rbuf[0] = 0x55; 512 rbuf[1] = st->signal_level; 513 break; 514 case 0x1c: 515 rbuf[0] = 0x55; 516 rbuf[1] = st->signal_sn; 517 break; 518 case 0x15: 519 case 0x16: 520 case 0x17: 521 case 0x18: 522 rbuf[0] = 0x55; 523 rbuf[1] = 0x00; 524 break; 525 default: 526 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen); 527 st->i2c_talk_onoff = 1; 528 break; 529 } 530 break; 531 case TUNER_S7395: 532 switch (wbuf[3]) { 533 case 0x10: 534 rbuf[0] = 0x55; 535 rbuf[1] = (st->signal_level & 0x80) 536 ? 0 : (st->signal_level * 2); 537 break; 538 case 0x2d: 539 rbuf[0] = 0x55; 540 rbuf[1] = st->signal_sn; 541 break; 542 case 0x24: 543 rbuf[0] = 0x55; 544 rbuf[1] = st->signal_lock; 545 break; 546 case 0x2e: 547 case 0x26: 548 case 0x27: 549 rbuf[0] = 0x55; 550 rbuf[1] = 0x00; 551 break; 552 default: 553 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen); 554 st->i2c_talk_onoff = 1; 555 break; 556 } 557 break; 558 case TUNER_S0194: 559 switch (wbuf[3]) { 560 case 0x18: 561 rbuf[0] = 0x55; 562 rbuf[1] = (st->signal_level & 0x80) 563 ? 0 : (st->signal_level * 2); 564 break; 565 case 0x24: 566 rbuf[0] = 0x55; 567 rbuf[1] = st->signal_sn; 568 break; 569 case 0x1b: 570 rbuf[0] = 0x55; 571 rbuf[1] = st->signal_lock; 572 break; 573 case 0x19: 574 case 0x25: 575 case 0x1e: 576 case 0x1d: 577 rbuf[0] = 0x55; 578 rbuf[1] = 0x00; 579 break; 580 default: 581 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen); 582 st->i2c_talk_onoff = 1; 583 break; 584 } 585 break; 586 case TUNER_RS2000: 587 switch (wbuf[3]) { 588 case 0x8c: 589 rbuf[0] = 0x55; 590 rbuf[1] = st->signal_lock; 591 592 /* If int_urb_due overdue 593 * set rbuf[1] to 0 to clear lock */ 594 if (time_after(jiffies, st->int_urb_due)) 595 rbuf[1] = 0; 596 597 break; 598 default: 599 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen); 600 st->i2c_talk_onoff = 1; 601 break; 602 } 603 default: 604 break; 605 } 606 607 deb_info(4, "I2C From Interrupt Message out(%02x) in(%02x)", 608 wbuf[3], rbuf[1]); 609 610 } 611 612 return ret; 613 } 614 615 616 static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], 617 int num) 618 { 619 struct dvb_usb_device *d = i2c_get_adapdata(adap); 620 struct lme2510_state *st = d->priv; 621 static u8 obuf[64], ibuf[64]; 622 int i, read, read_o; 623 u16 len; 624 u8 gate = st->i2c_gate; 625 626 mutex_lock(&d->i2c_mutex); 627 628 if (gate == 0) 629 gate = 5; 630 631 for (i = 0; i < num; i++) { 632 read_o = msg[i].flags & I2C_M_RD; 633 read = i + 1 < num && msg[i + 1].flags & I2C_M_RD; 634 read |= read_o; 635 gate = (msg[i].addr == st->i2c_tuner_addr) 636 ? (read) ? st->i2c_tuner_gate_r 637 : st->i2c_tuner_gate_w 638 : st->i2c_gate; 639 obuf[0] = gate | (read << 7); 640 641 if (gate == 5) 642 obuf[1] = (read) ? 2 : msg[i].len + 1; 643 else 644 obuf[1] = msg[i].len + read + 1; 645 646 obuf[2] = msg[i].addr << 1; 647 648 if (read) { 649 if (read_o) 650 len = 3; 651 else { 652 memcpy(&obuf[3], msg[i].buf, msg[i].len); 653 obuf[msg[i].len+3] = msg[i+1].len; 654 len = msg[i].len+4; 655 } 656 } else { 657 memcpy(&obuf[3], msg[i].buf, msg[i].len); 658 len = msg[i].len+3; 659 } 660 661 if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) { 662 deb_info(1, "i2c transfer failed."); 663 mutex_unlock(&d->i2c_mutex); 664 return -EAGAIN; 665 } 666 667 if (read) { 668 if (read_o) 669 memcpy(msg[i].buf, &ibuf[1], msg[i].len); 670 else { 671 memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len); 672 i++; 673 } 674 } 675 } 676 677 mutex_unlock(&d->i2c_mutex); 678 return i; 679 } 680 681 static u32 lme2510_i2c_func(struct i2c_adapter *adapter) 682 { 683 return I2C_FUNC_I2C; 684 } 685 686 static struct i2c_algorithm lme2510_i2c_algo = { 687 .master_xfer = lme2510_i2c_xfer, 688 .functionality = lme2510_i2c_func, 689 }; 690 691 static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff) 692 { 693 struct dvb_usb_adapter *adap = fe_to_adap(fe); 694 struct dvb_usb_device *d = adap_to_d(adap); 695 struct lme2510_state *st = adap_to_priv(adap); 696 static u8 clear_reg_3[] = LME_ALL_PIDS; 697 static u8 rbuf[1]; 698 int ret = 0, rlen = sizeof(rbuf); 699 700 deb_info(1, "STM (%02x)", onoff); 701 702 /* Streaming is started by FE_HAS_LOCK */ 703 if (onoff == 1) 704 st->stream_on = 1; 705 else { 706 deb_info(1, "STM Steam Off"); 707 /* mutex is here only to avoid collision with I2C */ 708 mutex_lock(&d->i2c_mutex); 709 710 ret = lme2510_usb_talk(d, clear_reg_3, 711 sizeof(clear_reg_3), rbuf, rlen); 712 st->stream_on = 0; 713 st->i2c_talk_onoff = 1; 714 715 mutex_unlock(&d->i2c_mutex); 716 } 717 718 return (ret < 0) ? -ENODEV : 0; 719 } 720 721 static u8 check_sum(u8 *p, u8 len) 722 { 723 u8 sum = 0; 724 while (len--) 725 sum += *p++; 726 return sum; 727 } 728 729 static int lme2510_download_firmware(struct dvb_usb_device *d, 730 const struct firmware *fw) 731 { 732 int ret = 0; 733 u8 *data; 734 u16 j, wlen, len_in, start, end; 735 u8 packet_size, dlen, i; 736 u8 *fw_data; 737 738 packet_size = 0x31; 739 len_in = 1; 740 741 data = kzalloc(128, GFP_KERNEL); 742 if (!data) { 743 info("FRM Could not start Firmware Download"\ 744 "(Buffer allocation failed)"); 745 return -ENOMEM; 746 } 747 748 info("FRM Starting Firmware Download"); 749 750 for (i = 1; i < 3; i++) { 751 start = (i == 1) ? 0 : 512; 752 end = (i == 1) ? 512 : fw->size; 753 for (j = start; j < end; j += (packet_size+1)) { 754 fw_data = (u8 *)(fw->data + j); 755 if ((end - j) > packet_size) { 756 data[0] = i; 757 dlen = packet_size; 758 } else { 759 data[0] = i | 0x80; 760 dlen = (u8)(end - j)-1; 761 } 762 data[1] = dlen; 763 memcpy(&data[2], fw_data, dlen+1); 764 wlen = (u8) dlen + 4; 765 data[wlen-1] = check_sum(fw_data, dlen+1); 766 deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3], 767 data[dlen+2], data[dlen+3]); 768 lme2510_usb_talk(d, data, wlen, data, len_in); 769 ret |= (data[0] == 0x88) ? 0 : -1; 770 } 771 } 772 773 data[0] = 0x8a; 774 len_in = 1; 775 msleep(2000); 776 lme2510_usb_talk(d, data, len_in, data, len_in); 777 msleep(400); 778 779 if (ret < 0) 780 info("FRM Firmware Download Failed (%04x)" , ret); 781 else 782 info("FRM Firmware Download Completed - Resetting Device"); 783 784 kfree(data); 785 return RECONNECTS_USB; 786 } 787 788 static void lme_coldreset(struct dvb_usb_device *d) 789 { 790 u8 data[1] = {0}; 791 data[0] = 0x0a; 792 info("FRM Firmware Cold Reset"); 793 794 lme2510_usb_talk(d, data, sizeof(data), data, sizeof(data)); 795 796 return; 797 } 798 799 static const char fw_c_s7395[] = LME2510_C_S7395; 800 static const char fw_c_lg[] = LME2510_C_LG; 801 static const char fw_c_s0194[] = LME2510_C_S0194; 802 static const char fw_c_rs2000[] = LME2510_C_RS2000; 803 static const char fw_lg[] = LME2510_LG; 804 static const char fw_s0194[] = LME2510_S0194; 805 806 static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold) 807 { 808 struct lme2510_state *st = d->priv; 809 struct usb_device *udev = d->udev; 810 const struct firmware *fw = NULL; 811 const char *fw_lme; 812 int ret = 0; 813 814 cold = (cold > 0) ? (cold & 1) : 0; 815 816 switch (le16_to_cpu(udev->descriptor.idProduct)) { 817 case 0x1122: 818 switch (st->dvb_usb_lme2510_firmware) { 819 default: 820 st->dvb_usb_lme2510_firmware = TUNER_S0194; 821 case TUNER_S0194: 822 fw_lme = fw_s0194; 823 ret = request_firmware(&fw, fw_lme, &udev->dev); 824 if (ret == 0) { 825 cold = 0; 826 break; 827 } 828 st->dvb_usb_lme2510_firmware = TUNER_LG; 829 case TUNER_LG: 830 fw_lme = fw_lg; 831 ret = request_firmware(&fw, fw_lme, &udev->dev); 832 if (ret == 0) 833 break; 834 st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; 835 break; 836 } 837 break; 838 case 0x1120: 839 switch (st->dvb_usb_lme2510_firmware) { 840 default: 841 st->dvb_usb_lme2510_firmware = TUNER_S7395; 842 case TUNER_S7395: 843 fw_lme = fw_c_s7395; 844 ret = request_firmware(&fw, fw_lme, &udev->dev); 845 if (ret == 0) { 846 cold = 0; 847 break; 848 } 849 st->dvb_usb_lme2510_firmware = TUNER_LG; 850 case TUNER_LG: 851 fw_lme = fw_c_lg; 852 ret = request_firmware(&fw, fw_lme, &udev->dev); 853 if (ret == 0) 854 break; 855 st->dvb_usb_lme2510_firmware = TUNER_S0194; 856 case TUNER_S0194: 857 fw_lme = fw_c_s0194; 858 ret = request_firmware(&fw, fw_lme, &udev->dev); 859 if (ret == 0) 860 break; 861 st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; 862 cold = 0; 863 break; 864 } 865 break; 866 case 0x22f0: 867 fw_lme = fw_c_rs2000; 868 st->dvb_usb_lme2510_firmware = TUNER_RS2000; 869 break; 870 default: 871 fw_lme = fw_c_s7395; 872 } 873 874 release_firmware(fw); 875 876 if (cold) { 877 dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware; 878 info("FRM Changing to %s firmware", fw_lme); 879 lme_coldreset(d); 880 return NULL; 881 } 882 883 return fw_lme; 884 } 885 886 static int lme2510_kill_urb(struct usb_data_stream *stream) 887 { 888 int i; 889 890 for (i = 0; i < stream->urbs_submitted; i++) { 891 deb_info(3, "killing URB no. %d.", i); 892 /* stop the URB */ 893 usb_kill_urb(stream->urb_list[i]); 894 } 895 stream->urbs_submitted = 0; 896 897 return 0; 898 } 899 900 static struct tda10086_config tda10086_config = { 901 .demod_address = 0x0e, 902 .invert = 0, 903 .diseqc_tone = 1, 904 .xtal_freq = TDA10086_XTAL_16M, 905 }; 906 907 static struct stv0288_config lme_config = { 908 .demod_address = 0x68, 909 .min_delay_ms = 15, 910 .inittab = s7395_inittab, 911 }; 912 913 static struct ix2505v_config lme_tuner = { 914 .tuner_address = 0x60, 915 .min_delay_ms = 100, 916 .tuner_gain = 0x0, 917 .tuner_chargepump = 0x3, 918 }; 919 920 static struct stv0299_config sharp_z0194_config = { 921 .demod_address = 0x68, 922 .inittab = sharp_z0194a_inittab, 923 .mclk = 88000000UL, 924 .invert = 0, 925 .skip_reinit = 0, 926 .lock_output = STV0299_LOCKOUTPUT_1, 927 .volt13_op0_op1 = STV0299_VOLT13_OP1, 928 .min_delay_ms = 100, 929 .set_symbol_rate = sharp_z0194a_set_symbol_rate, 930 }; 931 932 static int dm04_rs2000_set_ts_param(struct dvb_frontend *fe, 933 int caller) 934 { 935 struct dvb_usb_adapter *adap = fe_to_adap(fe); 936 struct dvb_usb_device *d = adap_to_d(adap); 937 struct lme2510_state *st = d->priv; 938 939 mutex_lock(&d->i2c_mutex); 940 if ((st->i2c_talk_onoff == 1) && (st->stream_on & 1)) { 941 st->i2c_talk_onoff = 0; 942 lme2510_stream_restart(d); 943 } 944 mutex_unlock(&d->i2c_mutex); 945 946 return 0; 947 } 948 949 static struct m88rs2000_config m88rs2000_config = { 950 .demod_addr = 0x68, 951 .set_ts_params = dm04_rs2000_set_ts_param, 952 }; 953 954 static struct ts2020_config ts2020_config = { 955 .tuner_address = 0x60, 956 .clk_out_div = 7, 957 }; 958 959 static int dm04_lme2510_set_voltage(struct dvb_frontend *fe, 960 fe_sec_voltage_t voltage) 961 { 962 struct dvb_usb_device *d = fe_to_d(fe); 963 struct lme2510_state *st = fe_to_priv(fe); 964 static u8 voltage_low[] = LME_VOLTAGE_L; 965 static u8 voltage_high[] = LME_VOLTAGE_H; 966 static u8 rbuf[1]; 967 int ret = 0, len = 3, rlen = 1; 968 969 mutex_lock(&d->i2c_mutex); 970 971 switch (voltage) { 972 case SEC_VOLTAGE_18: 973 ret |= lme2510_usb_talk(d, 974 voltage_high, len, rbuf, rlen); 975 break; 976 977 case SEC_VOLTAGE_OFF: 978 case SEC_VOLTAGE_13: 979 default: 980 ret |= lme2510_usb_talk(d, 981 voltage_low, len, rbuf, rlen); 982 break; 983 } 984 985 mutex_unlock(&d->i2c_mutex); 986 987 if (st->tuner_config == TUNER_RS2000) 988 if (st->fe_set_voltage) 989 st->fe_set_voltage(fe, voltage); 990 991 992 return (ret < 0) ? -ENODEV : 0; 993 } 994 995 static int dm04_rs2000_read_signal_strength(struct dvb_frontend *fe, 996 u16 *strength) 997 { 998 struct lme2510_state *st = fe_to_priv(fe); 999 1000 *strength = (u16)((u32)st->signal_level * 0xffff / 0xff); 1001 1002 return 0; 1003 } 1004 1005 static int dm04_rs2000_read_snr(struct dvb_frontend *fe, u16 *snr) 1006 { 1007 struct lme2510_state *st = fe_to_priv(fe); 1008 1009 *snr = (u16)((u32)st->signal_sn * 0xffff / 0x7f); 1010 1011 return 0; 1012 } 1013 1014 static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber) 1015 { 1016 *ber = 0; 1017 1018 return 0; 1019 } 1020 1021 static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 1022 { 1023 *ucblocks = 0; 1024 1025 return 0; 1026 } 1027 1028 static int lme_name(struct dvb_usb_adapter *adap) 1029 { 1030 struct dvb_usb_device *d = adap_to_d(adap); 1031 struct lme2510_state *st = adap_to_priv(adap); 1032 const char *desc = d->name; 1033 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395", 1034 " SHARP:BS2F7HZ0194", " RS2000"}; 1035 char *name = adap->fe[0]->ops.info.name; 1036 1037 strlcpy(name, desc, 128); 1038 strlcat(name, fe_name[st->tuner_config], 128); 1039 1040 return 0; 1041 } 1042 1043 static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) 1044 { 1045 struct dvb_usb_device *d = adap_to_d(adap); 1046 struct lme2510_state *st = d->priv; 1047 int ret = 0; 1048 1049 st->i2c_talk_onoff = 1; 1050 switch (le16_to_cpu(d->udev->descriptor.idProduct)) { 1051 case 0x1122: 1052 case 0x1120: 1053 st->i2c_gate = 4; 1054 adap->fe[0] = dvb_attach(tda10086_attach, 1055 &tda10086_config, &d->i2c_adap); 1056 if (adap->fe[0]) { 1057 info("TUN Found Frontend TDA10086"); 1058 st->i2c_tuner_gate_w = 4; 1059 st->i2c_tuner_gate_r = 4; 1060 st->i2c_tuner_addr = 0x60; 1061 st->tuner_config = TUNER_LG; 1062 if (st->dvb_usb_lme2510_firmware != TUNER_LG) { 1063 st->dvb_usb_lme2510_firmware = TUNER_LG; 1064 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1065 } 1066 break; 1067 } 1068 1069 st->i2c_gate = 4; 1070 adap->fe[0] = dvb_attach(stv0299_attach, 1071 &sharp_z0194_config, &d->i2c_adap); 1072 if (adap->fe[0]) { 1073 info("FE Found Stv0299"); 1074 st->i2c_tuner_gate_w = 4; 1075 st->i2c_tuner_gate_r = 5; 1076 st->i2c_tuner_addr = 0x60; 1077 st->tuner_config = TUNER_S0194; 1078 if (st->dvb_usb_lme2510_firmware != TUNER_S0194) { 1079 st->dvb_usb_lme2510_firmware = TUNER_S0194; 1080 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1081 } 1082 break; 1083 } 1084 1085 st->i2c_gate = 5; 1086 adap->fe[0] = dvb_attach(stv0288_attach, &lme_config, 1087 &d->i2c_adap); 1088 1089 if (adap->fe[0]) { 1090 info("FE Found Stv0288"); 1091 st->i2c_tuner_gate_w = 4; 1092 st->i2c_tuner_gate_r = 5; 1093 st->i2c_tuner_addr = 0x60; 1094 st->tuner_config = TUNER_S7395; 1095 if (st->dvb_usb_lme2510_firmware != TUNER_S7395) { 1096 st->dvb_usb_lme2510_firmware = TUNER_S7395; 1097 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1098 } 1099 break; 1100 } 1101 case 0x22f0: 1102 st->i2c_gate = 5; 1103 adap->fe[0] = dvb_attach(m88rs2000_attach, 1104 &m88rs2000_config, &d->i2c_adap); 1105 1106 if (adap->fe[0]) { 1107 info("FE Found M88RS2000"); 1108 dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config, 1109 &d->i2c_adap); 1110 st->i2c_tuner_gate_w = 5; 1111 st->i2c_tuner_gate_r = 5; 1112 st->i2c_tuner_addr = 0x60; 1113 st->tuner_config = TUNER_RS2000; 1114 st->fe_set_voltage = 1115 adap->fe[0]->ops.set_voltage; 1116 1117 adap->fe[0]->ops.read_signal_strength = 1118 dm04_rs2000_read_signal_strength; 1119 adap->fe[0]->ops.read_snr = 1120 dm04_rs2000_read_snr; 1121 adap->fe[0]->ops.read_ber = 1122 dm04_read_ber; 1123 adap->fe[0]->ops.read_ucblocks = 1124 dm04_read_ucblocks; 1125 } 1126 break; 1127 } 1128 1129 if (adap->fe[0] == NULL) { 1130 info("DM04/QQBOX Not Powered up or not Supported"); 1131 return -ENODEV; 1132 } 1133 1134 if (ret) { 1135 if (adap->fe[0]) { 1136 dvb_frontend_detach(adap->fe[0]); 1137 adap->fe[0] = NULL; 1138 } 1139 d->rc_map = NULL; 1140 return -ENODEV; 1141 } 1142 1143 adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage; 1144 ret = lme_name(adap); 1145 return ret; 1146 } 1147 1148 static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap) 1149 { 1150 struct dvb_usb_device *d = adap_to_d(adap); 1151 struct lme2510_state *st = adap_to_priv(adap); 1152 char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"}; 1153 int ret = 0; 1154 1155 switch (st->tuner_config) { 1156 case TUNER_LG: 1157 if (dvb_attach(tda826x_attach, adap->fe[0], 0x60, 1158 &d->i2c_adap, 1)) 1159 ret = st->tuner_config; 1160 break; 1161 case TUNER_S7395: 1162 if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner, 1163 &d->i2c_adap)) 1164 ret = st->tuner_config; 1165 break; 1166 case TUNER_S0194: 1167 if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60, 1168 &d->i2c_adap, DVB_PLL_OPERA1)) 1169 ret = st->tuner_config; 1170 break; 1171 case TUNER_RS2000: 1172 ret = st->tuner_config; 1173 break; 1174 default: 1175 break; 1176 } 1177 1178 if (ret) 1179 info("TUN Found %s tuner", tun_msg[ret]); 1180 else { 1181 info("TUN No tuner found --- resetting device"); 1182 lme_coldreset(d); 1183 return -ENODEV; 1184 } 1185 1186 /* Start the Interrupt*/ 1187 ret = lme2510_int_read(adap); 1188 if (ret < 0) { 1189 info("INT Unable to start Interrupt Service"); 1190 return -ENODEV; 1191 } 1192 1193 return ret; 1194 } 1195 1196 static int lme2510_powerup(struct dvb_usb_device *d, int onoff) 1197 { 1198 struct lme2510_state *st = d->priv; 1199 static u8 lnb_on[] = LNB_ON; 1200 static u8 lnb_off[] = LNB_OFF; 1201 static u8 rbuf[1]; 1202 int ret = 0, len = 3, rlen = 1; 1203 1204 mutex_lock(&d->i2c_mutex); 1205 1206 if (onoff) 1207 ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen); 1208 else 1209 ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen); 1210 1211 st->i2c_talk_onoff = 1; 1212 1213 mutex_unlock(&d->i2c_mutex); 1214 1215 return ret; 1216 } 1217 1218 static int lme2510_get_adapter_count(struct dvb_usb_device *d) 1219 { 1220 return 1; 1221 } 1222 1223 static int lme2510_identify_state(struct dvb_usb_device *d, const char **name) 1224 { 1225 struct lme2510_state *st = d->priv; 1226 1227 usb_reset_configuration(d->udev); 1228 1229 usb_set_interface(d->udev, 1230 d->props->bInterfaceNumber, 1); 1231 1232 st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware; 1233 1234 if (lme2510_return_status(d) == 0x44) { 1235 *name = lme_firmware_switch(d, 0); 1236 return COLD; 1237 } 1238 1239 return 0; 1240 } 1241 1242 static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type, 1243 struct usb_data_stream_properties *stream) 1244 { 1245 struct dvb_usb_adapter *adap = fe_to_adap(fe); 1246 struct dvb_usb_device *d; 1247 1248 if (adap == NULL) 1249 return 0; 1250 1251 d = adap_to_d(adap); 1252 1253 /* Turn PID filter on the fly by module option */ 1254 if (pid_filter == 2) { 1255 adap->pid_filtering = 1; 1256 adap->max_feed_count = 15; 1257 } 1258 1259 if (!(le16_to_cpu(d->udev->descriptor.idProduct) 1260 == 0x1122)) 1261 stream->endpoint = 0x8; 1262 1263 return 0; 1264 } 1265 1266 static int lme2510_get_rc_config(struct dvb_usb_device *d, 1267 struct dvb_usb_rc *rc) 1268 { 1269 rc->allowed_protos = RC_BIT_NEC; 1270 return 0; 1271 } 1272 1273 static void *lme2510_exit_int(struct dvb_usb_device *d) 1274 { 1275 struct lme2510_state *st = d->priv; 1276 struct dvb_usb_adapter *adap = &d->adapter[0]; 1277 void *buffer = NULL; 1278 1279 if (adap != NULL) { 1280 lme2510_kill_urb(&adap->stream); 1281 } 1282 1283 if (st->usb_buffer != NULL) { 1284 st->i2c_talk_onoff = 1; 1285 st->signal_lock = 0; 1286 st->signal_level = 0; 1287 st->signal_sn = 0; 1288 buffer = st->usb_buffer; 1289 } 1290 1291 if (st->lme_urb != NULL) { 1292 usb_kill_urb(st->lme_urb); 1293 usb_free_coherent(d->udev, 128, st->buffer, 1294 st->lme_urb->transfer_dma); 1295 info("Interrupt Service Stopped"); 1296 } 1297 1298 return buffer; 1299 } 1300 1301 static void lme2510_exit(struct dvb_usb_device *d) 1302 { 1303 void *usb_buffer; 1304 1305 if (d != NULL) { 1306 usb_buffer = lme2510_exit_int(d); 1307 kfree(usb_buffer); 1308 } 1309 } 1310 1311 static struct dvb_usb_device_properties lme2510_props = { 1312 .driver_name = KBUILD_MODNAME, 1313 .owner = THIS_MODULE, 1314 .bInterfaceNumber = 0, 1315 .adapter_nr = adapter_nr, 1316 .size_of_priv = sizeof(struct lme2510_state), 1317 1318 .download_firmware = lme2510_download_firmware, 1319 1320 .power_ctrl = lme2510_powerup, 1321 .identify_state = lme2510_identify_state, 1322 .i2c_algo = &lme2510_i2c_algo, 1323 1324 .frontend_attach = dm04_lme2510_frontend_attach, 1325 .tuner_attach = dm04_lme2510_tuner, 1326 .get_stream_config = lme2510_get_stream_config, 1327 .get_adapter_count = lme2510_get_adapter_count, 1328 .streaming_ctrl = lme2510_streaming_ctrl, 1329 1330 .get_rc_config = lme2510_get_rc_config, 1331 1332 .exit = lme2510_exit, 1333 .adapter = { 1334 { 1335 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1336 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1337 .pid_filter_count = 15, 1338 .pid_filter = lme2510_pid_filter, 1339 .pid_filter_ctrl = lme2510_pid_filter_ctrl, 1340 .stream = 1341 DVB_USB_STREAM_BULK(0x86, 10, 4096), 1342 }, 1343 { 1344 } 1345 }, 1346 }; 1347 1348 static const struct usb_device_id lme2510_id_table[] = { 1349 { DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props, 1350 "DM04_LME2510_DVB-S", RC_MAP_LME2510) }, 1351 { DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props, 1352 "DM04_LME2510C_DVB-S", RC_MAP_LME2510) }, 1353 { DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props, 1354 "DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510) }, 1355 {} /* Terminating entry */ 1356 }; 1357 1358 MODULE_DEVICE_TABLE(usb, lme2510_id_table); 1359 1360 static struct usb_driver lme2510_driver = { 1361 .name = KBUILD_MODNAME, 1362 .probe = dvb_usbv2_probe, 1363 .disconnect = dvb_usbv2_disconnect, 1364 .id_table = lme2510_id_table, 1365 .no_dynamic_id = 1, 1366 .soft_unbind = 1, 1367 }; 1368 1369 module_usb_driver(lme2510_driver); 1370 1371 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); 1372 MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); 1373 MODULE_VERSION("2.06"); 1374 MODULE_LICENSE("GPL"); 1375 MODULE_FIRMWARE(LME2510_C_S7395); 1376 MODULE_FIRMWARE(LME2510_C_LG); 1377 MODULE_FIRMWARE(LME2510_C_S0194); 1378 MODULE_FIRMWARE(LME2510_C_RS2000); 1379 MODULE_FIRMWARE(LME2510_LG); 1380 MODULE_FIRMWARE(LME2510_S0194); 1381 1382