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 case TUNER_S0194: 821 fw_lme = fw_s0194; 822 ret = request_firmware(&fw, fw_lme, &udev->dev); 823 if (ret == 0) { 824 st->dvb_usb_lme2510_firmware = TUNER_S0194; 825 cold = 0; 826 break; 827 } 828 /* fall through */ 829 case TUNER_LG: 830 fw_lme = fw_lg; 831 ret = request_firmware(&fw, fw_lme, &udev->dev); 832 if (ret == 0) { 833 st->dvb_usb_lme2510_firmware = TUNER_LG; 834 break; 835 } 836 st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; 837 break; 838 } 839 break; 840 case 0x1120: 841 switch (st->dvb_usb_lme2510_firmware) { 842 default: 843 case TUNER_S7395: 844 fw_lme = fw_c_s7395; 845 ret = request_firmware(&fw, fw_lme, &udev->dev); 846 if (ret == 0) { 847 st->dvb_usb_lme2510_firmware = TUNER_S7395; 848 cold = 0; 849 break; 850 } 851 /* fall through */ 852 case TUNER_LG: 853 fw_lme = fw_c_lg; 854 ret = request_firmware(&fw, fw_lme, &udev->dev); 855 if (ret == 0) { 856 st->dvb_usb_lme2510_firmware = TUNER_LG; 857 break; 858 } 859 /* fall through */ 860 case TUNER_S0194: 861 fw_lme = fw_c_s0194; 862 ret = request_firmware(&fw, fw_lme, &udev->dev); 863 if (ret == 0) { 864 st->dvb_usb_lme2510_firmware = TUNER_S0194; 865 break; 866 } 867 st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; 868 cold = 0; 869 break; 870 } 871 break; 872 case 0x22f0: 873 fw_lme = fw_c_rs2000; 874 st->dvb_usb_lme2510_firmware = TUNER_RS2000; 875 break; 876 default: 877 fw_lme = fw_c_s7395; 878 } 879 880 release_firmware(fw); 881 882 if (cold) { 883 dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware; 884 info("FRM Changing to %s firmware", fw_lme); 885 lme_coldreset(d); 886 return NULL; 887 } 888 889 return fw_lme; 890 } 891 892 static int lme2510_kill_urb(struct usb_data_stream *stream) 893 { 894 int i; 895 896 for (i = 0; i < stream->urbs_submitted; i++) { 897 deb_info(3, "killing URB no. %d.", i); 898 /* stop the URB */ 899 usb_kill_urb(stream->urb_list[i]); 900 } 901 stream->urbs_submitted = 0; 902 903 return 0; 904 } 905 906 static struct tda10086_config tda10086_config = { 907 .demod_address = 0x0e, 908 .invert = 0, 909 .diseqc_tone = 1, 910 .xtal_freq = TDA10086_XTAL_16M, 911 }; 912 913 static struct stv0288_config lme_config = { 914 .demod_address = 0x68, 915 .min_delay_ms = 15, 916 .inittab = s7395_inittab, 917 }; 918 919 static struct ix2505v_config lme_tuner = { 920 .tuner_address = 0x60, 921 .min_delay_ms = 100, 922 .tuner_gain = 0x0, 923 .tuner_chargepump = 0x3, 924 }; 925 926 static struct stv0299_config sharp_z0194_config = { 927 .demod_address = 0x68, 928 .inittab = sharp_z0194a_inittab, 929 .mclk = 88000000UL, 930 .invert = 0, 931 .skip_reinit = 0, 932 .lock_output = STV0299_LOCKOUTPUT_1, 933 .volt13_op0_op1 = STV0299_VOLT13_OP1, 934 .min_delay_ms = 100, 935 .set_symbol_rate = sharp_z0194a_set_symbol_rate, 936 }; 937 938 static int dm04_rs2000_set_ts_param(struct dvb_frontend *fe, 939 int caller) 940 { 941 struct dvb_usb_adapter *adap = fe_to_adap(fe); 942 struct dvb_usb_device *d = adap_to_d(adap); 943 struct lme2510_state *st = d->priv; 944 945 mutex_lock(&d->i2c_mutex); 946 if ((st->i2c_talk_onoff == 1) && (st->stream_on & 1)) { 947 st->i2c_talk_onoff = 0; 948 lme2510_stream_restart(d); 949 } 950 mutex_unlock(&d->i2c_mutex); 951 952 return 0; 953 } 954 955 static struct m88rs2000_config m88rs2000_config = { 956 .demod_addr = 0x68, 957 .set_ts_params = dm04_rs2000_set_ts_param, 958 }; 959 960 static struct ts2020_config ts2020_config = { 961 .tuner_address = 0x60, 962 .clk_out_div = 7, 963 }; 964 965 static int dm04_lme2510_set_voltage(struct dvb_frontend *fe, 966 fe_sec_voltage_t voltage) 967 { 968 struct dvb_usb_device *d = fe_to_d(fe); 969 struct lme2510_state *st = fe_to_priv(fe); 970 static u8 voltage_low[] = LME_VOLTAGE_L; 971 static u8 voltage_high[] = LME_VOLTAGE_H; 972 static u8 rbuf[1]; 973 int ret = 0, len = 3, rlen = 1; 974 975 mutex_lock(&d->i2c_mutex); 976 977 switch (voltage) { 978 case SEC_VOLTAGE_18: 979 ret |= lme2510_usb_talk(d, 980 voltage_high, len, rbuf, rlen); 981 break; 982 983 case SEC_VOLTAGE_OFF: 984 case SEC_VOLTAGE_13: 985 default: 986 ret |= lme2510_usb_talk(d, 987 voltage_low, len, rbuf, rlen); 988 break; 989 } 990 991 mutex_unlock(&d->i2c_mutex); 992 993 if (st->tuner_config == TUNER_RS2000) 994 if (st->fe_set_voltage) 995 st->fe_set_voltage(fe, voltage); 996 997 998 return (ret < 0) ? -ENODEV : 0; 999 } 1000 1001 static int dm04_rs2000_read_signal_strength(struct dvb_frontend *fe, 1002 u16 *strength) 1003 { 1004 struct lme2510_state *st = fe_to_priv(fe); 1005 1006 *strength = (u16)((u32)st->signal_level * 0xffff / 0xff); 1007 1008 return 0; 1009 } 1010 1011 static int dm04_rs2000_read_snr(struct dvb_frontend *fe, u16 *snr) 1012 { 1013 struct lme2510_state *st = fe_to_priv(fe); 1014 1015 *snr = (u16)((u32)st->signal_sn * 0xffff / 0x7f); 1016 1017 return 0; 1018 } 1019 1020 static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber) 1021 { 1022 *ber = 0; 1023 1024 return 0; 1025 } 1026 1027 static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 1028 { 1029 *ucblocks = 0; 1030 1031 return 0; 1032 } 1033 1034 static int lme_name(struct dvb_usb_adapter *adap) 1035 { 1036 struct dvb_usb_device *d = adap_to_d(adap); 1037 struct lme2510_state *st = adap_to_priv(adap); 1038 const char *desc = d->name; 1039 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395", 1040 " SHARP:BS2F7HZ0194", " RS2000"}; 1041 char *name = adap->fe[0]->ops.info.name; 1042 1043 strlcpy(name, desc, 128); 1044 strlcat(name, fe_name[st->tuner_config], 128); 1045 1046 return 0; 1047 } 1048 1049 static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) 1050 { 1051 struct dvb_usb_device *d = adap_to_d(adap); 1052 struct lme2510_state *st = d->priv; 1053 int ret = 0; 1054 1055 st->i2c_talk_onoff = 1; 1056 switch (le16_to_cpu(d->udev->descriptor.idProduct)) { 1057 case 0x1122: 1058 case 0x1120: 1059 st->i2c_gate = 4; 1060 adap->fe[0] = dvb_attach(tda10086_attach, 1061 &tda10086_config, &d->i2c_adap); 1062 if (adap->fe[0]) { 1063 info("TUN Found Frontend TDA10086"); 1064 st->i2c_tuner_gate_w = 4; 1065 st->i2c_tuner_gate_r = 4; 1066 st->i2c_tuner_addr = 0x60; 1067 st->tuner_config = TUNER_LG; 1068 if (st->dvb_usb_lme2510_firmware != TUNER_LG) { 1069 st->dvb_usb_lme2510_firmware = TUNER_LG; 1070 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1071 } 1072 break; 1073 } 1074 1075 st->i2c_gate = 4; 1076 adap->fe[0] = dvb_attach(stv0299_attach, 1077 &sharp_z0194_config, &d->i2c_adap); 1078 if (adap->fe[0]) { 1079 info("FE Found Stv0299"); 1080 st->i2c_tuner_gate_w = 4; 1081 st->i2c_tuner_gate_r = 5; 1082 st->i2c_tuner_addr = 0x60; 1083 st->tuner_config = TUNER_S0194; 1084 if (st->dvb_usb_lme2510_firmware != TUNER_S0194) { 1085 st->dvb_usb_lme2510_firmware = TUNER_S0194; 1086 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1087 } 1088 break; 1089 } 1090 1091 st->i2c_gate = 5; 1092 adap->fe[0] = dvb_attach(stv0288_attach, &lme_config, 1093 &d->i2c_adap); 1094 1095 if (adap->fe[0]) { 1096 info("FE Found Stv0288"); 1097 st->i2c_tuner_gate_w = 4; 1098 st->i2c_tuner_gate_r = 5; 1099 st->i2c_tuner_addr = 0x60; 1100 st->tuner_config = TUNER_S7395; 1101 if (st->dvb_usb_lme2510_firmware != TUNER_S7395) { 1102 st->dvb_usb_lme2510_firmware = TUNER_S7395; 1103 ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV; 1104 } 1105 break; 1106 } 1107 case 0x22f0: 1108 st->i2c_gate = 5; 1109 adap->fe[0] = dvb_attach(m88rs2000_attach, 1110 &m88rs2000_config, &d->i2c_adap); 1111 1112 if (adap->fe[0]) { 1113 info("FE Found M88RS2000"); 1114 dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config, 1115 &d->i2c_adap); 1116 st->i2c_tuner_gate_w = 5; 1117 st->i2c_tuner_gate_r = 5; 1118 st->i2c_tuner_addr = 0x60; 1119 st->tuner_config = TUNER_RS2000; 1120 st->fe_set_voltage = 1121 adap->fe[0]->ops.set_voltage; 1122 1123 adap->fe[0]->ops.read_signal_strength = 1124 dm04_rs2000_read_signal_strength; 1125 adap->fe[0]->ops.read_snr = 1126 dm04_rs2000_read_snr; 1127 adap->fe[0]->ops.read_ber = 1128 dm04_read_ber; 1129 adap->fe[0]->ops.read_ucblocks = 1130 dm04_read_ucblocks; 1131 } 1132 break; 1133 } 1134 1135 if (adap->fe[0] == NULL) { 1136 info("DM04/QQBOX Not Powered up or not Supported"); 1137 return -ENODEV; 1138 } 1139 1140 if (ret) { 1141 if (adap->fe[0]) { 1142 dvb_frontend_detach(adap->fe[0]); 1143 adap->fe[0] = NULL; 1144 } 1145 d->rc_map = NULL; 1146 return -ENODEV; 1147 } 1148 1149 adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage; 1150 ret = lme_name(adap); 1151 return ret; 1152 } 1153 1154 static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap) 1155 { 1156 struct dvb_usb_device *d = adap_to_d(adap); 1157 struct lme2510_state *st = adap_to_priv(adap); 1158 char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"}; 1159 int ret = 0; 1160 1161 switch (st->tuner_config) { 1162 case TUNER_LG: 1163 if (dvb_attach(tda826x_attach, adap->fe[0], 0x60, 1164 &d->i2c_adap, 1)) 1165 ret = st->tuner_config; 1166 break; 1167 case TUNER_S7395: 1168 if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner, 1169 &d->i2c_adap)) 1170 ret = st->tuner_config; 1171 break; 1172 case TUNER_S0194: 1173 if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60, 1174 &d->i2c_adap, DVB_PLL_OPERA1)) 1175 ret = st->tuner_config; 1176 break; 1177 case TUNER_RS2000: 1178 ret = st->tuner_config; 1179 break; 1180 default: 1181 break; 1182 } 1183 1184 if (ret) 1185 info("TUN Found %s tuner", tun_msg[ret]); 1186 else { 1187 info("TUN No tuner found --- resetting device"); 1188 lme_coldreset(d); 1189 return -ENODEV; 1190 } 1191 1192 /* Start the Interrupt*/ 1193 ret = lme2510_int_read(adap); 1194 if (ret < 0) { 1195 info("INT Unable to start Interrupt Service"); 1196 return -ENODEV; 1197 } 1198 1199 return ret; 1200 } 1201 1202 static int lme2510_powerup(struct dvb_usb_device *d, int onoff) 1203 { 1204 struct lme2510_state *st = d->priv; 1205 static u8 lnb_on[] = LNB_ON; 1206 static u8 lnb_off[] = LNB_OFF; 1207 static u8 rbuf[1]; 1208 int ret = 0, len = 3, rlen = 1; 1209 1210 mutex_lock(&d->i2c_mutex); 1211 1212 if (onoff) 1213 ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen); 1214 else 1215 ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen); 1216 1217 st->i2c_talk_onoff = 1; 1218 1219 mutex_unlock(&d->i2c_mutex); 1220 1221 return ret; 1222 } 1223 1224 static int lme2510_get_adapter_count(struct dvb_usb_device *d) 1225 { 1226 return 1; 1227 } 1228 1229 static int lme2510_identify_state(struct dvb_usb_device *d, const char **name) 1230 { 1231 struct lme2510_state *st = d->priv; 1232 1233 usb_reset_configuration(d->udev); 1234 1235 usb_set_interface(d->udev, 1236 d->props->bInterfaceNumber, 1); 1237 1238 st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware; 1239 1240 if (lme2510_return_status(d) == 0x44) { 1241 *name = lme_firmware_switch(d, 0); 1242 return COLD; 1243 } 1244 1245 return 0; 1246 } 1247 1248 static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type, 1249 struct usb_data_stream_properties *stream) 1250 { 1251 struct dvb_usb_adapter *adap = fe_to_adap(fe); 1252 struct dvb_usb_device *d; 1253 1254 if (adap == NULL) 1255 return 0; 1256 1257 d = adap_to_d(adap); 1258 1259 /* Turn PID filter on the fly by module option */ 1260 if (pid_filter == 2) { 1261 adap->pid_filtering = true; 1262 adap->max_feed_count = 15; 1263 } 1264 1265 if (!(le16_to_cpu(d->udev->descriptor.idProduct) 1266 == 0x1122)) 1267 stream->endpoint = 0x8; 1268 1269 return 0; 1270 } 1271 1272 static int lme2510_get_rc_config(struct dvb_usb_device *d, 1273 struct dvb_usb_rc *rc) 1274 { 1275 rc->allowed_protos = RC_BIT_NEC; 1276 return 0; 1277 } 1278 1279 static void *lme2510_exit_int(struct dvb_usb_device *d) 1280 { 1281 struct lme2510_state *st = d->priv; 1282 struct dvb_usb_adapter *adap = &d->adapter[0]; 1283 void *buffer = NULL; 1284 1285 if (adap != NULL) { 1286 lme2510_kill_urb(&adap->stream); 1287 } 1288 1289 if (st->usb_buffer != NULL) { 1290 st->i2c_talk_onoff = 1; 1291 st->signal_lock = 0; 1292 st->signal_level = 0; 1293 st->signal_sn = 0; 1294 buffer = st->usb_buffer; 1295 } 1296 1297 if (st->lme_urb != NULL) { 1298 usb_kill_urb(st->lme_urb); 1299 usb_free_coherent(d->udev, 128, st->buffer, 1300 st->lme_urb->transfer_dma); 1301 info("Interrupt Service Stopped"); 1302 } 1303 1304 return buffer; 1305 } 1306 1307 static void lme2510_exit(struct dvb_usb_device *d) 1308 { 1309 void *usb_buffer; 1310 1311 if (d != NULL) { 1312 usb_buffer = lme2510_exit_int(d); 1313 kfree(usb_buffer); 1314 } 1315 } 1316 1317 static struct dvb_usb_device_properties lme2510_props = { 1318 .driver_name = KBUILD_MODNAME, 1319 .owner = THIS_MODULE, 1320 .bInterfaceNumber = 0, 1321 .adapter_nr = adapter_nr, 1322 .size_of_priv = sizeof(struct lme2510_state), 1323 1324 .download_firmware = lme2510_download_firmware, 1325 1326 .power_ctrl = lme2510_powerup, 1327 .identify_state = lme2510_identify_state, 1328 .i2c_algo = &lme2510_i2c_algo, 1329 1330 .frontend_attach = dm04_lme2510_frontend_attach, 1331 .tuner_attach = dm04_lme2510_tuner, 1332 .get_stream_config = lme2510_get_stream_config, 1333 .get_adapter_count = lme2510_get_adapter_count, 1334 .streaming_ctrl = lme2510_streaming_ctrl, 1335 1336 .get_rc_config = lme2510_get_rc_config, 1337 1338 .exit = lme2510_exit, 1339 .adapter = { 1340 { 1341 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1342 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1343 .pid_filter_count = 15, 1344 .pid_filter = lme2510_pid_filter, 1345 .pid_filter_ctrl = lme2510_pid_filter_ctrl, 1346 .stream = 1347 DVB_USB_STREAM_BULK(0x86, 10, 4096), 1348 }, 1349 { 1350 } 1351 }, 1352 }; 1353 1354 static const struct usb_device_id lme2510_id_table[] = { 1355 { DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props, 1356 "DM04_LME2510_DVB-S", RC_MAP_LME2510) }, 1357 { DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props, 1358 "DM04_LME2510C_DVB-S", RC_MAP_LME2510) }, 1359 { DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props, 1360 "DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510) }, 1361 {} /* Terminating entry */ 1362 }; 1363 1364 MODULE_DEVICE_TABLE(usb, lme2510_id_table); 1365 1366 static struct usb_driver lme2510_driver = { 1367 .name = KBUILD_MODNAME, 1368 .probe = dvb_usbv2_probe, 1369 .disconnect = dvb_usbv2_disconnect, 1370 .id_table = lme2510_id_table, 1371 .no_dynamic_id = 1, 1372 .soft_unbind = 1, 1373 }; 1374 1375 module_usb_driver(lme2510_driver); 1376 1377 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); 1378 MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); 1379 MODULE_VERSION("2.06"); 1380 MODULE_LICENSE("GPL"); 1381 MODULE_FIRMWARE(LME2510_C_S7395); 1382 MODULE_FIRMWARE(LME2510_C_LG); 1383 MODULE_FIRMWARE(LME2510_C_S0194); 1384 MODULE_FIRMWARE(LME2510_C_RS2000); 1385 MODULE_FIRMWARE(LME2510_LG); 1386 MODULE_FIRMWARE(LME2510_S0194); 1387 1388