diff options
-rw-r--r-- | Documentation/dvb/README.dibusb | 285 | ||||
-rw-r--r-- | drivers/media/dvb/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/dvb/Makefile | 2 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/Kconfig | 62 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/Makefile | 11 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-core.c | 558 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-dvb.c | 185 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-fe-i2c.c | 582 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-firmware.c | 87 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-remote.c | 316 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb-usb.c | 303 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-dibusb.h | 327 | ||||
-rw-r--r-- | drivers/media/dvb/dibusb/dvb-fe-dtt200u.c | 263 |
13 files changed, 1 insertions, 2981 deletions
diff --git a/Documentation/dvb/README.dibusb b/Documentation/dvb/README.dibusb deleted file mode 100644 index 7a9e958513f3..000000000000 --- a/Documentation/dvb/README.dibusb +++ /dev/null | |||
@@ -1,285 +0,0 @@ | |||
1 | Documentation for dib3000* frontend drivers and dibusb device driver | ||
2 | ==================================================================== | ||
3 | |||
4 | Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de), | ||
5 | |||
6 | dibusb and dib3000mb/mc drivers based on GPL code, which has | ||
7 | |||
8 | Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr) | ||
9 | |||
10 | This program is free software; you can redistribute it and/or | ||
11 | modify it under the terms of the GNU General Public License as | ||
12 | published by the Free Software Foundation, version 2. | ||
13 | |||
14 | |||
15 | Supported devices USB1.1 | ||
16 | ======================== | ||
17 | |||
18 | Produced and reselled by Twinhan: | ||
19 | --------------------------------- | ||
20 | - TwinhanDTV USB-Ter DVB-T Device (VP7041) | ||
21 | http://www.twinhan.com/product_terrestrial_3.asp | ||
22 | |||
23 | - TwinhanDTV Magic Box (VP7041e) | ||
24 | http://www.twinhan.com/product_terrestrial_4.asp | ||
25 | |||
26 | - HAMA DVB-T USB device | ||
27 | http://www.hama.de/portal/articleId*110620/action*2598 | ||
28 | |||
29 | - CTS Portable (Chinese Television System) (2) | ||
30 | http://www.2cts.tv/ctsportable/ | ||
31 | |||
32 | - Unknown USB DVB-T device with vendor ID Hyper-Paltek | ||
33 | |||
34 | |||
35 | Produced and reselled by KWorld: | ||
36 | -------------------------------- | ||
37 | - KWorld V-Stream XPERT DTV DVB-T USB | ||
38 | http://www.kworld.com.tw/en/product/DVBT-USB/DVBT-USB.html | ||
39 | |||
40 | - JetWay DTV DVB-T USB | ||
41 | http://www.jetway.com.tw/evisn/product/lcd-tv/DVT-USB/dtv-usb.htm | ||
42 | |||
43 | - ADSTech Instant TV DVB-T USB | ||
44 | http://www.adstech.com/products/PTV-333/intro/PTV-333_intro.asp?pid=PTV-333 | ||
45 | |||
46 | |||
47 | Others: | ||
48 | ------- | ||
49 | - Ultima Electronic/Artec T1 USB TVBOX (AN2135, AN2235, AN2235 with Panasonic Tuner) | ||
50 | http://82.161.246.249/products-tvbox.html | ||
51 | |||
52 | - Compro Videomate DVB-U2000 - DVB-T USB (2) | ||
53 | http://www.comprousa.com/products/vmu2000.htm | ||
54 | |||
55 | - Grandtec USB DVB-T | ||
56 | http://www.grand.com.tw/ | ||
57 | |||
58 | - Avermedia AverTV DVBT USB (2) | ||
59 | http://www.avermedia.com/ | ||
60 | |||
61 | - DiBcom USB DVB-T reference device (non-public) | ||
62 | |||
63 | |||
64 | Supported devices USB2.0 | ||
65 | ======================== | ||
66 | - Twinhan MagicBox II (2) | ||
67 | http://www.twinhan.com/product_terrestrial_7.asp | ||
68 | |||
69 | - Hanftek UMT-010 (1) | ||
70 | http://www.globalsources.com/si/6008819757082/ProductDetail/Digital-TV/product_id-100046529 | ||
71 | |||
72 | - Typhoon/Yakumo/HAMA DVB-T mobile USB2.0 (1) | ||
73 | http://www.yakumo.de/produkte/index.php?pid=1&ag=DVB-T | ||
74 | |||
75 | - Artec T1 USB TVBOX (FX2) (2) | ||
76 | |||
77 | - Hauppauge WinTV NOVA-T USB2 | ||
78 | http://www.hauppauge.com/ | ||
79 | |||
80 | - KWorld/ADSTech Instant DVB-T USB2.0 (DiB3000M-B) | ||
81 | |||
82 | - DiBcom USB2.0 DVB-T reference device (non-public) | ||
83 | |||
84 | 1) It is working almost. | ||
85 | 2) No test reports received yet. | ||
86 | |||
87 | |||
88 | 0. NEWS: | ||
89 | 2005-02-11 - added support for the KWorld/ADSTech Instant DVB-T USB2.0. Thanks a lot to Joachim von Caron | ||
90 | 2005-02-02 - added support for the Hauppauge Win-TV Nova-T USB2 | ||
91 | 2005-01-31 - distorted streaming is finally gone for USB1.1 devices | ||
92 | 2005-01-13 - moved the mirrored pid_filter_table back to dvb-dibusb | ||
93 | - first almost working version for HanfTek UMT-010 | ||
94 | - found out, that Yakumo/HAMA/Typhoon are predessors of the HanfTek UMT-010 | ||
95 | 2005-01-10 - refactoring completed, now everything is very delightful | ||
96 | - tuner quirks for some weird devices (Artec T1 AN2235 device has sometimes a | ||
97 | Panasonic Tuner assembled). Tunerprobing implemented. Thanks a lot to Gunnar Wittich. | ||
98 | 2004-12-29 - after several days of struggling around bug of no returning URBs fixed. | ||
99 | 2004-12-26 - refactored the dibusb-driver, splitted into separate files | ||
100 | - i2c-probing enabled | ||
101 | 2004-12-06 - possibility for demod i2c-address probing | ||
102 | - new usb IDs (Compro,Artec) | ||
103 | 2004-11-23 - merged changes from DiB3000MC_ver2.1 | ||
104 | - revised the debugging | ||
105 | - possibility to deliver the complete TS for USB2.0 | ||
106 | 2004-11-21 - first working version of the dib3000mc/p frontend driver. | ||
107 | 2004-11-12 - added additional remote control keys. Thanks to Uwe Hanke. | ||
108 | 2004-11-07 - added remote control support. Thanks to David Matthews. | ||
109 | 2004-11-05 - added support for a new devices (Grandtec/Avermedia/Artec) | ||
110 | - merged my changes (for dib3000mb/dibusb) to the FE_REFACTORING, because it became HEAD | ||
111 | - moved transfer control (pid filter, fifo control) from usb driver to frontend, it seems | ||
112 | better settled there (added xfer_ops-struct) | ||
113 | - created a common files for frontends (mc/p/mb) | ||
114 | 2004-09-28 - added support for a new device (Unkown, vendor ID is Hyper-Paltek) | ||
115 | 2004-09-20 - added support for a new device (Compro DVB-U2000), thanks | ||
116 | to Amaury Demol for reporting | ||
117 | - changed usb TS transfer method (several urbs, stopping transfer | ||
118 | before setting a new pid) | ||
119 | 2004-09-13 - added support for a new device (Artec T1 USB TVBOX), thanks | ||
120 | to Christian Motschke for reporting | ||
121 | 2004-09-05 - released the dibusb device and dib3000mb-frontend driver | ||
122 | |||
123 | (old news for vp7041.c) | ||
124 | 2004-07-15 - found out, by accident, that the device has a TUA6010XS for | ||
125 | PLL | ||
126 | 2004-07-12 - figured out, that the driver should also work with the | ||
127 | CTS Portable (Chinese Television System) | ||
128 | 2004-07-08 - firmware-extraction-2.422-problem solved, driver is now working | ||
129 | properly with firmware extracted from 2.422 | ||
130 | - #if for 2.6.4 (dvb), compile issue | ||
131 | - changed firmware handling, see vp7041.txt sec 1.1 | ||
132 | 2004-07-02 - some tuner modifications, v0.1, cleanups, first public | ||
133 | 2004-06-28 - now using the dvb_dmx_swfilter_packets, everything | ||
134 | runs fine now | ||
135 | 2004-06-27 - able to watch and switching channels (pre-alpha) | ||
136 | - no section filtering yet | ||
137 | 2004-06-06 - first TS received, but kernel oops :/ | ||
138 | 2004-05-14 - firmware loader is working | ||
139 | 2004-05-11 - start writing the driver | ||
140 | |||
141 | 1. How to use? | ||
142 | NOTE: This driver was developed using Linux 2.6.6., | ||
143 | it is working with 2.6.7 and above. | ||
144 | |||
145 | Linux 2.4.x support is not planned, but patches are very welcome. | ||
146 | |||
147 | NOTE: I'm using Debian testing, so the following explaination (especially | ||
148 | the hotplug-path) needn't match your system, but probably it will :). | ||
149 | |||
150 | The driver is included in the kernel since Linux 2.6.10. | ||
151 | |||
152 | 1.1. Firmware | ||
153 | |||
154 | The USB driver needs to download a firmware to start working. | ||
155 | |||
156 | You can either use "get_dvb_firmware dibusb" to download the firmware or you | ||
157 | can get it directly via | ||
158 | |||
159 | for USB1.1 (AN2135) | ||
160 | http://www.linuxtv.org/downloads/firmware/dvb-dibusb-5.0.0.11.fw | ||
161 | |||
162 | for USB1.1 (AN2235) (a few Artec T1 devices) | ||
163 | http://www.linuxtv.org/downloads/firmware/dvb-dibusb-an2235-1.fw | ||
164 | |||
165 | for USB2.0 (FX2) Hauppauge, DiBcom | ||
166 | http://www.linuxtv.org/downloads/firmware/dvb-dibusb-6.0.0.5.fw | ||
167 | |||
168 | for USB2.0 ADSTech/Kworld USB2.0 | ||
169 | http://www.linuxtv.org/downloads/firmware/dvb-dibusb-adstech-usb2-1.fw | ||
170 | |||
171 | for USB2.0 HanfTek | ||
172 | http://www.linuxtv.org/downloads/firmware/dvb-dibusb-an2235-1.fw | ||
173 | |||
174 | |||
175 | 1.2. Compiling | ||
176 | |||
177 | Since the driver is in the linux kernel, activating the driver in | ||
178 | your favorite config-environment should sufficient. I recommend | ||
179 | to compile the driver as module. Hotplug does the rest. | ||
180 | |||
181 | 1.3. Loading the drivers | ||
182 | |||
183 | Hotplug is able to load the driver, when it is needed (because you plugged | ||
184 | in the device). | ||
185 | |||
186 | If you want to enable debug output, you have to load the driver manually and | ||
187 | from withing the dvb-kernel cvs repository. | ||
188 | |||
189 | first have a look, which debug level are available: | ||
190 | |||
191 | modinfo dib3000mb | ||
192 | modinfo dib3000-common | ||
193 | modinfo dib3000mc | ||
194 | modinfo dvb-dibusb | ||
195 | |||
196 | modprobe dib3000-common debug=<level> | ||
197 | modprobe dib3000mb debug=<level> | ||
198 | modprobe dib3000mc debug=<level> | ||
199 | modprobe dvb-dibusb debug=<level> | ||
200 | |||
201 | should do the trick. | ||
202 | |||
203 | When the driver is loaded successfully, the firmware file was in | ||
204 | the right place and the device is connected, the "Power"-LED should be | ||
205 | turned on. | ||
206 | |||
207 | At this point you should be able to start a dvb-capable application. For myself | ||
208 | I used mplayer, dvbscan, tzap and kaxtv, they are working. Using the device | ||
209 | in vdr is working now also. | ||
210 | |||
211 | 2. Known problems and bugs | ||
212 | |||
213 | - Don't remove the USB device while running an DVB application, your system will die. | ||
214 | |||
215 | 2.1. Adding support for devices | ||
216 | |||
217 | It is not possible to determine the range of devices based on the DiBcom | ||
218 | reference designs. This is because the reference design of DiBcom can be sold | ||
219 | to thirds, without telling DiBcom (so done with the Twinhan VP7041 and | ||
220 | the HAMA device). | ||
221 | |||
222 | When you think you have a device like this and the driver does not recognizes it, | ||
223 | please send the ****load*.inf and the ****cap*.inf of the Windows driver to me. | ||
224 | |||
225 | Sometimes the Vendor or Product ID is identical to the ones of Twinhan, even | ||
226 | though it is not a Twinhan device (e.g. HAMA), then please send me the name | ||
227 | of the device. I will add it to this list in order to make this clear to | ||
228 | others. | ||
229 | |||
230 | If you are familar with C you can also add the VID and PID of the device to | ||
231 | the dvb-dibusb-core.c-file and create a patch and send it over to me or to | ||
232 | the linux-dvb mailing list, _after_ you have tried compiling and modprobing | ||
233 | it. | ||
234 | |||
235 | 2.2. USB1.1 Bandwidth limitation | ||
236 | |||
237 | Most of the currently supported devices are USB1.1 and thus they have a | ||
238 | maximum bandwidth of about 5-6 MBit/s when connected to a USB2.0 hub. | ||
239 | This is not enough for receiving the complete transport stream of a | ||
240 | DVB-T channel (which can be about 16 MBit/s). Normally this is not a | ||
241 | problem, if you only want to watch TV (this does not apply for HDTV), | ||
242 | but watching a channel while recording another channel on the same | ||
243 | frequency simply does not work very well. This applies to all USB1.1 | ||
244 | DVB-T devices, not just dibusb) | ||
245 | |||
246 | Update: For the USB1.1 and VDR some work has been done (patches and comments | ||
247 | are still very welcome). Maybe the problem is solved in the meantime because I | ||
248 | now use the dmx_sw_filter function instead of dmx_sw_filter_packet. I hope the | ||
249 | linux-dvb software filter is able to get the best of the garbled TS. | ||
250 | |||
251 | The bug, where the TS is distorted by a heavy usage of the device is gone | ||
252 | definitely. All dibusb-devices I was using (Twinhan, Kworld, DiBcom) are | ||
253 | working like charm now with VDR. Sometimes I even was able to record a channel | ||
254 | and watch another one. | ||
255 | |||
256 | 2.3. Comments | ||
257 | |||
258 | Patches, comments and suggestions are very very welcome. | ||
259 | |||
260 | 3. Acknowledgements | ||
261 | Amaury Demol (ademol@dibcom.fr) and Francois Kanounnikoff from DiBcom for | ||
262 | providing specs, code and help, on which the dvb-dibusb, dib3000mb and | ||
263 | dib3000mc are based. | ||
264 | |||
265 | David Matthews for identifying a new device type (Artec T1 with AN2235) | ||
266 | and for extending dibusb with remote control event handling. Thank you. | ||
267 | |||
268 | Alex Woods for frequently answering question about usb and dvb | ||
269 | stuff, a big thank you. | ||
270 | |||
271 | Bernd Wagner for helping with huge bug reports and discussions. | ||
272 | |||
273 | Gunnar Wittich and Joachim von Caron for their trust for giving me | ||
274 | root-shells on their machines to implement support for new devices. | ||
275 | |||
276 | Some guys on the linux-dvb mailing list for encouraging me | ||
277 | |||
278 | Peter Schildmann >peter.schildmann-nospam-at-web.de< for his | ||
279 | user-level firmware loader, which saves a lot of time | ||
280 | (when writing the vp7041 driver) | ||
281 | |||
282 | Ulf Hermenau for helping me out with traditional chinese. | ||
283 | |||
284 | André Smoktun and Christian Frömmel for supporting me with | ||
285 | hardware and listening to my problems very patient | ||
diff --git a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig index 4983e1b1bb1d..b81abdfde378 100644 --- a/drivers/media/dvb/Kconfig +++ b/drivers/media/dvb/Kconfig | |||
@@ -29,7 +29,6 @@ comment "Supported USB Adapters" | |||
29 | depends on DVB_CORE && USB | 29 | depends on DVB_CORE && USB |
30 | source "drivers/media/dvb/ttusb-budget/Kconfig" | 30 | source "drivers/media/dvb/ttusb-budget/Kconfig" |
31 | source "drivers/media/dvb/ttusb-dec/Kconfig" | 31 | source "drivers/media/dvb/ttusb-dec/Kconfig" |
32 | source "drivers/media/dvb/dibusb/Kconfig" | ||
33 | source "drivers/media/dvb/cinergyT2/Kconfig" | 32 | source "drivers/media/dvb/cinergyT2/Kconfig" |
34 | 33 | ||
35 | comment "Supported FlexCopII (B2C2) Adapters" | 34 | comment "Supported FlexCopII (B2C2) Adapters" |
diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile index 520fc3902819..d2dd914f7776 100644 --- a/drivers/media/dvb/Makefile +++ b/drivers/media/dvb/Makefile | |||
@@ -2,4 +2,4 @@ | |||
2 | # Makefile for the kernel multimedia device drivers. | 2 | # Makefile for the kernel multimedia device drivers. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dibusb/ cinergyT2/ | 5 | obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ cinergyT2/ |
diff --git a/drivers/media/dvb/dibusb/Kconfig b/drivers/media/dvb/dibusb/Kconfig deleted file mode 100644 index 74dfc73ae5b0..000000000000 --- a/drivers/media/dvb/dibusb/Kconfig +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | config DVB_DIBUSB | ||
2 | tristate "DiBcom USB DVB-T devices (see help for a complete device list)" | ||
3 | depends on DVB_CORE && USB | ||
4 | select FW_LOADER | ||
5 | select DVB_DIB3000MB | ||
6 | select DVB_DIB3000MC | ||
7 | select DVB_MT352 | ||
8 | help | ||
9 | Support for USB 1.1 and 2.0 DVB-T devices based on reference designs made by | ||
10 | DiBcom (http://www.dibcom.fr) and C&E. | ||
11 | |||
12 | Devices supported by this driver: | ||
13 | |||
14 | TwinhanDTV USB-Ter (VP7041) | ||
15 | TwinhanDTV Magic Box (VP7041e) | ||
16 | KWorld/JetWay/ADSTech V-Stream XPERT DTV - DVB-T USB1.1 and USB2.0 | ||
17 | Hama DVB-T USB-Box | ||
18 | DiBcom reference devices (non-public) | ||
19 | Ultima Electronic/Artec T1 USB TVBOX | ||
20 | Compro Videomate DVB-U2000 - DVB-T USB | ||
21 | Grandtec DVB-T USB | ||
22 | Avermedia AverTV DVBT USB | ||
23 | Artec T1 USB1.1 and USB2.0 boxes | ||
24 | Yakumo/Typhoon DVB-T USB2.0 | ||
25 | Hanftek UMT-010 USB2.0 | ||
26 | Hauppauge WinTV NOVA-T USB2 | ||
27 | |||
28 | The VP7041 seems to be identical to "CTS Portable" (Chinese | ||
29 | Television System). | ||
30 | |||
31 | These devices can be understood as budget ones, they "only" deliver | ||
32 | (a part of) the MPEG2 transport stream. | ||
33 | |||
34 | A firmware is needed to get the device working. See Documentation/dvb/README.dibusb | ||
35 | details. | ||
36 | |||
37 | Say Y if you own such a device and want to use it. You should build it as | ||
38 | a module. | ||
39 | |||
40 | config DVB_DIBUSB_MISDESIGNED_DEVICES | ||
41 | bool "Enable support for some misdesigned (see help) devices, which identify with wrong IDs" | ||
42 | depends on DVB_DIBUSB | ||
43 | help | ||
44 | Somehow Artec/Ultima Electronic forgot to program the eeprom of some of their | ||
45 | USB1.1/USB2.0 devices. | ||
46 | So comes that they identify with the default Vendor and Product ID of the Cypress | ||
47 | CY7C64613 (AN2235) or Cypress FX2. | ||
48 | |||
49 | Affected device IDs: | ||
50 | 0x0574:0x2235 (Artec T1 USB1.1, cold) | ||
51 | 0x04b4:0x8613 (Artec T1 USB2.0, cold) | ||
52 | 0x0574:0x1002 (Artec T1 USB2.0, warm) | ||
53 | 0x0574:0x2131 (aged DiBcom USB1.1 test device) | ||
54 | |||
55 | Say Y if your device has one of the mentioned IDs. | ||
56 | |||
57 | config DVB_DIBCOM_DEBUG | ||
58 | bool "Enable extended debug support for DiBcom USB device" | ||
59 | depends on DVB_DIBUSB | ||
60 | help | ||
61 | Say Y if you want to enable debuging. See modinfo dvb-dibusb for | ||
62 | debug levels. | ||
diff --git a/drivers/media/dvb/dibusb/Makefile b/drivers/media/dvb/dibusb/Makefile deleted file mode 100644 index e941c508624e..000000000000 --- a/drivers/media/dvb/dibusb/Makefile +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | dvb-dibusb-objs = dvb-dibusb-core.o \ | ||
2 | dvb-dibusb-dvb.o \ | ||
3 | dvb-dibusb-fe-i2c.o \ | ||
4 | dvb-dibusb-firmware.o \ | ||
5 | dvb-dibusb-remote.o \ | ||
6 | dvb-dibusb-usb.o \ | ||
7 | dvb-fe-dtt200u.o | ||
8 | |||
9 | obj-$(CONFIG_DVB_DIBUSB) += dvb-dibusb.o | ||
10 | |||
11 | EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-core.c b/drivers/media/dvb/dibusb/dvb-dibusb-core.c deleted file mode 100644 index 26235f9247e4..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-core.c +++ /dev/null | |||
@@ -1,558 +0,0 @@ | |||
1 | /* | ||
2 | * Driver for mobile USB Budget DVB-T devices based on reference | ||
3 | * design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * dvb-dibusb-core.c | ||
6 | * | ||
7 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
8 | * | ||
9 | * based on GPL code from DiBcom, which has | ||
10 | * Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr) | ||
11 | * | ||
12 | * Remote control code added by David Matthews (dm@prolingua.co.uk) | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or | ||
15 | * modify it under the terms of the GNU General Public License as | ||
16 | * published by the Free Software Foundation, version 2. | ||
17 | * | ||
18 | * Acknowledgements | ||
19 | * | ||
20 | * Amaury Demol (ademol@dibcom.fr) from DiBcom for providing specs and driver | ||
21 | * sources, on which this driver (and the dib3000mb/mc/p frontends) are based. | ||
22 | * | ||
23 | * see Documentation/dvb/README.dibusb for more information | ||
24 | */ | ||
25 | #include "dvb-dibusb.h" | ||
26 | |||
27 | #include <linux/moduleparam.h> | ||
28 | |||
29 | /* debug */ | ||
30 | int dvb_dibusb_debug; | ||
31 | module_param_named(debug, dvb_dibusb_debug, int, 0644); | ||
32 | |||
33 | #ifdef CONFIG_DVB_DIBCOM_DEBUG | ||
34 | #define DBSTATUS "" | ||
35 | #else | ||
36 | #define DBSTATUS " (debugging is not enabled)" | ||
37 | #endif | ||
38 | MODULE_PARM_DESC(debug, "set debugging level (1=info,2=xfer,4=alotmore,8=ts,16=err,32=rc (|-able))." DBSTATUS); | ||
39 | #undef DBSTATUS | ||
40 | |||
41 | static int pid_parse; | ||
42 | module_param(pid_parse, int, 0644); | ||
43 | MODULE_PARM_DESC(pid_parse, "enable pid parsing (filtering) when running at USB2.0"); | ||
44 | |||
45 | static int rc_query_interval = 100; | ||
46 | module_param(rc_query_interval, int, 0644); | ||
47 | MODULE_PARM_DESC(rc_query_interval, "interval in msecs for remote control query (default: 100; min: 40)"); | ||
48 | |||
49 | static int rc_key_repeat_count = 2; | ||
50 | module_param(rc_key_repeat_count, int, 0644); | ||
51 | MODULE_PARM_DESC(rc_key_repeat_count, "how many key repeats will be dropped before passing the key event again (default: 2)"); | ||
52 | |||
53 | /* Vendor IDs */ | ||
54 | #define USB_VID_ADSTECH 0x06e1 | ||
55 | #define USB_VID_ANCHOR 0x0547 | ||
56 | #define USB_VID_AVERMEDIA 0x14aa | ||
57 | #define USB_VID_COMPRO 0x185b | ||
58 | #define USB_VID_COMPRO_UNK 0x145f | ||
59 | #define USB_VID_CYPRESS 0x04b4 | ||
60 | #define USB_VID_DIBCOM 0x10b8 | ||
61 | #define USB_VID_EMPIA 0xeb1a | ||
62 | #define USB_VID_GRANDTEC 0x5032 | ||
63 | #define USB_VID_HANFTEK 0x15f4 | ||
64 | #define USB_VID_HAUPPAUGE 0x2040 | ||
65 | #define USB_VID_HYPER_PALTEK 0x1025 | ||
66 | #define USB_VID_IMC_NETWORKS 0x13d3 | ||
67 | #define USB_VID_TWINHAN 0x1822 | ||
68 | #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 | ||
69 | |||
70 | /* Product IDs */ | ||
71 | #define USB_PID_ADSTECH_USB2_COLD 0xa333 | ||
72 | #define USB_PID_ADSTECH_USB2_WARM 0xa334 | ||
73 | #define USB_PID_AVERMEDIA_DVBT_USB_COLD 0x0001 | ||
74 | #define USB_PID_AVERMEDIA_DVBT_USB_WARM 0x0002 | ||
75 | #define USB_PID_COMPRO_DVBU2000_COLD 0xd000 | ||
76 | #define USB_PID_COMPRO_DVBU2000_WARM 0xd001 | ||
77 | #define USB_PID_COMPRO_DVBU2000_UNK_COLD 0x010c | ||
78 | #define USB_PID_COMPRO_DVBU2000_UNK_WARM 0x010d | ||
79 | #define USB_PID_DIBCOM_MOD3000_COLD 0x0bb8 | ||
80 | #define USB_PID_DIBCOM_MOD3000_WARM 0x0bb9 | ||
81 | #define USB_PID_DIBCOM_MOD3001_COLD 0x0bc6 | ||
82 | #define USB_PID_DIBCOM_MOD3001_WARM 0x0bc7 | ||
83 | #define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131 | ||
84 | #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 | ||
85 | #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 | ||
86 | #define USB_PID_KWORLD_VSTREAM_COLD 0x17de | ||
87 | #define USB_PID_KWORLD_VSTREAM_WARM 0x17df | ||
88 | #define USB_PID_TWINHAN_VP7041_COLD 0x3201 | ||
89 | #define USB_PID_TWINHAN_VP7041_WARM 0x3202 | ||
90 | #define USB_PID_ULTIMA_TVBOX_COLD 0x8105 | ||
91 | #define USB_PID_ULTIMA_TVBOX_WARM 0x8106 | ||
92 | #define USB_PID_ULTIMA_TVBOX_AN2235_COLD 0x8107 | ||
93 | #define USB_PID_ULTIMA_TVBOX_AN2235_WARM 0x8108 | ||
94 | #define USB_PID_ULTIMA_TVBOX_ANCHOR_COLD 0x2235 | ||
95 | #define USB_PID_ULTIMA_TVBOX_USB2_COLD 0x8109 | ||
96 | #define USB_PID_ULTIMA_TVBOX_USB2_FX_COLD 0x8613 | ||
97 | #define USB_PID_ULTIMA_TVBOX_USB2_FX_WARM 0x1002 | ||
98 | #define USB_PID_UNK_HYPER_PALTEK_COLD 0x005e | ||
99 | #define USB_PID_UNK_HYPER_PALTEK_WARM 0x005f | ||
100 | #define USB_PID_HANFTEK_UMT_010_COLD 0x0001 | ||
101 | #define USB_PID_HANFTEK_UMT_010_WARM 0x0015 | ||
102 | #define USB_PID_YAKUMO_DTT200U_COLD 0x0201 | ||
103 | #define USB_PID_YAKUMO_DTT200U_WARM 0x0301 | ||
104 | #define USB_PID_WINTV_NOVA_T_USB2_COLD 0x9300 | ||
105 | #define USB_PID_WINTV_NOVA_T_USB2_WARM 0x9301 | ||
106 | |||
107 | /* USB Driver stuff | ||
108 | * table of devices that this driver is working with | ||
109 | * | ||
110 | * ATTENTION: Never ever change the order of this table, the particular | ||
111 | * devices depend on this order | ||
112 | * | ||
113 | * Each entry is used as a reference in the device_struct. Currently this is | ||
114 | * the only non-redundant way of assigning USB ids to actual devices I'm aware | ||
115 | * of, because there is only one place in the code where the assignment of | ||
116 | * vendor and product id is done, here. | ||
117 | */ | ||
118 | static struct usb_device_id dib_table [] = { | ||
119 | /* 00 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_DVBT_USB_COLD)}, | ||
120 | /* 01 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_DVBT_USB_WARM)}, | ||
121 | /* 02 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_YAKUMO_DTT200U_COLD) }, | ||
122 | /* 03 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_YAKUMO_DTT200U_WARM) }, | ||
123 | |||
124 | /* 04 */ { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_DVBU2000_COLD) }, | ||
125 | /* 05 */ { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_DVBU2000_WARM) }, | ||
126 | /* 06 */ { USB_DEVICE(USB_VID_COMPRO_UNK, USB_PID_COMPRO_DVBU2000_UNK_COLD) }, | ||
127 | /* 07 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3000_COLD) }, | ||
128 | /* 08 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3000_WARM) }, | ||
129 | /* 09 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_COLD) }, | ||
130 | /* 10 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_WARM) }, | ||
131 | /* 11 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_KWORLD_VSTREAM_COLD) }, | ||
132 | /* 12 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_KWORLD_VSTREAM_WARM) }, | ||
133 | /* 13 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB_COLD) }, | ||
134 | /* 14 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB_WARM) }, | ||
135 | /* 15 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_DIBCOM_MOD3000_COLD) }, | ||
136 | /* 16 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_DIBCOM_MOD3000_WARM) }, | ||
137 | /* 17 */ { USB_DEVICE(USB_VID_HYPER_PALTEK, USB_PID_UNK_HYPER_PALTEK_COLD) }, | ||
138 | /* 18 */ { USB_DEVICE(USB_VID_HYPER_PALTEK, USB_PID_UNK_HYPER_PALTEK_WARM) }, | ||
139 | /* 19 */ { USB_DEVICE(USB_VID_IMC_NETWORKS, USB_PID_TWINHAN_VP7041_COLD) }, | ||
140 | /* 20 */ { USB_DEVICE(USB_VID_IMC_NETWORKS, USB_PID_TWINHAN_VP7041_WARM) }, | ||
141 | /* 21 */ { USB_DEVICE(USB_VID_TWINHAN, USB_PID_TWINHAN_VP7041_COLD) }, | ||
142 | /* 22 */ { USB_DEVICE(USB_VID_TWINHAN, USB_PID_TWINHAN_VP7041_WARM) }, | ||
143 | /* 23 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_COLD) }, | ||
144 | /* 24 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_WARM) }, | ||
145 | /* 25 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_AN2235_COLD) }, | ||
146 | /* 26 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_AN2235_WARM) }, | ||
147 | /* 27 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_COLD) }, | ||
148 | |||
149 | /* 28 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_COLD) }, | ||
150 | /* 29 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_WARM) }, | ||
151 | |||
152 | /* 30 */ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_WINTV_NOVA_T_USB2_COLD) }, | ||
153 | /* 31 */ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_WINTV_NOVA_T_USB2_WARM) }, | ||
154 | /* 32 */ { USB_DEVICE(USB_VID_ADSTECH, USB_PID_ADSTECH_USB2_COLD) }, | ||
155 | /* 33 */ { USB_DEVICE(USB_VID_ADSTECH, USB_PID_ADSTECH_USB2_WARM) }, | ||
156 | /* | ||
157 | * activate the following define when you have one of the devices and want to | ||
158 | * build it from build-2.6 in dvb-kernel | ||
159 | */ | ||
160 | // #define CONFIG_DVB_DIBUSB_MISDESIGNED_DEVICES | ||
161 | #ifdef CONFIG_DVB_DIBUSB_MISDESIGNED_DEVICES | ||
162 | /* 34 */ { USB_DEVICE(USB_VID_ANCHOR, USB_PID_ULTIMA_TVBOX_ANCHOR_COLD) }, | ||
163 | /* 35 */ { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ULTIMA_TVBOX_USB2_FX_COLD) }, | ||
164 | /* 36 */ { USB_DEVICE(USB_VID_ANCHOR, USB_PID_ULTIMA_TVBOX_USB2_FX_WARM) }, | ||
165 | /* 37 */ { USB_DEVICE(USB_VID_ANCHOR, USB_PID_DIBCOM_ANCHOR_2135_COLD) }, | ||
166 | #endif | ||
167 | { } /* Terminating entry */ | ||
168 | }; | ||
169 | |||
170 | MODULE_DEVICE_TABLE (usb, dib_table); | ||
171 | |||
172 | static struct dibusb_usb_controller dibusb_usb_ctrl[] = { | ||
173 | { .name = "Cypress AN2135", .cpu_cs_register = 0x7f92 }, | ||
174 | { .name = "Cypress AN2235", .cpu_cs_register = 0x7f92 }, | ||
175 | { .name = "Cypress FX2", .cpu_cs_register = 0xe600 }, | ||
176 | }; | ||
177 | |||
178 | struct dibusb_tuner dibusb_tuner[] = { | ||
179 | { DIBUSB_TUNER_CABLE_THOMSON, | ||
180 | 0x61 | ||
181 | }, | ||
182 | { DIBUSB_TUNER_COFDM_PANASONIC_ENV57H1XD5, | ||
183 | 0x60 | ||
184 | }, | ||
185 | { DIBUSB_TUNER_CABLE_LG_TDTP_E102P, | ||
186 | 0x61 | ||
187 | }, | ||
188 | { DIBUSB_TUNER_COFDM_PANASONIC_ENV77H11D5, | ||
189 | 0x60 | ||
190 | }, | ||
191 | }; | ||
192 | |||
193 | static struct dibusb_demod dibusb_demod[] = { | ||
194 | { DIBUSB_DIB3000MB, | ||
195 | 16, | ||
196 | { 0x8, 0 }, | ||
197 | }, | ||
198 | { DIBUSB_DIB3000MC, | ||
199 | 32, | ||
200 | { 0x9, 0xa, 0xb, 0xc }, | ||
201 | }, | ||
202 | { DIBUSB_MT352, | ||
203 | 254, | ||
204 | { 0xf, 0 }, | ||
205 | }, | ||
206 | { DTT200U_FE, | ||
207 | 8, | ||
208 | { 0xff,0 }, /* there is no i2c bus in this device */ | ||
209 | } | ||
210 | }; | ||
211 | |||
212 | static struct dibusb_device_class dibusb_device_classes[] = { | ||
213 | { .id = DIBUSB1_1, .usb_ctrl = &dibusb_usb_ctrl[0], | ||
214 | .firmware = "dvb-dibusb-5.0.0.11.fw", | ||
215 | .pipe_cmd = 0x01, .pipe_data = 0x02, | ||
216 | .urb_count = 7, .urb_buffer_size = 4096, | ||
217 | DIBUSB_RC_NEC_PROTOCOL, | ||
218 | &dibusb_demod[DIBUSB_DIB3000MB], | ||
219 | &dibusb_tuner[DIBUSB_TUNER_CABLE_THOMSON], | ||
220 | }, | ||
221 | { DIBUSB1_1_AN2235, &dibusb_usb_ctrl[1], | ||
222 | "dvb-dibusb-an2235-1.fw", | ||
223 | 0x01, 0x02, | ||
224 | 7, 4096, | ||
225 | DIBUSB_RC_NEC_PROTOCOL, | ||
226 | &dibusb_demod[DIBUSB_DIB3000MB], | ||
227 | &dibusb_tuner[DIBUSB_TUNER_CABLE_THOMSON], | ||
228 | }, | ||
229 | { DIBUSB2_0,&dibusb_usb_ctrl[2], | ||
230 | "dvb-dibusb-6.0.0.5.fw", | ||
231 | 0x01, 0x06, | ||
232 | 7, 4096, | ||
233 | DIBUSB_RC_NEC_PROTOCOL, | ||
234 | &dibusb_demod[DIBUSB_DIB3000MC], | ||
235 | &dibusb_tuner[DIBUSB_TUNER_COFDM_PANASONIC_ENV57H1XD5], | ||
236 | }, | ||
237 | { UMT2_0, &dibusb_usb_ctrl[2], | ||
238 | "dvb-dibusb-umt-2.fw", | ||
239 | 0x01, 0x06, | ||
240 | 20, 512, | ||
241 | DIBUSB_RC_NO, | ||
242 | &dibusb_demod[DIBUSB_MT352], | ||
243 | &dibusb_tuner[DIBUSB_TUNER_CABLE_LG_TDTP_E102P], | ||
244 | }, | ||
245 | { DIBUSB2_0B,&dibusb_usb_ctrl[2], | ||
246 | "dvb-dibusb-adstech-usb2-1.fw", | ||
247 | 0x01, 0x06, | ||
248 | 7, 4096, | ||
249 | DIBUSB_RC_NEC_PROTOCOL, | ||
250 | &dibusb_demod[DIBUSB_DIB3000MB], | ||
251 | &dibusb_tuner[DIBUSB_TUNER_CABLE_THOMSON], | ||
252 | }, | ||
253 | { NOVAT_USB2,&dibusb_usb_ctrl[2], | ||
254 | "dvb-dibusb-nova-t-1.fw", | ||
255 | 0x01, 0x06, | ||
256 | 7, 4096, | ||
257 | DIBUSB_RC_HAUPPAUGE_PROTO, | ||
258 | &dibusb_demod[DIBUSB_DIB3000MC], | ||
259 | &dibusb_tuner[DIBUSB_TUNER_COFDM_PANASONIC_ENV57H1XD5], | ||
260 | }, | ||
261 | { DTT200U,&dibusb_usb_ctrl[2], | ||
262 | "dvb-dtt200u-1.fw", | ||
263 | 0x01, 0x02, | ||
264 | 7, 4096, | ||
265 | DIBUSB_RC_NO, | ||
266 | &dibusb_demod[DTT200U_FE], | ||
267 | NULL, /* no explicit tuner/pll-programming necessary (it has the ENV57H1XD5) */ | ||
268 | }, | ||
269 | }; | ||
270 | |||
271 | static struct dibusb_usb_device dibusb_devices[] = { | ||
272 | { "TwinhanDTV USB1.1 / Magic Box / HAMA USB1.1 DVB-T device", | ||
273 | &dibusb_device_classes[DIBUSB1_1], | ||
274 | { &dib_table[19], &dib_table[21], NULL}, | ||
275 | { &dib_table[20], &dib_table[22], NULL}, | ||
276 | }, | ||
277 | { "KWorld V-Stream XPERT DTV - DVB-T USB1.1", | ||
278 | &dibusb_device_classes[DIBUSB1_1], | ||
279 | { &dib_table[11], NULL }, | ||
280 | { &dib_table[12], NULL }, | ||
281 | }, | ||
282 | { "Grandtec USB1.1 DVB-T", | ||
283 | &dibusb_device_classes[DIBUSB1_1], | ||
284 | { &dib_table[13], &dib_table[15], NULL }, | ||
285 | { &dib_table[14], &dib_table[16], NULL }, | ||
286 | }, | ||
287 | { "DiBcom USB1.1 DVB-T reference design (MOD3000)", | ||
288 | &dibusb_device_classes[DIBUSB1_1], | ||
289 | { &dib_table[7], NULL }, | ||
290 | { &dib_table[8], NULL }, | ||
291 | }, | ||
292 | { "Artec T1 USB1.1 TVBOX with AN2135", | ||
293 | &dibusb_device_classes[DIBUSB1_1], | ||
294 | { &dib_table[23], NULL }, | ||
295 | { &dib_table[24], NULL }, | ||
296 | }, | ||
297 | { "Artec T1 USB1.1 TVBOX with AN2235", | ||
298 | &dibusb_device_classes[DIBUSB1_1_AN2235], | ||
299 | { &dib_table[25], NULL }, | ||
300 | { &dib_table[26], NULL }, | ||
301 | }, | ||
302 | { "Avermedia AverTV DVBT USB1.1", | ||
303 | &dibusb_device_classes[DIBUSB1_1], | ||
304 | { &dib_table[0], NULL }, | ||
305 | { &dib_table[1], NULL }, | ||
306 | }, | ||
307 | { "Compro Videomate DVB-U2000 - DVB-T USB1.1 (please confirm to linux-dvb)", | ||
308 | &dibusb_device_classes[DIBUSB1_1], | ||
309 | { &dib_table[4], &dib_table[6], NULL}, | ||
310 | { &dib_table[5], NULL }, | ||
311 | }, | ||
312 | { "Unkown USB1.1 DVB-T device ???? please report the name to the author", | ||
313 | &dibusb_device_classes[DIBUSB1_1], | ||
314 | { &dib_table[17], NULL }, | ||
315 | { &dib_table[18], NULL }, | ||
316 | }, | ||
317 | { "DiBcom USB2.0 DVB-T reference design (MOD3000P)", | ||
318 | &dibusb_device_classes[DIBUSB2_0], | ||
319 | { &dib_table[9], NULL }, | ||
320 | { &dib_table[10], NULL }, | ||
321 | }, | ||
322 | { "Artec T1 USB2.0 TVBOX (please report the warm ID)", | ||
323 | &dibusb_device_classes[DIBUSB2_0], | ||
324 | { &dib_table[27], NULL }, | ||
325 | { NULL }, | ||
326 | }, | ||
327 | { "Hauppauge WinTV NOVA-T USB2", | ||
328 | &dibusb_device_classes[NOVAT_USB2], | ||
329 | { &dib_table[30], NULL }, | ||
330 | { &dib_table[31], NULL }, | ||
331 | }, | ||
332 | { "DTT200U (Yakumo/Hama/Typhoon) DVB-T USB2.0", | ||
333 | &dibusb_device_classes[DTT200U], | ||
334 | { &dib_table[2], NULL }, | ||
335 | { &dib_table[3], NULL }, | ||
336 | }, | ||
337 | { "Hanftek UMT-010 DVB-T USB2.0", | ||
338 | &dibusb_device_classes[UMT2_0], | ||
339 | { &dib_table[28], NULL }, | ||
340 | { &dib_table[29], NULL }, | ||
341 | }, | ||
342 | { "KWorld/ADSTech Instant DVB-T USB 2.0", | ||
343 | &dibusb_device_classes[DIBUSB2_0B], | ||
344 | { &dib_table[32], NULL }, | ||
345 | { &dib_table[33], NULL }, /* device ID with default DIBUSB2_0-firmware */ | ||
346 | }, | ||
347 | #ifdef CONFIG_DVB_DIBUSB_MISDESIGNED_DEVICES | ||
348 | { "Artec T1 USB1.1 TVBOX with AN2235 (misdesigned)", | ||
349 | &dibusb_device_classes[DIBUSB1_1_AN2235], | ||
350 | { &dib_table[34], NULL }, | ||
351 | { NULL }, | ||
352 | }, | ||
353 | { "Artec T1 USB2.0 TVBOX with FX2 IDs (misdesigned, please report the warm ID)", | ||
354 | &dibusb_device_classes[DTT200U], | ||
355 | { &dib_table[35], NULL }, | ||
356 | { &dib_table[36], NULL }, /* undefined, it could be that the device will get another USB ID in warm state */ | ||
357 | }, | ||
358 | { "DiBcom USB1.1 DVB-T reference design (MOD3000) with AN2135 default IDs", | ||
359 | &dibusb_device_classes[DIBUSB1_1], | ||
360 | { &dib_table[37], NULL }, | ||
361 | { NULL }, | ||
362 | }, | ||
363 | #endif | ||
364 | }; | ||
365 | |||
366 | static int dibusb_exit(struct usb_dibusb *dib) | ||
367 | { | ||
368 | deb_info("init_state before exiting everything: %x\n",dib->init_state); | ||
369 | dibusb_remote_exit(dib); | ||
370 | dibusb_fe_exit(dib); | ||
371 | dibusb_i2c_exit(dib); | ||
372 | dibusb_dvb_exit(dib); | ||
373 | dibusb_urb_exit(dib); | ||
374 | deb_info("init_state should be zero now: %x\n",dib->init_state); | ||
375 | dib->init_state = DIBUSB_STATE_INIT; | ||
376 | kfree(dib); | ||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | static int dibusb_init(struct usb_dibusb *dib) | ||
381 | { | ||
382 | int ret = 0; | ||
383 | sema_init(&dib->usb_sem, 1); | ||
384 | sema_init(&dib->i2c_sem, 1); | ||
385 | |||
386 | dib->init_state = DIBUSB_STATE_INIT; | ||
387 | |||
388 | if ((ret = dibusb_urb_init(dib)) || | ||
389 | (ret = dibusb_dvb_init(dib)) || | ||
390 | (ret = dibusb_i2c_init(dib))) { | ||
391 | dibusb_exit(dib); | ||
392 | return ret; | ||
393 | } | ||
394 | |||
395 | if ((ret = dibusb_fe_init(dib))) | ||
396 | err("could not initialize a frontend."); | ||
397 | |||
398 | if ((ret = dibusb_remote_init(dib))) | ||
399 | err("could not initialize remote control."); | ||
400 | |||
401 | return 0; | ||
402 | } | ||
403 | |||
404 | static struct dibusb_usb_device * dibusb_device_class_quirk(struct usb_device *udev, struct dibusb_usb_device *dev) | ||
405 | { | ||
406 | int i; | ||
407 | |||
408 | /* Quirk for the Kworld/ADSTech Instant USB2.0 device. It has the same USB | ||
409 | * IDs like the USB1.1 KWorld after loading the firmware. Which is a bad | ||
410 | * idea and make this quirk necessary. | ||
411 | */ | ||
412 | if (dev->dev_cl->id == DIBUSB1_1 && udev->speed == USB_SPEED_HIGH) { | ||
413 | info("this seems to be the Kworld/ADSTech Instant USB2.0 device or equal."); | ||
414 | for (i = 0; i < sizeof(dibusb_devices)/sizeof(struct dibusb_usb_device); i++) { | ||
415 | if (dibusb_devices[i].dev_cl->id == DIBUSB2_0B) { | ||
416 | dev = &dibusb_devices[i]; | ||
417 | break; | ||
418 | } | ||
419 | } | ||
420 | } | ||
421 | |||
422 | return dev; | ||
423 | } | ||
424 | |||
425 | static struct dibusb_usb_device * dibusb_find_device (struct usb_device *udev,int *cold) | ||
426 | { | ||
427 | int i,j; | ||
428 | struct dibusb_usb_device *dev = NULL; | ||
429 | *cold = -1; | ||
430 | |||
431 | for (i = 0; i < sizeof(dibusb_devices)/sizeof(struct dibusb_usb_device); i++) { | ||
432 | for (j = 0; j < DIBUSB_ID_MAX_NUM && dibusb_devices[i].cold_ids[j] != NULL; j++) { | ||
433 | deb_info("check for cold %x %x\n",dibusb_devices[i].cold_ids[j]->idVendor, dibusb_devices[i].cold_ids[j]->idProduct); | ||
434 | if (dibusb_devices[i].cold_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) && | ||
435 | dibusb_devices[i].cold_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) { | ||
436 | *cold = 1; | ||
437 | dev = &dibusb_devices[i]; | ||
438 | break; | ||
439 | } | ||
440 | } | ||
441 | |||
442 | if (dev != NULL) | ||
443 | break; | ||
444 | |||
445 | for (j = 0; j < DIBUSB_ID_MAX_NUM && dibusb_devices[i].warm_ids[j] != NULL; j++) { | ||
446 | deb_info("check for warm %x %x\n",dibusb_devices[i].warm_ids[j]->idVendor, dibusb_devices[i].warm_ids[j]->idProduct); | ||
447 | if (dibusb_devices[i].warm_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) && | ||
448 | dibusb_devices[i].warm_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) { | ||
449 | *cold = 0; | ||
450 | dev = &dibusb_devices[i]; | ||
451 | break; | ||
452 | } | ||
453 | } | ||
454 | } | ||
455 | |||
456 | if (dev != NULL) | ||
457 | dev = dibusb_device_class_quirk(udev,dev); | ||
458 | |||
459 | return dev; | ||
460 | } | ||
461 | |||
462 | /* | ||
463 | * USB | ||
464 | */ | ||
465 | static int dibusb_probe(struct usb_interface *intf, | ||
466 | const struct usb_device_id *id) | ||
467 | { | ||
468 | struct usb_device *udev = interface_to_usbdev(intf); | ||
469 | struct usb_dibusb *dib = NULL; | ||
470 | struct dibusb_usb_device *dibdev = NULL; | ||
471 | |||
472 | int ret = -ENOMEM,cold=0; | ||
473 | |||
474 | if ((dibdev = dibusb_find_device(udev,&cold)) == NULL) { | ||
475 | err("something went very wrong, " | ||
476 | "unknown product ID: %.4x",le16_to_cpu(udev->descriptor.idProduct)); | ||
477 | return -ENODEV; | ||
478 | } | ||
479 | |||
480 | if (cold == 1) { | ||
481 | info("found a '%s' in cold state, will try to load a firmware",dibdev->name); | ||
482 | ret = dibusb_loadfirmware(udev,dibdev); | ||
483 | } else { | ||
484 | info("found a '%s' in warm state.",dibdev->name); | ||
485 | dib = kmalloc(sizeof(struct usb_dibusb),GFP_KERNEL); | ||
486 | if (dib == NULL) { | ||
487 | err("no memory"); | ||
488 | return ret; | ||
489 | } | ||
490 | memset(dib,0,sizeof(struct usb_dibusb)); | ||
491 | |||
492 | dib->udev = udev; | ||
493 | dib->dibdev = dibdev; | ||
494 | |||
495 | /* store parameters to structures */ | ||
496 | dib->rc_query_interval = rc_query_interval; | ||
497 | dib->pid_parse = pid_parse; | ||
498 | dib->rc_key_repeat_count = rc_key_repeat_count; | ||
499 | |||
500 | usb_set_intfdata(intf, dib); | ||
501 | |||
502 | ret = dibusb_init(dib); | ||
503 | } | ||
504 | |||
505 | if (ret == 0) | ||
506 | info("%s successfully initialized and connected.",dibdev->name); | ||
507 | else | ||
508 | info("%s error while loading driver (%d)",dibdev->name,ret); | ||
509 | return ret; | ||
510 | } | ||
511 | |||
512 | static void dibusb_disconnect(struct usb_interface *intf) | ||
513 | { | ||
514 | struct usb_dibusb *dib = usb_get_intfdata(intf); | ||
515 | const char *name = DRIVER_DESC; | ||
516 | |||
517 | usb_set_intfdata(intf,NULL); | ||
518 | if (dib != NULL && dib->dibdev != NULL) { | ||
519 | name = dib->dibdev->name; | ||
520 | dibusb_exit(dib); | ||
521 | } | ||
522 | info("%s successfully deinitialized and disconnected.",name); | ||
523 | |||
524 | } | ||
525 | |||
526 | /* usb specific object needed to register this driver with the usb subsystem */ | ||
527 | static struct usb_driver dibusb_driver = { | ||
528 | .owner = THIS_MODULE, | ||
529 | .name = DRIVER_DESC, | ||
530 | .probe = dibusb_probe, | ||
531 | .disconnect = dibusb_disconnect, | ||
532 | .id_table = dib_table, | ||
533 | }; | ||
534 | |||
535 | /* module stuff */ | ||
536 | static int __init usb_dibusb_init(void) | ||
537 | { | ||
538 | int result; | ||
539 | if ((result = usb_register(&dibusb_driver))) { | ||
540 | err("usb_register failed. Error number %d",result); | ||
541 | return result; | ||
542 | } | ||
543 | |||
544 | return 0; | ||
545 | } | ||
546 | |||
547 | static void __exit usb_dibusb_exit(void) | ||
548 | { | ||
549 | /* deregister this driver from the USB subsystem */ | ||
550 | usb_deregister(&dibusb_driver); | ||
551 | } | ||
552 | |||
553 | module_init (usb_dibusb_init); | ||
554 | module_exit (usb_dibusb_exit); | ||
555 | |||
556 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
557 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
558 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-dvb.c b/drivers/media/dvb/dibusb/dvb-dibusb-dvb.c deleted file mode 100644 index 400b439e804e..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-dvb.c +++ /dev/null | |||
@@ -1,185 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb-dvb.c is part of the driver for mobile USB Budget DVB-T devices | ||
3 | * based on reference design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
6 | * | ||
7 | * see dvb-dibusb-core.c for more copyright details. | ||
8 | * | ||
9 | * This file contains functions for initializing and handling the | ||
10 | * linux-dvb API. | ||
11 | */ | ||
12 | #include "dvb-dibusb.h" | ||
13 | |||
14 | #include <linux/usb.h> | ||
15 | #include <linux/version.h> | ||
16 | |||
17 | static u32 urb_compl_count; | ||
18 | |||
19 | /* | ||
20 | * MPEG2 TS DVB stuff | ||
21 | */ | ||
22 | void dibusb_urb_complete(struct urb *urb, struct pt_regs *ptregs) | ||
23 | { | ||
24 | struct usb_dibusb *dib = urb->context; | ||
25 | |||
26 | deb_ts("urb complete feedcount: %d, status: %d, length: %d\n",dib->feedcount,urb->status, | ||
27 | urb->actual_length); | ||
28 | |||
29 | urb_compl_count++; | ||
30 | if (urb_compl_count % 1000 == 0) | ||
31 | deb_info("%d urbs completed so far.\n",urb_compl_count); | ||
32 | |||
33 | switch (urb->status) { | ||
34 | case 0: /* success */ | ||
35 | case -ETIMEDOUT: /* NAK */ | ||
36 | break; | ||
37 | case -ECONNRESET: /* kill */ | ||
38 | case -ENOENT: | ||
39 | case -ESHUTDOWN: | ||
40 | return; | ||
41 | default: /* error */ | ||
42 | deb_ts("urb completition error %d.", urb->status); | ||
43 | break; | ||
44 | } | ||
45 | |||
46 | if (dib->feedcount > 0 && urb->actual_length > 0) { | ||
47 | if (dib->init_state & DIBUSB_STATE_DVB) | ||
48 | dvb_dmx_swfilter(&dib->demux, (u8*) urb->transfer_buffer,urb->actual_length); | ||
49 | } else | ||
50 | deb_ts("URB dropped because of feedcount.\n"); | ||
51 | |||
52 | usb_submit_urb(urb,GFP_ATOMIC); | ||
53 | } | ||
54 | |||
55 | static int dibusb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff) | ||
56 | { | ||
57 | struct usb_dibusb *dib = dvbdmxfeed->demux->priv; | ||
58 | int newfeedcount; | ||
59 | |||
60 | if (dib == NULL) | ||
61 | return -ENODEV; | ||
62 | |||
63 | newfeedcount = dib->feedcount + (onoff ? 1 : -1); | ||
64 | |||
65 | /* | ||
66 | * stop feed before setting a new pid if there will be no pid anymore | ||
67 | */ | ||
68 | if (newfeedcount == 0) { | ||
69 | deb_ts("stop feeding\n"); | ||
70 | if (dib->xfer_ops.fifo_ctrl != NULL) { | ||
71 | if (dib->xfer_ops.fifo_ctrl(dib->fe,0)) { | ||
72 | err("error while inhibiting fifo."); | ||
73 | return -ENODEV; | ||
74 | } | ||
75 | } | ||
76 | dibusb_streaming(dib,0); | ||
77 | } | ||
78 | |||
79 | dib->feedcount = newfeedcount; | ||
80 | |||
81 | /* activate the pid on the device specific pid_filter */ | ||
82 | deb_ts("setting pid: %5d %04x at index %d '%s'\n",dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ? "on" : "off"); | ||
83 | if (dib->pid_parse && dib->xfer_ops.pid_ctrl != NULL) | ||
84 | dib->xfer_ops.pid_ctrl(dib->fe,dvbdmxfeed->index,dvbdmxfeed->pid,onoff); | ||
85 | |||
86 | /* | ||
87 | * start the feed if this was the first pid to set and there is still a pid | ||
88 | * for reception. | ||
89 | */ | ||
90 | if (dib->feedcount == onoff && dib->feedcount > 0) { | ||
91 | |||
92 | deb_ts("controlling pid parser\n"); | ||
93 | if (dib->xfer_ops.pid_parse != NULL) { | ||
94 | if (dib->xfer_ops.pid_parse(dib->fe,dib->pid_parse) < 0) { | ||
95 | err("could not handle pid_parser"); | ||
96 | } | ||
97 | } | ||
98 | |||
99 | deb_ts("start feeding\n"); | ||
100 | if (dib->xfer_ops.fifo_ctrl != NULL) { | ||
101 | if (dib->xfer_ops.fifo_ctrl(dib->fe,1)) { | ||
102 | err("error while enabling fifo."); | ||
103 | return -ENODEV; | ||
104 | } | ||
105 | } | ||
106 | dibusb_streaming(dib,1); | ||
107 | } | ||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static int dibusb_start_feed(struct dvb_demux_feed *dvbdmxfeed) | ||
112 | { | ||
113 | deb_ts("start pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid,dvbdmxfeed->type); | ||
114 | return dibusb_ctrl_feed(dvbdmxfeed,1); | ||
115 | } | ||
116 | |||
117 | static int dibusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed) | ||
118 | { | ||
119 | deb_ts("stop pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid, dvbdmxfeed->type); | ||
120 | return dibusb_ctrl_feed(dvbdmxfeed,0); | ||
121 | } | ||
122 | |||
123 | int dibusb_dvb_init(struct usb_dibusb *dib) | ||
124 | { | ||
125 | int ret; | ||
126 | |||
127 | urb_compl_count = 0; | ||
128 | |||
129 | if ((ret = dvb_register_adapter(&dib->adapter, DRIVER_DESC, | ||
130 | THIS_MODULE)) < 0) { | ||
131 | deb_info("dvb_register_adapter failed: error %d", ret); | ||
132 | goto err; | ||
133 | } | ||
134 | dib->adapter.priv = dib; | ||
135 | |||
136 | /* i2c is done in dibusb_i2c_init */ | ||
137 | |||
138 | dib->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; | ||
139 | |||
140 | dib->demux.priv = (void *)dib; | ||
141 | /* get pidcount from demod */ | ||
142 | dib->demux.feednum = dib->demux.filternum = 255; | ||
143 | dib->demux.start_feed = dibusb_start_feed; | ||
144 | dib->demux.stop_feed = dibusb_stop_feed; | ||
145 | dib->demux.write_to_decoder = NULL; | ||
146 | if ((ret = dvb_dmx_init(&dib->demux)) < 0) { | ||
147 | err("dvb_dmx_init failed: error %d",ret); | ||
148 | goto err_dmx; | ||
149 | } | ||
150 | |||
151 | dib->dmxdev.filternum = dib->demux.filternum; | ||
152 | dib->dmxdev.demux = &dib->demux.dmx; | ||
153 | dib->dmxdev.capabilities = 0; | ||
154 | if ((ret = dvb_dmxdev_init(&dib->dmxdev, &dib->adapter)) < 0) { | ||
155 | err("dvb_dmxdev_init failed: error %d",ret); | ||
156 | goto err_dmx_dev; | ||
157 | } | ||
158 | |||
159 | dvb_net_init(&dib->adapter, &dib->dvb_net, &dib->demux.dmx); | ||
160 | |||
161 | goto success; | ||
162 | err_dmx_dev: | ||
163 | dvb_dmx_release(&dib->demux); | ||
164 | err_dmx: | ||
165 | dvb_unregister_adapter(&dib->adapter); | ||
166 | err: | ||
167 | return ret; | ||
168 | success: | ||
169 | dib->init_state |= DIBUSB_STATE_DVB; | ||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | int dibusb_dvb_exit(struct usb_dibusb *dib) | ||
174 | { | ||
175 | if (dib->init_state & DIBUSB_STATE_DVB) { | ||
176 | dib->init_state &= ~DIBUSB_STATE_DVB; | ||
177 | deb_info("unregistering DVB part\n"); | ||
178 | dvb_net_release(&dib->dvb_net); | ||
179 | dib->demux.dmx.close(&dib->demux.dmx); | ||
180 | dvb_dmxdev_release(&dib->dmxdev); | ||
181 | dvb_dmx_release(&dib->demux); | ||
182 | dvb_unregister_adapter(&dib->adapter); | ||
183 | } | ||
184 | return 0; | ||
185 | } | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-fe-i2c.c b/drivers/media/dvb/dibusb/dvb-dibusb-fe-i2c.c deleted file mode 100644 index 5a71b88797d9..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-fe-i2c.c +++ /dev/null | |||
@@ -1,582 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb-fe-i2c.c is part of the driver for mobile USB Budget DVB-T devices | ||
3 | * based on reference design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
6 | * | ||
7 | * see dvb-dibusb-core.c for more copyright details. | ||
8 | * | ||
9 | * This file contains functions for attaching, initializing of an appropriate | ||
10 | * demodulator/frontend. I2C-stuff is also located here. | ||
11 | * | ||
12 | */ | ||
13 | #include "dvb-dibusb.h" | ||
14 | |||
15 | #include <linux/usb.h> | ||
16 | |||
17 | static int dibusb_i2c_msg(struct usb_dibusb *dib, u8 addr, | ||
18 | u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen) | ||
19 | { | ||
20 | u8 sndbuf[wlen+4]; /* lead(1) devaddr,direction(1) addr(2) data(wlen) (len(2) (when reading)) */ | ||
21 | /* write only ? */ | ||
22 | int wo = (rbuf == NULL || rlen == 0), | ||
23 | len = 2 + wlen + (wo ? 0 : 2); | ||
24 | |||
25 | sndbuf[0] = wo ? DIBUSB_REQ_I2C_WRITE : DIBUSB_REQ_I2C_READ; | ||
26 | sndbuf[1] = (addr << 1) | (wo ? 0 : 1); | ||
27 | |||
28 | memcpy(&sndbuf[2],wbuf,wlen); | ||
29 | |||
30 | if (!wo) { | ||
31 | sndbuf[wlen+2] = (rlen >> 8) & 0xff; | ||
32 | sndbuf[wlen+3] = rlen & 0xff; | ||
33 | } | ||
34 | |||
35 | return dibusb_readwrite_usb(dib,sndbuf,len,rbuf,rlen); | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * I2C master xfer function | ||
40 | */ | ||
41 | static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msg,int num) | ||
42 | { | ||
43 | struct usb_dibusb *dib = i2c_get_adapdata(adap); | ||
44 | int i; | ||
45 | |||
46 | if (down_interruptible(&dib->i2c_sem) < 0) | ||
47 | return -EAGAIN; | ||
48 | |||
49 | if (num > 2) | ||
50 | warn("more than 2 i2c messages at a time is not handled yet. TODO."); | ||
51 | |||
52 | for (i = 0; i < num; i++) { | ||
53 | /* write/read request */ | ||
54 | if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) { | ||
55 | if (dibusb_i2c_msg(dib, msg[i].addr, msg[i].buf,msg[i].len, | ||
56 | msg[i+1].buf,msg[i+1].len) < 0) | ||
57 | break; | ||
58 | i++; | ||
59 | } else | ||
60 | if (dibusb_i2c_msg(dib, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) | ||
61 | break; | ||
62 | } | ||
63 | |||
64 | up(&dib->i2c_sem); | ||
65 | return i; | ||
66 | } | ||
67 | |||
68 | static u32 dibusb_i2c_func(struct i2c_adapter *adapter) | ||
69 | { | ||
70 | return I2C_FUNC_I2C; | ||
71 | } | ||
72 | |||
73 | static struct i2c_algorithm dibusb_algo = { | ||
74 | .name = "DiBcom USB i2c algorithm", | ||
75 | .id = I2C_ALGO_BIT, | ||
76 | .master_xfer = dibusb_i2c_xfer, | ||
77 | .functionality = dibusb_i2c_func, | ||
78 | }; | ||
79 | |||
80 | static int dibusb_general_demod_init(struct dvb_frontend *fe); | ||
81 | static u8 dibusb_general_pll_addr(struct dvb_frontend *fe); | ||
82 | static int dibusb_general_pll_init(struct dvb_frontend *fe, u8 pll_buf[5]); | ||
83 | static int dibusb_general_pll_set(struct dvb_frontend *fe, | ||
84 | struct dvb_frontend_parameters* params, u8 pll_buf[5]); | ||
85 | |||
86 | static struct mt352_config mt352_hanftek_umt_010_config = { | ||
87 | .demod_address = 0x1e, | ||
88 | .demod_init = dibusb_general_demod_init, | ||
89 | .pll_set = dibusb_general_pll_set, | ||
90 | }; | ||
91 | |||
92 | static int dibusb_tuner_quirk(struct usb_dibusb *dib) | ||
93 | { | ||
94 | switch (dib->dibdev->dev_cl->id) { | ||
95 | case DIBUSB1_1: /* some these device have the ENV77H11D5 and some the THOMSON CABLE */ | ||
96 | case DIBUSB1_1_AN2235: { /* actually its this device, but in warm state they are indistinguishable */ | ||
97 | struct dibusb_tuner *t; | ||
98 | u8 b[2] = { 0,0 } ,b2[1]; | ||
99 | struct i2c_msg msg[2] = { | ||
100 | { .flags = 0, .buf = b, .len = 2 }, | ||
101 | { .flags = I2C_M_RD, .buf = b2, .len = 1}, | ||
102 | }; | ||
103 | |||
104 | t = &dibusb_tuner[DIBUSB_TUNER_COFDM_PANASONIC_ENV77H11D5]; | ||
105 | |||
106 | msg[0].addr = msg[1].addr = t->pll_addr; | ||
107 | |||
108 | if (dib->xfer_ops.tuner_pass_ctrl != NULL) | ||
109 | dib->xfer_ops.tuner_pass_ctrl(dib->fe,1,t->pll_addr); | ||
110 | dibusb_i2c_xfer(&dib->i2c_adap,msg,2); | ||
111 | if (dib->xfer_ops.tuner_pass_ctrl != NULL) | ||
112 | dib->xfer_ops.tuner_pass_ctrl(dib->fe,0,t->pll_addr); | ||
113 | |||
114 | if (b2[0] == 0xfe) | ||
115 | info("this device has the Thomson Cable onboard. Which is default."); | ||
116 | else { | ||
117 | dib->tuner = t; | ||
118 | info("this device has the Panasonic ENV77H11D5 onboard."); | ||
119 | } | ||
120 | break; | ||
121 | } | ||
122 | default: | ||
123 | break; | ||
124 | } | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | int dibusb_fe_init(struct usb_dibusb* dib) | ||
129 | { | ||
130 | struct dib3000_config demod_cfg; | ||
131 | int i; | ||
132 | |||
133 | if (dib->init_state & DIBUSB_STATE_I2C) { | ||
134 | for (i = 0; i < sizeof(dib->dibdev->dev_cl->demod->i2c_addrs) / sizeof(unsigned char) && | ||
135 | dib->dibdev->dev_cl->demod->i2c_addrs[i] != 0; i++) { | ||
136 | |||
137 | demod_cfg.demod_address = dib->dibdev->dev_cl->demod->i2c_addrs[i]; | ||
138 | demod_cfg.pll_addr = dibusb_general_pll_addr; | ||
139 | demod_cfg.pll_set = dibusb_general_pll_set; | ||
140 | demod_cfg.pll_init = dibusb_general_pll_init; | ||
141 | |||
142 | deb_info("demod id: %d %d\n",dib->dibdev->dev_cl->demod->id,DTT200U_FE); | ||
143 | |||
144 | switch (dib->dibdev->dev_cl->demod->id) { | ||
145 | case DIBUSB_DIB3000MB: | ||
146 | dib->fe = dib3000mb_attach(&demod_cfg,&dib->i2c_adap,&dib->xfer_ops); | ||
147 | break; | ||
148 | case DIBUSB_DIB3000MC: | ||
149 | dib->fe = dib3000mc_attach(&demod_cfg,&dib->i2c_adap,&dib->xfer_ops); | ||
150 | break; | ||
151 | case DIBUSB_MT352: | ||
152 | mt352_hanftek_umt_010_config.demod_address = dib->dibdev->dev_cl->demod->i2c_addrs[i]; | ||
153 | dib->fe = mt352_attach(&mt352_hanftek_umt_010_config, &dib->i2c_adap); | ||
154 | break; | ||
155 | case DTT200U_FE: | ||
156 | dib->fe = dtt200u_fe_attach(dib,&dib->xfer_ops); | ||
157 | break; | ||
158 | } | ||
159 | if (dib->fe != NULL) { | ||
160 | info("found demodulator at i2c address 0x%x",dib->dibdev->dev_cl->demod->i2c_addrs[i]); | ||
161 | break; | ||
162 | } | ||
163 | } | ||
164 | /* if a frontend was found */ | ||
165 | if (dib->fe != NULL) { | ||
166 | if (dib->fe->ops->sleep != NULL) | ||
167 | dib->fe_sleep = dib->fe->ops->sleep; | ||
168 | dib->fe->ops->sleep = dibusb_hw_sleep; | ||
169 | |||
170 | if (dib->fe->ops->init != NULL ) | ||
171 | dib->fe_init = dib->fe->ops->init; | ||
172 | dib->fe->ops->init = dibusb_hw_wakeup; | ||
173 | |||
174 | /* setting the default tuner */ | ||
175 | dib->tuner = dib->dibdev->dev_cl->tuner; | ||
176 | |||
177 | /* check which tuner is mounted on this device, in case this is unsure */ | ||
178 | dibusb_tuner_quirk(dib); | ||
179 | } | ||
180 | } | ||
181 | if (dib->fe == NULL) { | ||
182 | err("A frontend driver was not found for device '%s'.", | ||
183 | dib->dibdev->name); | ||
184 | return -ENODEV; | ||
185 | } else { | ||
186 | if (dvb_register_frontend(&dib->adapter, dib->fe)) { | ||
187 | err("Frontend registration failed."); | ||
188 | if (dib->fe->ops->release) | ||
189 | dib->fe->ops->release(dib->fe); | ||
190 | dib->fe = NULL; | ||
191 | return -ENODEV; | ||
192 | } | ||
193 | } | ||
194 | |||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | int dibusb_fe_exit(struct usb_dibusb *dib) | ||
199 | { | ||
200 | if (dib->fe != NULL) | ||
201 | dvb_unregister_frontend(dib->fe); | ||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | int dibusb_i2c_init(struct usb_dibusb *dib) | ||
206 | { | ||
207 | int ret = 0; | ||
208 | |||
209 | dib->adapter.priv = dib; | ||
210 | |||
211 | strncpy(dib->i2c_adap.name,dib->dibdev->name,I2C_NAME_SIZE); | ||
212 | #ifdef I2C_ADAP_CLASS_TV_DIGITAL | ||
213 | dib->i2c_adap.class = I2C_ADAP_CLASS_TV_DIGITAL, | ||
214 | #else | ||
215 | dib->i2c_adap.class = I2C_CLASS_TV_DIGITAL, | ||
216 | #endif | ||
217 | dib->i2c_adap.algo = &dibusb_algo; | ||
218 | dib->i2c_adap.algo_data = NULL; | ||
219 | dib->i2c_adap.id = I2C_ALGO_BIT; | ||
220 | |||
221 | i2c_set_adapdata(&dib->i2c_adap, dib); | ||
222 | |||
223 | if ((ret = i2c_add_adapter(&dib->i2c_adap)) < 0) | ||
224 | err("could not add i2c adapter"); | ||
225 | |||
226 | dib->init_state |= DIBUSB_STATE_I2C; | ||
227 | |||
228 | return ret; | ||
229 | } | ||
230 | |||
231 | int dibusb_i2c_exit(struct usb_dibusb *dib) | ||
232 | { | ||
233 | if (dib->init_state & DIBUSB_STATE_I2C) | ||
234 | i2c_del_adapter(&dib->i2c_adap); | ||
235 | dib->init_state &= ~DIBUSB_STATE_I2C; | ||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | |||
240 | /* pll stuff, maybe removed soon (thx to Gerd/Andrew in advance) */ | ||
241 | static int thomson_cable_eu_pll_set(struct dvb_frontend_parameters *fep, u8 pllbuf[4]) | ||
242 | { | ||
243 | u32 tfreq = (fep->frequency + 36125000) / 62500; | ||
244 | int vu,p0,p1,p2; | ||
245 | |||
246 | if (fep->frequency > 403250000) | ||
247 | vu = 1, p2 = 1, p1 = 0, p0 = 1; | ||
248 | else if (fep->frequency > 115750000) | ||
249 | vu = 0, p2 = 1, p1 = 1, p0 = 0; | ||
250 | else if (fep->frequency > 44250000) | ||
251 | vu = 0, p2 = 0, p1 = 1, p0 = 1; | ||
252 | else | ||
253 | return -EINVAL; | ||
254 | |||
255 | pllbuf[0] = (tfreq >> 8) & 0x7f; | ||
256 | pllbuf[1] = tfreq & 0xff; | ||
257 | pllbuf[2] = 0x8e; | ||
258 | pllbuf[3] = (vu << 7) | (p2 << 2) | (p1 << 1) | p0; | ||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static int panasonic_cofdm_env57h1xd5_pll_set(struct dvb_frontend_parameters *fep, u8 pllbuf[4]) | ||
263 | { | ||
264 | u32 freq_khz = fep->frequency / 1000; | ||
265 | u32 tfreq = ((freq_khz + 36125)*6 + 500) / 1000; | ||
266 | u8 TA, T210, R210, ctrl1, cp210, p4321; | ||
267 | if (freq_khz > 858000) { | ||
268 | err("frequency cannot be larger than 858 MHz."); | ||
269 | return -EINVAL; | ||
270 | } | ||
271 | |||
272 | // contol data 1 : 1 | T/A=1 | T2,T1,T0 = 0,0,0 | R2,R1,R0 = 0,1,0 | ||
273 | TA = 1; | ||
274 | T210 = 0; | ||
275 | R210 = 0x2; | ||
276 | ctrl1 = (1 << 7) | (TA << 6) | (T210 << 3) | R210; | ||
277 | |||
278 | // ******** CHARGE PUMP CONFIG vs RF FREQUENCIES ***************** | ||
279 | if (freq_khz < 470000) | ||
280 | cp210 = 2; // VHF Low and High band ch E12 to E4 to E12 | ||
281 | else if (freq_khz < 526000) | ||
282 | cp210 = 4; // UHF band Ch E21 to E27 | ||
283 | else // if (freq < 862000000) | ||
284 | cp210 = 5; // UHF band ch E28 to E69 | ||
285 | |||
286 | //********************* BW select ******************************* | ||
287 | if (freq_khz < 153000) | ||
288 | p4321 = 1; // BW selected for VHF low | ||
289 | else if (freq_khz < 470000) | ||
290 | p4321 = 2; // BW selected for VHF high E5 to E12 | ||
291 | else // if (freq < 862000000) | ||
292 | p4321 = 4; // BW selection for UHF E21 to E69 | ||
293 | |||
294 | pllbuf[0] = (tfreq >> 8) & 0xff; | ||
295 | pllbuf[1] = (tfreq >> 0) & 0xff; | ||
296 | pllbuf[2] = 0xff & ctrl1; | ||
297 | pllbuf[3] = (cp210 << 5) | (p4321); | ||
298 | |||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | /* | ||
303 | * 7 6 5 4 3 2 1 0 | ||
304 | * Address Byte 1 1 0 0 0 MA1 MA0 R/~W=0 | ||
305 | * | ||
306 | * Program divider byte 1 0 n14 n13 n12 n11 n10 n9 n8 | ||
307 | * Program divider byte 2 n7 n6 n5 n4 n3 n2 n1 n0 | ||
308 | * | ||
309 | * Control byte 1 1 T/A=1 T2 T1 T0 R2 R1 R0 | ||
310 | * 1 T/A=0 0 0 ATC AL2 AL1 AL0 | ||
311 | * | ||
312 | * Control byte 2 CP2 CP1 CP0 BS5 BS4 BS3 BS2 BS1 | ||
313 | * | ||
314 | * MA0/1 = programmable address bits | ||
315 | * R/~W = read/write bit (0 for writing) | ||
316 | * N14-0 = programmable LO frequency | ||
317 | * | ||
318 | * T/A = test AGC bit (0 = next 6 bits AGC setting, | ||
319 | * 1 = next 6 bits test and reference divider ratio settings) | ||
320 | * T2-0 = test bits | ||
321 | * R2-0 = reference divider ratio and programmable frequency step | ||
322 | * ATC = AGC current setting and time constant | ||
323 | * ATC = 0: AGC current = 220nA, AGC time constant = 2s | ||
324 | * ATC = 1: AGC current = 9uA, AGC time constant = 50ms | ||
325 | * AL2-0 = AGC take-over point bits | ||
326 | * CP2-0 = charge pump current | ||
327 | * BS5-1 = PMOS ports control bits; | ||
328 | * BSn = 0 corresponding port is off, high-impedance state (at power-on) | ||
329 | * BSn = 1 corresponding port is on | ||
330 | */ | ||
331 | static int panasonic_cofdm_env77h11d5_tda6650_init(struct dvb_frontend *fe, u8 pllbuf[4]) | ||
332 | { | ||
333 | pllbuf[0] = 0x0b; | ||
334 | pllbuf[1] = 0xf5; | ||
335 | pllbuf[2] = 0x85; | ||
336 | pllbuf[3] = 0xab; | ||
337 | return 0; | ||
338 | } | ||
339 | |||
340 | static int panasonic_cofdm_env77h11d5_tda6650_set (struct dvb_frontend_parameters *fep,u8 pllbuf[4]) | ||
341 | { | ||
342 | int tuner_frequency = 0; | ||
343 | u8 band, cp, filter; | ||
344 | |||
345 | // determine charge pump | ||
346 | tuner_frequency = fep->frequency + 36166000; | ||
347 | if (tuner_frequency < 87000000) | ||
348 | return -EINVAL; | ||
349 | else if (tuner_frequency < 130000000) | ||
350 | cp = 3; | ||
351 | else if (tuner_frequency < 160000000) | ||
352 | cp = 5; | ||
353 | else if (tuner_frequency < 200000000) | ||
354 | cp = 6; | ||
355 | else if (tuner_frequency < 290000000) | ||
356 | cp = 3; | ||
357 | else if (tuner_frequency < 420000000) | ||
358 | cp = 5; | ||
359 | else if (tuner_frequency < 480000000) | ||
360 | cp = 6; | ||
361 | else if (tuner_frequency < 620000000) | ||
362 | cp = 3; | ||
363 | else if (tuner_frequency < 830000000) | ||
364 | cp = 5; | ||
365 | else if (tuner_frequency < 895000000) | ||
366 | cp = 7; | ||
367 | else | ||
368 | return -EINVAL; | ||
369 | |||
370 | // determine band | ||
371 | if (fep->frequency < 49000000) | ||
372 | return -EINVAL; | ||
373 | else if (fep->frequency < 161000000) | ||
374 | band = 1; | ||
375 | else if (fep->frequency < 444000000) | ||
376 | band = 2; | ||
377 | else if (fep->frequency < 861000000) | ||
378 | band = 4; | ||
379 | else | ||
380 | return -EINVAL; | ||
381 | |||
382 | // setup PLL filter | ||
383 | switch (fep->u.ofdm.bandwidth) { | ||
384 | case BANDWIDTH_6_MHZ: | ||
385 | case BANDWIDTH_7_MHZ: | ||
386 | filter = 0; | ||
387 | break; | ||
388 | case BANDWIDTH_8_MHZ: | ||
389 | filter = 1; | ||
390 | break; | ||
391 | default: | ||
392 | return -EINVAL; | ||
393 | } | ||
394 | |||
395 | // calculate divisor | ||
396 | // ((36166000+((1000000/6)/2)) + Finput)/(1000000/6) | ||
397 | tuner_frequency = (((fep->frequency / 1000) * 6) + 217496) / 1000; | ||
398 | |||
399 | // setup tuner buffer | ||
400 | pllbuf[0] = (tuner_frequency >> 8) & 0x7f; | ||
401 | pllbuf[1] = tuner_frequency & 0xff; | ||
402 | pllbuf[2] = 0xca; | ||
403 | pllbuf[3] = (cp << 5) | (filter << 3) | band; | ||
404 | return 0; | ||
405 | } | ||
406 | |||
407 | /* | ||
408 | * 7 6 5 4 3 2 1 0 | ||
409 | * Address Byte 1 1 0 0 0 MA1 MA0 R/~W=0 | ||
410 | * | ||
411 | * Program divider byte 1 0 n14 n13 n12 n11 n10 n9 n8 | ||
412 | * Program divider byte 2 n7 n6 n5 n4 n3 n2 n1 n0 | ||
413 | * | ||
414 | * Control byte 1 CP T2 T1 T0 RSA RSB OS | ||
415 | * | ||
416 | * Band Switch byte X X X P4 P3 P2 P1 P0 | ||
417 | * | ||
418 | * Auxiliary byte ATC AL2 AL1 AL0 0 0 0 0 | ||
419 | * | ||
420 | * Address: MA1 MA0 Address | ||
421 | * 0 0 c0 | ||
422 | * 0 1 c2 (always valid) | ||
423 | * 1 0 c4 | ||
424 | * 1 1 c6 | ||
425 | */ | ||
426 | static int lg_tdtp_e102p_tua6034(struct dvb_frontend_parameters* fep, u8 pllbuf[4]) | ||
427 | { | ||
428 | u32 div; | ||
429 | u8 p210, p3; | ||
430 | |||
431 | #define TUNER_MUL 62500 | ||
432 | |||
433 | div = (fep->frequency + 36125000 + TUNER_MUL / 2) / TUNER_MUL; | ||
434 | // div = ((fep->frequency/1000 + 36166) * 6) / 1000; | ||
435 | |||
436 | if (fep->frequency < 174500000) | ||
437 | p210 = 1; // not supported by the tdtp_e102p | ||
438 | else if (fep->frequency < 230000000) // VHF | ||
439 | p210 = 2; | ||
440 | else | ||
441 | p210 = 4; | ||
442 | |||
443 | if (fep->u.ofdm.bandwidth == BANDWIDTH_7_MHZ) | ||
444 | p3 = 0; | ||
445 | else | ||
446 | p3 = 1; | ||
447 | |||
448 | pllbuf[0] = (div >> 8) & 0x7f; | ||
449 | pllbuf[1] = div & 0xff; | ||
450 | pllbuf[2] = 0xce; | ||
451 | // pllbuf[2] = 0xcc; | ||
452 | pllbuf[3] = (p3 << 3) | p210; | ||
453 | |||
454 | return 0; | ||
455 | } | ||
456 | |||
457 | static int lg_tdtp_e102p_mt352_demod_init(struct dvb_frontend *fe) | ||
458 | { | ||
459 | static u8 mt352_clock_config[] = { 0x89, 0xb8, 0x2d }; | ||
460 | static u8 mt352_reset[] = { 0x50, 0x80 }; | ||
461 | static u8 mt352_mclk_ratio[] = { 0x8b, 0x00 }; | ||
462 | static u8 mt352_adc_ctl_1_cfg[] = { 0x8E, 0x40 }; | ||
463 | static u8 mt352_agc_cfg[] = { 0x67, 0x10, 0xa0 }; | ||
464 | |||
465 | static u8 mt352_sec_agc_cfg1[] = { 0x6a, 0xff }; | ||
466 | static u8 mt352_sec_agc_cfg2[] = { 0x6d, 0xff }; | ||
467 | static u8 mt352_sec_agc_cfg3[] = { 0x70, 0x40 }; | ||
468 | static u8 mt352_sec_agc_cfg4[] = { 0x7b, 0x03 }; | ||
469 | static u8 mt352_sec_agc_cfg5[] = { 0x7d, 0x0f }; | ||
470 | |||
471 | static u8 mt352_acq_ctl[] = { 0x53, 0x50 }; | ||
472 | static u8 mt352_input_freq_1[] = { 0x56, 0x31, 0x06 }; | ||
473 | |||
474 | mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); | ||
475 | udelay(2000); | ||
476 | mt352_write(fe, mt352_reset, sizeof(mt352_reset)); | ||
477 | mt352_write(fe, mt352_mclk_ratio, sizeof(mt352_mclk_ratio)); | ||
478 | |||
479 | mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg)); | ||
480 | mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg)); | ||
481 | |||
482 | mt352_write(fe, mt352_sec_agc_cfg1, sizeof(mt352_sec_agc_cfg1)); | ||
483 | mt352_write(fe, mt352_sec_agc_cfg2, sizeof(mt352_sec_agc_cfg2)); | ||
484 | mt352_write(fe, mt352_sec_agc_cfg3, sizeof(mt352_sec_agc_cfg3)); | ||
485 | mt352_write(fe, mt352_sec_agc_cfg4, sizeof(mt352_sec_agc_cfg4)); | ||
486 | mt352_write(fe, mt352_sec_agc_cfg5, sizeof(mt352_sec_agc_cfg5)); | ||
487 | |||
488 | mt352_write(fe, mt352_acq_ctl, sizeof(mt352_acq_ctl)); | ||
489 | mt352_write(fe, mt352_input_freq_1, sizeof(mt352_input_freq_1)); | ||
490 | |||
491 | return 0; | ||
492 | } | ||
493 | |||
494 | static int dibusb_general_demod_init(struct dvb_frontend *fe) | ||
495 | { | ||
496 | struct usb_dibusb* dib = (struct usb_dibusb*) fe->dvb->priv; | ||
497 | switch (dib->dibdev->dev_cl->id) { | ||
498 | case UMT2_0: | ||
499 | return lg_tdtp_e102p_mt352_demod_init(fe); | ||
500 | default: /* other device classes do not have device specific demod inits */ | ||
501 | break; | ||
502 | } | ||
503 | return 0; | ||
504 | } | ||
505 | |||
506 | static u8 dibusb_general_pll_addr(struct dvb_frontend *fe) | ||
507 | { | ||
508 | struct usb_dibusb* dib = (struct usb_dibusb*) fe->dvb->priv; | ||
509 | return dib->tuner->pll_addr; | ||
510 | } | ||
511 | |||
512 | static int dibusb_pll_i2c_helper(struct usb_dibusb *dib, u8 pll_buf[5], u8 buf[4]) | ||
513 | { | ||
514 | if (pll_buf == NULL) { | ||
515 | struct i2c_msg msg = { | ||
516 | .addr = dib->tuner->pll_addr, | ||
517 | .flags = 0, | ||
518 | .buf = buf, | ||
519 | .len = sizeof(buf) | ||
520 | }; | ||
521 | if (i2c_transfer (&dib->i2c_adap, &msg, 1) != 1) | ||
522 | return -EIO; | ||
523 | msleep(1); | ||
524 | } else { | ||
525 | pll_buf[0] = dib->tuner->pll_addr << 1; | ||
526 | memcpy(&pll_buf[1],buf,4); | ||
527 | } | ||
528 | |||
529 | return 0; | ||
530 | } | ||
531 | |||
532 | static int dibusb_general_pll_init(struct dvb_frontend *fe, | ||
533 | u8 pll_buf[5]) | ||
534 | { | ||
535 | struct usb_dibusb* dib = (struct usb_dibusb*) fe->dvb->priv; | ||
536 | u8 buf[4]; | ||
537 | int ret=0; | ||
538 | switch (dib->tuner->id) { | ||
539 | case DIBUSB_TUNER_COFDM_PANASONIC_ENV77H11D5: | ||
540 | ret = panasonic_cofdm_env77h11d5_tda6650_init(fe,buf); | ||
541 | break; | ||
542 | default: | ||
543 | break; | ||
544 | } | ||
545 | |||
546 | if (ret) | ||
547 | return ret; | ||
548 | |||
549 | return dibusb_pll_i2c_helper(dib,pll_buf,buf); | ||
550 | } | ||
551 | |||
552 | static int dibusb_general_pll_set(struct dvb_frontend *fe, | ||
553 | struct dvb_frontend_parameters *fep, u8 pll_buf[5]) | ||
554 | { | ||
555 | struct usb_dibusb* dib = (struct usb_dibusb*) fe->dvb->priv; | ||
556 | u8 buf[4]; | ||
557 | int ret=0; | ||
558 | |||
559 | switch (dib->tuner->id) { | ||
560 | case DIBUSB_TUNER_CABLE_THOMSON: | ||
561 | ret = thomson_cable_eu_pll_set(fep, buf); | ||
562 | break; | ||
563 | case DIBUSB_TUNER_COFDM_PANASONIC_ENV57H1XD5: | ||
564 | ret = panasonic_cofdm_env57h1xd5_pll_set(fep, buf); | ||
565 | break; | ||
566 | case DIBUSB_TUNER_CABLE_LG_TDTP_E102P: | ||
567 | ret = lg_tdtp_e102p_tua6034(fep, buf); | ||
568 | break; | ||
569 | case DIBUSB_TUNER_COFDM_PANASONIC_ENV77H11D5: | ||
570 | ret = panasonic_cofdm_env77h11d5_tda6650_set(fep,buf); | ||
571 | break; | ||
572 | default: | ||
573 | warn("no pll programming routine found for tuner %d.\n",dib->tuner->id); | ||
574 | ret = -ENODEV; | ||
575 | break; | ||
576 | } | ||
577 | |||
578 | if (ret) | ||
579 | return ret; | ||
580 | |||
581 | return dibusb_pll_i2c_helper(dib,pll_buf,buf); | ||
582 | } | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-firmware.c b/drivers/media/dvb/dibusb/dvb-dibusb-firmware.c deleted file mode 100644 index 504ba47afdf3..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-firmware.c +++ /dev/null | |||
@@ -1,87 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb-firmware.c is part of the driver for mobile USB Budget DVB-T devices | ||
3 | * based on reference design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
6 | * | ||
7 | * see dvb-dibusb-core.c for more copyright details. | ||
8 | * | ||
9 | * This file contains functions for downloading the firmware to the device. | ||
10 | */ | ||
11 | #include "dvb-dibusb.h" | ||
12 | |||
13 | #include <linux/firmware.h> | ||
14 | #include <linux/usb.h> | ||
15 | |||
16 | /* | ||
17 | * load a firmware packet to the device | ||
18 | */ | ||
19 | static int dibusb_writemem(struct usb_device *udev,u16 addr,u8 *data, u8 len) | ||
20 | { | ||
21 | return usb_control_msg(udev, usb_sndctrlpipe(udev,0), | ||
22 | 0xa0, USB_TYPE_VENDOR, addr, 0x00, data, len, 5000); | ||
23 | } | ||
24 | |||
25 | int dibusb_loadfirmware(struct usb_device *udev, struct dibusb_usb_device *dibdev) | ||
26 | { | ||
27 | const struct firmware *fw = NULL; | ||
28 | u16 addr; | ||
29 | u8 *b,*p; | ||
30 | int ret = 0,i; | ||
31 | |||
32 | if ((ret = request_firmware(&fw, dibdev->dev_cl->firmware, &udev->dev)) != 0) { | ||
33 | err("did not find the firmware file. (%s) " | ||
34 | "Please see linux/Documentation/dvb/ for more details on firmware-problems.", | ||
35 | dibdev->dev_cl->firmware); | ||
36 | return ret; | ||
37 | } | ||
38 | |||
39 | info("downloading firmware from file '%s'.",dibdev->dev_cl->firmware); | ||
40 | |||
41 | p = kmalloc(fw->size,GFP_KERNEL); | ||
42 | if (p != NULL) { | ||
43 | u8 reset; | ||
44 | /* | ||
45 | * you cannot use the fw->data as buffer for | ||
46 | * usb_control_msg, a new buffer has to be | ||
47 | * created | ||
48 | */ | ||
49 | memcpy(p,fw->data,fw->size); | ||
50 | |||
51 | /* stop the CPU */ | ||
52 | reset = 1; | ||
53 | if ((ret = dibusb_writemem(udev,dibdev->dev_cl->usb_ctrl->cpu_cs_register,&reset,1)) != 1) | ||
54 | err("could not stop the USB controller CPU."); | ||
55 | for(i = 0; p[i+3] == 0 && i < fw->size; ) { | ||
56 | b = (u8 *) &p[i]; | ||
57 | addr = *((u16 *) &b[1]); | ||
58 | |||
59 | ret = dibusb_writemem(udev,addr,&b[4],b[0]); | ||
60 | |||
61 | if (ret != b[0]) { | ||
62 | err("error while transferring firmware " | ||
63 | "(transferred size: %d, block size: %d)", | ||
64 | ret,b[0]); | ||
65 | ret = -EINVAL; | ||
66 | break; | ||
67 | } | ||
68 | i += 5 + b[0]; | ||
69 | } | ||
70 | /* length in ret */ | ||
71 | if (ret > 0) | ||
72 | ret = 0; | ||
73 | /* restart the CPU */ | ||
74 | reset = 0; | ||
75 | if (ret || dibusb_writemem(udev,dibdev->dev_cl->usb_ctrl->cpu_cs_register,&reset,1) != 1) { | ||
76 | err("could not restart the USB controller CPU."); | ||
77 | ret = -EINVAL; | ||
78 | } | ||
79 | |||
80 | kfree(p); | ||
81 | } else { | ||
82 | ret = -ENOMEM; | ||
83 | } | ||
84 | release_firmware(fw); | ||
85 | |||
86 | return ret; | ||
87 | } | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-remote.c b/drivers/media/dvb/dibusb/dvb-dibusb-remote.c deleted file mode 100644 index 9dc8b15517b7..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-remote.c +++ /dev/null | |||
@@ -1,316 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb-remote.c is part of the driver for mobile USB Budget DVB-T devices | ||
3 | * based on reference design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
6 | * | ||
7 | * see dvb-dibusb-core.c for more copyright details. | ||
8 | * | ||
9 | * This file contains functions for handling the event device on the software | ||
10 | * side and the remote control on the hardware side. | ||
11 | */ | ||
12 | #include "dvb-dibusb.h" | ||
13 | |||
14 | /* Table to map raw key codes to key events. This should not be hard-wired | ||
15 | into the kernel. */ | ||
16 | static const struct { u8 c0, c1, c2; uint32_t key; } nec_rc_keys [] = | ||
17 | { | ||
18 | /* Key codes for the little Artec T1/Twinhan/HAMA/ remote. */ | ||
19 | { 0x00, 0xff, 0x16, KEY_POWER }, | ||
20 | { 0x00, 0xff, 0x10, KEY_MUTE }, | ||
21 | { 0x00, 0xff, 0x03, KEY_1 }, | ||
22 | { 0x00, 0xff, 0x01, KEY_2 }, | ||
23 | { 0x00, 0xff, 0x06, KEY_3 }, | ||
24 | { 0x00, 0xff, 0x09, KEY_4 }, | ||
25 | { 0x00, 0xff, 0x1d, KEY_5 }, | ||
26 | { 0x00, 0xff, 0x1f, KEY_6 }, | ||
27 | { 0x00, 0xff, 0x0d, KEY_7 }, | ||
28 | { 0x00, 0xff, 0x19, KEY_8 }, | ||
29 | { 0x00, 0xff, 0x1b, KEY_9 }, | ||
30 | { 0x00, 0xff, 0x15, KEY_0 }, | ||
31 | { 0x00, 0xff, 0x05, KEY_CHANNELUP }, | ||
32 | { 0x00, 0xff, 0x02, KEY_CHANNELDOWN }, | ||
33 | { 0x00, 0xff, 0x1e, KEY_VOLUMEUP }, | ||
34 | { 0x00, 0xff, 0x0a, KEY_VOLUMEDOWN }, | ||
35 | { 0x00, 0xff, 0x11, KEY_RECORD }, | ||
36 | { 0x00, 0xff, 0x17, KEY_FAVORITES }, /* Heart symbol - Channel list. */ | ||
37 | { 0x00, 0xff, 0x14, KEY_PLAY }, | ||
38 | { 0x00, 0xff, 0x1a, KEY_STOP }, | ||
39 | { 0x00, 0xff, 0x40, KEY_REWIND }, | ||
40 | { 0x00, 0xff, 0x12, KEY_FASTFORWARD }, | ||
41 | { 0x00, 0xff, 0x0e, KEY_PREVIOUS }, /* Recall - Previous channel. */ | ||
42 | { 0x00, 0xff, 0x4c, KEY_PAUSE }, | ||
43 | { 0x00, 0xff, 0x4d, KEY_SCREEN }, /* Full screen mode. */ | ||
44 | { 0x00, 0xff, 0x54, KEY_AUDIO }, /* MTS - Switch to secondary audio. */ | ||
45 | /* additional keys TwinHan VisionPlus, the Artec seemingly not have */ | ||
46 | { 0x00, 0xff, 0x0c, KEY_CANCEL }, /* Cancel */ | ||
47 | { 0x00, 0xff, 0x1c, KEY_EPG }, /* EPG */ | ||
48 | { 0x00, 0xff, 0x00, KEY_TAB }, /* Tab */ | ||
49 | { 0x00, 0xff, 0x48, KEY_INFO }, /* Preview */ | ||
50 | { 0x00, 0xff, 0x04, KEY_LIST }, /* RecordList */ | ||
51 | { 0x00, 0xff, 0x0f, KEY_TEXT }, /* Teletext */ | ||
52 | /* Key codes for the KWorld/ADSTech/JetWay remote. */ | ||
53 | { 0x86, 0x6b, 0x12, KEY_POWER }, | ||
54 | { 0x86, 0x6b, 0x0f, KEY_SELECT }, /* source */ | ||
55 | { 0x86, 0x6b, 0x0c, KEY_UNKNOWN }, /* scan */ | ||
56 | { 0x86, 0x6b, 0x0b, KEY_EPG }, | ||
57 | { 0x86, 0x6b, 0x10, KEY_MUTE }, | ||
58 | { 0x86, 0x6b, 0x01, KEY_1 }, | ||
59 | { 0x86, 0x6b, 0x02, KEY_2 }, | ||
60 | { 0x86, 0x6b, 0x03, KEY_3 }, | ||
61 | { 0x86, 0x6b, 0x04, KEY_4 }, | ||
62 | { 0x86, 0x6b, 0x05, KEY_5 }, | ||
63 | { 0x86, 0x6b, 0x06, KEY_6 }, | ||
64 | { 0x86, 0x6b, 0x07, KEY_7 }, | ||
65 | { 0x86, 0x6b, 0x08, KEY_8 }, | ||
66 | { 0x86, 0x6b, 0x09, KEY_9 }, | ||
67 | { 0x86, 0x6b, 0x0a, KEY_0 }, | ||
68 | { 0x86, 0x6b, 0x18, KEY_ZOOM }, | ||
69 | { 0x86, 0x6b, 0x1c, KEY_UNKNOWN }, /* preview */ | ||
70 | { 0x86, 0x6b, 0x13, KEY_UNKNOWN }, /* snap */ | ||
71 | { 0x86, 0x6b, 0x00, KEY_UNDO }, | ||
72 | { 0x86, 0x6b, 0x1d, KEY_RECORD }, | ||
73 | { 0x86, 0x6b, 0x0d, KEY_STOP }, | ||
74 | { 0x86, 0x6b, 0x0e, KEY_PAUSE }, | ||
75 | { 0x86, 0x6b, 0x16, KEY_PLAY }, | ||
76 | { 0x86, 0x6b, 0x11, KEY_BACK }, | ||
77 | { 0x86, 0x6b, 0x19, KEY_FORWARD }, | ||
78 | { 0x86, 0x6b, 0x14, KEY_UNKNOWN }, /* pip */ | ||
79 | { 0x86, 0x6b, 0x15, KEY_ESC }, | ||
80 | { 0x86, 0x6b, 0x1a, KEY_UP }, | ||
81 | { 0x86, 0x6b, 0x1e, KEY_DOWN }, | ||
82 | { 0x86, 0x6b, 0x1f, KEY_LEFT }, | ||
83 | { 0x86, 0x6b, 0x1b, KEY_RIGHT }, | ||
84 | }; | ||
85 | |||
86 | /* Hauppauge NOVA-T USB2 keys */ | ||
87 | static const struct { u16 raw; uint32_t key; } haupp_rc_keys [] = { | ||
88 | { 0xddf, KEY_GOTO }, | ||
89 | { 0xdef, KEY_POWER }, | ||
90 | { 0xce7, KEY_TV }, | ||
91 | { 0xcc7, KEY_VIDEO }, | ||
92 | { 0xccf, KEY_AUDIO }, | ||
93 | { 0xcd7, KEY_MEDIA }, | ||
94 | { 0xcdf, KEY_EPG }, | ||
95 | { 0xca7, KEY_UP }, | ||
96 | { 0xc67, KEY_RADIO }, | ||
97 | { 0xcb7, KEY_LEFT }, | ||
98 | { 0xd2f, KEY_OK }, | ||
99 | { 0xcbf, KEY_RIGHT }, | ||
100 | { 0xcff, KEY_BACK }, | ||
101 | { 0xcaf, KEY_DOWN }, | ||
102 | { 0xc6f, KEY_MENU }, | ||
103 | { 0xc87, KEY_VOLUMEUP }, | ||
104 | { 0xc8f, KEY_VOLUMEDOWN }, | ||
105 | { 0xc97, KEY_CHANNEL }, | ||
106 | { 0xc7f, KEY_MUTE }, | ||
107 | { 0xd07, KEY_CHANNELUP }, | ||
108 | { 0xd0f, KEY_CHANNELDOWN }, | ||
109 | { 0xdbf, KEY_RECORD }, | ||
110 | { 0xdb7, KEY_STOP }, | ||
111 | { 0xd97, KEY_REWIND }, | ||
112 | { 0xdaf, KEY_PLAY }, | ||
113 | { 0xda7, KEY_FASTFORWARD }, | ||
114 | { 0xd27, KEY_LAST }, /* Skip backwards */ | ||
115 | { 0xd87, KEY_PAUSE }, | ||
116 | { 0xcf7, KEY_NEXT }, | ||
117 | { 0xc07, KEY_0 }, | ||
118 | { 0xc0f, KEY_1 }, | ||
119 | { 0xc17, KEY_2 }, | ||
120 | { 0xc1f, KEY_3 }, | ||
121 | { 0xc27, KEY_4 }, | ||
122 | { 0xc2f, KEY_5 }, | ||
123 | { 0xc37, KEY_6 }, | ||
124 | { 0xc3f, KEY_7 }, | ||
125 | { 0xc47, KEY_8 }, | ||
126 | { 0xc4f, KEY_9 }, | ||
127 | { 0xc57, KEY_KPASTERISK }, | ||
128 | { 0xc77, KEY_GRAVE }, /* # */ | ||
129 | { 0xc5f, KEY_RED }, | ||
130 | { 0xd77, KEY_GREEN }, | ||
131 | { 0xdc7, KEY_YELLOW }, | ||
132 | { 0xd4f, KEY_BLUE}, | ||
133 | }; | ||
134 | |||
135 | static int dibusb_key2event_nec(struct usb_dibusb *dib,u8 rb[5]) | ||
136 | { | ||
137 | int i; | ||
138 | switch (rb[0]) { | ||
139 | case DIBUSB_RC_NEC_KEY_PRESSED: | ||
140 | /* rb[1-3] is the actual key, rb[4] is a checksum */ | ||
141 | deb_rc("raw key code 0x%02x, 0x%02x, 0x%02x, 0x%02x\n", | ||
142 | rb[1], rb[2], rb[3], rb[4]); | ||
143 | |||
144 | if ((0xff - rb[3]) != rb[4]) { | ||
145 | deb_rc("remote control checksum failed.\n"); | ||
146 | break; | ||
147 | } | ||
148 | |||
149 | /* See if we can match the raw key code. */ | ||
150 | for (i = 0; i < sizeof(nec_rc_keys)/sizeof(nec_rc_keys[0]); i++) { | ||
151 | if (nec_rc_keys[i].c0 == rb[1] && | ||
152 | nec_rc_keys[i].c1 == rb[2] && | ||
153 | nec_rc_keys[i].c2 == rb[3]) { | ||
154 | |||
155 | dib->last_event = nec_rc_keys[i].key; | ||
156 | return 1; | ||
157 | } | ||
158 | } | ||
159 | break; | ||
160 | case DIBUSB_RC_NEC_KEY_REPEATED: | ||
161 | /* rb[1]..rb[4] are always zero.*/ | ||
162 | /* Repeats often seem to occur so for the moment just ignore this. */ | ||
163 | return 0; | ||
164 | case DIBUSB_RC_NEC_EMPTY: /* No (more) remote control keys. */ | ||
165 | default: | ||
166 | break; | ||
167 | } | ||
168 | return -1; | ||
169 | } | ||
170 | |||
171 | static int dibusb_key2event_hauppauge(struct usb_dibusb *dib,u8 rb[4]) | ||
172 | { | ||
173 | u16 raw; | ||
174 | int i,state; | ||
175 | switch (rb[0]) { | ||
176 | case DIBUSB_RC_HAUPPAUGE_KEY_PRESSED: | ||
177 | raw = ((rb[1] & 0x0f) << 8) | rb[2]; | ||
178 | |||
179 | state = !!(rb[1] & 0x40); | ||
180 | |||
181 | deb_rc("raw key code 0x%02x, 0x%02x, 0x%02x to %04x state: %d\n",rb[1],rb[2],rb[3],raw,state); | ||
182 | for (i = 0; i < sizeof(haupp_rc_keys)/sizeof(haupp_rc_keys[0]); i++) { | ||
183 | if (haupp_rc_keys[i].raw == raw) { | ||
184 | if (dib->last_event == haupp_rc_keys[i].key && | ||
185 | dib->last_state == state) { | ||
186 | deb_rc("key repeat\n"); | ||
187 | return 0; | ||
188 | } else { | ||
189 | dib->last_event = haupp_rc_keys[i].key; | ||
190 | dib->last_state = state; | ||
191 | return 1; | ||
192 | } | ||
193 | } | ||
194 | } | ||
195 | |||
196 | break; | ||
197 | case DIBUSB_RC_HAUPPAUGE_KEY_EMPTY: | ||
198 | default: | ||
199 | break; | ||
200 | } | ||
201 | return -1; | ||
202 | } | ||
203 | |||
204 | /* | ||
205 | * Read the remote control and feed the appropriate event. | ||
206 | * NEC protocol is used for remote controls | ||
207 | */ | ||
208 | static int dibusb_read_remote_control(struct usb_dibusb *dib) | ||
209 | { | ||
210 | u8 b[1] = { DIBUSB_REQ_POLL_REMOTE }, rb[5]; | ||
211 | int ret,event = 0; | ||
212 | |||
213 | if ((ret = dibusb_readwrite_usb(dib,b,1,rb,5))) | ||
214 | return ret; | ||
215 | |||
216 | switch (dib->dibdev->dev_cl->remote_type) { | ||
217 | case DIBUSB_RC_NEC_PROTOCOL: | ||
218 | event = dibusb_key2event_nec(dib,rb); | ||
219 | break; | ||
220 | case DIBUSB_RC_HAUPPAUGE_PROTO: | ||
221 | event = dibusb_key2event_hauppauge(dib,rb); | ||
222 | default: | ||
223 | break; | ||
224 | } | ||
225 | |||
226 | /* key repeat */ | ||
227 | if (event == 0) | ||
228 | if (++dib->repeat_key_count < dib->rc_key_repeat_count) { | ||
229 | deb_rc("key repeat dropped. (%d)\n",dib->repeat_key_count); | ||
230 | event = -1; /* skip this key repeat */ | ||
231 | } | ||
232 | |||
233 | if (event == 1 || event == 0) { | ||
234 | deb_rc("Translated key 0x%04x\n",event); | ||
235 | |||
236 | /* Signal down and up events for this key. */ | ||
237 | input_report_key(&dib->rc_input_dev, dib->last_event, 1); | ||
238 | input_report_key(&dib->rc_input_dev, dib->last_event, 0); | ||
239 | input_sync(&dib->rc_input_dev); | ||
240 | |||
241 | if (event == 1) | ||
242 | dib->repeat_key_count = 0; | ||
243 | } | ||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | /* Remote-control poll function - called every dib->rc_query_interval ms to see | ||
248 | whether the remote control has received anything. */ | ||
249 | static void dibusb_remote_query(void *data) | ||
250 | { | ||
251 | struct usb_dibusb *dib = (struct usb_dibusb *) data; | ||
252 | /* TODO: need a lock here. We can simply skip checking for the remote control | ||
253 | if we're busy. */ | ||
254 | dibusb_read_remote_control(dib); | ||
255 | schedule_delayed_work(&dib->rc_query_work, | ||
256 | msecs_to_jiffies(dib->rc_query_interval)); | ||
257 | } | ||
258 | |||
259 | int dibusb_remote_init(struct usb_dibusb *dib) | ||
260 | { | ||
261 | int i; | ||
262 | |||
263 | if (dib->dibdev->dev_cl->remote_type == DIBUSB_RC_NO) | ||
264 | return 0; | ||
265 | |||
266 | /* Initialise the remote-control structures.*/ | ||
267 | init_input_dev(&dib->rc_input_dev); | ||
268 | |||
269 | dib->rc_input_dev.evbit[0] = BIT(EV_KEY); | ||
270 | dib->rc_input_dev.keycodesize = sizeof(unsigned char); | ||
271 | dib->rc_input_dev.keycodemax = KEY_MAX; | ||
272 | dib->rc_input_dev.name = DRIVER_DESC " remote control"; | ||
273 | |||
274 | switch (dib->dibdev->dev_cl->remote_type) { | ||
275 | case DIBUSB_RC_NEC_PROTOCOL: | ||
276 | for (i=0; i<sizeof(nec_rc_keys)/sizeof(nec_rc_keys[0]); i++) | ||
277 | set_bit(nec_rc_keys[i].key, dib->rc_input_dev.keybit); | ||
278 | break; | ||
279 | case DIBUSB_RC_HAUPPAUGE_PROTO: | ||
280 | for (i=0; i<sizeof(haupp_rc_keys)/sizeof(haupp_rc_keys[0]); i++) | ||
281 | set_bit(haupp_rc_keys[i].key, dib->rc_input_dev.keybit); | ||
282 | break; | ||
283 | default: | ||
284 | break; | ||
285 | } | ||
286 | |||
287 | |||
288 | input_register_device(&dib->rc_input_dev); | ||
289 | |||
290 | INIT_WORK(&dib->rc_query_work, dibusb_remote_query, dib); | ||
291 | |||
292 | /* Start the remote-control polling. */ | ||
293 | if (dib->rc_query_interval < 40) | ||
294 | dib->rc_query_interval = 100; /* default */ | ||
295 | |||
296 | info("schedule remote query interval to %d msecs.",dib->rc_query_interval); | ||
297 | schedule_delayed_work(&dib->rc_query_work,msecs_to_jiffies(dib->rc_query_interval)); | ||
298 | |||
299 | dib->init_state |= DIBUSB_STATE_REMOTE; | ||
300 | |||
301 | return 0; | ||
302 | } | ||
303 | |||
304 | int dibusb_remote_exit(struct usb_dibusb *dib) | ||
305 | { | ||
306 | if (dib->dibdev->dev_cl->remote_type == DIBUSB_RC_NO) | ||
307 | return 0; | ||
308 | |||
309 | if (dib->init_state & DIBUSB_STATE_REMOTE) { | ||
310 | cancel_delayed_work(&dib->rc_query_work); | ||
311 | flush_scheduled_work(); | ||
312 | input_unregister_device(&dib->rc_input_dev); | ||
313 | } | ||
314 | dib->init_state &= ~DIBUSB_STATE_REMOTE; | ||
315 | return 0; | ||
316 | } | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb-usb.c b/drivers/media/dvb/dibusb/dvb-dibusb-usb.c deleted file mode 100644 index 642f0596a5ba..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb-usb.c +++ /dev/null | |||
@@ -1,303 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb-usb.c is part of the driver for mobile USB Budget DVB-T devices | ||
3 | * based on reference design made by DiBcom (http://www.dibcom.fr/) | ||
4 | * | ||
5 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
6 | * | ||
7 | * see dvb-dibusb-core.c for more copyright details. | ||
8 | * | ||
9 | * This file contains functions for initializing and handling the | ||
10 | * usb specific stuff. | ||
11 | */ | ||
12 | #include "dvb-dibusb.h" | ||
13 | |||
14 | #include <linux/version.h> | ||
15 | #include <linux/pci.h> | ||
16 | |||
17 | int dibusb_readwrite_usb(struct usb_dibusb *dib, u8 *wbuf, u16 wlen, u8 *rbuf, | ||
18 | u16 rlen) | ||
19 | { | ||
20 | int actlen,ret = -ENOMEM; | ||
21 | |||
22 | if (wbuf == NULL || wlen == 0) | ||
23 | return -EINVAL; | ||
24 | |||
25 | if ((ret = down_interruptible(&dib->usb_sem))) | ||
26 | return ret; | ||
27 | |||
28 | debug_dump(wbuf,wlen); | ||
29 | |||
30 | ret = usb_bulk_msg(dib->udev,usb_sndbulkpipe(dib->udev, | ||
31 | dib->dibdev->dev_cl->pipe_cmd), wbuf,wlen,&actlen, | ||
32 | DIBUSB_I2C_TIMEOUT); | ||
33 | |||
34 | if (ret) | ||
35 | err("bulk message failed: %d (%d/%d)",ret,wlen,actlen); | ||
36 | else | ||
37 | ret = actlen != wlen ? -1 : 0; | ||
38 | |||
39 | /* an answer is expected, and no error before */ | ||
40 | if (!ret && rbuf && rlen) { | ||
41 | ret = usb_bulk_msg(dib->udev,usb_rcvbulkpipe(dib->udev, | ||
42 | dib->dibdev->dev_cl->pipe_cmd),rbuf,rlen,&actlen, | ||
43 | DIBUSB_I2C_TIMEOUT); | ||
44 | |||
45 | if (ret) | ||
46 | err("recv bulk message failed: %d",ret); | ||
47 | else { | ||
48 | deb_alot("rlen: %d\n",rlen); | ||
49 | debug_dump(rbuf,actlen); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | up(&dib->usb_sem); | ||
54 | return ret; | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * Cypress controls | ||
59 | */ | ||
60 | int dibusb_write_usb(struct usb_dibusb *dib, u8 *buf, u16 len) | ||
61 | { | ||
62 | return dibusb_readwrite_usb(dib,buf,len,NULL,0); | ||
63 | } | ||
64 | |||
65 | #if 0 | ||
66 | /* | ||
67 | * #if 0'ing the following functions as they are not in use _now_, | ||
68 | * but probably will be sometime. | ||
69 | */ | ||
70 | /* | ||
71 | * do not use this, just a workaround for a bug, | ||
72 | * which will hopefully never occur :). | ||
73 | */ | ||
74 | int dibusb_interrupt_read_loop(struct usb_dibusb *dib) | ||
75 | { | ||
76 | u8 b[1] = { DIBUSB_REQ_INTR_READ }; | ||
77 | return dibusb_write_usb(dib,b,1); | ||
78 | } | ||
79 | #endif | ||
80 | |||
81 | /* | ||
82 | * ioctl for the firmware | ||
83 | */ | ||
84 | static int dibusb_ioctl_cmd(struct usb_dibusb *dib, u8 cmd, u8 *param, int plen) | ||
85 | { | ||
86 | u8 b[34]; | ||
87 | int size = plen > 32 ? 32 : plen; | ||
88 | memset(b,0,34); | ||
89 | b[0] = DIBUSB_REQ_SET_IOCTL; | ||
90 | b[1] = cmd; | ||
91 | |||
92 | if (size > 0) | ||
93 | memcpy(&b[2],param,size); | ||
94 | |||
95 | return dibusb_write_usb(dib,b,34); //2+size); | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * ioctl for power control | ||
100 | */ | ||
101 | int dibusb_hw_wakeup(struct dvb_frontend *fe) | ||
102 | { | ||
103 | struct usb_dibusb *dib = (struct usb_dibusb *) fe->dvb->priv; | ||
104 | u8 b[1] = { DIBUSB_IOCTL_POWER_WAKEUP }; | ||
105 | deb_info("dibusb-device is getting up.\n"); | ||
106 | |||
107 | switch (dib->dibdev->dev_cl->id) { | ||
108 | case DTT200U: | ||
109 | break; | ||
110 | default: | ||
111 | dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_POWER_MODE, b,1); | ||
112 | break; | ||
113 | } | ||
114 | |||
115 | if (dib->fe_init) | ||
116 | return dib->fe_init(fe); | ||
117 | |||
118 | return 0; | ||
119 | } | ||
120 | |||
121 | int dibusb_hw_sleep(struct dvb_frontend *fe) | ||
122 | { | ||
123 | struct usb_dibusb *dib = (struct usb_dibusb *) fe->dvb->priv; | ||
124 | u8 b[1] = { DIBUSB_IOCTL_POWER_SLEEP }; | ||
125 | deb_info("dibusb-device is going to bed.\n"); | ||
126 | /* workaround, something is wrong, when dibusb 1.1 device are going to bed too late */ | ||
127 | switch (dib->dibdev->dev_cl->id) { | ||
128 | case DIBUSB1_1: | ||
129 | case NOVAT_USB2: | ||
130 | case DTT200U: | ||
131 | break; | ||
132 | default: | ||
133 | dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_POWER_MODE, b,1); | ||
134 | break; | ||
135 | } | ||
136 | if (dib->fe_sleep) | ||
137 | return dib->fe_sleep(fe); | ||
138 | |||
139 | return 0; | ||
140 | } | ||
141 | |||
142 | int dibusb_set_streaming_mode(struct usb_dibusb *dib,u8 mode) | ||
143 | { | ||
144 | u8 b[2] = { DIBUSB_REQ_SET_STREAMING_MODE, mode }; | ||
145 | return dibusb_readwrite_usb(dib,b,2,NULL,0); | ||
146 | } | ||
147 | |||
148 | static int dibusb_urb_kill(struct usb_dibusb *dib) | ||
149 | { | ||
150 | int i; | ||
151 | deb_info("trying to kill urbs\n"); | ||
152 | if (dib->init_state & DIBUSB_STATE_URB_SUBMIT) { | ||
153 | for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { | ||
154 | deb_info("killing URB no. %d.\n",i); | ||
155 | |||
156 | /* stop the URB */ | ||
157 | usb_kill_urb(dib->urb_list[i]); | ||
158 | } | ||
159 | } else | ||
160 | deb_info(" URBs not killed.\n"); | ||
161 | dib->init_state &= ~DIBUSB_STATE_URB_SUBMIT; | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | static int dibusb_urb_submit(struct usb_dibusb *dib) | ||
166 | { | ||
167 | int i,ret; | ||
168 | if (dib->init_state & DIBUSB_STATE_URB_INIT) { | ||
169 | for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { | ||
170 | deb_info("submitting URB no. %d\n",i); | ||
171 | if ((ret = usb_submit_urb(dib->urb_list[i],GFP_ATOMIC))) { | ||
172 | err("could not submit buffer urb no. %d - get them all back\n",i); | ||
173 | dibusb_urb_kill(dib); | ||
174 | return ret; | ||
175 | } | ||
176 | dib->init_state |= DIBUSB_STATE_URB_SUBMIT; | ||
177 | } | ||
178 | } | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | int dibusb_streaming(struct usb_dibusb *dib,int onoff) | ||
183 | { | ||
184 | if (onoff) | ||
185 | dibusb_urb_submit(dib); | ||
186 | else | ||
187 | dibusb_urb_kill(dib); | ||
188 | |||
189 | switch (dib->dibdev->dev_cl->id) { | ||
190 | case DIBUSB2_0: | ||
191 | case DIBUSB2_0B: | ||
192 | case NOVAT_USB2: | ||
193 | case UMT2_0: | ||
194 | if (onoff) | ||
195 | return dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_ENABLE_STREAM,NULL,0); | ||
196 | else | ||
197 | return dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_DISABLE_STREAM,NULL,0); | ||
198 | break; | ||
199 | default: | ||
200 | break; | ||
201 | } | ||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | int dibusb_urb_init(struct usb_dibusb *dib) | ||
206 | { | ||
207 | int i,bufsize,def_pid_parse = 1; | ||
208 | |||
209 | /* | ||
210 | * when reloading the driver w/o replugging the device | ||
211 | * a timeout occures, this helps | ||
212 | */ | ||
213 | usb_clear_halt(dib->udev,usb_sndbulkpipe(dib->udev,dib->dibdev->dev_cl->pipe_cmd)); | ||
214 | usb_clear_halt(dib->udev,usb_rcvbulkpipe(dib->udev,dib->dibdev->dev_cl->pipe_cmd)); | ||
215 | usb_clear_halt(dib->udev,usb_rcvbulkpipe(dib->udev,dib->dibdev->dev_cl->pipe_data)); | ||
216 | |||
217 | /* allocate the array for the data transfer URBs */ | ||
218 | dib->urb_list = kmalloc(dib->dibdev->dev_cl->urb_count*sizeof(struct urb *),GFP_KERNEL); | ||
219 | if (dib->urb_list == NULL) | ||
220 | return -ENOMEM; | ||
221 | memset(dib->urb_list,0,dib->dibdev->dev_cl->urb_count*sizeof(struct urb *)); | ||
222 | |||
223 | dib->init_state |= DIBUSB_STATE_URB_LIST; | ||
224 | |||
225 | bufsize = dib->dibdev->dev_cl->urb_count*dib->dibdev->dev_cl->urb_buffer_size; | ||
226 | deb_info("allocate %d bytes as buffersize for all URBs\n",bufsize); | ||
227 | /* allocate the actual buffer for the URBs */ | ||
228 | if ((dib->buffer = pci_alloc_consistent(NULL,bufsize,&dib->dma_handle)) == NULL) { | ||
229 | deb_info("not enough memory.\n"); | ||
230 | return -ENOMEM; | ||
231 | } | ||
232 | deb_info("allocation complete\n"); | ||
233 | memset(dib->buffer,0,bufsize); | ||
234 | |||
235 | dib->init_state |= DIBUSB_STATE_URB_BUF; | ||
236 | |||
237 | /* allocate and submit the URBs */ | ||
238 | for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { | ||
239 | if (!(dib->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC))) { | ||
240 | return -ENOMEM; | ||
241 | } | ||
242 | |||
243 | usb_fill_bulk_urb( dib->urb_list[i], dib->udev, | ||
244 | usb_rcvbulkpipe(dib->udev,dib->dibdev->dev_cl->pipe_data), | ||
245 | &dib->buffer[i*dib->dibdev->dev_cl->urb_buffer_size], | ||
246 | dib->dibdev->dev_cl->urb_buffer_size, | ||
247 | dibusb_urb_complete, dib); | ||
248 | |||
249 | dib->urb_list[i]->transfer_flags = 0; | ||
250 | |||
251 | dib->init_state |= DIBUSB_STATE_URB_INIT; | ||
252 | } | ||
253 | |||
254 | /* dib->pid_parse here contains the value of the module parameter */ | ||
255 | /* decide if pid parsing can be deactivated: | ||
256 | * is possible (by device type) and wanted (by user) | ||
257 | */ | ||
258 | switch (dib->dibdev->dev_cl->id) { | ||
259 | case DIBUSB2_0: | ||
260 | case DIBUSB2_0B: | ||
261 | if (dib->udev->speed == USB_SPEED_HIGH && !dib->pid_parse) { | ||
262 | def_pid_parse = 0; | ||
263 | info("running at HIGH speed, will deliver the complete TS."); | ||
264 | } else | ||
265 | info("will use pid_parsing."); | ||
266 | break; | ||
267 | default: | ||
268 | break; | ||
269 | } | ||
270 | /* from here on it contains the device and user decision */ | ||
271 | dib->pid_parse = def_pid_parse; | ||
272 | |||
273 | return 0; | ||
274 | } | ||
275 | |||
276 | int dibusb_urb_exit(struct usb_dibusb *dib) | ||
277 | { | ||
278 | int i; | ||
279 | |||
280 | dibusb_urb_kill(dib); | ||
281 | |||
282 | if (dib->init_state & DIBUSB_STATE_URB_LIST) { | ||
283 | for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { | ||
284 | if (dib->urb_list[i] != NULL) { | ||
285 | deb_info("freeing URB no. %d.\n",i); | ||
286 | /* free the URBs */ | ||
287 | usb_free_urb(dib->urb_list[i]); | ||
288 | } | ||
289 | } | ||
290 | /* free the urb array */ | ||
291 | kfree(dib->urb_list); | ||
292 | dib->init_state &= ~DIBUSB_STATE_URB_LIST; | ||
293 | } | ||
294 | |||
295 | if (dib->init_state & DIBUSB_STATE_URB_BUF) | ||
296 | pci_free_consistent(NULL, | ||
297 | dib->dibdev->dev_cl->urb_buffer_size*dib->dibdev->dev_cl->urb_count, | ||
298 | dib->buffer,dib->dma_handle); | ||
299 | |||
300 | dib->init_state &= ~DIBUSB_STATE_URB_BUF; | ||
301 | dib->init_state &= ~DIBUSB_STATE_URB_INIT; | ||
302 | return 0; | ||
303 | } | ||
diff --git a/drivers/media/dvb/dibusb/dvb-dibusb.h b/drivers/media/dvb/dibusb/dvb-dibusb.h deleted file mode 100644 index c965b64fb1ab..000000000000 --- a/drivers/media/dvb/dibusb/dvb-dibusb.h +++ /dev/null | |||
@@ -1,327 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dibusb.h | ||
3 | * | ||
4 | * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation, version 2. | ||
9 | * | ||
10 | * for more information see dvb-dibusb-core.c . | ||
11 | */ | ||
12 | #ifndef __DVB_DIBUSB_H__ | ||
13 | #define __DVB_DIBUSB_H__ | ||
14 | |||
15 | #include <linux/input.h> | ||
16 | #include <linux/config.h> | ||
17 | #include <linux/usb.h> | ||
18 | |||
19 | #include "dvb_frontend.h" | ||
20 | #include "dvb_demux.h" | ||
21 | #include "dvb_net.h" | ||
22 | #include "dmxdev.h" | ||
23 | |||
24 | #include "dib3000.h" | ||
25 | #include "mt352.h" | ||
26 | |||
27 | /* debug */ | ||
28 | #ifdef CONFIG_DVB_DIBCOM_DEBUG | ||
29 | #define dprintk(level,args...) \ | ||
30 | do { if ((dvb_dibusb_debug & level)) { printk(args); } } while (0) | ||
31 | |||
32 | #define debug_dump(b,l) {\ | ||
33 | int i; \ | ||
34 | for (i = 0; i < l; i++) deb_xfer("%02x ", b[i]); \ | ||
35 | deb_xfer("\n");\ | ||
36 | } | ||
37 | |||
38 | #else | ||
39 | #define dprintk(args...) | ||
40 | #define debug_dump(b,l) | ||
41 | #endif | ||
42 | |||
43 | extern int dvb_dibusb_debug; | ||
44 | |||
45 | /* Version information */ | ||
46 | #define DRIVER_VERSION "0.3" | ||
47 | #define DRIVER_DESC "DiBcom based USB Budget DVB-T device" | ||
48 | #define DRIVER_AUTHOR "Patrick Boettcher, patrick.boettcher@desy.de" | ||
49 | |||
50 | #define deb_info(args...) dprintk(0x01,args) | ||
51 | #define deb_xfer(args...) dprintk(0x02,args) | ||
52 | #define deb_alot(args...) dprintk(0x04,args) | ||
53 | #define deb_ts(args...) dprintk(0x08,args) | ||
54 | #define deb_err(args...) dprintk(0x10,args) | ||
55 | #define deb_rc(args...) dprintk(0x20,args) | ||
56 | |||
57 | /* generic log methods - taken from usb.h */ | ||
58 | #undef err | ||
59 | #define err(format, arg...) printk(KERN_ERR "dvb-dibusb: " format "\n" , ## arg) | ||
60 | #undef info | ||
61 | #define info(format, arg...) printk(KERN_INFO "dvb-dibusb: " format "\n" , ## arg) | ||
62 | #undef warn | ||
63 | #define warn(format, arg...) printk(KERN_WARNING "dvb-dibusb: " format "\n" , ## arg) | ||
64 | |||
65 | struct dibusb_usb_controller { | ||
66 | const char *name; /* name of the usb controller */ | ||
67 | u16 cpu_cs_register; /* needs to be restarted, when the firmware has been downloaded. */ | ||
68 | }; | ||
69 | |||
70 | typedef enum { | ||
71 | DIBUSB1_1 = 0, | ||
72 | DIBUSB1_1_AN2235, | ||
73 | DIBUSB2_0, | ||
74 | UMT2_0, | ||
75 | DIBUSB2_0B, | ||
76 | NOVAT_USB2, | ||
77 | DTT200U, | ||
78 | } dibusb_class_t; | ||
79 | |||
80 | typedef enum { | ||
81 | DIBUSB_TUNER_CABLE_THOMSON = 0, | ||
82 | DIBUSB_TUNER_COFDM_PANASONIC_ENV57H1XD5, | ||
83 | DIBUSB_TUNER_CABLE_LG_TDTP_E102P, | ||
84 | DIBUSB_TUNER_COFDM_PANASONIC_ENV77H11D5, | ||
85 | } dibusb_tuner_t; | ||
86 | |||
87 | typedef enum { | ||
88 | DIBUSB_DIB3000MB = 0, | ||
89 | DIBUSB_DIB3000MC, | ||
90 | DIBUSB_MT352, | ||
91 | DTT200U_FE, | ||
92 | } dibusb_demodulator_t; | ||
93 | |||
94 | typedef enum { | ||
95 | DIBUSB_RC_NO = 0, | ||
96 | DIBUSB_RC_NEC_PROTOCOL, | ||
97 | DIBUSB_RC_HAUPPAUGE_PROTO, | ||
98 | } dibusb_remote_t; | ||
99 | |||
100 | struct dibusb_tuner { | ||
101 | dibusb_tuner_t id; | ||
102 | |||
103 | u8 pll_addr; /* tuner i2c address */ | ||
104 | }; | ||
105 | extern struct dibusb_tuner dibusb_tuner[]; | ||
106 | |||
107 | #define DIBUSB_POSSIBLE_I2C_ADDR_NUM 4 | ||
108 | struct dibusb_demod { | ||
109 | dibusb_demodulator_t id; | ||
110 | |||
111 | int pid_filter_count; /* counter of the internal pid_filter */ | ||
112 | u8 i2c_addrs[DIBUSB_POSSIBLE_I2C_ADDR_NUM]; /* list of possible i2c addresses of the demod */ | ||
113 | }; | ||
114 | |||
115 | #define DIBUSB_MAX_TUNER_NUM 2 | ||
116 | struct dibusb_device_class { | ||
117 | dibusb_class_t id; | ||
118 | |||
119 | const struct dibusb_usb_controller *usb_ctrl; /* usb controller */ | ||
120 | const char *firmware; /* valid firmware filenames */ | ||
121 | |||
122 | int pipe_cmd; /* command pipe (read/write) */ | ||
123 | int pipe_data; /* data pipe */ | ||
124 | |||
125 | int urb_count; /* number of data URBs to be submitted */ | ||
126 | int urb_buffer_size; /* the size of the buffer for each URB */ | ||
127 | |||
128 | dibusb_remote_t remote_type; /* does this device have a ir-receiver */ | ||
129 | |||
130 | struct dibusb_demod *demod; /* which demodulator is mount */ | ||
131 | struct dibusb_tuner *tuner; /* which tuner can be found here */ | ||
132 | }; | ||
133 | |||
134 | #define DIBUSB_ID_MAX_NUM 15 | ||
135 | struct dibusb_usb_device { | ||
136 | const char *name; /* real name of the box */ | ||
137 | struct dibusb_device_class *dev_cl; /* which dibusb_device_class is this device part of */ | ||
138 | |||
139 | struct usb_device_id *cold_ids[DIBUSB_ID_MAX_NUM]; /* list of USB ids when this device is at pre firmware state */ | ||
140 | struct usb_device_id *warm_ids[DIBUSB_ID_MAX_NUM]; /* list of USB ids when this device is at post firmware state */ | ||
141 | }; | ||
142 | |||
143 | /* a PID for the pid_filter list, when in use */ | ||
144 | struct dibusb_pid | ||
145 | { | ||
146 | int index; | ||
147 | u16 pid; | ||
148 | int active; | ||
149 | }; | ||
150 | |||
151 | struct usb_dibusb { | ||
152 | /* usb */ | ||
153 | struct usb_device * udev; | ||
154 | |||
155 | struct dibusb_usb_device * dibdev; | ||
156 | |||
157 | #define DIBUSB_STATE_INIT 0x000 | ||
158 | #define DIBUSB_STATE_URB_LIST 0x001 | ||
159 | #define DIBUSB_STATE_URB_BUF 0x002 | ||
160 | #define DIBUSB_STATE_URB_INIT 0x004 | ||
161 | #define DIBUSB_STATE_DVB 0x008 | ||
162 | #define DIBUSB_STATE_I2C 0x010 | ||
163 | #define DIBUSB_STATE_REMOTE 0x020 | ||
164 | #define DIBUSB_STATE_URB_SUBMIT 0x040 | ||
165 | int init_state; | ||
166 | |||
167 | int feedcount; | ||
168 | struct dib_fe_xfer_ops xfer_ops; | ||
169 | |||
170 | struct dibusb_tuner *tuner; | ||
171 | |||
172 | struct urb **urb_list; | ||
173 | u8 *buffer; | ||
174 | dma_addr_t dma_handle; | ||
175 | |||
176 | /* I2C */ | ||
177 | struct i2c_adapter i2c_adap; | ||
178 | |||
179 | /* locking */ | ||
180 | struct semaphore usb_sem; | ||
181 | struct semaphore i2c_sem; | ||
182 | |||
183 | /* dvb */ | ||
184 | struct dvb_adapter adapter; | ||
185 | struct dmxdev dmxdev; | ||
186 | struct dvb_demux demux; | ||
187 | struct dvb_net dvb_net; | ||
188 | struct dvb_frontend* fe; | ||
189 | |||
190 | int (*fe_sleep) (struct dvb_frontend *); | ||
191 | int (*fe_init) (struct dvb_frontend *); | ||
192 | |||
193 | /* remote control */ | ||
194 | struct input_dev rc_input_dev; | ||
195 | struct work_struct rc_query_work; | ||
196 | int last_event; | ||
197 | int last_state; /* for Hauppauge RC protocol */ | ||
198 | int repeat_key_count; | ||
199 | int rc_key_repeat_count; /* module parameter */ | ||
200 | |||
201 | /* module parameters */ | ||
202 | int pid_parse; | ||
203 | int rc_query_interval; | ||
204 | }; | ||
205 | |||
206 | /* commonly used functions in the separated files */ | ||
207 | |||
208 | /* dvb-dibusb-firmware.c */ | ||
209 | int dibusb_loadfirmware(struct usb_device *udev, struct dibusb_usb_device *dibdev); | ||
210 | |||
211 | /* dvb-dibusb-remote.c */ | ||
212 | int dibusb_remote_exit(struct usb_dibusb *dib); | ||
213 | int dibusb_remote_init(struct usb_dibusb *dib); | ||
214 | |||
215 | /* dvb-dibusb-fe-i2c.c */ | ||
216 | int dibusb_fe_init(struct usb_dibusb* dib); | ||
217 | int dibusb_fe_exit(struct usb_dibusb *dib); | ||
218 | int dibusb_i2c_init(struct usb_dibusb *dib); | ||
219 | int dibusb_i2c_exit(struct usb_dibusb *dib); | ||
220 | |||
221 | /* dvb-dibusb-dvb.c */ | ||
222 | void dibusb_urb_complete(struct urb *urb, struct pt_regs *ptregs); | ||
223 | int dibusb_dvb_init(struct usb_dibusb *dib); | ||
224 | int dibusb_dvb_exit(struct usb_dibusb *dib); | ||
225 | |||
226 | /* dvb-dibusb-usb.c */ | ||
227 | int dibusb_readwrite_usb(struct usb_dibusb *dib, u8 *wbuf, u16 wlen, u8 *rbuf, | ||
228 | u16 rlen); | ||
229 | int dibusb_write_usb(struct usb_dibusb *dib, u8 *buf, u16 len); | ||
230 | |||
231 | int dibusb_hw_wakeup(struct dvb_frontend *); | ||
232 | int dibusb_hw_sleep(struct dvb_frontend *); | ||
233 | int dibusb_set_streaming_mode(struct usb_dibusb *,u8); | ||
234 | int dibusb_streaming(struct usb_dibusb *,int); | ||
235 | |||
236 | int dibusb_urb_init(struct usb_dibusb *); | ||
237 | int dibusb_urb_exit(struct usb_dibusb *); | ||
238 | |||
239 | /* dvb-fe-dtt200u.c */ | ||
240 | struct dvb_frontend* dtt200u_fe_attach(struct usb_dibusb *,struct dib_fe_xfer_ops *); | ||
241 | |||
242 | /* i2c and transfer stuff */ | ||
243 | #define DIBUSB_I2C_TIMEOUT 5000 | ||
244 | |||
245 | /* | ||
246 | * protocol of all dibusb related devices | ||
247 | */ | ||
248 | |||
249 | /* | ||
250 | * bulk msg to/from endpoint 0x01 | ||
251 | * | ||
252 | * general structure: | ||
253 | * request_byte parameter_bytes | ||
254 | */ | ||
255 | |||
256 | #define DIBUSB_REQ_START_READ 0x00 | ||
257 | #define DIBUSB_REQ_START_DEMOD 0x01 | ||
258 | |||
259 | /* | ||
260 | * i2c read | ||
261 | * bulk write: 0x02 ((7bit i2c_addr << 1) & 0x01) register_bytes length_word | ||
262 | * bulk read: byte_buffer (length_word bytes) | ||
263 | */ | ||
264 | #define DIBUSB_REQ_I2C_READ 0x02 | ||
265 | |||
266 | /* | ||
267 | * i2c write | ||
268 | * bulk write: 0x03 (7bit i2c_addr << 1) register_bytes value_bytes | ||
269 | */ | ||
270 | #define DIBUSB_REQ_I2C_WRITE 0x03 | ||
271 | |||
272 | /* | ||
273 | * polling the value of the remote control | ||
274 | * bulk write: 0x04 | ||
275 | * bulk read: byte_buffer (5 bytes) | ||
276 | * | ||
277 | * first byte of byte_buffer shows the status (0x00, 0x01, 0x02) | ||
278 | */ | ||
279 | #define DIBUSB_REQ_POLL_REMOTE 0x04 | ||
280 | |||
281 | #define DIBUSB_RC_NEC_EMPTY 0x00 | ||
282 | #define DIBUSB_RC_NEC_KEY_PRESSED 0x01 | ||
283 | #define DIBUSB_RC_NEC_KEY_REPEATED 0x02 | ||
284 | |||
285 | /* additional status values for Hauppauge Remote Control Protocol */ | ||
286 | #define DIBUSB_RC_HAUPPAUGE_KEY_PRESSED 0x01 | ||
287 | #define DIBUSB_RC_HAUPPAUGE_KEY_EMPTY 0x03 | ||
288 | |||
289 | /* streaming mode: | ||
290 | * bulk write: 0x05 mode_byte | ||
291 | * | ||
292 | * mode_byte is mostly 0x00 | ||
293 | */ | ||
294 | #define DIBUSB_REQ_SET_STREAMING_MODE 0x05 | ||
295 | |||
296 | /* interrupt the internal read loop, when blocking */ | ||
297 | #define DIBUSB_REQ_INTR_READ 0x06 | ||
298 | |||
299 | /* io control | ||
300 | * 0x07 cmd_byte param_bytes | ||
301 | * | ||
302 | * param_bytes can be up to 32 bytes | ||
303 | * | ||
304 | * cmd_byte function parameter name | ||
305 | * 0x00 power mode | ||
306 | * 0x00 sleep | ||
307 | * 0x01 wakeup | ||
308 | * | ||
309 | * 0x01 enable streaming | ||
310 | * 0x02 disable streaming | ||
311 | * | ||
312 | * | ||
313 | */ | ||
314 | #define DIBUSB_REQ_SET_IOCTL 0x07 | ||
315 | |||
316 | /* IOCTL commands */ | ||
317 | |||
318 | /* change the power mode in firmware */ | ||
319 | #define DIBUSB_IOCTL_CMD_POWER_MODE 0x00 | ||
320 | #define DIBUSB_IOCTL_POWER_SLEEP 0x00 | ||
321 | #define DIBUSB_IOCTL_POWER_WAKEUP 0x01 | ||
322 | |||
323 | /* modify streaming of the FX2 */ | ||
324 | #define DIBUSB_IOCTL_CMD_ENABLE_STREAM 0x01 | ||
325 | #define DIBUSB_IOCTL_CMD_DISABLE_STREAM 0x02 | ||
326 | |||
327 | #endif | ||
diff --git a/drivers/media/dvb/dibusb/dvb-fe-dtt200u.c b/drivers/media/dvb/dibusb/dvb-fe-dtt200u.c deleted file mode 100644 index 1872aa6d200a..000000000000 --- a/drivers/media/dvb/dibusb/dvb-fe-dtt200u.c +++ /dev/null | |||
@@ -1,263 +0,0 @@ | |||
1 | /* | ||
2 | * dvb-dtt200u-fe.c is a driver which implements the frontend-part of the | ||
3 | * Yakumo/Typhoon/Hama USB2.0 boxes. It is hard-wired to the dibusb-driver as | ||
4 | * it uses the usb-transfer functions directly (maybe creating a | ||
5 | * generic-dvb-usb-lib for all usb-drivers will be reduce some more code.) | ||
6 | * | ||
7 | * Copyright (C) 2005 Patrick Boettcher <patrick.boettcher@desy.de> | ||
8 | * | ||
9 | * see dvb-dibusb-core.c for copyright details. | ||
10 | */ | ||
11 | |||
12 | /* guessed protocol description (reverse engineered): | ||
13 | * read | ||
14 | * 00 - USB type 0x02 for usb2.0, 0x01 for usb1.1 | ||
15 | * 81 - <TS_LOCK> <current frequency divided by 250000> | ||
16 | * 82 - crash - do not touch | ||
17 | * 83 - crash - do not touch | ||
18 | * 84 - remote control | ||
19 | * 85 - crash - do not touch (OK, stop testing here) | ||
20 | * 88 - locking 2 bytes (0x80 0x40 == no signal, 0x89 0x20 == nice signal) | ||
21 | * 89 - noise-to-signal | ||
22 | * 8a - unkown 1 byte - signal_strength | ||
23 | * 8c - ber ??? | ||
24 | * 8d - ber | ||
25 | * 8e - unc | ||
26 | * | ||
27 | * write | ||
28 | * 02 - bandwidth | ||
29 | * 03 - frequency (divided by 250000) | ||
30 | * 04 - pid table (index pid(7:0) pid(12:8)) | ||
31 | * 05 - reset the pid table | ||
32 | * 08 - demod transfer enabled or not (FX2 transfer is enabled by default) | ||
33 | */ | ||
34 | |||
35 | #include "dvb-dibusb.h" | ||
36 | #include "dvb_frontend.h" | ||
37 | |||
38 | struct dtt200u_fe_state { | ||
39 | struct usb_dibusb *dib; | ||
40 | |||
41 | struct dvb_frontend_parameters fep; | ||
42 | struct dvb_frontend frontend; | ||
43 | }; | ||
44 | |||
45 | #define moan(which,what) info("unexpected value in '%s' for cmd '%02x' - please report to linux-dvb@linuxtv.org",which,what) | ||
46 | |||
47 | static int dtt200u_fe_read_status(struct dvb_frontend* fe, fe_status_t *stat) | ||
48 | { | ||
49 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
50 | u8 bw[1] = { 0x81 }; | ||
51 | u8 br[3] = { 0 }; | ||
52 | // u8 bdeb[5] = { 0 }; | ||
53 | |||
54 | dibusb_readwrite_usb(state->dib,bw,1,br,3); | ||
55 | switch (br[0]) { | ||
56 | case 0x01: | ||
57 | *stat = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; | ||
58 | break; | ||
59 | case 0x00: | ||
60 | *stat = 0; | ||
61 | break; | ||
62 | default: | ||
63 | moan("br[0]",0x81); | ||
64 | break; | ||
65 | } | ||
66 | |||
67 | // bw[0] = 0x88; | ||
68 | // dibusb_readwrite_usb(state->dib,bw,1,bdeb,5); | ||
69 | |||
70 | // deb_info("%02x: %02x %02x %02x %02x %02x\n",bw[0],bdeb[0],bdeb[1],bdeb[2],bdeb[3],bdeb[4]); | ||
71 | |||
72 | return 0; | ||
73 | } | ||
74 | static int dtt200u_fe_read_ber(struct dvb_frontend* fe, u32 *ber) | ||
75 | { | ||
76 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
77 | u8 bw[1] = { 0x8d }; | ||
78 | *ber = 0; | ||
79 | dibusb_readwrite_usb(state->dib,bw,1,(u8*) ber, 3); | ||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | static int dtt200u_fe_read_unc_blocks(struct dvb_frontend* fe, u32 *unc) | ||
84 | { | ||
85 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
86 | u8 bw[1] = { 0x8c }; | ||
87 | *unc = 0; | ||
88 | dibusb_readwrite_usb(state->dib,bw,1,(u8*) unc, 3); | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | static int dtt200u_fe_read_signal_strength(struct dvb_frontend* fe, u16 *strength) | ||
93 | { | ||
94 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
95 | u8 bw[1] = { 0x8a }; | ||
96 | u8 b; | ||
97 | dibusb_readwrite_usb(state->dib,bw,1,&b, 1); | ||
98 | *strength = (b << 8) | b; | ||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static int dtt200u_fe_read_snr(struct dvb_frontend* fe, u16 *snr) | ||
103 | { | ||
104 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
105 | u8 bw[1] = { 0x89 }; | ||
106 | u8 br[1] = { 0 }; | ||
107 | dibusb_readwrite_usb(state->dib,bw,1,br,1); | ||
108 | *snr = ((0xff - br[0]) << 8) | (0xff - br[0]); | ||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | static int dtt200u_fe_init(struct dvb_frontend* fe) | ||
113 | { | ||
114 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
115 | u8 b[] = { 0x01 }; | ||
116 | return dibusb_write_usb(state->dib,b,1); | ||
117 | } | ||
118 | |||
119 | static int dtt200u_fe_sleep(struct dvb_frontend* fe) | ||
120 | { | ||
121 | return dtt200u_fe_init(fe); | ||
122 | } | ||
123 | |||
124 | static int dtt200u_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune) | ||
125 | { | ||
126 | tune->min_delay_ms = 1500; | ||
127 | tune->step_size = 166667; | ||
128 | tune->max_drift = 166667 * 2; | ||
129 | return 0; | ||
130 | } | ||
131 | |||
132 | static int dtt200u_fe_set_frontend(struct dvb_frontend* fe, | ||
133 | struct dvb_frontend_parameters *fep) | ||
134 | { | ||
135 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
136 | u16 freq = fep->frequency / 250000; | ||
137 | u8 bw,bwbuf[2] = { 0x03, 0 }, freqbuf[3] = { 0x02, 0, 0 }; | ||
138 | |||
139 | switch (fep->u.ofdm.bandwidth) { | ||
140 | case BANDWIDTH_8_MHZ: bw = 8; break; | ||
141 | case BANDWIDTH_7_MHZ: bw = 7; break; | ||
142 | case BANDWIDTH_6_MHZ: bw = 6; break; | ||
143 | case BANDWIDTH_AUTO: return -EOPNOTSUPP; | ||
144 | default: | ||
145 | return -EINVAL; | ||
146 | } | ||
147 | deb_info("set_frontend\n"); | ||
148 | |||
149 | bwbuf[1] = bw; | ||
150 | dibusb_write_usb(state->dib,bwbuf,2); | ||
151 | |||
152 | freqbuf[1] = freq & 0xff; | ||
153 | freqbuf[2] = (freq >> 8) & 0xff; | ||
154 | dibusb_write_usb(state->dib,freqbuf,3); | ||
155 | |||
156 | memcpy(&state->fep,fep,sizeof(struct dvb_frontend_parameters)); | ||
157 | |||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | static int dtt200u_fe_get_frontend(struct dvb_frontend* fe, | ||
162 | struct dvb_frontend_parameters *fep) | ||
163 | { | ||
164 | struct dtt200u_fe_state *state = fe->demodulator_priv; | ||
165 | memcpy(fep,&state->fep,sizeof(struct dvb_frontend_parameters)); | ||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static void dtt200u_fe_release(struct dvb_frontend* fe) | ||
170 | { | ||
171 | struct dtt200u_fe_state *state = (struct dtt200u_fe_state*) fe->demodulator_priv; | ||
172 | kfree(state); | ||
173 | } | ||
174 | |||
175 | static int dtt200u_pid_control(struct dvb_frontend *fe,int index, int pid,int onoff) | ||
176 | { | ||
177 | struct dtt200u_fe_state *state = (struct dtt200u_fe_state*) fe->demodulator_priv; | ||
178 | u8 b_pid[4]; | ||
179 | pid = onoff ? pid : 0; | ||
180 | |||
181 | b_pid[0] = 0x04; | ||
182 | b_pid[1] = index; | ||
183 | b_pid[2] = pid & 0xff; | ||
184 | b_pid[3] = (pid >> 8) & 0xff; | ||
185 | |||
186 | dibusb_write_usb(state->dib,b_pid,4); | ||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static int dtt200u_fifo_control(struct dvb_frontend *fe, int onoff) | ||
191 | { | ||
192 | struct dtt200u_fe_state *state = (struct dtt200u_fe_state*) fe->demodulator_priv; | ||
193 | u8 b_streaming[2] = { 0x08, onoff }; | ||
194 | u8 b_rst_pid[1] = { 0x05 }; | ||
195 | |||
196 | dibusb_write_usb(state->dib,b_streaming,2); | ||
197 | |||
198 | if (!onoff) | ||
199 | dibusb_write_usb(state->dib,b_rst_pid,1); | ||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | static struct dvb_frontend_ops dtt200u_fe_ops; | ||
204 | |||
205 | struct dvb_frontend* dtt200u_fe_attach(struct usb_dibusb *dib, struct dib_fe_xfer_ops *xfer_ops) | ||
206 | { | ||
207 | struct dtt200u_fe_state* state = NULL; | ||
208 | |||
209 | /* allocate memory for the internal state */ | ||
210 | state = (struct dtt200u_fe_state*) kmalloc(sizeof(struct dtt200u_fe_state), GFP_KERNEL); | ||
211 | if (state == NULL) | ||
212 | goto error; | ||
213 | memset(state,0,sizeof(struct dtt200u_fe_state)); | ||
214 | |||
215 | deb_info("attaching frontend dtt200u\n"); | ||
216 | |||
217 | state->dib = dib; | ||
218 | |||
219 | state->frontend.ops = &dtt200u_fe_ops; | ||
220 | state->frontend.demodulator_priv = state; | ||
221 | |||
222 | xfer_ops->fifo_ctrl = dtt200u_fifo_control; | ||
223 | xfer_ops->pid_ctrl = dtt200u_pid_control; | ||
224 | |||
225 | goto success; | ||
226 | error: | ||
227 | return NULL; | ||
228 | success: | ||
229 | return &state->frontend; | ||
230 | } | ||
231 | |||
232 | static struct dvb_frontend_ops dtt200u_fe_ops = { | ||
233 | .info = { | ||
234 | .name = "DTT200U (Yakumo/Typhoon/Hama) DVB-T", | ||
235 | .type = FE_OFDM, | ||
236 | .frequency_min = 44250000, | ||
237 | .frequency_max = 867250000, | ||
238 | .frequency_stepsize = 250000, | ||
239 | .caps = FE_CAN_INVERSION_AUTO | | ||
240 | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||
241 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||
242 | FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | | ||
243 | FE_CAN_TRANSMISSION_MODE_AUTO | | ||
244 | FE_CAN_GUARD_INTERVAL_AUTO | | ||
245 | FE_CAN_RECOVER | | ||
246 | FE_CAN_HIERARCHY_AUTO, | ||
247 | }, | ||
248 | |||
249 | .release = dtt200u_fe_release, | ||
250 | |||
251 | .init = dtt200u_fe_init, | ||
252 | .sleep = dtt200u_fe_sleep, | ||
253 | |||
254 | .set_frontend = dtt200u_fe_set_frontend, | ||
255 | .get_frontend = dtt200u_fe_get_frontend, | ||
256 | .get_tune_settings = dtt200u_fe_get_tune_settings, | ||
257 | |||
258 | .read_status = dtt200u_fe_read_status, | ||
259 | .read_ber = dtt200u_fe_read_ber, | ||
260 | .read_signal_strength = dtt200u_fe_read_signal_strength, | ||
261 | .read_snr = dtt200u_fe_read_snr, | ||
262 | .read_ucblocks = dtt200u_fe_read_unc_blocks, | ||
263 | }; | ||