Path: blob/master/drivers/media/dvb/dvb-usb/dtt200u.c
15111 views
/* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/1* Typhoon/ Yuan/ Miglia DVB-T USB2.0 receiver.2*3* Copyright (C) 2004-5 Patrick Boettcher ([email protected])4*5* Thanks to Steve Chang from WideView for providing support for the WT-220U.6*7* This program is free software; you can redistribute it and/or modify it8* under the terms of the GNU General Public License as published by the Free9* Software Foundation, version 2.10*11* see Documentation/dvb/README.dvb-usb for more information12*/13#include "dtt200u.h"1415/* debug */16int dvb_usb_dtt200u_debug;17module_param_named(debug,dvb_usb_dtt200u_debug, int, 0644);18MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2 (or-able))." DVB_USB_DEBUG_STATUS);1920DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);2122static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff)23{24u8 b = SET_INIT;2526if (onoff)27dvb_usb_generic_write(d,&b,2);2829return 0;30}3132static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)33{34u8 b_streaming[2] = { SET_STREAMING, onoff };35u8 b_rst_pid = RESET_PID_FILTER;3637dvb_usb_generic_write(adap->dev, b_streaming, 2);3839if (onoff == 0)40dvb_usb_generic_write(adap->dev, &b_rst_pid, 1);41return 0;42}4344static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)45{46u8 b_pid[4];47pid = onoff ? pid : 0;4849b_pid[0] = SET_PID_FILTER;50b_pid[1] = index;51b_pid[2] = pid & 0xff;52b_pid[3] = (pid >> 8) & 0x1f;5354return dvb_usb_generic_write(adap->dev, b_pid, 4);55}5657/* remote control */58/* key list for the tiny remote control (Yakumo, don't know about the others) */59static struct rc_map_table rc_map_dtt200u_table[] = {60{ 0x8001, KEY_MUTE },61{ 0x8002, KEY_CHANNELDOWN },62{ 0x8003, KEY_VOLUMEDOWN },63{ 0x8004, KEY_1 },64{ 0x8005, KEY_2 },65{ 0x8006, KEY_3 },66{ 0x8007, KEY_4 },67{ 0x8008, KEY_5 },68{ 0x8009, KEY_6 },69{ 0x800a, KEY_7 },70{ 0x800c, KEY_ZOOM },71{ 0x800d, KEY_0 },72{ 0x800e, KEY_SELECT },73{ 0x8012, KEY_POWER },74{ 0x801a, KEY_CHANNELUP },75{ 0x801b, KEY_8 },76{ 0x801e, KEY_VOLUMEUP },77{ 0x801f, KEY_9 },78};7980static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state)81{82u8 key[5],cmd = GET_RC_CODE;83dvb_usb_generic_rw(d,&cmd,1,key,5,0);84dvb_usb_nec_rc_key_to_event(d,key,event,state);85if (key[0] != 0)86deb_info("key: %x %x %x %x %x\n",key[0],key[1],key[2],key[3],key[4]);87return 0;88}8990static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap)91{92adap->fe = dtt200u_fe_attach(adap->dev);93return 0;94}9596static struct dvb_usb_device_properties dtt200u_properties;97static struct dvb_usb_device_properties wt220u_fc_properties;98static struct dvb_usb_device_properties wt220u_properties;99static struct dvb_usb_device_properties wt220u_zl0353_properties;100static struct dvb_usb_device_properties wt220u_miglia_properties;101102static int dtt200u_usb_probe(struct usb_interface *intf,103const struct usb_device_id *id)104{105if (0 == dvb_usb_device_init(intf, &dtt200u_properties,106THIS_MODULE, NULL, adapter_nr) ||1070 == dvb_usb_device_init(intf, &wt220u_properties,108THIS_MODULE, NULL, adapter_nr) ||1090 == dvb_usb_device_init(intf, &wt220u_fc_properties,110THIS_MODULE, NULL, adapter_nr) ||1110 == dvb_usb_device_init(intf, &wt220u_zl0353_properties,112THIS_MODULE, NULL, adapter_nr) ||1130 == dvb_usb_device_init(intf, &wt220u_miglia_properties,114THIS_MODULE, NULL, adapter_nr))115return 0;116117return -ENODEV;118}119120static struct usb_device_id dtt200u_usb_table [] = {121{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) },122{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) },123{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) },124{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) },125{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) },126{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) },127{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_COLD) },128{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_WARM) },129{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZAP250_COLD) },130{ USB_DEVICE(USB_VID_MIGLIA, USB_PID_WT220U_ZAP250_COLD) },131{ 0 },132};133MODULE_DEVICE_TABLE(usb, dtt200u_usb_table);134135static struct dvb_usb_device_properties dtt200u_properties = {136.usb_ctrl = CYPRESS_FX2,137.firmware = "dvb-usb-dtt200u-01.fw",138139.num_adapters = 1,140.adapter = {141{142.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,143.pid_filter_count = 15,144145.streaming_ctrl = dtt200u_streaming_ctrl,146.pid_filter = dtt200u_pid_filter,147.frontend_attach = dtt200u_frontend_attach,148/* parameter for the MPEG2-data transfer */149.stream = {150.type = USB_BULK,151.count = 7,152.endpoint = 0x02,153.u = {154.bulk = {155.buffersize = 4096,156}157}158},159}160},161.power_ctrl = dtt200u_power_ctrl,162163.rc.legacy = {164.rc_interval = 300,165.rc_map_table = rc_map_dtt200u_table,166.rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),167.rc_query = dtt200u_rc_query,168},169170.generic_bulk_ctrl_endpoint = 0x01,171172.num_device_descs = 1,173.devices = {174{ .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)",175.cold_ids = { &dtt200u_usb_table[0], NULL },176.warm_ids = { &dtt200u_usb_table[1], NULL },177},178{ NULL },179}180};181182static struct dvb_usb_device_properties wt220u_properties = {183.usb_ctrl = CYPRESS_FX2,184.firmware = "dvb-usb-wt220u-02.fw",185186.num_adapters = 1,187.adapter = {188{189.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,190.pid_filter_count = 15,191192.streaming_ctrl = dtt200u_streaming_ctrl,193.pid_filter = dtt200u_pid_filter,194.frontend_attach = dtt200u_frontend_attach,195/* parameter for the MPEG2-data transfer */196.stream = {197.type = USB_BULK,198.count = 7,199.endpoint = 0x02,200.u = {201.bulk = {202.buffersize = 4096,203}204}205},206}207},208.power_ctrl = dtt200u_power_ctrl,209210.rc.legacy = {211.rc_interval = 300,212.rc_map_table = rc_map_dtt200u_table,213.rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),214.rc_query = dtt200u_rc_query,215},216217.generic_bulk_ctrl_endpoint = 0x01,218219.num_device_descs = 1,220.devices = {221{ .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)",222.cold_ids = { &dtt200u_usb_table[2], &dtt200u_usb_table[8], NULL },223.warm_ids = { &dtt200u_usb_table[3], NULL },224},225{ NULL },226}227};228229static struct dvb_usb_device_properties wt220u_fc_properties = {230.usb_ctrl = CYPRESS_FX2,231.firmware = "dvb-usb-wt220u-fc03.fw",232233.num_adapters = 1,234.adapter = {235{236.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,237.pid_filter_count = 15,238239.streaming_ctrl = dtt200u_streaming_ctrl,240.pid_filter = dtt200u_pid_filter,241.frontend_attach = dtt200u_frontend_attach,242/* parameter for the MPEG2-data transfer */243.stream = {244.type = USB_BULK,245.count = 7,246.endpoint = 0x06,247.u = {248.bulk = {249.buffersize = 4096,250}251}252},253}254},255.power_ctrl = dtt200u_power_ctrl,256257.rc.legacy = {258.rc_interval = 300,259.rc_map_table = rc_map_dtt200u_table,260.rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),261.rc_query = dtt200u_rc_query,262},263264.generic_bulk_ctrl_endpoint = 0x01,265266.num_device_descs = 1,267.devices = {268{ .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)",269.cold_ids = { &dtt200u_usb_table[6], NULL },270.warm_ids = { &dtt200u_usb_table[7], NULL },271},272{ NULL },273}274};275276static struct dvb_usb_device_properties wt220u_zl0353_properties = {277.usb_ctrl = CYPRESS_FX2,278.firmware = "dvb-usb-wt220u-zl0353-01.fw",279280.num_adapters = 1,281.adapter = {282{283.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,284.pid_filter_count = 15,285286.streaming_ctrl = dtt200u_streaming_ctrl,287.pid_filter = dtt200u_pid_filter,288.frontend_attach = dtt200u_frontend_attach,289/* parameter for the MPEG2-data transfer */290.stream = {291.type = USB_BULK,292.count = 7,293.endpoint = 0x02,294.u = {295.bulk = {296.buffersize = 4096,297}298}299},300}301},302.power_ctrl = dtt200u_power_ctrl,303304.rc.legacy = {305.rc_interval = 300,306.rc_map_table = rc_map_dtt200u_table,307.rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),308.rc_query = dtt200u_rc_query,309},310311.generic_bulk_ctrl_endpoint = 0x01,312313.num_device_descs = 1,314.devices = {315{ .name = "WideView WT-220U PenType Receiver (based on ZL353)",316.cold_ids = { &dtt200u_usb_table[4], NULL },317.warm_ids = { &dtt200u_usb_table[5], NULL },318},319{ NULL },320}321};322323static struct dvb_usb_device_properties wt220u_miglia_properties = {324.usb_ctrl = CYPRESS_FX2,325.firmware = "dvb-usb-wt220u-miglia-01.fw",326327.num_adapters = 1,328.generic_bulk_ctrl_endpoint = 0x01,329330.num_device_descs = 1,331.devices = {332{ .name = "WideView WT-220U PenType Receiver (Miglia)",333.cold_ids = { &dtt200u_usb_table[9], NULL },334/* This device turns into WT220U_ZL0353_WARM when fw335has been uploaded */336.warm_ids = { NULL },337},338{ NULL },339}340};341342/* usb specific object needed to register this driver with the usb subsystem */343static struct usb_driver dtt200u_usb_driver = {344.name = "dvb_usb_dtt200u",345.probe = dtt200u_usb_probe,346.disconnect = dvb_usb_device_exit,347.id_table = dtt200u_usb_table,348};349350/* module stuff */351static int __init dtt200u_usb_module_init(void)352{353int result;354if ((result = usb_register(&dtt200u_usb_driver))) {355err("usb_register failed. (%d)",result);356return result;357}358359return 0;360}361362static void __exit dtt200u_usb_module_exit(void)363{364/* deregister this driver from the USB subsystem */365usb_deregister(&dtt200u_usb_driver);366}367368module_init(dtt200u_usb_module_init);369module_exit(dtt200u_usb_module_exit);370371MODULE_AUTHOR("Patrick Boettcher <[email protected]>");372MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon/Club3D/Miglia DVB-T USB2.0 devices");373MODULE_VERSION("1.0");374MODULE_LICENSE("GPL");375376377