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 if ((result = mutex_lock_interruptible(&dec->usb_mutex))) {
334 b[1] = ++dec->trans_count;
346 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
352 mutex_unlock(&dec->usb_mutex);
357 result = usb_bulk_msg(dec->udev, dec->result_pipe, b,
363 mutex_unlock(&dec->usb_mutex);
377 mutex_unlock(&dec->usb_mutex);
384 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode,
394 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
419 struct ttusb_dec *dec = priv;
421 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0,
422 &dec->audio_filter->feed->feed.ts, NULL);
429 struct ttusb_dec *dec = priv;
431 dec->video_filter->feed->cb.ts(data, 188, NULL, 0,
432 &dec->video_filter->feed->feed.ts, NULL);
437 static void ttusb_dec_set_pids(struct ttusb_dec *dec)
443 __be16 pcr = htons(dec->pid[DMX_PES_PCR]);
444 __be16 audio = htons(dec->pid[DMX_PES_AUDIO]);
445 __be16 video = htons(dec->pid[DMX_PES_VIDEO]);
453 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL);
455 dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO],
456 ttusb_dec_audio_pes2ts_cb, dec);
457 dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
458 ttusb_dec_video_pes2ts_cb, dec);
459 dec->v_pes_length = 0;
460 dec->v_pes_postbytes = 0;
463 static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length)
483 dec->video_filter->feed->cb.ts(pva, length, NULL, 0,
484 &dec->video_filter->feed->feed.ts, NULL);
488 if (dec->v_pes_postbytes > 0 &&
489 dec->v_pes_postbytes == prebytes) {
490 memcpy(&dec->v_pes[dec->v_pes_length],
493 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
494 dec->v_pes_length + prebytes, 1);
498 dec->v_pes[7] = 0x80;
499 dec->v_pes[8] = 0x05;
501 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5);
502 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) |
504 dec->v_pes[11] = 0x01 |
507 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) |
509 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1);
511 memcpy(&dec->v_pes[14], &pva[12 + prebytes],
513 dec->v_pes_length = 14 + length - 12 - prebytes;
515 dec->v_pes[7] = 0x00;
516 dec->v_pes[8] = 0x00;
518 memcpy(&dec->v_pes[9], &pva[8], length - 8);
519 dec->v_pes_length = 9 + length - 8;
522 dec->v_pes_postbytes = postbytes;
524 if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 &&
525 dec->v_pes[10 + dec->v_pes[8]] == 0x00 &&
526 dec->v_pes[11 + dec->v_pes[8]] == 0x01)
527 dec->v_pes[6] = 0x84;
529 dec->v_pes[6] = 0x80;
531 v_pes_payload_length = htons(dec->v_pes_length - 6 +
533 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2);
536 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
537 dec->v_pes_length, 1);
544 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0,
545 &dec->audio_filter->feed->feed.ts, NULL);
549 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8,
560 static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet,
570 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
571 for (item = dec->filter_info_list.next; item != &dec->filter_info_list;
579 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
586 static void ttusb_dec_process_packet(struct ttusb_dec *dec)
592 if (dec->packet_length % 2) {
597 for (i = 0; i < dec->packet_length; i += 2)
598 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]);
605 packet_id = dec->packet[dec->packet_length - 4] << 8;
606 packet_id += dec->packet[dec->packet_length - 3];
608 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) {
610 __func__, dec->next_packet_id - 1, packet_id);
614 dec->next_packet_id = 0x8000;
616 dec->next_packet_id = packet_id + 1;
618 switch (dec->packet_type) {
620 if (dec->pva_stream_count)
621 ttusb_dec_process_pva(dec, dec->packet,
622 dec->packet_payload_length);
626 if (dec->filter_stream_count)
627 ttusb_dec_process_filter(dec, dec->packet,
628 dec->packet_payload_length);
643 static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b,
649 switch (dec->packet_state) {
655 dec->packet_state++;
657 dec->packet_state = 0;
664 dec->packet_state++;
665 dec->packet_length = 0;
667 dec->packet_state = 0;
675 dec->packet[dec->packet_length++] = *b++;
677 if (dec->packet_length == 2) {
678 if (dec->packet[0] == 'A' &&
679 dec->packet[1] == 'V') {
680 dec->packet_type =
682 dec->packet_state++;
683 } else if (dec->packet[0] == 'S') {
684 dec->packet_type =
686 dec->packet_state++;
687 } else if (dec->packet[0] == 0x00) {
688 dec->packet_type =
690 dec->packet_payload_length = 2;
691 dec->packet_state = 7;
695 dec->packet[0], dec->packet[1]);
696 dec->packet_state = 0;
704 dec->packet[dec->packet_length++] = *b++;
706 if (dec->packet_type == TTUSB_DEC_PACKET_PVA &&
707 dec->packet_length == 8) {
708 dec->packet_state++;
709 dec->packet_payload_length = 8 +
710 (dec->packet[6] << 8) +
711 dec->packet[7];
712 } else if (dec->packet_type ==
714 dec->packet_length == 5) {
715 dec->packet_state++;
716 dec->packet_payload_length = 5 +
717 ((dec->packet[3] & 0x0f) << 8) +
718 dec->packet[4];
725 int remainder = dec->packet_payload_length -
726 dec->packet_length;
729 memcpy(dec->packet + dec->packet_length,
731 dec->packet_length += remainder;
734 dec->packet_state++;
736 memcpy(&dec->packet[dec->packet_length],
738 dec->packet_length += length;
748 dec->packet[dec->packet_length++] = *b++;
750 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION &&
751 dec->packet_payload_length % 2)
754 if (dec->packet_length ==
755 dec->packet_payload_length + tail) {
756 ttusb_dec_process_packet(dec);
757 dec->packet_state = 0;
767 dec->packet_state = 0;
774 struct ttusb_dec *dec = from_tasklet(dec, t, urb_tasklet);
780 spin_lock_irqsave(&dec->urb_frame_list_lock, flags);
781 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
786 spin_unlock_irqrestore(&dec->urb_frame_list_lock,
790 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags);
792 ttusb_dec_process_urb_frame(dec, frame->data, frame->length);
799 struct ttusb_dec *dec = urb->context;
821 spin_lock_irqsave(&dec->urb_frame_list_lock,
824 &dec->urb_frame_list);
825 spin_unlock_irqrestore(&dec->urb_frame_list_lock,
828 tasklet_schedule(&dec->urb_tasklet);
838 if (dec->iso_stream_count)
842 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
850 struct urb *urb = dec->iso_urb[i];
852 urb->dev = dec->udev;
853 urb->context = dec;
855 urb->pipe = dec->in_pipe;
861 urb->transfer_buffer = dec->iso_buffer + buffer_offset;
872 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
878 if (mutex_lock_interruptible(&dec->iso_mutex))
881 dec->iso_stream_count--;
883 if (!dec->iso_stream_count) {
885 usb_kill_urb(dec->iso_urb[i]);
888 mutex_unlock(&dec->iso_mutex);
895 static int ttusb_dec_set_interface(struct ttusb_dec *dec,
901 if (interface != dec->interface) {
904 result = usb_set_interface(dec->udev, 0, 0);
907 result = ttusb_dec_send_command(dec, 0x80, sizeof(b),
911 result = usb_set_interface(dec->udev, 0, 8);
914 result = usb_set_interface(dec->udev, 0, 1);
921 dec->interface = interface;
927 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
933 if (mutex_lock_interruptible(&dec->iso_mutex))
936 if (!dec->iso_stream_count) {
937 ttusb_dec_setup_urbs(dec);
939 dec->packet_state = 0;
940 dec->v_pes_postbytes = 0;
941 dec->next_packet_id = 0;
944 if ((result = usb_submit_urb(dec->iso_urb[i],
950 usb_kill_urb(dec->iso_urb[i - 1]);
954 mutex_unlock(&dec->iso_mutex);
960 dec->iso_stream_count++;
962 mutex_unlock(&dec->iso_mutex);
970 struct ttusb_dec *dec = dvbdmx->priv;
993 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
994 dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid;
995 dec->video_filter = dvbdmxfeed->filter;
996 ttusb_dec_set_pids(dec);
1001 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid;
1002 dec->audio_filter = dvbdmxfeed->filter;
1003 ttusb_dec_set_pids(dec);
1007 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid;
1013 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
1014 ttusb_dec_set_pids(dec);
1027 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
1031 dec->pva_stream_count++;
1032 return ttusb_dec_start_iso_xfer(dec);
1037 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1061 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0,
1073 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1075 &dec->filter_info_list);
1076 spin_unlock_irqrestore(&dec->filter_info_list_lock,
1081 dec->filter_stream_count++;
1082 return ttusb_dec_start_iso_xfer(dec);
1120 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1123 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
1125 dec->pva_stream_count--;
1127 ttusb_dec_stop_iso_xfer(dec);
1134 struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
1140 spin_lock_irqsave(&dec->filter_info_list_lock, flags);
1142 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
1144 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL);
1146 dec->filter_stream_count--;
1148 ttusb_dec_stop_iso_xfer(dec);
1170 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
1177 usb_free_urb(dec->iso_urb[i]);
1178 kfree(dec->iso_buffer);
1181 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
1187 dec->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT,
1189 if (!dec->iso_buffer)
1196 ttusb_dec_free_iso_urbs(dec);
1200 dec->iso_urb[i] = urb;
1203 ttusb_dec_setup_urbs(dec);
1208 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec)
1210 spin_lock_init(&dec->urb_frame_list_lock);
1211 INIT_LIST_HEAD(&dec->urb_frame_list);
1212 tasklet_setup(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list);
1215 static int ttusb_init_rc( struct ttusb_dec *dec)
1222 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
1223 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys));
1230 input_dev->phys = dec->rc_phys;
1245 dec->rc_input_dev = input_dev;
1246 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL))
1249 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL);
1254 static void ttusb_dec_init_v_pes(struct ttusb_dec *dec)
1258 dec->v_pes[0] = 0x00;
1259 dec->v_pes[1] = 0x00;
1260 dec->v_pes[2] = 0x01;
1261 dec->v_pes[3] = 0xe0;
1264 static int ttusb_dec_init_usb(struct ttusb_dec *dec)
1270 mutex_init(&dec->usb_mutex);
1271 mutex_init(&dec->iso_mutex);
1273 dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE);
1274 dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE);
1275 dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE);
1276 dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE);
1277 dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE);
1280 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
1281 if(!dec->irq_urb) {
1284 dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE,
1285 GFP_KERNEL, &dec->irq_dma_handle);
1286 if(!dec->irq_buffer) {
1287 usb_free_urb(dec->irq_urb);
1290 usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe,
1291 dec->irq_buffer, IRQ_PACKET_SIZE,
1292 ttusb_dec_handle_irq, dec, 1);
1293 dec->irq_urb->transfer_dma = dec->irq_dma_handle;
1294 dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1297 result = ttusb_dec_alloc_iso_urbs(dec);
1299 usb_free_urb(dec->irq_urb);
1300 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1301 dec->irq_buffer, dec->irq_dma_handle);
1306 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
1326 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev);
1329 __func__, dec->firmware_name);
1365 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
1395 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1400 result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
1406 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
1414 static int ttusb_dec_init_stb(struct ttusb_dec *dec)
1421 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version);
1433 result = ttusb_dec_boot_dsp(dec);
1443 ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1447 ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1450 ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1458 dec->can_playback = 1;
1463 static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
1469 if ((result = dvb_register_adapter(&dec->adapter,
1470 dec->model_name, THIS_MODULE,
1471 &dec->udev->dev,
1479 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
1481 dec->demux.priv = (void *)dec;
1482 dec->demux.filternum = 31;
1483 dec->demux.feednum = 31;
1484 dec->demux.start_feed = ttusb_dec_start_feed;
1485 dec->demux.stop_feed = ttusb_dec_stop_feed;
1486 dec->demux.write_to_decoder = NULL;
1488 if ((result = dvb_dmx_init(&dec->demux)) < 0) {
1492 dvb_unregister_adapter(&dec->adapter);
1497 dec->dmxdev.filternum = 32;
1498 dec->dmxdev.demux = &dec->demux.dmx;
1499 dec->dmxdev.capabilities = 0;
1501 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) {
1505 dvb_dmx_release(&dec->demux);
1506 dvb_unregister_adapter(&dec->adapter);
1511 dec->frontend.source = DMX_FRONTEND_0;
1513 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx,
1514 &dec->frontend)) < 0) {
1518 dvb_dmxdev_release(&dec->dmxdev);
1519 dvb_dmx_release(&dec->demux);
1520 dvb_unregister_adapter(&dec->adapter);
1525 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx,
1526 &dec->frontend)) < 0) {
1530 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
1531 dvb_dmxdev_release(&dec->dmxdev);
1532 dvb_dmx_release(&dec->demux);
1533 dvb_unregister_adapter(&dec->adapter);
1538 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx);
1543 static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
1547 dvb_net_release(&dec->dvb_net);
1548 dec->demux.dmx.close(&dec->demux.dmx);
1549 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
1550 dvb_dmxdev_release(&dec->dmxdev);
1551 dvb_dmx_release(&dec->demux);
1552 if (dec->fe) {
1553 dvb_unregister_frontend(dec->fe);
1554 dvb_frontend_detach(dec->fe);
1556 dvb_unregister_adapter(&dec->adapter);
1559 static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
1563 if (dec->rc_input_dev) {
1564 input_unregister_device(dec->rc_input_dev);
1565 dec->rc_input_dev = NULL;
1570 static void ttusb_dec_exit_usb(struct ttusb_dec *dec)
1581 if (dec->interface == TTUSB_DEC_INTERFACE_IN)
1582 usb_kill_urb(dec->irq_urb);
1584 usb_free_urb(dec->irq_urb);
1586 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE,
1587 dec->irq_buffer, dec->irq_dma_handle);
1590 dec->iso_stream_count = 0;
1593 usb_kill_urb(dec->iso_urb[i]);
1595 ttusb_dec_free_iso_urbs(dec);
1598 static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec)
1603 tasklet_kill(&dec->urb_tasklet);
1605 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) {
1612 static void ttusb_dec_init_filters(struct ttusb_dec *dec)
1614 INIT_LIST_HEAD(&dec->filter_info_list);
1615 spin_lock_init(&dec->filter_info_list_lock);
1618 static void ttusb_dec_exit_filters(struct ttusb_dec *dec)
1623 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) {
1634 struct ttusb_dec* dec = fe->dvb->priv;
1635 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result);
1646 struct ttusb_dec *dec;
1653 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
1658 usb_set_intfdata(intf, (void *)dec);
1662 ttusb_dec_set_model(dec, TTUSB_DEC3000S);
1666 ttusb_dec_set_model(dec, TTUSB_DEC2000T);
1670 ttusb_dec_set_model(dec, TTUSB_DEC2540T);
1674 dec->udev = udev;
1676 result = ttusb_dec_init_usb(dec);
1679 result = ttusb_dec_init_stb(dec);
1682 result = ttusb_dec_init_dvb(dec);
1686 dec->adapter.priv = dec;
1689 dec->fe = ttusbdecfe_dvbs_attach(&fe_config);
1694 dec->fe = ttusbdecfe_dvbt_attach(&fe_config);
1698 if (dec->fe == NULL) {
1699 printk("dvb-ttusb-dec: A frontend driver was not found for device [%04x:%04x]\n",
1700 le16_to_cpu(dec->udev->descriptor.idVendor),
1701 le16_to_cpu(dec->udev->descriptor.idProduct));
1703 if (dvb_register_frontend(&dec->adapter, dec->fe)) {
1705 if (dec->fe->ops.release)
1706 dec->fe->ops.release(dec->fe);
1707 dec->fe = NULL;
1711 ttusb_dec_init_v_pes(dec);
1712 ttusb_dec_init_filters(dec);
1713 ttusb_dec_init_tasklet(dec);
1715 dec->active = 1;
1717 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN);
1720 ttusb_init_rc(dec);
1724 ttusb_dec_exit_usb(dec);
1726 kfree(dec);
1732 struct ttusb_dec *dec = usb_get_intfdata(intf);
1738 if (dec->active) {
1739 ttusb_dec_exit_tasklet(dec);
1740 ttusb_dec_exit_filters(dec);
1742 ttusb_dec_exit_rc(dec);
1743 ttusb_dec_exit_usb(dec);
1744 ttusb_dec_exit_dvb(dec);
1747 kfree(dec);
1750 static void ttusb_dec_set_model(struct ttusb_dec *dec,
1753 dec->model = model;
1757 dec->model_name = "DEC2000-t";
1758 dec->firmware_name = "dvb-ttusb-dec-2000t.fw";
1762 dec->model_name = "DEC2540-t";
1763 dec->firmware_name = "dvb-ttusb-dec-2540t.fw";
1767 dec->model_name = "DEC3000-s";
1768 dec->firmware_name = "dvb-ttusb-dec-3000s.fw";
1782 .name = "ttusb-dec",