diff options
Diffstat (limited to 'drivers/media/dvb/dvb-usb/dtt200u.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/dtt200u.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-usb/dtt200u.c b/drivers/media/dvb/dvb-usb/dtt200u.c new file mode 100644 index 000000000000..47dba6e45968 --- /dev/null +++ b/drivers/media/dvb/dvb-usb/dtt200u.c | |||
@@ -0,0 +1,233 @@ | |||
1 | /* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/ | ||
2 | * Typhoon/ Yuan DVB-T USB2.0 receiver. | ||
3 | * | ||
4 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
5 | * | ||
6 | * Thanks to Steve Chang from WideView for providing support for the WT-220U. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the Free | ||
10 | * Software Foundation, version 2. | ||
11 | * | ||
12 | * see Documentation/dvb/README.dvb-usb for more information | ||
13 | */ | ||
14 | #include "dtt200u.h" | ||
15 | |||
16 | /* debug */ | ||
17 | int dvb_usb_dtt200u_debug; | ||
18 | module_param_named(debug,dvb_usb_dtt200u_debug, int, 0644); | ||
19 | MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2 (or-able))." DVB_USB_DEBUG_STATUS); | ||
20 | |||
21 | static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff) | ||
22 | { | ||
23 | u8 b = SET_INIT; | ||
24 | |||
25 | if (onoff) | ||
26 | dvb_usb_generic_write(d,&b,2); | ||
27 | |||
28 | return 0; | ||
29 | } | ||
30 | |||
31 | static int dtt200u_streaming_ctrl(struct dvb_usb_device *d, int onoff) | ||
32 | { | ||
33 | u8 b_streaming[2] = { SET_STREAMING, onoff }; | ||
34 | u8 b_rst_pid = RESET_PID_FILTER; | ||
35 | |||
36 | dvb_usb_generic_write(d,b_streaming,2); | ||
37 | |||
38 | if (onoff == 0) | ||
39 | dvb_usb_generic_write(d,&b_rst_pid,1); | ||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | static int dtt200u_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff) | ||
44 | { | ||
45 | u8 b_pid[4]; | ||
46 | pid = onoff ? pid : 0; | ||
47 | |||
48 | b_pid[0] = SET_PID_FILTER; | ||
49 | b_pid[1] = index; | ||
50 | b_pid[2] = pid & 0xff; | ||
51 | b_pid[3] = (pid >> 8) & 0x1f; | ||
52 | |||
53 | return dvb_usb_generic_write(d,b_pid,4); | ||
54 | } | ||
55 | |||
56 | /* remote control */ | ||
57 | /* key list for the tiny remote control (Yakumo, don't know about the others) */ | ||
58 | static struct dvb_usb_rc_key dtt200u_rc_keys[] = { | ||
59 | { 0x80, 0x01, KEY_MUTE }, | ||
60 | { 0x80, 0x02, KEY_CHANNELDOWN }, | ||
61 | { 0x80, 0x03, KEY_VOLUMEDOWN }, | ||
62 | { 0x80, 0x04, KEY_1 }, | ||
63 | { 0x80, 0x05, KEY_2 }, | ||
64 | { 0x80, 0x06, KEY_3 }, | ||
65 | { 0x80, 0x07, KEY_4 }, | ||
66 | { 0x80, 0x08, KEY_5 }, | ||
67 | { 0x80, 0x09, KEY_6 }, | ||
68 | { 0x80, 0x0a, KEY_7 }, | ||
69 | { 0x80, 0x0c, KEY_ZOOM }, | ||
70 | { 0x80, 0x0d, KEY_0 }, | ||
71 | { 0x80, 0x0e, KEY_SELECT }, | ||
72 | { 0x80, 0x12, KEY_POWER }, | ||
73 | { 0x80, 0x1a, KEY_CHANNELUP }, | ||
74 | { 0x80, 0x1b, KEY_8 }, | ||
75 | { 0x80, 0x1e, KEY_VOLUMEUP }, | ||
76 | { 0x80, 0x1f, KEY_9 }, | ||
77 | }; | ||
78 | |||
79 | static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | ||
80 | { | ||
81 | u8 key[5],cmd = GET_RC_CODE; | ||
82 | dvb_usb_generic_rw(d,&cmd,1,key,5,0); | ||
83 | dvb_usb_nec_rc_key_to_event(d,key,event,state); | ||
84 | if (key[0] != 0) | ||
85 | deb_info("key: %x %x %x %x %x\n",key[0],key[1],key[2],key[3],key[4]); | ||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | static int dtt200u_frontend_attach(struct dvb_usb_device *d) | ||
90 | { | ||
91 | d->fe = dtt200u_fe_attach(d); | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | static struct dvb_usb_properties dtt200u_properties; | ||
96 | static struct dvb_usb_properties wt220u_properties; | ||
97 | |||
98 | static int dtt200u_usb_probe(struct usb_interface *intf, | ||
99 | const struct usb_device_id *id) | ||
100 | { | ||
101 | if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE) == 0 || | ||
102 | dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE) == 0) | ||
103 | return 0; | ||
104 | |||
105 | return -ENODEV; | ||
106 | } | ||
107 | |||
108 | static struct usb_device_id dtt200u_usb_table [] = { | ||
109 | // { USB_DEVICE(0x04b4,0x8613) }, | ||
110 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, | ||
111 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, | ||
112 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, | ||
113 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, | ||
114 | { 0 }, | ||
115 | }; | ||
116 | MODULE_DEVICE_TABLE(usb, dtt200u_usb_table); | ||
117 | |||
118 | static struct dvb_usb_properties dtt200u_properties = { | ||
119 | .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING, | ||
120 | .pid_filter_count = 15, | ||
121 | |||
122 | .usb_ctrl = CYPRESS_FX2, | ||
123 | .firmware = "dvb-usb-dtt200u-01.fw", | ||
124 | |||
125 | .power_ctrl = dtt200u_power_ctrl, | ||
126 | .streaming_ctrl = dtt200u_streaming_ctrl, | ||
127 | .pid_filter = dtt200u_pid_filter, | ||
128 | .frontend_attach = dtt200u_frontend_attach, | ||
129 | |||
130 | .rc_interval = 300, | ||
131 | .rc_key_map = dtt200u_rc_keys, | ||
132 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | ||
133 | .rc_query = dtt200u_rc_query, | ||
134 | |||
135 | .generic_bulk_ctrl_endpoint = 0x01, | ||
136 | |||
137 | /* parameter for the MPEG2-data transfer */ | ||
138 | .urb = { | ||
139 | .type = DVB_USB_BULK, | ||
140 | .count = 7, | ||
141 | .endpoint = 0x02, | ||
142 | .u = { | ||
143 | .bulk = { | ||
144 | .buffersize = 4096, | ||
145 | } | ||
146 | } | ||
147 | }, | ||
148 | |||
149 | .num_device_descs = 1, | ||
150 | .devices = { | ||
151 | { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", | ||
152 | .cold_ids = { &dtt200u_usb_table[0], NULL }, | ||
153 | .warm_ids = { &dtt200u_usb_table[1], NULL }, | ||
154 | }, | ||
155 | { 0 }, | ||
156 | } | ||
157 | }; | ||
158 | |||
159 | static struct dvb_usb_properties wt220u_properties = { | ||
160 | .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING, | ||
161 | .pid_filter_count = 15, | ||
162 | |||
163 | .usb_ctrl = CYPRESS_FX2, | ||
164 | .firmware = "dvb-usb-wt220u-01.fw", | ||
165 | |||
166 | .power_ctrl = dtt200u_power_ctrl, | ||
167 | .streaming_ctrl = dtt200u_streaming_ctrl, | ||
168 | .pid_filter = dtt200u_pid_filter, | ||
169 | .frontend_attach = dtt200u_frontend_attach, | ||
170 | |||
171 | .rc_interval = 300, | ||
172 | .rc_key_map = dtt200u_rc_keys, | ||
173 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | ||
174 | .rc_query = dtt200u_rc_query, | ||
175 | |||
176 | .generic_bulk_ctrl_endpoint = 0x01, | ||
177 | |||
178 | /* parameter for the MPEG2-data transfer */ | ||
179 | .urb = { | ||
180 | .type = DVB_USB_BULK, | ||
181 | .count = 7, | ||
182 | .endpoint = 0x02, | ||
183 | .u = { | ||
184 | .bulk = { | ||
185 | .buffersize = 4096, | ||
186 | } | ||
187 | } | ||
188 | }, | ||
189 | |||
190 | .num_device_descs = 1, | ||
191 | .devices = { | ||
192 | { .name = "WideView WT-220U PenType Receiver (and clones)", | ||
193 | .cold_ids = { &dtt200u_usb_table[2], NULL }, | ||
194 | .warm_ids = { &dtt200u_usb_table[3], NULL }, | ||
195 | }, | ||
196 | { 0 }, | ||
197 | } | ||
198 | }; | ||
199 | |||
200 | /* usb specific object needed to register this driver with the usb subsystem */ | ||
201 | static struct usb_driver dtt200u_usb_driver = { | ||
202 | .owner = THIS_MODULE, | ||
203 | .name = "dvb_usb_dtt200u", | ||
204 | .probe = dtt200u_usb_probe, | ||
205 | .disconnect = dvb_usb_device_exit, | ||
206 | .id_table = dtt200u_usb_table, | ||
207 | }; | ||
208 | |||
209 | /* module stuff */ | ||
210 | static int __init dtt200u_usb_module_init(void) | ||
211 | { | ||
212 | int result; | ||
213 | if ((result = usb_register(&dtt200u_usb_driver))) { | ||
214 | err("usb_register failed. (%d)",result); | ||
215 | return result; | ||
216 | } | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | static void __exit dtt200u_usb_module_exit(void) | ||
222 | { | ||
223 | /* deregister this driver from the USB subsystem */ | ||
224 | usb_deregister(&dtt200u_usb_driver); | ||
225 | } | ||
226 | |||
227 | module_init(dtt200u_usb_module_init); | ||
228 | module_exit(dtt200u_usb_module_exit); | ||
229 | |||
230 | MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); | ||
231 | MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon DVB-T USB2.0 devices"); | ||
232 | MODULE_VERSION("1.0"); | ||
233 | MODULE_LICENSE("GPL"); | ||