]>
Commit | Line | Data |
---|---|---|
1 | /* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/ | |
2 | * Typhoon/ Yuan/ Miglia 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_adapter *adap, 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(adap->dev, b_streaming, 2); | |
37 | ||
38 | if (onoff == 0) | |
39 | dvb_usb_generic_write(adap->dev, &b_rst_pid, 1); | |
40 | return 0; | |
41 | } | |
42 | ||
43 | static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, 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(adap->dev, 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_adapter *adap) | |
90 | { | |
91 | adap->fe = dtt200u_fe_attach(adap->dev); | |
92 | return 0; | |
93 | } | |
94 | ||
95 | static struct dvb_usb_device_properties dtt200u_properties; | |
96 | static struct dvb_usb_device_properties wt220u_fc_properties; | |
97 | static struct dvb_usb_device_properties wt220u_properties; | |
98 | static struct dvb_usb_device_properties wt220u_zl0353_properties; | |
99 | static struct dvb_usb_device_properties wt220u_miglia_properties; | |
100 | ||
101 | static int dtt200u_usb_probe(struct usb_interface *intf, | |
102 | const struct usb_device_id *id) | |
103 | { | |
104 | if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 || | |
105 | dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0 || | |
106 | dvb_usb_device_init(intf,&wt220u_fc_properties,THIS_MODULE,NULL) == 0 || | |
107 | dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0 || | |
108 | dvb_usb_device_init(intf,&wt220u_miglia_properties,THIS_MODULE,NULL) == 0) | |
109 | return 0; | |
110 | ||
111 | return -ENODEV; | |
112 | } | |
113 | ||
114 | static struct usb_device_id dtt200u_usb_table [] = { | |
115 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, | |
116 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, | |
117 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, | |
118 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, | |
119 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) }, | |
120 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) }, | |
121 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_COLD) }, | |
122 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_WARM) }, | |
123 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZAP250_COLD) }, | |
124 | { USB_DEVICE(USB_VID_MIGLIA, USB_PID_WT220U_ZAP250_COLD) }, | |
125 | { 0 }, | |
126 | }; | |
127 | MODULE_DEVICE_TABLE(usb, dtt200u_usb_table); | |
128 | ||
129 | static struct dvb_usb_device_properties dtt200u_properties = { | |
130 | .usb_ctrl = CYPRESS_FX2, | |
131 | .firmware = "dvb-usb-dtt200u-01.fw", | |
132 | ||
133 | .num_adapters = 1, | |
134 | .adapter = { | |
135 | { | |
136 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, | |
137 | .pid_filter_count = 15, | |
138 | ||
139 | .streaming_ctrl = dtt200u_streaming_ctrl, | |
140 | .pid_filter = dtt200u_pid_filter, | |
141 | .frontend_attach = dtt200u_frontend_attach, | |
142 | /* parameter for the MPEG2-data transfer */ | |
143 | .stream = { | |
144 | .type = USB_BULK, | |
145 | .count = 7, | |
146 | .endpoint = 0x02, | |
147 | .u = { | |
148 | .bulk = { | |
149 | .buffersize = 4096, | |
150 | } | |
151 | } | |
152 | }, | |
153 | } | |
154 | }, | |
155 | .power_ctrl = dtt200u_power_ctrl, | |
156 | ||
157 | .rc_interval = 300, | |
158 | .rc_key_map = dtt200u_rc_keys, | |
159 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
160 | .rc_query = dtt200u_rc_query, | |
161 | ||
162 | .generic_bulk_ctrl_endpoint = 0x01, | |
163 | ||
164 | .num_device_descs = 1, | |
165 | .devices = { | |
166 | { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", | |
167 | .cold_ids = { &dtt200u_usb_table[0], NULL }, | |
168 | .warm_ids = { &dtt200u_usb_table[1], NULL }, | |
169 | }, | |
170 | { NULL }, | |
171 | } | |
172 | }; | |
173 | ||
174 | static struct dvb_usb_device_properties wt220u_properties = { | |
175 | .usb_ctrl = CYPRESS_FX2, | |
176 | .firmware = "dvb-usb-wt220u-02.fw", | |
177 | ||
178 | .num_adapters = 1, | |
179 | .adapter = { | |
180 | { | |
181 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, | |
182 | .pid_filter_count = 15, | |
183 | ||
184 | .streaming_ctrl = dtt200u_streaming_ctrl, | |
185 | .pid_filter = dtt200u_pid_filter, | |
186 | .frontend_attach = dtt200u_frontend_attach, | |
187 | /* parameter for the MPEG2-data transfer */ | |
188 | .stream = { | |
189 | .type = USB_BULK, | |
190 | .count = 7, | |
191 | .endpoint = 0x02, | |
192 | .u = { | |
193 | .bulk = { | |
194 | .buffersize = 4096, | |
195 | } | |
196 | } | |
197 | }, | |
198 | } | |
199 | }, | |
200 | .power_ctrl = dtt200u_power_ctrl, | |
201 | ||
202 | .rc_interval = 300, | |
203 | .rc_key_map = dtt200u_rc_keys, | |
204 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
205 | .rc_query = dtt200u_rc_query, | |
206 | ||
207 | .generic_bulk_ctrl_endpoint = 0x01, | |
208 | ||
209 | .num_device_descs = 1, | |
210 | .devices = { | |
211 | { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", | |
212 | .cold_ids = { &dtt200u_usb_table[2], &dtt200u_usb_table[8], NULL }, | |
213 | .warm_ids = { &dtt200u_usb_table[3], NULL }, | |
214 | }, | |
215 | { NULL }, | |
216 | } | |
217 | }; | |
218 | ||
219 | static struct dvb_usb_device_properties wt220u_fc_properties = { | |
220 | .usb_ctrl = CYPRESS_FX2, | |
221 | .firmware = "dvb-usb-wt220u-fc03.fw", | |
222 | ||
223 | .num_adapters = 1, | |
224 | .adapter = { | |
225 | { | |
226 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, | |
227 | .pid_filter_count = 15, | |
228 | ||
229 | .streaming_ctrl = dtt200u_streaming_ctrl, | |
230 | .pid_filter = dtt200u_pid_filter, | |
231 | .frontend_attach = dtt200u_frontend_attach, | |
232 | /* parameter for the MPEG2-data transfer */ | |
233 | .stream = { | |
234 | .type = USB_BULK, | |
235 | .count = 7, | |
236 | .endpoint = 0x06, | |
237 | .u = { | |
238 | .bulk = { | |
239 | .buffersize = 4096, | |
240 | } | |
241 | } | |
242 | }, | |
243 | } | |
244 | }, | |
245 | .power_ctrl = dtt200u_power_ctrl, | |
246 | ||
247 | .rc_interval = 300, | |
248 | .rc_key_map = dtt200u_rc_keys, | |
249 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
250 | .rc_query = dtt200u_rc_query, | |
251 | ||
252 | .generic_bulk_ctrl_endpoint = 0x01, | |
253 | ||
254 | .num_device_descs = 1, | |
255 | .devices = { | |
256 | { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", | |
257 | .cold_ids = { &dtt200u_usb_table[6], NULL }, | |
258 | .warm_ids = { &dtt200u_usb_table[7], NULL }, | |
259 | }, | |
260 | { NULL }, | |
261 | } | |
262 | }; | |
263 | ||
264 | static struct dvb_usb_device_properties wt220u_zl0353_properties = { | |
265 | .usb_ctrl = CYPRESS_FX2, | |
266 | .firmware = "dvb-usb-wt220u-zl0353-01.fw", | |
267 | ||
268 | .num_adapters = 1, | |
269 | .adapter = { | |
270 | { | |
271 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, | |
272 | .pid_filter_count = 15, | |
273 | ||
274 | .streaming_ctrl = dtt200u_streaming_ctrl, | |
275 | .pid_filter = dtt200u_pid_filter, | |
276 | .frontend_attach = dtt200u_frontend_attach, | |
277 | /* parameter for the MPEG2-data transfer */ | |
278 | .stream = { | |
279 | .type = USB_BULK, | |
280 | .count = 7, | |
281 | .endpoint = 0x02, | |
282 | .u = { | |
283 | .bulk = { | |
284 | .buffersize = 4096, | |
285 | } | |
286 | } | |
287 | }, | |
288 | } | |
289 | }, | |
290 | .power_ctrl = dtt200u_power_ctrl, | |
291 | ||
292 | .rc_interval = 300, | |
293 | .rc_key_map = dtt200u_rc_keys, | |
294 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
295 | .rc_query = dtt200u_rc_query, | |
296 | ||
297 | .generic_bulk_ctrl_endpoint = 0x01, | |
298 | ||
299 | .num_device_descs = 1, | |
300 | .devices = { | |
301 | { .name = "WideView WT-220U PenType Receiver (based on ZL353)", | |
302 | .cold_ids = { &dtt200u_usb_table[4], NULL }, | |
303 | .warm_ids = { &dtt200u_usb_table[5], NULL }, | |
304 | }, | |
305 | { NULL }, | |
306 | } | |
307 | }; | |
308 | ||
309 | static struct dvb_usb_device_properties wt220u_miglia_properties = { | |
310 | .usb_ctrl = CYPRESS_FX2, | |
311 | .firmware = "dvb-usb-wt220u-miglia-01.fw", | |
312 | ||
313 | .num_adapters = 1, | |
314 | .generic_bulk_ctrl_endpoint = 0x01, | |
315 | ||
316 | .num_device_descs = 1, | |
317 | .devices = { | |
318 | { .name = "WideView WT-220U PenType Receiver (Miglia)", | |
319 | .cold_ids = { &dtt200u_usb_table[9], NULL }, | |
320 | /* This device turns into WT220U_ZL0353_WARM when fw | |
321 | has been uploaded */ | |
322 | .warm_ids = { NULL }, | |
323 | }, | |
324 | { NULL }, | |
325 | } | |
326 | }; | |
327 | ||
328 | /* usb specific object needed to register this driver with the usb subsystem */ | |
329 | static struct usb_driver dtt200u_usb_driver = { | |
330 | .name = "dvb_usb_dtt200u", | |
331 | .probe = dtt200u_usb_probe, | |
332 | .disconnect = dvb_usb_device_exit, | |
333 | .id_table = dtt200u_usb_table, | |
334 | }; | |
335 | ||
336 | /* module stuff */ | |
337 | static int __init dtt200u_usb_module_init(void) | |
338 | { | |
339 | int result; | |
340 | if ((result = usb_register(&dtt200u_usb_driver))) { | |
341 | err("usb_register failed. (%d)",result); | |
342 | return result; | |
343 | } | |
344 | ||
345 | return 0; | |
346 | } | |
347 | ||
348 | static void __exit dtt200u_usb_module_exit(void) | |
349 | { | |
350 | /* deregister this driver from the USB subsystem */ | |
351 | usb_deregister(&dtt200u_usb_driver); | |
352 | } | |
353 | ||
354 | module_init(dtt200u_usb_module_init); | |
355 | module_exit(dtt200u_usb_module_exit); | |
356 | ||
357 | MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); | |
358 | MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon/Club3D/Miglia DVB-T USB2.0 devices"); | |
359 | MODULE_VERSION("1.0"); | |
360 | MODULE_LICENSE("GPL"); |