Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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