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 | { | |
d590f9c2 PB |
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; | |
776338e1 JS |
106 | } |
107 | ||
108 | static struct usb_device_id dtt200u_usb_table [] = { | |
d590f9c2 | 109 | // { USB_DEVICE(0x04b4,0x8613) }, |
fb41f5a7 PB |
110 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, |
111 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, | |
d590f9c2 PB |
112 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, |
113 | { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, | |
776338e1 JS |
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, | |
d590f9c2 | 120 | .pid_filter_count = 15, |
776338e1 JS |
121 | |
122 | .usb_ctrl = CYPRESS_FX2, | |
123 | .firmware = "dvb-usb-dtt200u-01.fw", | |
124 | ||
d590f9c2 | 125 | .power_ctrl = dtt200u_power_ctrl, |
776338e1 JS |
126 | .streaming_ctrl = dtt200u_streaming_ctrl, |
127 | .pid_filter = dtt200u_pid_filter, | |
128 | .frontend_attach = dtt200u_frontend_attach, | |
129 | ||
d590f9c2 | 130 | .rc_interval = 300, |
776338e1 JS |
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 = { | |
d590f9c2 | 151 | { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", |
fb41f5a7 | 152 | .cold_ids = { &dtt200u_usb_table[0], NULL }, |
776338e1 JS |
153 | .warm_ids = { &dtt200u_usb_table[1], NULL }, |
154 | }, | |
155 | { 0 }, | |
156 | } | |
157 | }; | |
158 | ||
d590f9c2 PB |
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 | ||
776338e1 JS |
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, | |
d590f9c2 | 203 | .name = "dvb_usb_dtt200u", |
776338e1 JS |
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>"); | |
d590f9c2 | 231 | MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon DVB-T USB2.0 devices"); |
776338e1 JS |
232 | MODULE_VERSION("1.0"); |
233 | MODULE_LICENSE("GPL"); |