]>
Commit | Line | Data |
---|---|---|
fb41f5a7 PB |
1 | /* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/ |
2 | * Typhoon/ Yuan 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 | ||
d590f9c2 PB |
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 | ||
776338e1 JS |
31 | static int dtt200u_streaming_ctrl(struct dvb_usb_device *d, int onoff) |
32 | { | |
d590f9c2 | 33 | u8 b_streaming[2] = { SET_STREAMING, onoff }; |
776338e1 JS |
34 | u8 b_rst_pid = RESET_PID_FILTER; |
35 | ||
36 | dvb_usb_generic_write(d,b_streaming,2); | |
37 | ||
d590f9c2 | 38 | if (onoff == 0) |
776338e1 JS |
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; | |
d590f9c2 | 51 | b_pid[3] = (pid >> 8) & 0x1f; |
776338e1 JS |
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 }, | |
d590f9c2 | 69 | { 0x80, 0x0c, KEY_ZOOM }, |
776338e1 | 70 | { 0x80, 0x0d, KEY_0 }, |
d590f9c2 | 71 | { 0x80, 0x0e, KEY_SELECT }, |
776338e1 JS |
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 | { | |
d590f9c2 | 81 | u8 key[5],cmd = GET_RC_CODE; |
776338e1 JS |
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; | |
d590f9c2 | 96 | static struct dvb_usb_properties wt220u_properties; |
776338e1 JS |
97 | |
98 | static int dtt200u_usb_probe(struct usb_interface *intf, | |
99 | const struct usb_device_id *id) | |
100 | { | |
47dc3d68 PB |
101 | if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 || |
102 | dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0) | |
d590f9c2 PB |
103 | return 0; |
104 | ||
105 | return -ENODEV; | |
776338e1 JS |
106 | } |
107 | ||
108 | static struct usb_device_id dtt200u_usb_table [] = { | |
62703b9d PB |
109 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, |
110 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, | |
111 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, | |
112 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, | |
113 | { 0 }, | |
776338e1 JS |
114 | }; |
115 | MODULE_DEVICE_TABLE(usb, dtt200u_usb_table); | |
116 | ||
117 | static struct dvb_usb_properties dtt200u_properties = { | |
118 | .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING, | |
d590f9c2 | 119 | .pid_filter_count = 15, |
776338e1 JS |
120 | |
121 | .usb_ctrl = CYPRESS_FX2, | |
122 | .firmware = "dvb-usb-dtt200u-01.fw", | |
123 | ||
d590f9c2 | 124 | .power_ctrl = dtt200u_power_ctrl, |
776338e1 JS |
125 | .streaming_ctrl = dtt200u_streaming_ctrl, |
126 | .pid_filter = dtt200u_pid_filter, | |
127 | .frontend_attach = dtt200u_frontend_attach, | |
128 | ||
d590f9c2 | 129 | .rc_interval = 300, |
776338e1 JS |
130 | .rc_key_map = dtt200u_rc_keys, |
131 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
132 | .rc_query = dtt200u_rc_query, | |
133 | ||
134 | .generic_bulk_ctrl_endpoint = 0x01, | |
135 | ||
136 | /* parameter for the MPEG2-data transfer */ | |
137 | .urb = { | |
138 | .type = DVB_USB_BULK, | |
139 | .count = 7, | |
140 | .endpoint = 0x02, | |
141 | .u = { | |
142 | .bulk = { | |
143 | .buffersize = 4096, | |
144 | } | |
145 | } | |
146 | }, | |
147 | ||
148 | .num_device_descs = 1, | |
149 | .devices = { | |
d590f9c2 | 150 | { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", |
fb41f5a7 | 151 | .cold_ids = { &dtt200u_usb_table[0], NULL }, |
776338e1 JS |
152 | .warm_ids = { &dtt200u_usb_table[1], NULL }, |
153 | }, | |
4302c15e | 154 | { 0 }, |
776338e1 JS |
155 | } |
156 | }; | |
157 | ||
d590f9c2 PB |
158 | static struct dvb_usb_properties wt220u_properties = { |
159 | .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING, | |
160 | .pid_filter_count = 15, | |
161 | ||
162 | .usb_ctrl = CYPRESS_FX2, | |
163 | .firmware = "dvb-usb-wt220u-01.fw", | |
164 | ||
165 | .power_ctrl = dtt200u_power_ctrl, | |
166 | .streaming_ctrl = dtt200u_streaming_ctrl, | |
167 | .pid_filter = dtt200u_pid_filter, | |
168 | .frontend_attach = dtt200u_frontend_attach, | |
169 | ||
170 | .rc_interval = 300, | |
171 | .rc_key_map = dtt200u_rc_keys, | |
172 | .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), | |
173 | .rc_query = dtt200u_rc_query, | |
174 | ||
175 | .generic_bulk_ctrl_endpoint = 0x01, | |
176 | ||
177 | /* parameter for the MPEG2-data transfer */ | |
178 | .urb = { | |
179 | .type = DVB_USB_BULK, | |
180 | .count = 7, | |
181 | .endpoint = 0x02, | |
182 | .u = { | |
183 | .bulk = { | |
184 | .buffersize = 4096, | |
185 | } | |
186 | } | |
187 | }, | |
188 | ||
189 | .num_device_descs = 1, | |
190 | .devices = { | |
62703b9d | 191 | { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", |
d590f9c2 PB |
192 | .cold_ids = { &dtt200u_usb_table[2], NULL }, |
193 | .warm_ids = { &dtt200u_usb_table[3], NULL }, | |
194 | }, | |
4302c15e | 195 | { 0 }, |
d590f9c2 PB |
196 | } |
197 | }; | |
198 | ||
776338e1 JS |
199 | /* usb specific object needed to register this driver with the usb subsystem */ |
200 | static struct usb_driver dtt200u_usb_driver = { | |
d590f9c2 | 201 | .name = "dvb_usb_dtt200u", |
62703b9d | 202 | .probe = dtt200u_usb_probe, |
776338e1 | 203 | .disconnect = dvb_usb_device_exit, |
62703b9d | 204 | .id_table = dtt200u_usb_table, |
776338e1 JS |
205 | }; |
206 | ||
207 | /* module stuff */ | |
208 | static int __init dtt200u_usb_module_init(void) | |
209 | { | |
210 | int result; | |
211 | if ((result = usb_register(&dtt200u_usb_driver))) { | |
212 | err("usb_register failed. (%d)",result); | |
213 | return result; | |
214 | } | |
215 | ||
216 | return 0; | |
217 | } | |
218 | ||
219 | static void __exit dtt200u_usb_module_exit(void) | |
220 | { | |
221 | /* deregister this driver from the USB subsystem */ | |
222 | usb_deregister(&dtt200u_usb_driver); | |
223 | } | |
224 | ||
225 | module_init(dtt200u_usb_module_init); | |
226 | module_exit(dtt200u_usb_module_exit); | |
227 | ||
228 | MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); | |
d590f9c2 | 229 | MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon DVB-T USB2.0 devices"); |
776338e1 JS |
230 | MODULE_VERSION("1.0"); |
231 | MODULE_LICENSE("GPL"); |