Merge branch 'for-linus' of git://neil.brown.name/md
[linux-2.6] / drivers / media / dvb / dvb-usb / af9015.h
1 /*
2  * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
3  *
4  * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5  *
6  * Thanks to Afatech who kindly provided information.
7  *
8  *    This program is free software; you can redistribute it and/or modify
9  *    it under the terms of the GNU General Public License as published by
10  *    the Free Software Foundation; either version 2 of the License, or
11  *    (at your option) any later version.
12  *
13  *    This program is distributed in the hope that it will be useful,
14  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *    GNU General Public License for more details.
17  *
18  *    You should have received a copy of the GNU General Public License
19  *    along with this program; if not, write to the Free Software
20  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  */
23
24 #ifndef _DVB_USB_AF9015_H_
25 #define _DVB_USB_AF9015_H_
26
27 #define DVB_USB_LOG_PREFIX "af9015"
28 #include "dvb-usb.h"
29
30 #define deb_info(args...) dprintk(dvb_usb_af9015_debug, 0x01, args)
31 #define deb_rc(args...)   dprintk(dvb_usb_af9015_debug, 0x02, args)
32 #define deb_xfer(args...) dprintk(dvb_usb_af9015_debug, 0x04, args)
33 #define deb_reg(args...)  dprintk(dvb_usb_af9015_debug, 0x08, args)
34 #define deb_i2c(args...)  dprintk(dvb_usb_af9015_debug, 0x10, args)
35 #define deb_fw(args...)   dprintk(dvb_usb_af9015_debug, 0x20, args)
36
37 #define AF9015_I2C_EEPROM  0xa0
38 #define AF9015_I2C_DEMOD   0x38
39 #define AF9015_USB_TIMEOUT 2000
40
41 /* EEPROM locations */
42 #define AF9015_EEPROM_IR_MODE        0x18
43 #define AF9015_EEPROM_IR_REMOTE_TYPE 0x34
44 #define AF9015_EEPROM_TS_MODE        0x31
45 #define AF9015_EEPROM_DEMOD2_I2C     0x32
46
47 #define AF9015_EEPROM_SAW_BW1        0x35
48 #define AF9015_EEPROM_XTAL_TYPE1     0x36
49 #define AF9015_EEPROM_SPEC_INV1      0x37
50 #define AF9015_EEPROM_IF1L           0x38
51 #define AF9015_EEPROM_IF1H           0x39
52 #define AF9015_EEPROM_MT2060_IF1L    0x3a
53 #define AF9015_EEPROM_MT2060_IF1H    0x3b
54 #define AF9015_EEPROM_TUNER_ID1      0x3c
55
56 #define AF9015_EEPROM_SAW_BW2        0x45
57 #define AF9015_EEPROM_XTAL_TYPE2     0x46
58 #define AF9015_EEPROM_SPEC_INV2      0x47
59 #define AF9015_EEPROM_IF2L           0x48
60 #define AF9015_EEPROM_IF2H           0x49
61 #define AF9015_EEPROM_MT2060_IF2L    0x4a
62 #define AF9015_EEPROM_MT2060_IF2H    0x4b
63 #define AF9015_EEPROM_TUNER_ID2      0x4c
64
65 #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1)
66
67 #define AF9015_GPIO_ON (1 << 0)
68 #define AF9015_GPIO_EN (1 << 1)
69 #define AF9015_GPIO_O  (1 << 2)
70 #define AF9015_GPIO_I  (1 << 3)
71
72 #define AF9015_GPIO_TUNER_ON  (AF9015_GPIO_ON|AF9015_GPIO_EN)
73 #define AF9015_GPIO_TUNER_OFF (AF9015_GPIO_ON|AF9015_GPIO_EN|AF9015_GPIO_O)
74
75 struct req_t {
76         u8  cmd;       /* [0] */
77         /*  seq */     /* [1] */
78         u8  i2c_addr;  /* [2] */
79         u16 addr;      /* [3|4] */
80         u8  mbox;      /* [5] */
81         u8  addr_len;  /* [6] */
82         u8  data_len;  /* [7] */
83         u8  *data;
84 };
85
86 enum af9015_cmd {
87         GET_CONFIG           = 0x10,
88         DOWNLOAD_FIRMWARE    = 0x11,
89         BOOT                 = 0x13,
90         READ_MEMORY          = 0x20,
91         WRITE_MEMORY         = 0x21,
92         READ_WRITE_I2C       = 0x22,
93         COPY_FIRMWARE        = 0x23,
94         RECONNECT_USB        = 0x5a,
95         WRITE_VIRTUAL_MEMORY = 0x26,
96         GET_IR_CODE          = 0x27,
97         READ_I2C,
98         WRITE_I2C,
99 };
100
101 enum af9015_ir_mode {
102         AF9015_IR_MODE_DISABLED = 0,
103         AF9015_IR_MODE_HID,
104         AF9015_IR_MODE_RLC,
105         AF9015_IR_MODE_RC6,
106 };
107
108 struct af9015_state {
109         struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */
110 };
111
112 struct af9015_config {
113         u8  dual_mode:1;
114         u16 mt2060_if1[2];
115         u16 firmware_size;
116         u16 firmware_checksum;
117         u8  *ir_table;
118         u16 ir_table_size;
119 };
120
121 enum af9015_remote {
122         AF9015_REMOTE_NONE                    = 0,
123         AF9015_REMOTE_A_LINK_DTU_M,
124         AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
125         AF9015_REMOTE_MYGICTV_U718,
126         AF9015_REMOTE_DIGITTRADE_DVB_T,
127 };
128
129 /* Leadtek WinFast DTV Dongle Gold */
130 static struct dvb_usb_rc_key af9015_rc_keys_leadtek[] = {
131         { 0x00, 0x1e, KEY_1 },
132         { 0x00, 0x1f, KEY_2 },
133         { 0x00, 0x20, KEY_3 },
134         { 0x00, 0x21, KEY_4 },
135         { 0x00, 0x22, KEY_5 },
136         { 0x00, 0x23, KEY_6 },
137         { 0x00, 0x24, KEY_7 },
138         { 0x00, 0x25, KEY_8 },
139         { 0x00, 0x26, KEY_9 },
140         { 0x00, 0x27, KEY_0 },
141         { 0x00, 0x28, KEY_ENTER },
142         { 0x00, 0x4f, KEY_VOLUMEUP },
143         { 0x00, 0x50, KEY_VOLUMEDOWN },
144         { 0x00, 0x51, KEY_CHANNELDOWN },
145         { 0x00, 0x52, KEY_CHANNELUP },
146 };
147
148 static u8 af9015_ir_table_leadtek[] = {
149         0x03, 0xfc, 0x00, 0xff, 0x1a, 0x01, 0x00,
150         0x03, 0xfc, 0x56, 0xa9, 0x00, 0x00, 0x00,
151         0x03, 0xfc, 0x4b, 0xb4, 0x00, 0x00, 0x00,
152         0x03, 0xfc, 0x4c, 0xb3, 0xb2, 0x04, 0x00,
153         0x03, 0xfc, 0x4d, 0xb2, 0x00, 0x00, 0x00,
154         0x03, 0xfc, 0x4e, 0xb1, 0x00, 0x00, 0x00,
155         0x03, 0xfc, 0x1f, 0xe0, 0x3d, 0x00, 0x00,
156         0x03, 0xfc, 0x40, 0xbf, 0x13, 0x01, 0x00,
157         0x03, 0xfc, 0x14, 0xeb, 0x10, 0x00, 0x00,
158         0x03, 0xfc, 0x49, 0xb6, 0x05, 0x01, 0x00,
159         0x03, 0xfc, 0x50, 0xaf, 0x29, 0x00, 0x00,
160         0x03, 0xfc, 0x0c, 0xf3, 0x52, 0x00, 0x00,
161         0x03, 0xfc, 0x03, 0xfc, 0x09, 0x00, 0x00,
162         0x03, 0xfc, 0x08, 0xf7, 0x50, 0x00, 0x00,
163         0x03, 0xfc, 0x13, 0xec, 0x28, 0x00, 0x00,
164         0x03, 0xfc, 0x04, 0xfb, 0x4f, 0x00, 0x00,
165         0x03, 0xfc, 0x4f, 0xb0, 0x0f, 0x01, 0x00,
166         0x03, 0xfc, 0x10, 0xef, 0x51, 0x00, 0x00,
167         0x03, 0xfc, 0x51, 0xae, 0x3f, 0x00, 0x00,
168         0x03, 0xfc, 0x42, 0xbd, 0x13, 0x00, 0x00,
169         0x03, 0xfc, 0x43, 0xbc, 0x00, 0x00, 0x00,
170         0x03, 0xfc, 0x44, 0xbb, 0x11, 0x00, 0x00,
171         0x03, 0xfc, 0x52, 0xad, 0x19, 0x00, 0x00,
172         0x03, 0xfc, 0x54, 0xab, 0x05, 0x00, 0x00,
173         0x03, 0xfc, 0x46, 0xb9, 0x29, 0x00, 0x00,
174         0x03, 0xfc, 0x55, 0xaa, 0x2b, 0x00, 0x00,
175         0x03, 0xfc, 0x53, 0xac, 0x41, 0x00, 0x00,
176         0x03, 0xfc, 0x05, 0xfa, 0x1e, 0x00, 0x00,
177         0x03, 0xfc, 0x06, 0xf9, 0x1f, 0x00, 0x00,
178         0x03, 0xfc, 0x07, 0xf8, 0x20, 0x00, 0x00,
179         0x03, 0xfc, 0x1e, 0xe1, 0x19, 0x00, 0x00,
180         0x03, 0xfc, 0x09, 0xf6, 0x21, 0x00, 0x00,
181         0x03, 0xfc, 0x0a, 0xf5, 0x22, 0x00, 0x00,
182         0x03, 0xfc, 0x0b, 0xf4, 0x23, 0x00, 0x00,
183         0x03, 0xfc, 0x1b, 0xe4, 0x16, 0x00, 0x00,
184         0x03, 0xfc, 0x0d, 0xf2, 0x24, 0x00, 0x00,
185         0x03, 0xfc, 0x0e, 0xf1, 0x25, 0x00, 0x00,
186         0x03, 0xfc, 0x0f, 0xf0, 0x26, 0x00, 0x00,
187         0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00,
188         0x03, 0xfc, 0x41, 0xbe, 0x37, 0x00, 0x00,
189         0x03, 0xfc, 0x12, 0xed, 0x27, 0x00, 0x00,
190         0x03, 0xfc, 0x11, 0xee, 0x2a, 0x00, 0x00,
191         0x03, 0xfc, 0x48, 0xb7, 0x2c, 0x00, 0x00,
192         0x03, 0xfc, 0x4a, 0xb5, 0x3c, 0x00, 0x00,
193         0x03, 0xfc, 0x47, 0xb8, 0x15, 0x01, 0x00,
194         0x03, 0xfc, 0x45, 0xba, 0x0b, 0x01, 0x00,
195         0x03, 0xfc, 0x5e, 0xa1, 0x43, 0x00, 0x00,
196         0x03, 0xfc, 0x5a, 0xa5, 0x42, 0x00, 0x00,
197         0x03, 0xfc, 0x5b, 0xa4, 0x4b, 0x00, 0x00,
198         0x03, 0xfc, 0x5f, 0xa0, 0x4e, 0x00, 0x00,
199 };
200
201 /* TwinHan AzureWave AD-TU700(704J) */
202 static struct dvb_usb_rc_key af9015_rc_keys_twinhan[] = {
203         { 0x05, 0x3f, KEY_POWER },
204         { 0x00, 0x19, KEY_FAVORITES },    /* Favorite List */
205         { 0x00, 0x04, KEY_TEXT },         /* Teletext */
206         { 0x00, 0x0e, KEY_POWER },
207         { 0x00, 0x0e, KEY_INFO },         /* Preview */
208         { 0x00, 0x08, KEY_EPG },          /* Info/EPG */
209         { 0x00, 0x0f, KEY_LIST },         /* Record List */
210         { 0x00, 0x1e, KEY_1 },
211         { 0x00, 0x1f, KEY_2 },
212         { 0x00, 0x20, KEY_3 },
213         { 0x00, 0x21, KEY_4 },
214         { 0x00, 0x22, KEY_5 },
215         { 0x00, 0x23, KEY_6 },
216         { 0x00, 0x24, KEY_7 },
217         { 0x00, 0x25, KEY_8 },
218         { 0x00, 0x26, KEY_9 },
219         { 0x00, 0x27, KEY_0 },
220         { 0x00, 0x29, KEY_CANCEL },       /* Cancel */
221         { 0x00, 0x4c, KEY_CLEAR },        /* Clear */
222         { 0x00, 0x2a, KEY_BACK },         /* Back */
223         { 0x00, 0x2b, KEY_TAB },          /* Tab */
224         { 0x00, 0x52, KEY_UP },           /* up arrow */
225         { 0x00, 0x51, KEY_DOWN },         /* down arrow */
226         { 0x00, 0x4f, KEY_RIGHT },        /* right arrow */
227         { 0x00, 0x50, KEY_LEFT },         /* left arrow */
228         { 0x00, 0x28, KEY_ENTER },        /* Enter / ok */
229         { 0x02, 0x52, KEY_VOLUMEUP },
230         { 0x02, 0x51, KEY_VOLUMEDOWN },
231         { 0x00, 0x4e, KEY_CHANNELDOWN },
232         { 0x00, 0x4b, KEY_CHANNELUP },
233         { 0x00, 0x4a, KEY_RECORD },
234         { 0x01, 0x11, KEY_PLAY },
235         { 0x00, 0x17, KEY_PAUSE },
236         { 0x00, 0x0c, KEY_REWIND },       /* FR << */
237         { 0x00, 0x11, KEY_FASTFORWARD },  /* FF >> */
238         { 0x01, 0x15, KEY_PREVIOUS },     /* Replay */
239         { 0x01, 0x0e, KEY_NEXT },         /* Skip */
240         { 0x00, 0x13, KEY_CAMERA },       /* Capture */
241         { 0x01, 0x0f, KEY_LANGUAGE },     /* SAP */
242         { 0x01, 0x13, KEY_TV2 },          /* PIP */
243         { 0x00, 0x1d, KEY_ZOOM },         /* Full Screen */
244         { 0x01, 0x17, KEY_SUBTITLE },     /* Subtitle / CC */
245         { 0x00, 0x10, KEY_MUTE },
246         { 0x01, 0x19, KEY_AUDIO },        /* L/R */ /* TODO better event */
247         { 0x01, 0x16, KEY_SLEEP },        /* Hibernate */
248         { 0x01, 0x16, KEY_SWITCHVIDEOMODE },
249                                           /* A/V */ /* TODO does not work */
250         { 0x00, 0x06, KEY_AGAIN },        /* Recall */
251         { 0x01, 0x16, KEY_KPPLUS },       /* Zoom+ */ /* TODO does not work */
252         { 0x01, 0x16, KEY_KPMINUS },      /* Zoom- */ /* TODO does not work */
253         { 0x02, 0x15, KEY_RED },
254         { 0x02, 0x0a, KEY_GREEN },
255         { 0x02, 0x1c, KEY_YELLOW },
256         { 0x02, 0x05, KEY_BLUE },
257 };
258
259 static u8 af9015_ir_table_twinhan[] = {
260         0x00, 0xff, 0x16, 0xe9, 0x3f, 0x05, 0x00,
261         0x00, 0xff, 0x07, 0xf8, 0x16, 0x01, 0x00,
262         0x00, 0xff, 0x14, 0xeb, 0x11, 0x01, 0x00,
263         0x00, 0xff, 0x1a, 0xe5, 0x4d, 0x00, 0x00,
264         0x00, 0xff, 0x4c, 0xb3, 0x17, 0x00, 0x00,
265         0x00, 0xff, 0x12, 0xed, 0x11, 0x00, 0x00,
266         0x00, 0xff, 0x40, 0xbf, 0x0c, 0x00, 0x00,
267         0x00, 0xff, 0x11, 0xee, 0x4a, 0x00, 0x00,
268         0x00, 0xff, 0x54, 0xab, 0x13, 0x00, 0x00,
269         0x00, 0xff, 0x41, 0xbe, 0x15, 0x01, 0x00,
270         0x00, 0xff, 0x42, 0xbd, 0x0e, 0x01, 0x00,
271         0x00, 0xff, 0x43, 0xbc, 0x17, 0x01, 0x00,
272         0x00, 0xff, 0x50, 0xaf, 0x0f, 0x01, 0x00,
273         0x00, 0xff, 0x4d, 0xb2, 0x1d, 0x00, 0x00,
274         0x00, 0xff, 0x47, 0xb8, 0x13, 0x01, 0x00,
275         0x00, 0xff, 0x05, 0xfa, 0x4b, 0x00, 0x00,
276         0x00, 0xff, 0x02, 0xfd, 0x4e, 0x00, 0x00,
277         0x00, 0xff, 0x0e, 0xf1, 0x06, 0x00, 0x00,
278         0x00, 0xff, 0x1e, 0xe1, 0x52, 0x02, 0x00,
279         0x00, 0xff, 0x0a, 0xf5, 0x51, 0x02, 0x00,
280         0x00, 0xff, 0x10, 0xef, 0x10, 0x00, 0x00,
281         0x00, 0xff, 0x49, 0xb6, 0x19, 0x01, 0x00,
282         0x00, 0xff, 0x15, 0xea, 0x27, 0x00, 0x00,
283         0x00, 0xff, 0x03, 0xfc, 0x1e, 0x00, 0x00,
284         0x00, 0xff, 0x01, 0xfe, 0x1f, 0x00, 0x00,
285         0x00, 0xff, 0x06, 0xf9, 0x20, 0x00, 0x00,
286         0x00, 0xff, 0x09, 0xf6, 0x21, 0x00, 0x00,
287         0x00, 0xff, 0x1d, 0xe2, 0x22, 0x00, 0x00,
288         0x00, 0xff, 0x1f, 0xe0, 0x23, 0x00, 0x00,
289         0x00, 0xff, 0x0d, 0xf2, 0x24, 0x00, 0x00,
290         0x00, 0xff, 0x19, 0xe6, 0x25, 0x00, 0x00,
291         0x00, 0xff, 0x1b, 0xe4, 0x26, 0x00, 0x00,
292         0x00, 0xff, 0x00, 0xff, 0x2b, 0x00, 0x00,
293         0x00, 0xff, 0x4a, 0xb5, 0x4c, 0x00, 0x00,
294         0x00, 0xff, 0x4b, 0xb4, 0x52, 0x00, 0x00,
295         0x00, 0xff, 0x51, 0xae, 0x51, 0x00, 0x00,
296         0x00, 0xff, 0x52, 0xad, 0x4f, 0x00, 0x00,
297         0x00, 0xff, 0x4e, 0xb1, 0x50, 0x00, 0x00,
298         0x00, 0xff, 0x0c, 0xf3, 0x29, 0x00, 0x00,
299         0x00, 0xff, 0x4f, 0xb0, 0x28, 0x00, 0x00,
300         0x00, 0xff, 0x13, 0xec, 0x2a, 0x00, 0x00,
301         0x00, 0xff, 0x17, 0xe8, 0x19, 0x00, 0x00,
302         0x00, 0xff, 0x04, 0xfb, 0x0f, 0x00, 0x00,
303         0x00, 0xff, 0x48, 0xb7, 0x0e, 0x00, 0x00,
304         0x00, 0xff, 0x0f, 0xf0, 0x04, 0x00, 0x00,
305         0x00, 0xff, 0x1c, 0xe3, 0x08, 0x00, 0x00,
306         0x00, 0xff, 0x18, 0xe7, 0x15, 0x02, 0x00,
307         0x00, 0xff, 0x53, 0xac, 0x0a, 0x02, 0x00,
308         0x00, 0xff, 0x5e, 0xa1, 0x1c, 0x02, 0x00,
309         0x00, 0xff, 0x5f, 0xa0, 0x05, 0x02, 0x00,
310 };
311
312 /* A-Link DTU(m) */
313 static struct dvb_usb_rc_key af9015_rc_keys_a_link[] = {
314         { 0x00, 0x1e, KEY_1 },
315         { 0x00, 0x1f, KEY_2 },
316         { 0x00, 0x20, KEY_3 },
317         { 0x00, 0x21, KEY_4 },
318         { 0x00, 0x22, KEY_5 },
319         { 0x00, 0x23, KEY_6 },
320         { 0x00, 0x24, KEY_7 },
321         { 0x00, 0x25, KEY_8 },
322         { 0x00, 0x26, KEY_9 },
323         { 0x00, 0x27, KEY_0 },
324         { 0x00, 0x2e, KEY_CHANNELUP },
325         { 0x00, 0x2d, KEY_CHANNELDOWN },
326         { 0x04, 0x28, KEY_ZOOM },
327         { 0x00, 0x41, KEY_MUTE },
328         { 0x00, 0x42, KEY_VOLUMEDOWN },
329         { 0x00, 0x43, KEY_VOLUMEUP },
330         { 0x00, 0x44, KEY_GOTO },         /* jump */
331         { 0x05, 0x45, KEY_POWER },
332 };
333
334 static u8 af9015_ir_table_a_link[] = {
335         0x08, 0xf7, 0x12, 0xed, 0x45, 0x05, 0x00, /* power */
336         0x08, 0xf7, 0x1a, 0xe5, 0x41, 0x00, 0x00, /* mute */
337         0x08, 0xf7, 0x01, 0xfe, 0x1e, 0x00, 0x00, /* 1 */
338         0x08, 0xf7, 0x1c, 0xe3, 0x21, 0x00, 0x00, /* 4 */
339         0x08, 0xf7, 0x03, 0xfc, 0x24, 0x00, 0x00, /* 7 */
340         0x08, 0xf7, 0x05, 0xfa, 0x28, 0x04, 0x00, /* zoom */
341         0x08, 0xf7, 0x00, 0xff, 0x43, 0x00, 0x00, /* volume up */
342         0x08, 0xf7, 0x16, 0xe9, 0x42, 0x00, 0x00, /* volume down */
343         0x08, 0xf7, 0x0f, 0xf0, 0x1f, 0x00, 0x00, /* 2 */
344         0x08, 0xf7, 0x0d, 0xf2, 0x22, 0x00, 0x00, /* 5 */
345         0x08, 0xf7, 0x1b, 0xe4, 0x25, 0x00, 0x00, /* 8 */
346         0x08, 0xf7, 0x06, 0xf9, 0x27, 0x00, 0x00, /* 0 */
347         0x08, 0xf7, 0x14, 0xeb, 0x2e, 0x00, 0x00, /* channel up */
348         0x08, 0xf7, 0x1d, 0xe2, 0x2d, 0x00, 0x00, /* channel down */
349         0x08, 0xf7, 0x02, 0xfd, 0x20, 0x00, 0x00, /* 3 */
350         0x08, 0xf7, 0x18, 0xe7, 0x23, 0x00, 0x00, /* 6 */
351         0x08, 0xf7, 0x04, 0xfb, 0x26, 0x00, 0x00, /* 9 */
352         0x08, 0xf7, 0x07, 0xf8, 0x44, 0x00, 0x00, /* jump */
353 };
354
355 /* MSI DIGIVOX mini II V3.0 */
356 static struct dvb_usb_rc_key af9015_rc_keys_msi[] = {
357         { 0x00, 0x1e, KEY_1 },
358         { 0x00, 0x1f, KEY_2 },
359         { 0x00, 0x20, KEY_3 },
360         { 0x00, 0x21, KEY_4 },
361         { 0x00, 0x22, KEY_5 },
362         { 0x00, 0x23, KEY_6 },
363         { 0x00, 0x24, KEY_7 },
364         { 0x00, 0x25, KEY_8 },
365         { 0x00, 0x26, KEY_9 },
366         { 0x00, 0x27, KEY_0 },
367         { 0x03, 0x0f, KEY_CHANNELUP },
368         { 0x03, 0x0e, KEY_CHANNELDOWN },
369         { 0x00, 0x42, KEY_VOLUMEDOWN },
370         { 0x00, 0x43, KEY_VOLUMEUP },
371         { 0x05, 0x45, KEY_POWER },
372         { 0x00, 0x52, KEY_UP },           /* up */
373         { 0x00, 0x51, KEY_DOWN },         /* down */
374         { 0x00, 0x28, KEY_ENTER },
375 };
376
377 static u8 af9015_ir_table_msi[] = {
378         0x03, 0xfc, 0x17, 0xe8, 0x45, 0x05, 0x00, /* power */
379         0x03, 0xfc, 0x0d, 0xf2, 0x51, 0x00, 0x00, /* down */
380         0x03, 0xfc, 0x03, 0xfc, 0x52, 0x00, 0x00, /* up */
381         0x03, 0xfc, 0x1a, 0xe5, 0x1e, 0x00, 0x00, /* 1 */
382         0x03, 0xfc, 0x02, 0xfd, 0x1f, 0x00, 0x00, /* 2 */
383         0x03, 0xfc, 0x04, 0xfb, 0x20, 0x00, 0x00, /* 3 */
384         0x03, 0xfc, 0x1c, 0xe3, 0x21, 0x00, 0x00, /* 4 */
385         0x03, 0xfc, 0x08, 0xf7, 0x22, 0x00, 0x00, /* 5 */
386         0x03, 0xfc, 0x1d, 0xe2, 0x23, 0x00, 0x00, /* 6 */
387         0x03, 0xfc, 0x11, 0xee, 0x24, 0x00, 0x00, /* 7 */
388         0x03, 0xfc, 0x0b, 0xf4, 0x25, 0x00, 0x00, /* 8 */
389         0x03, 0xfc, 0x10, 0xef, 0x26, 0x00, 0x00, /* 9 */
390         0x03, 0xfc, 0x09, 0xf6, 0x27, 0x00, 0x00, /* 0 */
391         0x03, 0xfc, 0x14, 0xeb, 0x43, 0x00, 0x00, /* volume up */
392         0x03, 0xfc, 0x1f, 0xe0, 0x42, 0x00, 0x00, /* volume down */
393         0x03, 0xfc, 0x15, 0xea, 0x0f, 0x03, 0x00, /* channel up */
394         0x03, 0xfc, 0x05, 0xfa, 0x0e, 0x03, 0x00, /* channel down */
395         0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00, /* enter */
396 };
397
398 /* MYGICTV U718 */
399 static struct dvb_usb_rc_key af9015_rc_keys_mygictv[] = {
400         { 0x00, 0x3d, KEY_SWITCHVIDEOMODE },
401                                           /* TV / AV */
402         { 0x05, 0x45, KEY_POWER },
403         { 0x00, 0x1e, KEY_1 },
404         { 0x00, 0x1f, KEY_2 },
405         { 0x00, 0x20, KEY_3 },
406         { 0x00, 0x21, KEY_4 },
407         { 0x00, 0x22, KEY_5 },
408         { 0x00, 0x23, KEY_6 },
409         { 0x00, 0x24, KEY_7 },
410         { 0x00, 0x25, KEY_8 },
411         { 0x00, 0x26, KEY_9 },
412         { 0x00, 0x27, KEY_0 },
413         { 0x00, 0x41, KEY_MUTE },
414         { 0x00, 0x2a, KEY_ESC },          /* Esc */
415         { 0x00, 0x2e, KEY_CHANNELUP },
416         { 0x00, 0x2d, KEY_CHANNELDOWN },
417         { 0x00, 0x42, KEY_VOLUMEDOWN },
418         { 0x00, 0x43, KEY_VOLUMEUP },
419         { 0x00, 0x52, KEY_UP },           /* up arrow */
420         { 0x00, 0x51, KEY_DOWN },         /* down arrow */
421         { 0x00, 0x4f, KEY_RIGHT },        /* right arrow */
422         { 0x00, 0x50, KEY_LEFT },         /* left arrow */
423         { 0x00, 0x28, KEY_ENTER },        /* ok */
424         { 0x01, 0x15, KEY_RECORD },
425         { 0x03, 0x13, KEY_PLAY },
426         { 0x01, 0x13, KEY_PAUSE },
427         { 0x01, 0x16, KEY_STOP },
428         { 0x03, 0x07, KEY_REWIND },       /* FR << */
429         { 0x03, 0x09, KEY_FASTFORWARD },  /* FF >> */
430         { 0x00, 0x3b, KEY_TIME },         /* TimeShift */
431         { 0x00, 0x3e, KEY_CAMERA },       /* Snapshot */
432         { 0x03, 0x16, KEY_CYCLEWINDOWS }, /* yellow, min / max */
433         { 0x00, 0x00, KEY_ZOOM },         /* 'select' (?) */
434         { 0x03, 0x16, KEY_SHUFFLE },      /* Shuffle */
435         { 0x03, 0x45, KEY_POWER },
436 };
437
438 static u8 af9015_ir_table_mygictv[] = {
439         0x02, 0xbd, 0x0c, 0xf3, 0x3d, 0x00, 0x00, /* TV / AV */
440         0x02, 0xbd, 0x14, 0xeb, 0x45, 0x05, 0x00, /* power */
441         0x02, 0xbd, 0x00, 0xff, 0x1e, 0x00, 0x00, /* 1 */
442         0x02, 0xbd, 0x01, 0xfe, 0x1f, 0x00, 0x00, /* 2 */
443         0x02, 0xbd, 0x02, 0xfd, 0x20, 0x00, 0x00, /* 3 */
444         0x02, 0xbd, 0x03, 0xfc, 0x21, 0x00, 0x00, /* 4 */
445         0x02, 0xbd, 0x04, 0xfb, 0x22, 0x00, 0x00, /* 5 */
446         0x02, 0xbd, 0x05, 0xfa, 0x23, 0x00, 0x00, /* 6 */
447         0x02, 0xbd, 0x06, 0xf9, 0x24, 0x00, 0x00, /* 7 */
448         0x02, 0xbd, 0x07, 0xf8, 0x25, 0x00, 0x00, /* 8 */
449         0x02, 0xbd, 0x08, 0xf7, 0x26, 0x00, 0x00, /* 9 */
450         0x02, 0xbd, 0x09, 0xf6, 0x27, 0x00, 0x00, /* 0 */
451         0x02, 0xbd, 0x0a, 0xf5, 0x41, 0x00, 0x00, /* mute */
452         0x02, 0xbd, 0x1c, 0xe3, 0x2a, 0x00, 0x00, /* esc */
453         0x02, 0xbd, 0x1f, 0xe0, 0x43, 0x00, 0x00, /* volume up */
454         0x02, 0xbd, 0x12, 0xed, 0x52, 0x00, 0x00, /* up arrow */
455         0x02, 0xbd, 0x11, 0xee, 0x50, 0x00, 0x00, /* left arrow */
456         0x02, 0xbd, 0x15, 0xea, 0x28, 0x00, 0x00, /* ok */
457         0x02, 0xbd, 0x10, 0xef, 0x4f, 0x00, 0x00, /* right arrow */
458         0x02, 0xbd, 0x13, 0xec, 0x51, 0x00, 0x00, /* down arrow */
459         0x02, 0xbd, 0x0e, 0xf1, 0x42, 0x00, 0x00, /* volume down */
460         0x02, 0xbd, 0x19, 0xe6, 0x15, 0x01, 0x00, /* record */
461         0x02, 0xbd, 0x1e, 0xe1, 0x13, 0x03, 0x00, /* play */
462         0x02, 0xbd, 0x16, 0xe9, 0x16, 0x01, 0x00, /* stop */
463         0x02, 0xbd, 0x0b, 0xf4, 0x28, 0x04, 0x00, /* yellow, min / max */
464         0x02, 0xbd, 0x0f, 0xf0, 0x3b, 0x00, 0x00, /* time shift */
465         0x02, 0xbd, 0x18, 0xe7, 0x2e, 0x00, 0x00, /* channel up */
466         0x02, 0xbd, 0x1a, 0xe5, 0x2d, 0x00, 0x00, /* channel down */
467         0x02, 0xbd, 0x17, 0xe8, 0x3e, 0x00, 0x00, /* snapshot */
468         0x02, 0xbd, 0x40, 0xbf, 0x13, 0x01, 0x00, /* pause */
469         0x02, 0xbd, 0x41, 0xbe, 0x09, 0x03, 0x00, /* FF >> */
470         0x02, 0xbd, 0x42, 0xbd, 0x07, 0x03, 0x00, /* FR << */
471         0x02, 0xbd, 0x43, 0xbc, 0x00, 0x00, 0x00, /* 'select' (?) */
472         0x02, 0xbd, 0x44, 0xbb, 0x16, 0x03, 0x00, /* shuffle */
473         0x02, 0xbd, 0x45, 0xba, 0x45, 0x03, 0x00, /* power */
474 };
475
476 /* KWorld PlusTV Dual DVB-T Stick (DVB-T 399U) */
477 static u8 af9015_ir_table_kworld[] = {
478         0x86, 0x6b, 0x0c, 0xf3, 0x2e, 0x07, 0x00,
479         0x86, 0x6b, 0x16, 0xe9, 0x2d, 0x07, 0x00,
480         0x86, 0x6b, 0x1d, 0xe2, 0x37, 0x07, 0x00,
481         0x86, 0x6b, 0x00, 0xff, 0x1e, 0x07, 0x00,
482         0x86, 0x6b, 0x01, 0xfe, 0x1f, 0x07, 0x00,
483         0x86, 0x6b, 0x02, 0xfd, 0x20, 0x07, 0x00,
484         0x86, 0x6b, 0x03, 0xfc, 0x21, 0x07, 0x00,
485         0x86, 0x6b, 0x04, 0xfb, 0x22, 0x07, 0x00,
486         0x86, 0x6b, 0x05, 0xfa, 0x23, 0x07, 0x00,
487         0x86, 0x6b, 0x06, 0xf9, 0x24, 0x07, 0x00,
488         0x86, 0x6b, 0x07, 0xf8, 0x25, 0x07, 0x00,
489         0x86, 0x6b, 0x08, 0xf7, 0x26, 0x07, 0x00,
490         0x86, 0x6b, 0x09, 0xf6, 0x4d, 0x07, 0x00,
491         0x86, 0x6b, 0x0a, 0xf5, 0x4e, 0x07, 0x00,
492         0x86, 0x6b, 0x14, 0xeb, 0x4f, 0x07, 0x00,
493         0x86, 0x6b, 0x1e, 0xe1, 0x50, 0x07, 0x00,
494         0x86, 0x6b, 0x17, 0xe8, 0x52, 0x07, 0x00,
495         0x86, 0x6b, 0x1f, 0xe0, 0x51, 0x07, 0x00,
496         0x86, 0x6b, 0x0e, 0xf1, 0x0b, 0x07, 0x00,
497         0x86, 0x6b, 0x20, 0xdf, 0x0c, 0x07, 0x00,
498         0x86, 0x6b, 0x42, 0xbd, 0x0d, 0x07, 0x00,
499         0x86, 0x6b, 0x0b, 0xf4, 0x0e, 0x07, 0x00,
500         0x86, 0x6b, 0x43, 0xbc, 0x0f, 0x07, 0x00,
501         0x86, 0x6b, 0x10, 0xef, 0x10, 0x07, 0x00,
502         0x86, 0x6b, 0x21, 0xde, 0x11, 0x07, 0x00,
503         0x86, 0x6b, 0x13, 0xec, 0x12, 0x07, 0x00,
504         0x86, 0x6b, 0x11, 0xee, 0x13, 0x07, 0x00,
505         0x86, 0x6b, 0x12, 0xed, 0x14, 0x07, 0x00,
506         0x86, 0x6b, 0x19, 0xe6, 0x15, 0x07, 0x00,
507         0x86, 0x6b, 0x1a, 0xe5, 0x16, 0x07, 0x00,
508         0x86, 0x6b, 0x1b, 0xe4, 0x17, 0x07, 0x00,
509         0x86, 0x6b, 0x4b, 0xb4, 0x18, 0x07, 0x00,
510         0x86, 0x6b, 0x40, 0xbf, 0x19, 0x07, 0x00,
511         0x86, 0x6b, 0x44, 0xbb, 0x1a, 0x07, 0x00,
512         0x86, 0x6b, 0x41, 0xbe, 0x1b, 0x07, 0x00,
513         0x86, 0x6b, 0x22, 0xdd, 0x1c, 0x07, 0x00,
514         0x86, 0x6b, 0x15, 0xea, 0x1d, 0x07, 0x00,
515         0x86, 0x6b, 0x0f, 0xf0, 0x3f, 0x07, 0x00,
516         0x86, 0x6b, 0x1c, 0xe3, 0x40, 0x07, 0x00,
517         0x86, 0x6b, 0x4a, 0xb5, 0x41, 0x07, 0x00,
518         0x86, 0x6b, 0x48, 0xb7, 0x42, 0x07, 0x00,
519         0x86, 0x6b, 0x49, 0xb6, 0x43, 0x07, 0x00,
520         0x86, 0x6b, 0x18, 0xe7, 0x44, 0x07, 0x00,
521         0x86, 0x6b, 0x23, 0xdc, 0x45, 0x07, 0x00,
522 };
523
524 /* AverMedia Volar X */
525 static struct dvb_usb_rc_key af9015_rc_keys_avermedia[] = {
526         { 0x05, 0x3d, KEY_PROG1 },       /* SOURCE */
527         { 0x05, 0x12, KEY_POWER },       /* POWER */
528         { 0x05, 0x1e, KEY_1 },           /* 1 */
529         { 0x05, 0x1f, KEY_2 },           /* 2 */
530         { 0x05, 0x20, KEY_3 },           /* 3 */
531         { 0x05, 0x21, KEY_4 },           /* 4 */
532         { 0x05, 0x22, KEY_5 },           /* 5 */
533         { 0x05, 0x23, KEY_6 },           /* 6 */
534         { 0x05, 0x24, KEY_7 },           /* 7 */
535         { 0x05, 0x25, KEY_8 },           /* 8 */
536         { 0x05, 0x26, KEY_9 },           /* 9 */
537         { 0x05, 0x3f, KEY_LEFT },        /* L / DISPLAY */
538         { 0x05, 0x27, KEY_0 },           /* 0 */
539         { 0x05, 0x0f, KEY_RIGHT },       /* R / CH RTN */
540         { 0x05, 0x18, KEY_PROG2 },       /* SNAP SHOT */
541         { 0x05, 0x1c, KEY_PROG3 },       /* 16-CH PREV */
542         { 0x05, 0x2d, KEY_VOLUMEDOWN },  /* VOL DOWN */
543         { 0x05, 0x3e, KEY_ZOOM },        /* FULL SCREEN */
544         { 0x05, 0x2e, KEY_VOLUMEUP },    /* VOL UP */
545         { 0x05, 0x10, KEY_MUTE },        /* MUTE */
546         { 0x05, 0x04, KEY_AUDIO },       /* AUDIO */
547         { 0x05, 0x15, KEY_RECORD },      /* RECORD */
548         { 0x05, 0x11, KEY_PLAY },        /* PLAY */
549         { 0x05, 0x16, KEY_STOP },        /* STOP */
550         { 0x05, 0x0c, KEY_PLAYPAUSE },   /* TIMESHIFT / PAUSE */
551         { 0x05, 0x05, KEY_BACK },        /* << / RED */
552         { 0x05, 0x09, KEY_FORWARD },     /* >> / YELLOW */
553         { 0x05, 0x17, KEY_TEXT },        /* TELETEXT */
554         { 0x05, 0x0a, KEY_EPG },         /* EPG */
555         { 0x05, 0x13, KEY_MENU },        /* MENU */
556
557         { 0x05, 0x0e, KEY_CHANNELUP },   /* CH UP */
558         { 0x05, 0x0d, KEY_CHANNELDOWN }, /* CH DOWN */
559         { 0x05, 0x19, KEY_FIRST },       /* |<< / GREEN */
560         { 0x05, 0x08, KEY_LAST },        /* >>| / BLUE */
561 };
562
563 static u8 af9015_ir_table_avermedia[] = {
564         0x02, 0xfd, 0x00, 0xff, 0x12, 0x05, 0x00,
565         0x02, 0xfd, 0x01, 0xfe, 0x3d, 0x05, 0x00,
566         0x02, 0xfd, 0x03, 0xfc, 0x17, 0x05, 0x00,
567         0x02, 0xfd, 0x04, 0xfb, 0x0a, 0x05, 0x00,
568         0x02, 0xfd, 0x05, 0xfa, 0x1e, 0x05, 0x00,
569         0x02, 0xfd, 0x06, 0xf9, 0x1f, 0x05, 0x00,
570         0x02, 0xfd, 0x07, 0xf8, 0x20, 0x05, 0x00,
571         0x02, 0xfd, 0x09, 0xf6, 0x21, 0x05, 0x00,
572         0x02, 0xfd, 0x0a, 0xf5, 0x22, 0x05, 0x00,
573         0x02, 0xfd, 0x0b, 0xf4, 0x23, 0x05, 0x00,
574         0x02, 0xfd, 0x0d, 0xf2, 0x24, 0x05, 0x00,
575         0x02, 0xfd, 0x0e, 0xf1, 0x25, 0x05, 0x00,
576         0x02, 0xfd, 0x0f, 0xf0, 0x26, 0x05, 0x00,
577         0x02, 0xfd, 0x11, 0xee, 0x27, 0x05, 0x00,
578         0x02, 0xfd, 0x08, 0xf7, 0x04, 0x05, 0x00,
579         0x02, 0xfd, 0x0c, 0xf3, 0x3e, 0x05, 0x00,
580         0x02, 0xfd, 0x10, 0xef, 0x1c, 0x05, 0x00,
581         0x02, 0xfd, 0x12, 0xed, 0x3f, 0x05, 0x00,
582         0x02, 0xfd, 0x13, 0xec, 0x0f, 0x05, 0x00,
583         0x02, 0xfd, 0x14, 0xeb, 0x10, 0x05, 0x00,
584         0x02, 0xfd, 0x15, 0xea, 0x13, 0x05, 0x00,
585         0x02, 0xfd, 0x17, 0xe8, 0x18, 0x05, 0x00,
586         0x02, 0xfd, 0x18, 0xe7, 0x11, 0x05, 0x00,
587         0x02, 0xfd, 0x19, 0xe6, 0x15, 0x05, 0x00,
588         0x02, 0xfd, 0x1a, 0xe5, 0x0c, 0x05, 0x00,
589         0x02, 0xfd, 0x1b, 0xe4, 0x16, 0x05, 0x00,
590         0x02, 0xfd, 0x1c, 0xe3, 0x09, 0x05, 0x00,
591         0x02, 0xfd, 0x1d, 0xe2, 0x05, 0x05, 0x00,
592         0x02, 0xfd, 0x1e, 0xe1, 0x2d, 0x05, 0x00,
593         0x02, 0xfd, 0x1f, 0xe0, 0x2e, 0x05, 0x00,
594         0x03, 0xfc, 0x00, 0xff, 0x08, 0x05, 0x00,
595         0x03, 0xfc, 0x01, 0xfe, 0x19, 0x05, 0x00,
596         0x03, 0xfc, 0x02, 0xfd, 0x0d, 0x05, 0x00,
597         0x03, 0xfc, 0x03, 0xfc, 0x0e, 0x05, 0x00,
598 };
599
600 /* Digittrade DVB-T USB Stick */
601 static struct dvb_usb_rc_key af9015_rc_keys_digittrade[] = {
602         { 0x01, 0x0f, KEY_LAST },       /* RETURN */
603         { 0x05, 0x17, KEY_TEXT },       /* TELETEXT */
604         { 0x01, 0x08, KEY_EPG },        /* EPG */
605         { 0x05, 0x13, KEY_POWER },      /* POWER */
606         { 0x01, 0x09, KEY_ZOOM },       /* FULLSCREEN */
607         { 0x00, 0x40, KEY_AUDIO },      /* DUAL SOUND */
608         { 0x00, 0x2c, KEY_PRINT },      /* SNAPSHOT */
609         { 0x05, 0x16, KEY_SUBTITLE },   /* SUBTITLE */
610         { 0x00, 0x52, KEY_CHANNELUP },  /* CH Up */
611         { 0x00, 0x51, KEY_CHANNELDOWN },/* Ch Dn */
612         { 0x00, 0x57, KEY_VOLUMEUP },   /* Vol Up */
613         { 0x00, 0x56, KEY_VOLUMEDOWN }, /* Vol Dn */
614         { 0x01, 0x10, KEY_MUTE },       /* MUTE */
615         { 0x00, 0x27, KEY_0 },
616         { 0x00, 0x1e, KEY_1 },
617         { 0x00, 0x1f, KEY_2 },
618         { 0x00, 0x20, KEY_3 },
619         { 0x00, 0x21, KEY_4 },
620         { 0x00, 0x22, KEY_5 },
621         { 0x00, 0x23, KEY_6 },
622         { 0x00, 0x24, KEY_7 },
623         { 0x00, 0x25, KEY_8 },
624         { 0x00, 0x26, KEY_9 },
625         { 0x01, 0x17, KEY_PLAYPAUSE },  /* TIMESHIFT */
626         { 0x01, 0x15, KEY_RECORD },     /* RECORD */
627         { 0x03, 0x13, KEY_PLAY },       /* PLAY */
628         { 0x01, 0x16, KEY_STOP },       /* STOP */
629         { 0x01, 0x13, KEY_PAUSE },      /* PAUSE */
630 };
631
632 static u8 af9015_ir_table_digittrade[] = {
633         0x00, 0xff, 0x06, 0xf9, 0x13, 0x05, 0x00,
634         0x00, 0xff, 0x4d, 0xb2, 0x17, 0x01, 0x00,
635         0x00, 0xff, 0x1f, 0xe0, 0x2c, 0x00, 0x00,
636         0x00, 0xff, 0x0a, 0xf5, 0x15, 0x01, 0x00,
637         0x00, 0xff, 0x0e, 0xf1, 0x16, 0x01, 0x00,
638         0x00, 0xff, 0x09, 0xf6, 0x09, 0x01, 0x00,
639         0x00, 0xff, 0x01, 0xfe, 0x08, 0x01, 0x00,
640         0x00, 0xff, 0x05, 0xfa, 0x10, 0x01, 0x00,
641         0x00, 0xff, 0x02, 0xfd, 0x56, 0x00, 0x00,
642         0x00, 0xff, 0x40, 0xbf, 0x57, 0x00, 0x00,
643         0x00, 0xff, 0x19, 0xe6, 0x52, 0x00, 0x00,
644         0x00, 0xff, 0x17, 0xe8, 0x51, 0x00, 0x00,
645         0x00, 0xff, 0x10, 0xef, 0x0f, 0x01, 0x00,
646         0x00, 0xff, 0x54, 0xab, 0x27, 0x00, 0x00,
647         0x00, 0xff, 0x1b, 0xe4, 0x1e, 0x00, 0x00,
648         0x00, 0xff, 0x11, 0xee, 0x1f, 0x00, 0x00,
649         0x00, 0xff, 0x15, 0xea, 0x20, 0x00, 0x00,
650         0x00, 0xff, 0x12, 0xed, 0x21, 0x00, 0x00,
651         0x00, 0xff, 0x16, 0xe9, 0x22, 0x00, 0x00,
652         0x00, 0xff, 0x4c, 0xb3, 0x23, 0x00, 0x00,
653         0x00, 0xff, 0x48, 0xb7, 0x24, 0x00, 0x00,
654         0x00, 0xff, 0x04, 0xfb, 0x25, 0x00, 0x00,
655         0x00, 0xff, 0x00, 0xff, 0x26, 0x00, 0x00,
656         0x00, 0xff, 0x1e, 0xe1, 0x13, 0x03, 0x00,
657         0x00, 0xff, 0x1a, 0xe5, 0x13, 0x01, 0x00,
658         0x00, 0xff, 0x03, 0xfc, 0x17, 0x05, 0x00,
659         0x00, 0xff, 0x0d, 0xf2, 0x16, 0x05, 0x00,
660         0x00, 0xff, 0x1d, 0xe2, 0x40, 0x00, 0x00,
661 };
662
663 #endif