Lines Matching refs:dec

245 static void ttusb_dec_set_model(struct ttusb_dec *dec,
250 struct ttusb_dec *dec = urb->context;
251 char *buffer = dec->irq_buffer;
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);
314 static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
327 result = mutex_lock_interruptible(&dec->usb_mutex);
334 b[1] = ++dec->trans_count;
346 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
355 result = usb_bulk_msg(dec->udev, dec->result_pipe, b,
375 mutex_unlock(&dec->usb_mutex);
381 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode,
391 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
416 struct ttusb_dec *dec = priv;
418 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0,
419 &dec->audio_filter->feed->feed.ts, NULL);
426 struct ttusb_dec *dec = priv;
428 dec->video_filter->feed->cb.ts(data, 188, NULL, 0,
429 &dec->video_filter->feed->feed.ts, NULL);
434 static void ttusb_dec_set_pids(struct ttusb_dec *dec)
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]);
450 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL);
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;
460 static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length)
480 dec->video_filter->feed->cb.ts(pva, length, NULL, 0,
481 &dec->video_filter->feed->feed.ts, NULL);
485 if (dec->v_pes_postbytes > 0 &&
486 dec->v_pes_postbytes == prebytes) {
487 memcpy(&dec->v_pes[dec->v_pes_length],
490 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
491 dec->v_pes_length + prebytes, 1);
495 dec->v_pes[7] = 0x80;
496 dec->v_pes[8] = 0x05;
498 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5);
499 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) |
501 dec->v_pes[11] = 0x01 |
504 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) |
506 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1);
508 memcpy(&dec->v_pes[14], &pva[12 + prebytes],
510 dec->v_pes_length = 14 + length - 12 - prebytes;
512 dec->v_pes[7] = 0x00;
513 dec->v_pes[8] = 0x00;
515 memcpy(&dec->v_pes[9], &pva[8], length - 8);
516 dec->v_pes_length = 9 + length - 8;
519 dec->v_pes_postbytes = postbytes;
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;
526 dec->v_pes[6] = 0x80;
528 v_pes_payload_length = htons(dec->v_pes_length - 6 +
530 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2);
533 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
534 dec->v_pes_length, 1);
541 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0,
542 &dec->audio_filter->feed->feed.ts, NULL);
546 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8,
557 static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet,
567 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
568 for (item = dec->filter_info_list.next; item != &dec->filter_info_list;
576 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
583 static void ttusb_dec_process_packet(struct ttusb_dec *dec)
589 if (dec->packet_length % 2) {
594 for (i = 0; i < dec->packet_length; i += 2)
595 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]);
602 packet_id = dec->packet[dec->packet_length - 4] << 8;
603 packet_id += dec->packet[dec->packet_length - 3];
605 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) {
607 __func__, dec->next_packet_id - 1, packet_id);
611 dec->next_packet_id = 0x8000;
613 dec->next_packet_id = packet_id + 1;
615 switch (dec->packet_type) {
617 if (dec->pva_stream_count)
618 ttusb_dec_process_pva(dec, dec->packet,
619 dec->packet_payload_length);
623 if (dec->filter_stream_count)
624 ttusb_dec_process_filter(dec, dec->packet,
625 dec->packet_payload_length);
640 static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b,
646 switch (dec->packet_state) {
652 dec->packet_state++;
654 dec->packet_state = 0;
661 dec->packet_state++;
662 dec->packet_length = 0;
664 dec->packet_state = 0;
672 dec->packet[dec->packet_length++] = *b++;
674 if (dec->packet_length == 2) {
675 if (dec->packet[0] == 'A' &&
676 dec->packet[1] == 'V') {
677 dec->packet_type =
679 dec->packet_state++;
680 } else if (dec->packet[0] == 'S') {
681 dec->packet_type =
683 dec->packet_state++;
684 } else if (dec->packet[0] == 0x00) {
685 dec->packet_type =
687 dec->packet_payload_length = 2;
688 dec->packet_state = 7;
692 dec->packet[0], dec->packet[1]);
693 dec->packet_state = 0;
701 dec->packet[dec->packet_length++] = *b++;
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 ==
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];
722 int remainder = dec->packet_payload_length -
723 dec->packet_length;
726 memcpy(dec->packet + dec->packet_length,
728 dec->packet_length += remainder;
731 dec->packet_state++;
733 memcpy(&dec->packet[dec->packet_length],
735 dec->packet_length += length;
745 dec->packet[dec->packet_length++] = *b++;
747 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION &&
748 dec->packet_payload_length % 2)
751 if (dec->packet_length ==
752 dec->packet_payload_length + tail) {
753 ttusb_dec_process_packet(dec);
754 dec->packet_state = 0;
764 dec->packet_state = 0;
771 struct ttusb_dec *dec = from_tasklet(dec, t, urb_tasklet);
777 spin_lock_irqsave(&dec->urb_frame_list_lock, flags);
778 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
783 spin_unlock_irqrestore(&dec->urb_frame_list_lock,
787 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags);
789 ttusb_dec_process_urb_frame(dec, frame->data, frame->length);
796 struct ttusb_dec *dec = urb->context;
818 spin_lock_irqsave(&dec->urb_frame_list_lock,
821 &dec->urb_frame_list);
822 spin_unlock_irqrestore(&dec->urb_frame_list_lock,
825 tasklet_schedule(&dec->urb_tasklet);
835 if (dec->iso_stream_count)
839 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
847 struct urb *urb = dec->iso_urb[i];
849 urb->dev = dec->udev;
850 urb->context = dec;
852 urb->pipe = dec->in_pipe;
858 urb->transfer_buffer = dec->iso_buffer + buffer_offset;
869 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
875 if (mutex_lock_interruptible(&dec->iso_mutex))
878 dec->iso_stream_count--;
880 if (!dec->iso_stream_count) {
882 usb_kill_urb(dec->iso_urb[i]);
885 mutex_unlock(&dec->iso_mutex);
892 static int ttusb_dec_set_interface(struct ttusb_dec *dec,
898 if (interface != dec->interface) {
901 result = usb_set_interface(dec->udev, 0, 0);
904 result = ttusb_dec_send_command(dec, 0x80, sizeof(b),
908 result = usb_set_interface(dec->udev, 0, 8);
911 result = usb_set_interface(dec->udev, 0, 1);
918 dec->interface = interface;
924 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
930 if (mutex_lock_interruptible(&dec->iso_mutex))
933 if (!dec->iso_stream_count) {
934 ttusb_dec_setup_urbs(dec);
936 dec->packet_state = 0;
937 dec->v_pes_postbytes = 0;
938 dec->next_packet_id = 0;
941 if ((result = usb_submit_urb(dec->iso_urb[i],
947 usb_kill_urb(dec->iso_urb[i - 1]);
951 mutex_unlock(&dec->iso_mutex);
957 dec->iso_stream_count++;
959 mutex_unlock(&dec->iso_mutex);
967 struct ttusb_dec *dec = dvbdmx->priv;
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);
998 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid;
999 dec->audio_filter = dvbdmxfeed->filter;
1000 ttusb_dec_set_pids(dec);
1004 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid;
1010 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
1011 ttusb_dec_set_pids(dec);
1024 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
1028 dec->pva_stream_count++;
1029 return ttusb_dec_start_iso_xfer(dec);
1034 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1058 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0,
1070 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1072 &dec->filter_info_list);
1073 spin_unlock_irqrestore(&dec->filter_info_list_lock,
1078 dec->filter_stream_count++;
1079 return ttusb_dec_start_iso_xfer(dec);
1115 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1118 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
1120 dec->pva_stream_count--;
1122 ttusb_dec_stop_iso_xfer(dec);
1129 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1135 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1137 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
1139 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL);
1141 dec->filter_stream_count--;
1143 ttusb_dec_stop_iso_xfer(dec);
1163 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
1170 usb_free_urb(dec->iso_urb[i]);
1171 kfree(dec->iso_buffer);
1174 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
1180 dec->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT,
1182 if (!dec->iso_buffer)
1189 ttusb_dec_free_iso_urbs(dec);
1193 dec->iso_urb[i] = urb;
1196 ttusb_dec_setup_urbs(dec);
1201 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec)
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);
1208 static int ttusb_init_rc( struct ttusb_dec *dec)
1215 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
1216 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys));
1223 input_dev->phys = dec->rc_phys;
1238 dec->rc_input_dev = input_dev;
1239 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL))
1242 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL);
1247 static void ttusb_dec_init_v_pes(struct ttusb_dec *dec)
1251 dec->v_pes[0] = 0x00;
1252 dec->v_pes[1] = 0x00;
1253 dec->v_pes[2] = 0x01;
1254 dec->v_pes[3] = 0xe0;
1257 static int ttusb_dec_init_usb(struct ttusb_dec *dec)
1263 mutex_init(&dec->usb_mutex);
1264 mutex_init(&dec->iso_mutex);
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);
1273 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
1274 if(!dec->irq_urb) {
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);
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;
1290 result = ttusb_dec_alloc_iso_urbs(dec);
1292 usb_free_urb(dec->irq_urb);
1293 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1294 dec->irq_buffer, dec->irq_dma_handle);
1299 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
1319 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev);
1322 __func__, dec->firmware_name);
1358 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
1388 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1393 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1399 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
1407 static int ttusb_dec_init_stb(struct ttusb_dec *dec)
1414 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version);
1426 result = ttusb_dec_boot_dsp(dec);
1436 ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1440 ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1443 ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1451 dec->can_playback = 1;
1456 static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
1462 if ((result = dvb_register_adapter(&dec->adapter,
1463 dec->model_name, THIS_MODULE,
1464 &dec->udev->dev,
1472 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
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;
1481 if ((result = dvb_dmx_init(&dec->demux)) < 0) {
1485 dvb_unregister_adapter(&dec->adapter);
1490 dec->dmxdev.filternum = 32;
1491 dec->dmxdev.demux = &dec->demux.dmx;
1492 dec->dmxdev.capabilities = 0;
1494 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) {
1498 dvb_dmx_release(&dec->demux);
1499 dvb_unregister_adapter(&dec->adapter);
1504 dec->frontend.source = DMX_FRONTEND_0;
1506 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx,
1507 &dec->frontend)) < 0) {
1511 dvb_dmxdev_release(&dec->dmxdev);
1512 dvb_dmx_release(&dec->demux);
1513 dvb_unregister_adapter(&dec->adapter);
1518 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx,
1519 &dec->frontend)) < 0) {
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);
1531 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx);
1536 static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
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 dvb_frontend_detach(dec->fe);
1549 dvb_unregister_adapter(&dec->adapter);
1552 static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
1556 if (dec->rc_input_dev) {
1557 input_unregister_device(dec->rc_input_dev);
1558 dec->rc_input_dev = NULL;
1563 static void ttusb_dec_exit_usb(struct ttusb_dec *dec)
1574 if (dec->interface == TTUSB_DEC_INTERFACE_IN)
1575 usb_kill_urb(dec->irq_urb);
1577 usb_free_urb(dec->irq_urb);
1579 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1580 dec->irq_buffer, dec->irq_dma_handle);
1583 dec->iso_stream_count = 0;
1586 usb_kill_urb(dec->iso_urb[i]);
1588 ttusb_dec_free_iso_urbs(dec);
1591 static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec)
1596 tasklet_kill(&dec->urb_tasklet);
1598 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
1605 static void ttusb_dec_init_filters(struct ttusb_dec *dec)
1607 INIT_LIST_HEAD(&dec->filter_info_list);
1608 spin_lock_init(&dec->filter_info_list_lock);
1611 static void ttusb_dec_exit_filters(struct ttusb_dec *dec)
1616 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) {
1627 struct ttusb_dec* dec = fe->dvb->priv;
1628 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result);
1639 struct ttusb_dec *dec;
1646 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
1651 usb_set_intfdata(intf, (void *)dec);
1655 ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1659 ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1663 ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1667 dec->udev = udev;
1669 result = ttusb_dec_init_usb(dec);
1672 result = ttusb_dec_init_stb(dec);
1675 result = ttusb_dec_init_dvb(dec);
1679 dec->adapter.priv = dec;
1682 dec->fe = ttusbdecfe_dvbs_attach(&fe_config);
1687 dec->fe = ttusbdecfe_dvbt_attach(&fe_config);
1691 if (dec->fe == NULL) {
1692 printk("dvb-ttusb-dec: A frontend driver was not found for device [%04x:%04x]\n",
1693 le16_to_cpu(dec->udev->descriptor.idVendor),
1694 le16_to_cpu(dec->udev->descriptor.idProduct));
1696 if (dvb_register_frontend(&dec->adapter, dec->fe)) {
1698 if (dec->fe->ops.release)
1699 dec->fe->ops.release(dec->fe);
1700 dec->fe = NULL;
1704 ttusb_dec_init_v_pes(dec);
1705 ttusb_dec_init_filters(dec);
1706 ttusb_dec_init_tasklet(dec);
1708 dec->active = 1;
1710 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN);
1713 ttusb_init_rc(dec);
1717 ttusb_dec_exit_usb(dec);
1719 kfree(dec);
1725 struct ttusb_dec *dec = usb_get_intfdata(intf);
1731 if (dec->active) {
1732 ttusb_dec_exit_tasklet(dec);
1733 ttusb_dec_exit_filters(dec);
1735 ttusb_dec_exit_rc(dec);
1736 ttusb_dec_exit_usb(dec);
1737 ttusb_dec_exit_dvb(dec);
1740 kfree(dec);
1743 static void ttusb_dec_set_model(struct ttusb_dec *dec,
1746 dec->model = model;
1750 dec->model_name = "DEC2000-t";
1751 dec->firmware_name = "dvb-ttusb-dec-2000t.fw";
1755 dec->model_name = "DEC2540-t";
1756 dec->firmware_name = "dvb-ttusb-dec-2540t.fw";
1760 dec->model_name = "DEC3000-s";
1761 dec->firmware_name = "dvb-ttusb-dec-3000s.fw";
1775 .name = "ttusb-dec",