Commit | Line | Data |
---|---|---|
fb41f5a7 | 1 | /* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/ |
d3c35acf | 2 | * Typhoon/ Yuan/ Miglia DVB-T USB2.0 receiver. |
776338e1 JS |
3 | * |
4 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | |
5 | * | |
d590f9c2 PB |
6 | * Thanks to Steve Chang from WideView for providing support for the WT-220U. |
7 | * | |
776338e1 JS |
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 | ||
78e92006 JG |
21 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
22 | ||
d590f9c2 PB |
23 | static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff) |
24 | { | |
25 | u8 b = SET_INIT; | |
26 | ||
27 | if (onoff) | |
28 | dvb_usb_generic_write(d,&b,2); | |
29 | ||
30 | return 0; | |
31 | } | |
32 | ||
4d43e13f | 33 | static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) |
776338e1 | 34 | { |
d590f9c2 | 35 | u8 b_streaming[2] = { SET_STREAMING, onoff }; |
776338e1 JS |
36 | u8 b_rst_pid = RESET_PID_FILTER; |
37 | ||
4d43e13f | 38 | dvb_usb_generic_write(adap->dev, b_streaming, 2); |
776338e1 | 39 | |
d590f9c2 | 40 | if (onoff == 0) |
4d43e13f | 41 | dvb_usb_generic_write(adap->dev, &b_rst_pid, 1); |
776338e1 JS |
42 | return 0; |
43 | } | |
44 | ||
4d43e13f | 45 | static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) |
776338e1 JS |
46 | { |
47 | u8 b_pid[4]; | |
48 | pid = onoff ? pid : 0; | |
49 | ||
50 | b_pid[0] = SET_PID_FILTER; | |
51 | b_pid[1] = index; | |
52 | b_pid[2] = pid & 0xff; | |
d590f9c2 | 53 | b_pid[3] = (pid >> 8) & 0x1f; |
776338e1 | 54 | |
4d43e13f | 55 | return dvb_usb_generic_write(adap->dev, b_pid, 4); |
776338e1 JS |
56 | } |
57 | ||
58 | /* remote control */ | |
59 | /* key list for the tiny remote control (Yakumo, don't know about the others) */ | |
2f4f58d6 | 60 | static struct rc_map_table rc_map_dtt200u_table[] = { |
2e365883 MCC |
61 | { 0x8001, KEY_MUTE }, |
62 | { 0x8002, KEY_CHANNELDOWN }, | |
63 | { 0x8003, KEY_VOLUMEDOWN }, | |
64 | { 0x8004, KEY_1 }, | |
65 | { 0x8005, KEY_2 }, | |
66 | { 0x8006, KEY_3 }, | |
67 | { 0x8007, KEY_4 }, | |
68 | { 0x8008, KEY_5 }, | |
69 | { 0x8009, KEY_6 }, | |
70 | { 0x800a, KEY_7 }, | |
71 | { 0x800c, KEY_ZOOM }, | |
72 | { 0x800d, KEY_0 }, | |
73 | { 0x800e, KEY_SELECT }, | |
74 | { 0x8012, KEY_POWER }, | |
75 | { 0x801a, KEY_CHANNELUP }, | |
76 | { 0x801b, KEY_8 }, | |
77 | { 0x801e, KEY_VOLUMEUP }, | |
78 | { 0x801f, KEY_9 }, | |
776338e1 JS |
79 | }; |
80 | ||
81 | static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | |
82 | { | |
d590f9c2 | 83 | u8 key[5],cmd = GET_RC_CODE; |
776338e1 JS |
84 | dvb_usb_generic_rw(d,&cmd,1,key,5,0); |
85 | dvb_usb_nec_rc_key_to_event(d,key,event,state); | |
86 | if (key[0] != 0) | |
5bdb7872 | 87 | deb_info("key: %*ph\n", 5, key); |
776338e1 JS |
88 | return 0; |
89 | } | |
90 | ||
4d43e13f | 91 | static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap) |
776338e1 | 92 | { |
77eed219 | 93 | adap->fe_adap[0].fe = dtt200u_fe_attach(adap->dev); |
776338e1 JS |
94 | return 0; |
95 | } | |
96 | ||
4d43e13f PB |
97 | static struct dvb_usb_device_properties dtt200u_properties; |
98 | static struct dvb_usb_device_properties wt220u_fc_properties; | |
99 | static struct dvb_usb_device_properties wt220u_properties; | |
100 | static struct dvb_usb_device_properties wt220u_zl0353_properties; | |
d3c35acf | 101 | static struct dvb_usb_device_properties wt220u_miglia_properties; |
776338e1 JS |
102 | |
103 | static int dtt200u_usb_probe(struct usb_interface *intf, | |
104 | const struct usb_device_id *id) | |
105 | { | |
78e92006 JG |
106 | if (0 == dvb_usb_device_init(intf, &dtt200u_properties, |
107 | THIS_MODULE, NULL, adapter_nr) || | |
108 | 0 == dvb_usb_device_init(intf, &wt220u_properties, | |
109 | THIS_MODULE, NULL, adapter_nr) || | |
110 | 0 == dvb_usb_device_init(intf, &wt220u_fc_properties, | |
111 | THIS_MODULE, NULL, adapter_nr) || | |
112 | 0 == dvb_usb_device_init(intf, &wt220u_zl0353_properties, | |
113 | THIS_MODULE, NULL, adapter_nr) || | |
114 | 0 == dvb_usb_device_init(intf, &wt220u_miglia_properties, | |
115 | THIS_MODULE, NULL, adapter_nr)) | |
d590f9c2 PB |
116 | return 0; |
117 | ||
118 | return -ENODEV; | |
776338e1 JS |
119 | } |
120 | ||
121 | static struct usb_device_id dtt200u_usb_table [] = { | |
62703b9d PB |
122 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, |
123 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, | |
124 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, | |
125 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, | |
d46e6451 PB |
126 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) }, |
127 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) }, | |
19e22576 AT |
128 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_COLD) }, |
129 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_WARM) }, | |
ded38d28 | 130 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZAP250_COLD) }, |
d3c35acf | 131 | { USB_DEVICE(USB_VID_MIGLIA, USB_PID_WT220U_ZAP250_COLD) }, |
62703b9d | 132 | { 0 }, |
776338e1 JS |
133 | }; |
134 | MODULE_DEVICE_TABLE(usb, dtt200u_usb_table); | |
135 | ||
4d43e13f | 136 | static struct dvb_usb_device_properties dtt200u_properties = { |
776338e1 JS |
137 | .usb_ctrl = CYPRESS_FX2, |
138 | .firmware = "dvb-usb-dtt200u-01.fw", | |
139 | ||
4d43e13f PB |
140 | .num_adapters = 1, |
141 | .adapter = { | |
142 | { | |
77eed219 MK |
143 | .num_frontends = 1, |
144 | .fe = {{ | |
4d43e13f PB |
145 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, |
146 | .pid_filter_count = 15, | |
147 | ||
776338e1 JS |
148 | .streaming_ctrl = dtt200u_streaming_ctrl, |
149 | .pid_filter = dtt200u_pid_filter, | |
150 | .frontend_attach = dtt200u_frontend_attach, | |
776338e1 | 151 | /* parameter for the MPEG2-data transfer */ |
4d43e13f PB |
152 | .stream = { |
153 | .type = USB_BULK, | |
776338e1 JS |
154 | .count = 7, |
155 | .endpoint = 0x02, | |
156 | .u = { | |
157 | .bulk = { | |
158 | .buffersize = 4096, | |
159 | } | |
160 | } | |
161 | }, | |
77eed219 | 162 | }}, |
4d43e13f PB |
163 | } |
164 | }, | |
165 | .power_ctrl = dtt200u_power_ctrl, | |
166 | ||
f72a27b8 MCC |
167 | .rc.legacy = { |
168 | .rc_interval = 300, | |
2f4f58d6 MCC |
169 | .rc_map_table = rc_map_dtt200u_table, |
170 | .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table), | |
f72a27b8 MCC |
171 | .rc_query = dtt200u_rc_query, |
172 | }, | |
4d43e13f PB |
173 | |
174 | .generic_bulk_ctrl_endpoint = 0x01, | |
776338e1 JS |
175 | |
176 | .num_device_descs = 1, | |
177 | .devices = { | |
d590f9c2 | 178 | { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", |
fb41f5a7 | 179 | .cold_ids = { &dtt200u_usb_table[0], NULL }, |
776338e1 JS |
180 | .warm_ids = { &dtt200u_usb_table[1], NULL }, |
181 | }, | |
dad08dfc | 182 | { NULL }, |
776338e1 JS |
183 | } |
184 | }; | |
185 | ||
4d43e13f | 186 | static struct dvb_usb_device_properties wt220u_properties = { |
d590f9c2 | 187 | .usb_ctrl = CYPRESS_FX2, |
6ce17c57 | 188 | .firmware = "dvb-usb-wt220u-02.fw", |
d590f9c2 | 189 | |
4d43e13f PB |
190 | .num_adapters = 1, |
191 | .adapter = { | |
192 | { | |
77eed219 MK |
193 | .num_frontends = 1, |
194 | .fe = {{ | |
4d43e13f PB |
195 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, |
196 | .pid_filter_count = 15, | |
197 | ||
d590f9c2 PB |
198 | .streaming_ctrl = dtt200u_streaming_ctrl, |
199 | .pid_filter = dtt200u_pid_filter, | |
200 | .frontend_attach = dtt200u_frontend_attach, | |
d590f9c2 | 201 | /* parameter for the MPEG2-data transfer */ |
4d43e13f PB |
202 | .stream = { |
203 | .type = USB_BULK, | |
d590f9c2 PB |
204 | .count = 7, |
205 | .endpoint = 0x02, | |
206 | .u = { | |
207 | .bulk = { | |
208 | .buffersize = 4096, | |
209 | } | |
210 | } | |
211 | }, | |
77eed219 | 212 | }}, |
4d43e13f PB |
213 | } |
214 | }, | |
215 | .power_ctrl = dtt200u_power_ctrl, | |
216 | ||
f72a27b8 MCC |
217 | .rc.legacy = { |
218 | .rc_interval = 300, | |
2f4f58d6 MCC |
219 | .rc_map_table = rc_map_dtt200u_table, |
220 | .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table), | |
f72a27b8 MCC |
221 | .rc_query = dtt200u_rc_query, |
222 | }, | |
4d43e13f PB |
223 | |
224 | .generic_bulk_ctrl_endpoint = 0x01, | |
d590f9c2 PB |
225 | |
226 | .num_device_descs = 1, | |
227 | .devices = { | |
62703b9d | 228 | { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", |
ded38d28 | 229 | .cold_ids = { &dtt200u_usb_table[2], &dtt200u_usb_table[8], NULL }, |
d590f9c2 PB |
230 | .warm_ids = { &dtt200u_usb_table[3], NULL }, |
231 | }, | |
dad08dfc | 232 | { NULL }, |
d590f9c2 PB |
233 | } |
234 | }; | |
235 | ||
4d43e13f | 236 | static struct dvb_usb_device_properties wt220u_fc_properties = { |
19e22576 AT |
237 | .usb_ctrl = CYPRESS_FX2, |
238 | .firmware = "dvb-usb-wt220u-fc03.fw", | |
239 | ||
4d43e13f PB |
240 | .num_adapters = 1, |
241 | .adapter = { | |
242 | { | |
77eed219 MK |
243 | .num_frontends = 1, |
244 | .fe = {{ | |
4d43e13f PB |
245 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, |
246 | .pid_filter_count = 15, | |
247 | ||
19e22576 AT |
248 | .streaming_ctrl = dtt200u_streaming_ctrl, |
249 | .pid_filter = dtt200u_pid_filter, | |
250 | .frontend_attach = dtt200u_frontend_attach, | |
19e22576 | 251 | /* parameter for the MPEG2-data transfer */ |
4d43e13f PB |
252 | .stream = { |
253 | .type = USB_BULK, | |
19e22576 | 254 | .count = 7, |
4d43e13f | 255 | .endpoint = 0x06, |
19e22576 AT |
256 | .u = { |
257 | .bulk = { | |
258 | .buffersize = 4096, | |
259 | } | |
260 | } | |
261 | }, | |
77eed219 | 262 | }}, |
4d43e13f PB |
263 | } |
264 | }, | |
265 | .power_ctrl = dtt200u_power_ctrl, | |
266 | ||
f72a27b8 MCC |
267 | .rc.legacy = { |
268 | .rc_interval = 300, | |
2f4f58d6 MCC |
269 | .rc_map_table = rc_map_dtt200u_table, |
270 | .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table), | |
f72a27b8 MCC |
271 | .rc_query = dtt200u_rc_query, |
272 | }, | |
4d43e13f PB |
273 | |
274 | .generic_bulk_ctrl_endpoint = 0x01, | |
19e22576 AT |
275 | |
276 | .num_device_descs = 1, | |
277 | .devices = { | |
278 | { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", | |
279 | .cold_ids = { &dtt200u_usb_table[6], NULL }, | |
280 | .warm_ids = { &dtt200u_usb_table[7], NULL }, | |
281 | }, | |
282 | { NULL }, | |
283 | } | |
284 | }; | |
285 | ||
4d43e13f | 286 | static struct dvb_usb_device_properties wt220u_zl0353_properties = { |
d46e6451 PB |
287 | .usb_ctrl = CYPRESS_FX2, |
288 | .firmware = "dvb-usb-wt220u-zl0353-01.fw", | |
289 | ||
4d43e13f PB |
290 | .num_adapters = 1, |
291 | .adapter = { | |
292 | { | |
77eed219 MK |
293 | .num_frontends = 1, |
294 | .fe = {{ | |
4d43e13f PB |
295 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, |
296 | .pid_filter_count = 15, | |
297 | ||
01451e72 PB |
298 | .streaming_ctrl = dtt200u_streaming_ctrl, |
299 | .pid_filter = dtt200u_pid_filter, | |
300 | .frontend_attach = dtt200u_frontend_attach, | |
301 | /* parameter for the MPEG2-data transfer */ | |
4d43e13f PB |
302 | .stream = { |
303 | .type = USB_BULK, | |
01451e72 PB |
304 | .count = 7, |
305 | .endpoint = 0x02, | |
306 | .u = { | |
307 | .bulk = { | |
308 | .buffersize = 4096, | |
309 | } | |
310 | } | |
311 | }, | |
77eed219 | 312 | }}, |
4d43e13f PB |
313 | } |
314 | }, | |
315 | .power_ctrl = dtt200u_power_ctrl, | |
316 | ||
f72a27b8 MCC |
317 | .rc.legacy = { |
318 | .rc_interval = 300, | |
2f4f58d6 MCC |
319 | .rc_map_table = rc_map_dtt200u_table, |
320 | .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table), | |
f72a27b8 MCC |
321 | .rc_query = dtt200u_rc_query, |
322 | }, | |
4d43e13f PB |
323 | |
324 | .generic_bulk_ctrl_endpoint = 0x01, | |
d46e6451 PB |
325 | |
326 | .num_device_descs = 1, | |
327 | .devices = { | |
328 | { .name = "WideView WT-220U PenType Receiver (based on ZL353)", | |
329 | .cold_ids = { &dtt200u_usb_table[4], NULL }, | |
330 | .warm_ids = { &dtt200u_usb_table[5], NULL }, | |
331 | }, | |
332 | { NULL }, | |
333 | } | |
334 | }; | |
335 | ||
d3c35acf RR |
336 | static struct dvb_usb_device_properties wt220u_miglia_properties = { |
337 | .usb_ctrl = CYPRESS_FX2, | |
338 | .firmware = "dvb-usb-wt220u-miglia-01.fw", | |
339 | ||
340 | .num_adapters = 1, | |
341 | .generic_bulk_ctrl_endpoint = 0x01, | |
342 | ||
343 | .num_device_descs = 1, | |
344 | .devices = { | |
345 | { .name = "WideView WT-220U PenType Receiver (Miglia)", | |
346 | .cold_ids = { &dtt200u_usb_table[9], NULL }, | |
347 | /* This device turns into WT220U_ZL0353_WARM when fw | |
348 | has been uploaded */ | |
349 | .warm_ids = { NULL }, | |
350 | }, | |
351 | { NULL }, | |
352 | } | |
353 | }; | |
354 | ||
776338e1 JS |
355 | /* usb specific object needed to register this driver with the usb subsystem */ |
356 | static struct usb_driver dtt200u_usb_driver = { | |
d590f9c2 | 357 | .name = "dvb_usb_dtt200u", |
62703b9d | 358 | .probe = dtt200u_usb_probe, |
776338e1 | 359 | .disconnect = dvb_usb_device_exit, |
62703b9d | 360 | .id_table = dtt200u_usb_table, |
776338e1 JS |
361 | }; |
362 | ||
ecb3b2b3 | 363 | module_usb_driver(dtt200u_usb_driver); |
776338e1 JS |
364 | |
365 | MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); | |
d3c35acf | 366 | MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon/Club3D/Miglia DVB-T USB2.0 devices"); |
776338e1 JS |
367 | MODULE_VERSION("1.0"); |
368 | MODULE_LICENSE("GPL"); |