ttusb_dec.c (40872B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * TTUSB DEC Driver 4 * 5 * Copyright (C) 2003-2004 Alex Woods <linux-dvb@giblets.org> 6 * IR support by Peter Beutner <p.beutner@gmx.net> 7 */ 8 9#include <linux/list.h> 10#include <linux/module.h> 11#include <linux/pci.h> 12#include <linux/slab.h> 13#include <linux/spinlock.h> 14#include <linux/usb.h> 15#include <linux/interrupt.h> 16#include <linux/firmware.h> 17#include <linux/crc32.h> 18#include <linux/init.h> 19#include <linux/input.h> 20 21#include <linux/mutex.h> 22 23#include <media/dmxdev.h> 24#include <media/dvb_demux.h> 25#include <media/dvb_frontend.h> 26#include <media/dvb_net.h> 27#include "ttusbdecfe.h" 28 29static int debug; 30static int output_pva; 31static int enable_rc; 32 33module_param(debug, int, 0644); 34MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); 35module_param(output_pva, int, 0444); 36MODULE_PARM_DESC(output_pva, "Output PVA from dvr device (default:off)"); 37module_param(enable_rc, int, 0644); 38MODULE_PARM_DESC(enable_rc, "Turn on/off IR remote control(default: off)"); 39 40DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 41 42#define dprintk if (debug) printk 43 44#define DRIVER_NAME "TechnoTrend/Hauppauge DEC USB" 45 46#define COMMAND_PIPE 0x03 47#define RESULT_PIPE 0x04 48#define IN_PIPE 0x08 49#define OUT_PIPE 0x07 50#define IRQ_PIPE 0x0A 51 52#define COMMAND_PACKET_SIZE 0x3c 53#define ARM_PACKET_SIZE 0x1000 54#define IRQ_PACKET_SIZE 0x8 55 56#define ISO_BUF_COUNT 0x04 57#define FRAMES_PER_ISO_BUF 0x04 58#define ISO_FRAME_SIZE 0x0380 59 60#define MAX_PVA_LENGTH 6144 61 62enum ttusb_dec_model { 63 TTUSB_DEC2000T, 64 TTUSB_DEC2540T, 65 TTUSB_DEC3000S 66}; 67 68enum ttusb_dec_packet_type { 69 TTUSB_DEC_PACKET_PVA, 70 TTUSB_DEC_PACKET_SECTION, 71 TTUSB_DEC_PACKET_EMPTY 72}; 73 74enum ttusb_dec_interface { 75 TTUSB_DEC_INTERFACE_INITIAL, 76 TTUSB_DEC_INTERFACE_IN, 77 TTUSB_DEC_INTERFACE_OUT 78}; 79 80typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *); 81 82struct dvb_filter_pes2ts { 83 unsigned char buf[188]; 84 unsigned char cc; 85 dvb_filter_pes2ts_cb_t *cb; 86 void *priv; 87}; 88 89struct ttusb_dec { 90 enum ttusb_dec_model model; 91 char *model_name; 92 char *firmware_name; 93 int can_playback; 94 95 /* DVB bits */ 96 struct dvb_adapter adapter; 97 struct dmxdev dmxdev; 98 struct dvb_demux demux; 99 struct dmx_frontend frontend; 100 struct dvb_net dvb_net; 101 struct dvb_frontend* fe; 102 103 u16 pid[DMX_PES_OTHER]; 104 105 /* USB bits */ 106 struct usb_device *udev; 107 u8 trans_count; 108 unsigned int command_pipe; 109 unsigned int result_pipe; 110 unsigned int in_pipe; 111 unsigned int out_pipe; 112 unsigned int irq_pipe; 113 enum ttusb_dec_interface interface; 114 struct mutex usb_mutex; 115 116 void *irq_buffer; 117 struct urb *irq_urb; 118 dma_addr_t irq_dma_handle; 119 void *iso_buffer; 120 struct urb *iso_urb[ISO_BUF_COUNT]; 121 int iso_stream_count; 122 struct mutex iso_mutex; 123 124 u8 packet[MAX_PVA_LENGTH + 4]; 125 enum ttusb_dec_packet_type packet_type; 126 int packet_state; 127 int packet_length; 128 int packet_payload_length; 129 u16 next_packet_id; 130 131 int pva_stream_count; 132 int filter_stream_count; 133 134 struct dvb_filter_pes2ts a_pes2ts; 135 struct dvb_filter_pes2ts v_pes2ts; 136 137 u8 v_pes[16 + MAX_PVA_LENGTH]; 138 int v_pes_length; 139 int v_pes_postbytes; 140 141 struct list_head urb_frame_list; 142 struct tasklet_struct urb_tasklet; 143 spinlock_t urb_frame_list_lock; 144 145 struct dvb_demux_filter *audio_filter; 146 struct dvb_demux_filter *video_filter; 147 struct list_head filter_info_list; 148 spinlock_t filter_info_list_lock; 149 150 struct input_dev *rc_input_dev; 151 char rc_phys[64]; 152 153 int active; /* Loaded successfully */ 154}; 155 156struct urb_frame { 157 u8 data[ISO_FRAME_SIZE]; 158 int length; 159 struct list_head urb_frame_list; 160}; 161 162struct filter_info { 163 u8 stream_id; 164 struct dvb_demux_filter *filter; 165 struct list_head filter_info_list; 166}; 167 168static u16 rc_keys[] = { 169 KEY_POWER, 170 KEY_MUTE, 171 KEY_1, 172 KEY_2, 173 KEY_3, 174 KEY_4, 175 KEY_5, 176 KEY_6, 177 KEY_7, 178 KEY_8, 179 KEY_9, 180 KEY_0, 181 KEY_CHANNELUP, 182 KEY_VOLUMEDOWN, 183 KEY_OK, 184 KEY_VOLUMEUP, 185 KEY_CHANNELDOWN, 186 KEY_PREVIOUS, 187 KEY_ESC, 188 KEY_RED, 189 KEY_GREEN, 190 KEY_YELLOW, 191 KEY_BLUE, 192 KEY_OPTION, 193 KEY_M, 194 KEY_RADIO 195}; 196 197static void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, 198 unsigned short pid, 199 dvb_filter_pes2ts_cb_t *cb, void *priv) 200{ 201 unsigned char *buf=p2ts->buf; 202 203 buf[0]=0x47; 204 buf[1]=(pid>>8); 205 buf[2]=pid&0xff; 206 p2ts->cc=0; 207 p2ts->cb=cb; 208 p2ts->priv=priv; 209} 210 211static int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, 212 unsigned char *pes, int len, int payload_start) 213{ 214 unsigned char *buf=p2ts->buf; 215 int ret=0, rest; 216 217 //len=6+((pes[4]<<8)|pes[5]); 218 219 if (payload_start) 220 buf[1]|=0x40; 221 else 222 buf[1]&=~0x40; 223 while (len>=184) { 224 buf[3]=0x10|((p2ts->cc++)&0x0f); 225 memcpy(buf+4, pes, 184); 226 if ((ret=p2ts->cb(p2ts->priv, buf))) 227 return ret; 228 len-=184; pes+=184; 229 buf[1]&=~0x40; 230 } 231 if (!len) 232 return 0; 233 buf[3]=0x30|((p2ts->cc++)&0x0f); 234 rest=183-len; 235 if (rest) { 236 buf[5]=0x00; 237 if (rest-1) 238 memset(buf+6, 0xff, rest-1); 239 } 240 buf[4]=rest; 241 memcpy(buf+5+rest, pes, len); 242 return p2ts->cb(p2ts->priv, buf); 243} 244 245static void ttusb_dec_set_model(struct ttusb_dec *dec, 246 enum ttusb_dec_model model); 247 248static void ttusb_dec_handle_irq( struct urb *urb) 249{ 250 struct ttusb_dec *dec = urb->context; 251 char *buffer = dec->irq_buffer; 252 int retval; 253 int index = buffer[4]; 254 255 switch(urb->status) { 256 case 0: /*success*/ 257 break; 258 case -ECONNRESET: 259 case -ENOENT: 260 case -ESHUTDOWN: 261 case -ETIME: 262 /* this urb is dead, cleanup */ 263 dprintk("%s:urb shutting down with status: %d\n", 264 __func__, urb->status); 265 return; 266 default: 267 dprintk("%s:nonzero status received: %d\n", 268 __func__,urb->status); 269 goto exit; 270 } 271 272 if ((buffer[0] == 0x1) && (buffer[2] == 0x15)) { 273 /* 274 * IR - Event 275 * 276 * this is an fact a bit too simple implementation; 277 * the box also reports a keyrepeat signal 278 * (with buffer[3] == 0x40) in an interval of ~100ms. 279 * But to handle this correctly we had to imlemenent some 280 * kind of timer which signals a 'key up' event if no 281 * keyrepeat signal is received for lets say 200ms. 282 * this should/could be added later ... 283 * for now lets report each signal as a key down and up 284 */ 285 if (index - 1 < ARRAY_SIZE(rc_keys)) { 286 dprintk("%s:rc signal:%d\n", __func__, index); 287 input_report_key(dec->rc_input_dev, rc_keys[index - 1], 1); 288 input_sync(dec->rc_input_dev); 289 input_report_key(dec->rc_input_dev, rc_keys[index - 1], 0); 290 input_sync(dec->rc_input_dev); 291 } 292 } 293 294exit: 295 retval = usb_submit_urb(urb, GFP_ATOMIC); 296 if (retval) 297 printk("%s - usb_commit_urb failed with result: %d\n", 298 __func__, retval); 299} 300 301static u16 crc16(u16 crc, const u8 *buf, size_t len) 302{ 303 u16 tmp; 304 305 while (len--) { 306 crc ^= *buf++; 307 crc ^= (u8)crc >> 4; 308 tmp = (u8)crc; 309 crc ^= (tmp ^ (tmp << 1)) << 4; 310 } 311 return crc; 312} 313 314static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, 315 int param_length, const u8 params[], 316 int *result_length, u8 cmd_result[]) 317{ 318 int result, actual_len; 319 u8 *b; 320 321 dprintk("%s\n", __func__); 322 323 b = kzalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL); 324 if (!b) 325 return -ENOMEM; 326 327 result = mutex_lock_interruptible(&dec->usb_mutex); 328 if (result) { 329 printk("%s: Failed to lock usb mutex.\n", __func__); 330 goto err_free; 331 } 332 333 b[0] = 0xaa; 334 b[1] = ++dec->trans_count; 335 b[2] = command; 336 b[3] = param_length; 337 338 if (params) 339 memcpy(&b[4], params, param_length); 340 341 if (debug) { 342 printk(KERN_DEBUG "%s: command: %*ph\n", 343 __func__, param_length, b); 344 } 345 346 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, 347 COMMAND_PACKET_SIZE + 4, &actual_len, 1000); 348 349 if (result) { 350 printk("%s: command bulk message failed: error %d\n", 351 __func__, result); 352 goto err_mutex_unlock; 353 } 354 355 result = usb_bulk_msg(dec->udev, dec->result_pipe, b, 356 COMMAND_PACKET_SIZE + 4, &actual_len, 1000); 357 358 if (result) { 359 printk("%s: result bulk message failed: error %d\n", 360 __func__, result); 361 goto err_mutex_unlock; 362 } else { 363 if (debug) { 364 printk(KERN_DEBUG "%s: result: %*ph\n", 365 __func__, actual_len, b); 366 } 367 368 if (result_length) 369 *result_length = b[3]; 370 if (cmd_result && b[3] > 0) 371 memcpy(cmd_result, &b[4], b[3]); 372 } 373 374err_mutex_unlock: 375 mutex_unlock(&dec->usb_mutex); 376err_free: 377 kfree(b); 378 return result; 379} 380 381static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode, 382 unsigned int *model, unsigned int *version) 383{ 384 u8 c[COMMAND_PACKET_SIZE]; 385 int c_length; 386 int result; 387 __be32 tmp; 388 389 dprintk("%s\n", __func__); 390 391 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c); 392 if (result) 393 return result; 394 395 if (c_length >= 0x0c) { 396 if (mode != NULL) { 397 memcpy(&tmp, c, 4); 398 *mode = ntohl(tmp); 399 } 400 if (model != NULL) { 401 memcpy(&tmp, &c[4], 4); 402 *model = ntohl(tmp); 403 } 404 if (version != NULL) { 405 memcpy(&tmp, &c[8], 4); 406 *version = ntohl(tmp); 407 } 408 return 0; 409 } else { 410 return -ENOENT; 411 } 412} 413 414static int ttusb_dec_audio_pes2ts_cb(void *priv, unsigned char *data) 415{ 416 struct ttusb_dec *dec = priv; 417 418 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0, 419 &dec->audio_filter->feed->feed.ts, NULL); 420 421 return 0; 422} 423 424static int ttusb_dec_video_pes2ts_cb(void *priv, unsigned char *data) 425{ 426 struct ttusb_dec *dec = priv; 427 428 dec->video_filter->feed->cb.ts(data, 188, NULL, 0, 429 &dec->video_filter->feed->feed.ts, NULL); 430 431 return 0; 432} 433 434static void ttusb_dec_set_pids(struct ttusb_dec *dec) 435{ 436 u8 b[] = { 0x00, 0x00, 0x00, 0x00, 437 0x00, 0x00, 0xff, 0xff, 438 0xff, 0xff, 0xff, 0xff }; 439 440 __be16 pcr = htons(dec->pid[DMX_PES_PCR]); 441 __be16 audio = htons(dec->pid[DMX_PES_AUDIO]); 442 __be16 video = htons(dec->pid[DMX_PES_VIDEO]); 443 444 dprintk("%s\n", __func__); 445 446 memcpy(&b[0], &pcr, 2); 447 memcpy(&b[2], &audio, 2); 448 memcpy(&b[4], &video, 2); 449 450 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL); 451 452 dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO], 453 ttusb_dec_audio_pes2ts_cb, dec); 454 dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO], 455 ttusb_dec_video_pes2ts_cb, dec); 456 dec->v_pes_length = 0; 457 dec->v_pes_postbytes = 0; 458} 459 460static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length) 461{ 462 if (length < 8) { 463 printk("%s: packet too short - discarding\n", __func__); 464 return; 465 } 466 467 if (length > 8 + MAX_PVA_LENGTH) { 468 printk("%s: packet too long - discarding\n", __func__); 469 return; 470 } 471 472 switch (pva[2]) { 473 474 case 0x01: { /* VideoStream */ 475 int prebytes = pva[5] & 0x03; 476 int postbytes = (pva[5] & 0x0c) >> 2; 477 __be16 v_pes_payload_length; 478 479 if (output_pva) { 480 dec->video_filter->feed->cb.ts(pva, length, NULL, 0, 481 &dec->video_filter->feed->feed.ts, NULL); 482 return; 483 } 484 485 if (dec->v_pes_postbytes > 0 && 486 dec->v_pes_postbytes == prebytes) { 487 memcpy(&dec->v_pes[dec->v_pes_length], 488 &pva[12], prebytes); 489 490 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, 491 dec->v_pes_length + prebytes, 1); 492 } 493 494 if (pva[5] & 0x10) { 495 dec->v_pes[7] = 0x80; 496 dec->v_pes[8] = 0x05; 497 498 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5); 499 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) | 500 ((pva[9] & 0xc0) >> 6); 501 dec->v_pes[11] = 0x01 | 502 ((pva[9] & 0x3f) << 2) | 503 ((pva[10] & 0x80) >> 6); 504 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) | 505 ((pva[11] & 0xc0) >> 7); 506 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1); 507 508 memcpy(&dec->v_pes[14], &pva[12 + prebytes], 509 length - 12 - prebytes); 510 dec->v_pes_length = 14 + length - 12 - prebytes; 511 } else { 512 dec->v_pes[7] = 0x00; 513 dec->v_pes[8] = 0x00; 514 515 memcpy(&dec->v_pes[9], &pva[8], length - 8); 516 dec->v_pes_length = 9 + length - 8; 517 } 518 519 dec->v_pes_postbytes = postbytes; 520 521 if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 && 522 dec->v_pes[10 + dec->v_pes[8]] == 0x00 && 523 dec->v_pes[11 + dec->v_pes[8]] == 0x01) 524 dec->v_pes[6] = 0x84; 525 else 526 dec->v_pes[6] = 0x80; 527 528 v_pes_payload_length = htons(dec->v_pes_length - 6 + 529 postbytes); 530 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2); 531 532 if (postbytes == 0) 533 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, 534 dec->v_pes_length, 1); 535 536 break; 537 } 538 539 case 0x02: /* MainAudioStream */ 540 if (output_pva) { 541 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0, 542 &dec->audio_filter->feed->feed.ts, NULL); 543 return; 544 } 545 546 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8, 547 pva[5] & 0x10); 548 break; 549 550 default: 551 printk("%s: unknown PVA type: %02x.\n", __func__, 552 pva[2]); 553 break; 554 } 555} 556 557static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet, 558 int length) 559{ 560 struct list_head *item; 561 struct filter_info *finfo; 562 struct dvb_demux_filter *filter = NULL; 563 unsigned long flags; 564 u8 sid; 565 566 sid = packet[1]; 567 spin_lock_irqsave(&dec->filter_info_list_lock, flags); 568 for (item = dec->filter_info_list.next; item != &dec->filter_info_list; 569 item = item->next) { 570 finfo = list_entry(item, struct filter_info, filter_info_list); 571 if (finfo->stream_id == sid) { 572 filter = finfo->filter; 573 break; 574 } 575 } 576 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); 577 578 if (filter) 579 filter->feed->cb.sec(&packet[2], length - 2, NULL, 0, 580 &filter->filter, NULL); 581} 582 583static void ttusb_dec_process_packet(struct ttusb_dec *dec) 584{ 585 int i; 586 u16 csum = 0; 587 u16 packet_id; 588 589 if (dec->packet_length % 2) { 590 printk("%s: odd sized packet - discarding\n", __func__); 591 return; 592 } 593 594 for (i = 0; i < dec->packet_length; i += 2) 595 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]); 596 597 if (csum) { 598 printk("%s: checksum failed - discarding\n", __func__); 599 return; 600 } 601 602 packet_id = dec->packet[dec->packet_length - 4] << 8; 603 packet_id += dec->packet[dec->packet_length - 3]; 604 605 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) { 606 printk("%s: warning: lost packets between %u and %u\n", 607 __func__, dec->next_packet_id - 1, packet_id); 608 } 609 610 if (packet_id == 0xffff) 611 dec->next_packet_id = 0x8000; 612 else 613 dec->next_packet_id = packet_id + 1; 614 615 switch (dec->packet_type) { 616 case TTUSB_DEC_PACKET_PVA: 617 if (dec->pva_stream_count) 618 ttusb_dec_process_pva(dec, dec->packet, 619 dec->packet_payload_length); 620 break; 621 622 case TTUSB_DEC_PACKET_SECTION: 623 if (dec->filter_stream_count) 624 ttusb_dec_process_filter(dec, dec->packet, 625 dec->packet_payload_length); 626 break; 627 628 case TTUSB_DEC_PACKET_EMPTY: 629 break; 630 } 631} 632 633static void swap_bytes(u8 *b, int length) 634{ 635 length -= length % 2; 636 for (; length; b += 2, length -= 2) 637 swap(*b, *(b + 1)); 638} 639 640static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b, 641 int length) 642{ 643 swap_bytes(b, length); 644 645 while (length) { 646 switch (dec->packet_state) { 647 648 case 0: 649 case 1: 650 case 2: 651 if (*b++ == 0xaa) 652 dec->packet_state++; 653 else 654 dec->packet_state = 0; 655 656 length--; 657 break; 658 659 case 3: 660 if (*b == 0x00) { 661 dec->packet_state++; 662 dec->packet_length = 0; 663 } else if (*b != 0xaa) { 664 dec->packet_state = 0; 665 } 666 667 b++; 668 length--; 669 break; 670 671 case 4: 672 dec->packet[dec->packet_length++] = *b++; 673 674 if (dec->packet_length == 2) { 675 if (dec->packet[0] == 'A' && 676 dec->packet[1] == 'V') { 677 dec->packet_type = 678 TTUSB_DEC_PACKET_PVA; 679 dec->packet_state++; 680 } else if (dec->packet[0] == 'S') { 681 dec->packet_type = 682 TTUSB_DEC_PACKET_SECTION; 683 dec->packet_state++; 684 } else if (dec->packet[0] == 0x00) { 685 dec->packet_type = 686 TTUSB_DEC_PACKET_EMPTY; 687 dec->packet_payload_length = 2; 688 dec->packet_state = 7; 689 } else { 690 printk("%s: unknown packet type: %02x%02x\n", 691 __func__, 692 dec->packet[0], dec->packet[1]); 693 dec->packet_state = 0; 694 } 695 } 696 697 length--; 698 break; 699 700 case 5: 701 dec->packet[dec->packet_length++] = *b++; 702 703 if (dec->packet_type == TTUSB_DEC_PACKET_PVA && 704 dec->packet_length == 8) { 705 dec->packet_state++; 706 dec->packet_payload_length = 8 + 707 (dec->packet[6] << 8) + 708 dec->packet[7]; 709 } else if (dec->packet_type == 710 TTUSB_DEC_PACKET_SECTION && 711 dec->packet_length == 5) { 712 dec->packet_state++; 713 dec->packet_payload_length = 5 + 714 ((dec->packet[3] & 0x0f) << 8) + 715 dec->packet[4]; 716 } 717 718 length--; 719 break; 720 721 case 6: { 722 int remainder = dec->packet_payload_length - 723 dec->packet_length; 724 725 if (length >= remainder) { 726 memcpy(dec->packet + dec->packet_length, 727 b, remainder); 728 dec->packet_length += remainder; 729 b += remainder; 730 length -= remainder; 731 dec->packet_state++; 732 } else { 733 memcpy(&dec->packet[dec->packet_length], 734 b, length); 735 dec->packet_length += length; 736 length = 0; 737 } 738 739 break; 740 } 741 742 case 7: { 743 int tail = 4; 744 745 dec->packet[dec->packet_length++] = *b++; 746 747 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION && 748 dec->packet_payload_length % 2) 749 tail++; 750 751 if (dec->packet_length == 752 dec->packet_payload_length + tail) { 753 ttusb_dec_process_packet(dec); 754 dec->packet_state = 0; 755 } 756 757 length--; 758 break; 759 } 760 761 default: 762 printk("%s: illegal packet state encountered.\n", 763 __func__); 764 dec->packet_state = 0; 765 } 766 } 767} 768 769static void ttusb_dec_process_urb_frame_list(struct tasklet_struct *t) 770{ 771 struct ttusb_dec *dec = from_tasklet(dec, t, urb_tasklet); 772 struct list_head *item; 773 struct urb_frame *frame; 774 unsigned long flags; 775 776 while (1) { 777 spin_lock_irqsave(&dec->urb_frame_list_lock, flags); 778 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { 779 frame = list_entry(item, struct urb_frame, 780 urb_frame_list); 781 list_del(&frame->urb_frame_list); 782 } else { 783 spin_unlock_irqrestore(&dec->urb_frame_list_lock, 784 flags); 785 return; 786 } 787 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags); 788 789 ttusb_dec_process_urb_frame(dec, frame->data, frame->length); 790 kfree(frame); 791 } 792} 793 794static void ttusb_dec_process_urb(struct urb *urb) 795{ 796 struct ttusb_dec *dec = urb->context; 797 798 if (!urb->status) { 799 int i; 800 801 for (i = 0; i < FRAMES_PER_ISO_BUF; i++) { 802 struct usb_iso_packet_descriptor *d; 803 u8 *b; 804 int length; 805 struct urb_frame *frame; 806 807 d = &urb->iso_frame_desc[i]; 808 b = urb->transfer_buffer + d->offset; 809 length = d->actual_length; 810 811 if ((frame = kmalloc(sizeof(struct urb_frame), 812 GFP_ATOMIC))) { 813 unsigned long flags; 814 815 memcpy(frame->data, b, length); 816 frame->length = length; 817 818 spin_lock_irqsave(&dec->urb_frame_list_lock, 819 flags); 820 list_add_tail(&frame->urb_frame_list, 821 &dec->urb_frame_list); 822 spin_unlock_irqrestore(&dec->urb_frame_list_lock, 823 flags); 824 825 tasklet_schedule(&dec->urb_tasklet); 826 } 827 } 828 } else { 829 /* -ENOENT is expected when unlinking urbs */ 830 if (urb->status != -ENOENT) 831 dprintk("%s: urb error: %d\n", __func__, 832 urb->status); 833 } 834 835 if (dec->iso_stream_count) 836 usb_submit_urb(urb, GFP_ATOMIC); 837} 838 839static void ttusb_dec_setup_urbs(struct ttusb_dec *dec) 840{ 841 int i, j, buffer_offset = 0; 842 843 dprintk("%s\n", __func__); 844 845 for (i = 0; i < ISO_BUF_COUNT; i++) { 846 int frame_offset = 0; 847 struct urb *urb = dec->iso_urb[i]; 848 849 urb->dev = dec->udev; 850 urb->context = dec; 851 urb->complete = ttusb_dec_process_urb; 852 urb->pipe = dec->in_pipe; 853 urb->transfer_flags = URB_ISO_ASAP; 854 urb->interval = 1; 855 urb->number_of_packets = FRAMES_PER_ISO_BUF; 856 urb->transfer_buffer_length = ISO_FRAME_SIZE * 857 FRAMES_PER_ISO_BUF; 858 urb->transfer_buffer = dec->iso_buffer + buffer_offset; 859 buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF; 860 861 for (j = 0; j < FRAMES_PER_ISO_BUF; j++) { 862 urb->iso_frame_desc[j].offset = frame_offset; 863 urb->iso_frame_desc[j].length = ISO_FRAME_SIZE; 864 frame_offset += ISO_FRAME_SIZE; 865 } 866 } 867} 868 869static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) 870{ 871 int i; 872 873 dprintk("%s\n", __func__); 874 875 if (mutex_lock_interruptible(&dec->iso_mutex)) 876 return; 877 878 dec->iso_stream_count--; 879 880 if (!dec->iso_stream_count) { 881 for (i = 0; i < ISO_BUF_COUNT; i++) 882 usb_kill_urb(dec->iso_urb[i]); 883 } 884 885 mutex_unlock(&dec->iso_mutex); 886} 887 888/* Setting the interface of the DEC tends to take down the USB communications 889 * for a short period, so it's important not to call this function just before 890 * trying to talk to it. 891 */ 892static int ttusb_dec_set_interface(struct ttusb_dec *dec, 893 enum ttusb_dec_interface interface) 894{ 895 int result = 0; 896 u8 b[] = { 0x05 }; 897 898 if (interface != dec->interface) { 899 switch (interface) { 900 case TTUSB_DEC_INTERFACE_INITIAL: 901 result = usb_set_interface(dec->udev, 0, 0); 902 break; 903 case TTUSB_DEC_INTERFACE_IN: 904 result = ttusb_dec_send_command(dec, 0x80, sizeof(b), 905 b, NULL, NULL); 906 if (result) 907 return result; 908 result = usb_set_interface(dec->udev, 0, 8); 909 break; 910 case TTUSB_DEC_INTERFACE_OUT: 911 result = usb_set_interface(dec->udev, 0, 1); 912 break; 913 } 914 915 if (result) 916 return result; 917 918 dec->interface = interface; 919 } 920 921 return 0; 922} 923 924static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) 925{ 926 int i, result; 927 928 dprintk("%s\n", __func__); 929 930 if (mutex_lock_interruptible(&dec->iso_mutex)) 931 return -EAGAIN; 932 933 if (!dec->iso_stream_count) { 934 ttusb_dec_setup_urbs(dec); 935 936 dec->packet_state = 0; 937 dec->v_pes_postbytes = 0; 938 dec->next_packet_id = 0; 939 940 for (i = 0; i < ISO_BUF_COUNT; i++) { 941 if ((result = usb_submit_urb(dec->iso_urb[i], 942 GFP_ATOMIC))) { 943 printk("%s: failed urb submission %d: error %d\n", 944 __func__, i, result); 945 946 while (i) { 947 usb_kill_urb(dec->iso_urb[i - 1]); 948 i--; 949 } 950 951 mutex_unlock(&dec->iso_mutex); 952 return result; 953 } 954 } 955 } 956 957 dec->iso_stream_count++; 958 959 mutex_unlock(&dec->iso_mutex); 960 961 return 0; 962} 963 964static int ttusb_dec_start_ts_feed(struct dvb_demux_feed *dvbdmxfeed) 965{ 966 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; 967 struct ttusb_dec *dec = dvbdmx->priv; 968 u8 b0[] = { 0x05 }; 969 int result = 0; 970 971 dprintk("%s\n", __func__); 972 973 dprintk(" ts_type:"); 974 975 if (dvbdmxfeed->ts_type & TS_DECODER) 976 dprintk(" TS_DECODER"); 977 978 if (dvbdmxfeed->ts_type & TS_PACKET) 979 dprintk(" TS_PACKET"); 980 981 if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) 982 dprintk(" TS_PAYLOAD_ONLY"); 983 984 dprintk("\n"); 985 986 switch (dvbdmxfeed->pes_type) { 987 988 case DMX_PES_VIDEO: 989 dprintk(" pes_type: DMX_PES_VIDEO\n"); 990 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; 991 dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid; 992 dec->video_filter = dvbdmxfeed->filter; 993 ttusb_dec_set_pids(dec); 994 break; 995 996 case DMX_PES_AUDIO: 997 dprintk(" pes_type: DMX_PES_AUDIO\n"); 998 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid; 999 dec->audio_filter = dvbdmxfeed->filter; 1000 ttusb_dec_set_pids(dec); 1001 break; 1002 1003 case DMX_PES_TELETEXT: 1004 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid; 1005 dprintk(" pes_type: DMX_PES_TELETEXT(not supported)\n"); 1006 return -ENOSYS; 1007 1008 case DMX_PES_PCR: 1009 dprintk(" pes_type: DMX_PES_PCR\n"); 1010 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; 1011 ttusb_dec_set_pids(dec); 1012 break; 1013 1014 case DMX_PES_OTHER: 1015 dprintk(" pes_type: DMX_PES_OTHER(not supported)\n"); 1016 return -ENOSYS; 1017 1018 default: 1019 dprintk(" pes_type: unknown (%d)\n", dvbdmxfeed->pes_type); 1020 return -EINVAL; 1021 1022 } 1023 1024 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL); 1025 if (result) 1026 return result; 1027 1028 dec->pva_stream_count++; 1029 return ttusb_dec_start_iso_xfer(dec); 1030} 1031 1032static int ttusb_dec_start_sec_feed(struct dvb_demux_feed *dvbdmxfeed) 1033{ 1034 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; 1035 u8 b0[] = { 0x00, 0x00, 0x00, 0x01, 1036 0x00, 0x00, 0x00, 0x00, 1037 0x00, 0x00, 0x00, 0x00, 1038 0x00, 0x00, 0x00, 0x00, 1039 0x00, 0xff, 0x00, 0x00, 1040 0x00, 0x00, 0x00, 0x00, 1041 0x00, 0x00, 0x00, 0x00, 1042 0x00 }; 1043 __be16 pid; 1044 u8 c[COMMAND_PACKET_SIZE]; 1045 int c_length; 1046 int result; 1047 struct filter_info *finfo; 1048 unsigned long flags; 1049 u8 x = 1; 1050 1051 dprintk("%s\n", __func__); 1052 1053 pid = htons(dvbdmxfeed->pid); 1054 memcpy(&b0[0], &pid, 2); 1055 memcpy(&b0[4], &x, 1); 1056 memcpy(&b0[5], &dvbdmxfeed->filter->filter.filter_value[0], 1); 1057 1058 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0, 1059 &c_length, c); 1060 1061 if (!result) { 1062 if (c_length == 2) { 1063 if (!(finfo = kmalloc(sizeof(struct filter_info), 1064 GFP_ATOMIC))) 1065 return -ENOMEM; 1066 1067 finfo->stream_id = c[1]; 1068 finfo->filter = dvbdmxfeed->filter; 1069 1070 spin_lock_irqsave(&dec->filter_info_list_lock, flags); 1071 list_add_tail(&finfo->filter_info_list, 1072 &dec->filter_info_list); 1073 spin_unlock_irqrestore(&dec->filter_info_list_lock, 1074 flags); 1075 1076 dvbdmxfeed->priv = finfo; 1077 1078 dec->filter_stream_count++; 1079 return ttusb_dec_start_iso_xfer(dec); 1080 } 1081 1082 return -EAGAIN; 1083 } else 1084 return result; 1085} 1086 1087static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed) 1088{ 1089 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; 1090 1091 dprintk("%s\n", __func__); 1092 1093 if (!dvbdmx->dmx.frontend) 1094 return -EINVAL; 1095 1096 dprintk(" pid: 0x%04X\n", dvbdmxfeed->pid); 1097 1098 switch (dvbdmxfeed->type) { 1099 1100 case DMX_TYPE_TS: 1101 return ttusb_dec_start_ts_feed(dvbdmxfeed); 1102 1103 case DMX_TYPE_SEC: 1104 return ttusb_dec_start_sec_feed(dvbdmxfeed); 1105 1106 default: 1107 dprintk(" type: unknown (%d)\n", dvbdmxfeed->type); 1108 return -EINVAL; 1109 1110 } 1111} 1112 1113static int ttusb_dec_stop_ts_feed(struct dvb_demux_feed *dvbdmxfeed) 1114{ 1115 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; 1116 u8 b0[] = { 0x00 }; 1117 1118 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL); 1119 1120 dec->pva_stream_count--; 1121 1122 ttusb_dec_stop_iso_xfer(dec); 1123 1124 return 0; 1125} 1126 1127static int ttusb_dec_stop_sec_feed(struct dvb_demux_feed *dvbdmxfeed) 1128{ 1129 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; 1130 u8 b0[] = { 0x00, 0x00 }; 1131 struct filter_info *finfo = (struct filter_info *)dvbdmxfeed->priv; 1132 unsigned long flags; 1133 1134 b0[1] = finfo->stream_id; 1135 spin_lock_irqsave(&dec->filter_info_list_lock, flags); 1136 list_del(&finfo->filter_info_list); 1137 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); 1138 kfree(finfo); 1139 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL); 1140 1141 dec->filter_stream_count--; 1142 1143 ttusb_dec_stop_iso_xfer(dec); 1144 1145 return 0; 1146} 1147 1148static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed) 1149{ 1150 dprintk("%s\n", __func__); 1151 1152 switch (dvbdmxfeed->type) { 1153 case DMX_TYPE_TS: 1154 return ttusb_dec_stop_ts_feed(dvbdmxfeed); 1155 1156 case DMX_TYPE_SEC: 1157 return ttusb_dec_stop_sec_feed(dvbdmxfeed); 1158 } 1159 1160 return 0; 1161} 1162 1163static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec) 1164{ 1165 int i; 1166 1167 dprintk("%s\n", __func__); 1168 1169 for (i = 0; i < ISO_BUF_COUNT; i++) 1170 usb_free_urb(dec->iso_urb[i]); 1171 kfree(dec->iso_buffer); 1172} 1173 1174static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) 1175{ 1176 int i; 1177 1178 dprintk("%s\n", __func__); 1179 1180 dec->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT, 1181 ISO_FRAME_SIZE, GFP_KERNEL); 1182 if (!dec->iso_buffer) 1183 return -ENOMEM; 1184 1185 for (i = 0; i < ISO_BUF_COUNT; i++) { 1186 struct urb *urb; 1187 1188 if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) { 1189 ttusb_dec_free_iso_urbs(dec); 1190 return -ENOMEM; 1191 } 1192 1193 dec->iso_urb[i] = urb; 1194 } 1195 1196 ttusb_dec_setup_urbs(dec); 1197 1198 return 0; 1199} 1200 1201static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) 1202{ 1203 spin_lock_init(&dec->urb_frame_list_lock); 1204 INIT_LIST_HEAD(&dec->urb_frame_list); 1205 tasklet_setup(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list); 1206} 1207 1208static int ttusb_init_rc( struct ttusb_dec *dec) 1209{ 1210 struct input_dev *input_dev; 1211 u8 b[] = { 0x00, 0x01 }; 1212 int i; 1213 int err; 1214 1215 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); 1216 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); 1217 1218 input_dev = input_allocate_device(); 1219 if (!input_dev) 1220 return -ENOMEM; 1221 1222 input_dev->name = "ttusb_dec remote control"; 1223 input_dev->phys = dec->rc_phys; 1224 input_dev->evbit[0] = BIT_MASK(EV_KEY); 1225 input_dev->keycodesize = sizeof(u16); 1226 input_dev->keycodemax = 0x1a; 1227 input_dev->keycode = rc_keys; 1228 1229 for (i = 0; i < ARRAY_SIZE(rc_keys); i++) 1230 set_bit(rc_keys[i], input_dev->keybit); 1231 1232 err = input_register_device(input_dev); 1233 if (err) { 1234 input_free_device(input_dev); 1235 return err; 1236 } 1237 1238 dec->rc_input_dev = input_dev; 1239 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL)) 1240 printk("%s: usb_submit_urb failed\n",__func__); 1241 /* enable irq pipe */ 1242 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL); 1243 1244 return 0; 1245} 1246 1247static void ttusb_dec_init_v_pes(struct ttusb_dec *dec) 1248{ 1249 dprintk("%s\n", __func__); 1250 1251 dec->v_pes[0] = 0x00; 1252 dec->v_pes[1] = 0x00; 1253 dec->v_pes[2] = 0x01; 1254 dec->v_pes[3] = 0xe0; 1255} 1256 1257static int ttusb_dec_init_usb(struct ttusb_dec *dec) 1258{ 1259 int result; 1260 1261 dprintk("%s\n", __func__); 1262 1263 mutex_init(&dec->usb_mutex); 1264 mutex_init(&dec->iso_mutex); 1265 1266 dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE); 1267 dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE); 1268 dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE); 1269 dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE); 1270 dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE); 1271 1272 if(enable_rc) { 1273 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL); 1274 if(!dec->irq_urb) { 1275 return -ENOMEM; 1276 } 1277 dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE, 1278 GFP_KERNEL, &dec->irq_dma_handle); 1279 if(!dec->irq_buffer) { 1280 usb_free_urb(dec->irq_urb); 1281 return -ENOMEM; 1282 } 1283 usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, 1284 dec->irq_buffer, IRQ_PACKET_SIZE, 1285 ttusb_dec_handle_irq, dec, 1); 1286 dec->irq_urb->transfer_dma = dec->irq_dma_handle; 1287 dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1288 } 1289 1290 result = ttusb_dec_alloc_iso_urbs(dec); 1291 if (result) { 1292 usb_free_urb(dec->irq_urb); 1293 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, 1294 dec->irq_buffer, dec->irq_dma_handle); 1295 } 1296 return result; 1297} 1298 1299static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) 1300{ 1301 int i, j, actual_len, result, size, trans_count; 1302 u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 1303 0x00, 0x00, 0x00, 0x00, 1304 0x61, 0x00 }; 1305 u8 b1[] = { 0x61 }; 1306 u8 *b; 1307 char idstring[21]; 1308 const u8 *firmware = NULL; 1309 size_t firmware_size = 0; 1310 u16 firmware_csum = 0; 1311 __be16 firmware_csum_ns; 1312 __be32 firmware_size_nl; 1313 u32 crc32_csum, crc32_check; 1314 __be32 tmp; 1315 const struct firmware *fw_entry = NULL; 1316 1317 dprintk("%s\n", __func__); 1318 1319 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev); 1320 if (result) { 1321 printk(KERN_ERR "%s: Firmware (%s) unavailable.\n", 1322 __func__, dec->firmware_name); 1323 return result; 1324 } 1325 1326 firmware = fw_entry->data; 1327 firmware_size = fw_entry->size; 1328 1329 if (firmware_size < 60) { 1330 printk("%s: firmware size too small for DSP code (%zu < 60).\n", 1331 __func__, firmware_size); 1332 release_firmware(fw_entry); 1333 return -ENOENT; 1334 } 1335 1336 /* a 32 bit checksum over the first 56 bytes of the DSP Code is stored 1337 at offset 56 of file, so use it to check if the firmware file is 1338 valid. */ 1339 crc32_csum = crc32(~0L, firmware, 56) ^ ~0L; 1340 memcpy(&tmp, &firmware[56], 4); 1341 crc32_check = ntohl(tmp); 1342 if (crc32_csum != crc32_check) { 1343 printk("%s: crc32 check of DSP code failed (calculated 0x%08x != 0x%08x in file), file invalid.\n", 1344 __func__, crc32_csum, crc32_check); 1345 release_firmware(fw_entry); 1346 return -ENOENT; 1347 } 1348 memcpy(idstring, &firmware[36], 20); 1349 idstring[20] = '\0'; 1350 printk(KERN_INFO "ttusb_dec: found DSP code \"%s\".\n", idstring); 1351 1352 firmware_size_nl = htonl(firmware_size); 1353 memcpy(b0, &firmware_size_nl, 4); 1354 firmware_csum = crc16(~0, firmware, firmware_size) ^ ~0; 1355 firmware_csum_ns = htons(firmware_csum); 1356 memcpy(&b0[6], &firmware_csum_ns, 2); 1357 1358 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL); 1359 1360 if (result) { 1361 release_firmware(fw_entry); 1362 return result; 1363 } 1364 1365 trans_count = 0; 1366 j = 0; 1367 1368 b = kmalloc(ARM_PACKET_SIZE, GFP_KERNEL); 1369 if (b == NULL) { 1370 release_firmware(fw_entry); 1371 return -ENOMEM; 1372 } 1373 1374 for (i = 0; i < firmware_size; i += COMMAND_PACKET_SIZE) { 1375 size = firmware_size - i; 1376 if (size > COMMAND_PACKET_SIZE) 1377 size = COMMAND_PACKET_SIZE; 1378 1379 b[j + 0] = 0xaa; 1380 b[j + 1] = trans_count++; 1381 b[j + 2] = 0xf0; 1382 b[j + 3] = size; 1383 memcpy(&b[j + 4], &firmware[i], size); 1384 1385 j += COMMAND_PACKET_SIZE + 4; 1386 1387 if (j >= ARM_PACKET_SIZE) { 1388 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, 1389 ARM_PACKET_SIZE, &actual_len, 1390 100); 1391 j = 0; 1392 } else if (size < COMMAND_PACKET_SIZE) { 1393 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, 1394 j - COMMAND_PACKET_SIZE + size, 1395 &actual_len, 100); 1396 } 1397 } 1398 1399 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL); 1400 1401 release_firmware(fw_entry); 1402 kfree(b); 1403 1404 return result; 1405} 1406 1407static int ttusb_dec_init_stb(struct ttusb_dec *dec) 1408{ 1409 int result; 1410 unsigned int mode = 0, model = 0, version = 0; 1411 1412 dprintk("%s\n", __func__); 1413 1414 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version); 1415 if (result) 1416 return result; 1417 1418 if (!mode) { 1419 if (version == 0xABCDEFAB) 1420 printk(KERN_INFO "ttusb_dec: no version info in Firmware\n"); 1421 else 1422 printk(KERN_INFO "ttusb_dec: Firmware %x.%02x%c%c\n", 1423 version >> 24, (version >> 16) & 0xff, 1424 (version >> 8) & 0xff, version & 0xff); 1425 1426 result = ttusb_dec_boot_dsp(dec); 1427 if (result) 1428 return result; 1429 } else { 1430 /* We can't trust the USB IDs that some firmwares 1431 give the box */ 1432 switch (model) { 1433 case 0x00070001: 1434 case 0x00070008: 1435 case 0x0007000c: 1436 ttusb_dec_set_model(dec, TTUSB_DEC3000S); 1437 break; 1438 case 0x00070009: 1439 case 0x00070013: 1440 ttusb_dec_set_model(dec, TTUSB_DEC2000T); 1441 break; 1442 case 0x00070011: 1443 ttusb_dec_set_model(dec, TTUSB_DEC2540T); 1444 break; 1445 default: 1446 printk(KERN_ERR "%s: unknown model returned by firmware (%08x) - please report\n", 1447 __func__, model); 1448 return -ENOENT; 1449 } 1450 if (version >= 0x01770000) 1451 dec->can_playback = 1; 1452 } 1453 return 0; 1454} 1455 1456static int ttusb_dec_init_dvb(struct ttusb_dec *dec) 1457{ 1458 int result; 1459 1460 dprintk("%s\n", __func__); 1461 1462 if ((result = dvb_register_adapter(&dec->adapter, 1463 dec->model_name, THIS_MODULE, 1464 &dec->udev->dev, 1465 adapter_nr)) < 0) { 1466 printk("%s: dvb_register_adapter failed: error %d\n", 1467 __func__, result); 1468 1469 return result; 1470 } 1471 1472 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; 1473 1474 dec->demux.priv = (void *)dec; 1475 dec->demux.filternum = 31; 1476 dec->demux.feednum = 31; 1477 dec->demux.start_feed = ttusb_dec_start_feed; 1478 dec->demux.stop_feed = ttusb_dec_stop_feed; 1479 dec->demux.write_to_decoder = NULL; 1480 1481 if ((result = dvb_dmx_init(&dec->demux)) < 0) { 1482 printk("%s: dvb_dmx_init failed: error %d\n", __func__, 1483 result); 1484 1485 dvb_unregister_adapter(&dec->adapter); 1486 1487 return result; 1488 } 1489 1490 dec->dmxdev.filternum = 32; 1491 dec->dmxdev.demux = &dec->demux.dmx; 1492 dec->dmxdev.capabilities = 0; 1493 1494 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) { 1495 printk("%s: dvb_dmxdev_init failed: error %d\n", 1496 __func__, result); 1497 1498 dvb_dmx_release(&dec->demux); 1499 dvb_unregister_adapter(&dec->adapter); 1500 1501 return result; 1502 } 1503 1504 dec->frontend.source = DMX_FRONTEND_0; 1505 1506 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx, 1507 &dec->frontend)) < 0) { 1508 printk("%s: dvb_dmx_init failed: error %d\n", __func__, 1509 result); 1510 1511 dvb_dmxdev_release(&dec->dmxdev); 1512 dvb_dmx_release(&dec->demux); 1513 dvb_unregister_adapter(&dec->adapter); 1514 1515 return result; 1516 } 1517 1518 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx, 1519 &dec->frontend)) < 0) { 1520 printk("%s: dvb_dmx_init failed: error %d\n", __func__, 1521 result); 1522 1523 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); 1524 dvb_dmxdev_release(&dec->dmxdev); 1525 dvb_dmx_release(&dec->demux); 1526 dvb_unregister_adapter(&dec->adapter); 1527 1528 return result; 1529 } 1530 1531 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx); 1532 1533 return 0; 1534} 1535 1536static void ttusb_dec_exit_dvb(struct ttusb_dec *dec) 1537{ 1538 dprintk("%s\n", __func__); 1539 1540 dvb_net_release(&dec->dvb_net); 1541 dec->demux.dmx.close(&dec->demux.dmx); 1542 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); 1543 dvb_dmxdev_release(&dec->dmxdev); 1544 dvb_dmx_release(&dec->demux); 1545 if (dec->fe) { 1546 dvb_unregister_frontend(dec->fe); 1547 if (dec->fe->ops.release) 1548 dec->fe->ops.release(dec->fe); 1549 } 1550 dvb_unregister_adapter(&dec->adapter); 1551} 1552 1553static void ttusb_dec_exit_rc(struct ttusb_dec *dec) 1554{ 1555 dprintk("%s\n", __func__); 1556 1557 if (dec->rc_input_dev) { 1558 input_unregister_device(dec->rc_input_dev); 1559 dec->rc_input_dev = NULL; 1560 } 1561} 1562 1563 1564static void ttusb_dec_exit_usb(struct ttusb_dec *dec) 1565{ 1566 int i; 1567 1568 dprintk("%s\n", __func__); 1569 1570 if (enable_rc) { 1571 /* we have to check whether the irq URB is already submitted. 1572 * As the irq is submitted after the interface is changed, 1573 * this is the best method i figured out. 1574 * Any others?*/ 1575 if (dec->interface == TTUSB_DEC_INTERFACE_IN) 1576 usb_kill_urb(dec->irq_urb); 1577 1578 usb_free_urb(dec->irq_urb); 1579 1580 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, 1581 dec->irq_buffer, dec->irq_dma_handle); 1582 } 1583 1584 dec->iso_stream_count = 0; 1585 1586 for (i = 0; i < ISO_BUF_COUNT; i++) 1587 usb_kill_urb(dec->iso_urb[i]); 1588 1589 ttusb_dec_free_iso_urbs(dec); 1590} 1591 1592static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) 1593{ 1594 struct list_head *item; 1595 struct urb_frame *frame; 1596 1597 tasklet_kill(&dec->urb_tasklet); 1598 1599 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { 1600 frame = list_entry(item, struct urb_frame, urb_frame_list); 1601 list_del(&frame->urb_frame_list); 1602 kfree(frame); 1603 } 1604} 1605 1606static void ttusb_dec_init_filters(struct ttusb_dec *dec) 1607{ 1608 INIT_LIST_HEAD(&dec->filter_info_list); 1609 spin_lock_init(&dec->filter_info_list_lock); 1610} 1611 1612static void ttusb_dec_exit_filters(struct ttusb_dec *dec) 1613{ 1614 struct list_head *item; 1615 struct filter_info *finfo; 1616 1617 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) { 1618 finfo = list_entry(item, struct filter_info, filter_info_list); 1619 list_del(&finfo->filter_info_list); 1620 kfree(finfo); 1621 } 1622} 1623 1624static int fe_send_command(struct dvb_frontend* fe, const u8 command, 1625 int param_length, const u8 params[], 1626 int *result_length, u8 cmd_result[]) 1627{ 1628 struct ttusb_dec* dec = fe->dvb->priv; 1629 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result); 1630} 1631 1632static const struct ttusbdecfe_config fe_config = { 1633 .send_command = fe_send_command 1634}; 1635 1636static int ttusb_dec_probe(struct usb_interface *intf, 1637 const struct usb_device_id *id) 1638{ 1639 struct usb_device *udev; 1640 struct ttusb_dec *dec; 1641 int result; 1642 1643 dprintk("%s\n", __func__); 1644 1645 udev = interface_to_usbdev(intf); 1646 1647 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) { 1648 printk("%s: couldn't allocate memory.\n", __func__); 1649 return -ENOMEM; 1650 } 1651 1652 usb_set_intfdata(intf, (void *)dec); 1653 1654 switch (id->idProduct) { 1655 case 0x1006: 1656 ttusb_dec_set_model(dec, TTUSB_DEC3000S); 1657 break; 1658 1659 case 0x1008: 1660 ttusb_dec_set_model(dec, TTUSB_DEC2000T); 1661 break; 1662 1663 case 0x1009: 1664 ttusb_dec_set_model(dec, TTUSB_DEC2540T); 1665 break; 1666 } 1667 1668 dec->udev = udev; 1669 1670 result = ttusb_dec_init_usb(dec); 1671 if (result) 1672 goto err_usb; 1673 result = ttusb_dec_init_stb(dec); 1674 if (result) 1675 goto err_stb; 1676 result = ttusb_dec_init_dvb(dec); 1677 if (result) 1678 goto err_stb; 1679 1680 dec->adapter.priv = dec; 1681 switch (id->idProduct) { 1682 case 0x1006: 1683 dec->fe = ttusbdecfe_dvbs_attach(&fe_config); 1684 break; 1685 1686 case 0x1008: 1687 case 0x1009: 1688 dec->fe = ttusbdecfe_dvbt_attach(&fe_config); 1689 break; 1690 } 1691 1692 if (dec->fe == NULL) { 1693 printk("dvb-ttusb-dec: A frontend driver was not found for device [%04x:%04x]\n", 1694 le16_to_cpu(dec->udev->descriptor.idVendor), 1695 le16_to_cpu(dec->udev->descriptor.idProduct)); 1696 } else { 1697 if (dvb_register_frontend(&dec->adapter, dec->fe)) { 1698 printk("budget-ci: Frontend registration failed!\n"); 1699 if (dec->fe->ops.release) 1700 dec->fe->ops.release(dec->fe); 1701 dec->fe = NULL; 1702 } 1703 } 1704 1705 ttusb_dec_init_v_pes(dec); 1706 ttusb_dec_init_filters(dec); 1707 ttusb_dec_init_tasklet(dec); 1708 1709 dec->active = 1; 1710 1711 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN); 1712 1713 if (enable_rc) 1714 ttusb_init_rc(dec); 1715 1716 return 0; 1717err_stb: 1718 ttusb_dec_exit_usb(dec); 1719err_usb: 1720 kfree(dec); 1721 return result; 1722} 1723 1724static void ttusb_dec_disconnect(struct usb_interface *intf) 1725{ 1726 struct ttusb_dec *dec = usb_get_intfdata(intf); 1727 1728 usb_set_intfdata(intf, NULL); 1729 1730 dprintk("%s\n", __func__); 1731 1732 if (dec->active) { 1733 ttusb_dec_exit_tasklet(dec); 1734 ttusb_dec_exit_filters(dec); 1735 if(enable_rc) 1736 ttusb_dec_exit_rc(dec); 1737 ttusb_dec_exit_usb(dec); 1738 ttusb_dec_exit_dvb(dec); 1739 } 1740 1741 kfree(dec); 1742} 1743 1744static void ttusb_dec_set_model(struct ttusb_dec *dec, 1745 enum ttusb_dec_model model) 1746{ 1747 dec->model = model; 1748 1749 switch (model) { 1750 case TTUSB_DEC2000T: 1751 dec->model_name = "DEC2000-t"; 1752 dec->firmware_name = "dvb-ttusb-dec-2000t.fw"; 1753 break; 1754 1755 case TTUSB_DEC2540T: 1756 dec->model_name = "DEC2540-t"; 1757 dec->firmware_name = "dvb-ttusb-dec-2540t.fw"; 1758 break; 1759 1760 case TTUSB_DEC3000S: 1761 dec->model_name = "DEC3000-s"; 1762 dec->firmware_name = "dvb-ttusb-dec-3000s.fw"; 1763 break; 1764 } 1765} 1766 1767static const struct usb_device_id ttusb_dec_table[] = { 1768 {USB_DEVICE(0x0b48, 0x1006)}, /* DEC3000-s */ 1769 /*{USB_DEVICE(0x0b48, 0x1007)}, Unconfirmed */ 1770 {USB_DEVICE(0x0b48, 0x1008)}, /* DEC2000-t */ 1771 {USB_DEVICE(0x0b48, 0x1009)}, /* DEC2540-t */ 1772 {} 1773}; 1774 1775static struct usb_driver ttusb_dec_driver = { 1776 .name = "ttusb-dec", 1777 .probe = ttusb_dec_probe, 1778 .disconnect = ttusb_dec_disconnect, 1779 .id_table = ttusb_dec_table, 1780}; 1781 1782module_usb_driver(ttusb_dec_driver); 1783 1784MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org>"); 1785MODULE_DESCRIPTION(DRIVER_NAME); 1786MODULE_LICENSE("GPL"); 1787MODULE_DEVICE_TABLE(usb, ttusb_dec_table);