af9015.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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. #ifndef _DVB_USB_AF9015_H_
  24. #define _DVB_USB_AF9015_H_
  25. #define DVB_USB_LOG_PREFIX "af9015"
  26. #include "dvb-usb.h"
  27. #define deb_info(args...) dprintk(dvb_usb_af9015_debug, 0x01, args)
  28. #define deb_rc(args...) dprintk(dvb_usb_af9015_debug, 0x02, args)
  29. #define deb_xfer(args...) dprintk(dvb_usb_af9015_debug, 0x04, args)
  30. #define deb_reg(args...) dprintk(dvb_usb_af9015_debug, 0x08, args)
  31. #define deb_i2c(args...) dprintk(dvb_usb_af9015_debug, 0x10, args)
  32. #define deb_fw(args...) dprintk(dvb_usb_af9015_debug, 0x20, args)
  33. #define AF9015_I2C_EEPROM 0xa0
  34. #define AF9015_I2C_DEMOD 0x38
  35. #define AF9015_USB_TIMEOUT 2000
  36. /* EEPROM locations */
  37. #define AF9015_EEPROM_IR_MODE 0x18
  38. #define AF9015_EEPROM_IR_REMOTE_TYPE 0x34
  39. #define AF9015_EEPROM_TS_MODE 0x31
  40. #define AF9015_EEPROM_DEMOD2_I2C 0x32
  41. #define AF9015_EEPROM_SAW_BW1 0x35
  42. #define AF9015_EEPROM_XTAL_TYPE1 0x36
  43. #define AF9015_EEPROM_SPEC_INV1 0x37
  44. #define AF9015_EEPROM_IF1L 0x38
  45. #define AF9015_EEPROM_IF1H 0x39
  46. #define AF9015_EEPROM_MT2060_IF1L 0x3a
  47. #define AF9015_EEPROM_MT2060_IF1H 0x3b
  48. #define AF9015_EEPROM_TUNER_ID1 0x3c
  49. #define AF9015_EEPROM_SAW_BW2 0x45
  50. #define AF9015_EEPROM_XTAL_TYPE2 0x46
  51. #define AF9015_EEPROM_SPEC_INV2 0x47
  52. #define AF9015_EEPROM_IF2L 0x48
  53. #define AF9015_EEPROM_IF2H 0x49
  54. #define AF9015_EEPROM_MT2060_IF2L 0x4a
  55. #define AF9015_EEPROM_MT2060_IF2H 0x4b
  56. #define AF9015_EEPROM_TUNER_ID2 0x4c
  57. #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1)
  58. #define AF9015_GPIO_ON (1 << 0)
  59. #define AF9015_GPIO_EN (1 << 1)
  60. #define AF9015_GPIO_O (1 << 2)
  61. #define AF9015_GPIO_I (1 << 3)
  62. #define AF9015_GPIO_TUNER_ON (AF9015_GPIO_ON|AF9015_GPIO_EN)
  63. #define AF9015_GPIO_TUNER_OFF (AF9015_GPIO_ON|AF9015_GPIO_EN|AF9015_GPIO_O)
  64. struct req_t {
  65. u8 cmd; /* [0] */
  66. /* seq */ /* [1] */
  67. u8 i2c_addr; /* [2] */
  68. u16 addr; /* [3|4] */
  69. u8 mbox; /* [5] */
  70. u8 addr_len; /* [6] */
  71. u8 data_len; /* [7] */
  72. u8 *data;
  73. };
  74. enum af9015_cmd {
  75. GET_CONFIG = 0x10,
  76. DOWNLOAD_FIRMWARE = 0x11,
  77. BOOT = 0x13,
  78. READ_MEMORY = 0x20,
  79. WRITE_MEMORY = 0x21,
  80. READ_WRITE_I2C = 0x22,
  81. COPY_FIRMWARE = 0x23,
  82. RECONNECT_USB = 0x5a,
  83. WRITE_VIRTUAL_MEMORY = 0x26,
  84. GET_IR_CODE = 0x27,
  85. READ_I2C,
  86. WRITE_I2C,
  87. };
  88. enum af9015_ir_mode {
  89. AF9015_IR_MODE_DISABLED = 0,
  90. AF9015_IR_MODE_HID,
  91. AF9015_IR_MODE_RLC,
  92. AF9015_IR_MODE_RC6,
  93. };
  94. struct af9015_state {
  95. struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */
  96. };
  97. struct af9015_config {
  98. u8 dual_mode:1;
  99. u16 mt2060_if1[2];
  100. u16 firmware_size;
  101. u16 firmware_checksum;
  102. u8 *ir_table;
  103. u16 ir_table_size;
  104. };
  105. enum af9015_remote {
  106. AF9015_REMOTE_NONE = 0,
  107. AF9015_REMOTE_A_LINK_DTU_M,
  108. AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
  109. AF9015_REMOTE_MYGICTV_U718,
  110. };
  111. /* Leadtek WinFast DTV Dongle Gold */
  112. static struct dvb_usb_rc_key af9015_rc_keys_leadtek[] = {
  113. { 0x00, 0x1e, KEY_1 },
  114. { 0x00, 0x1f, KEY_2 },
  115. { 0x00, 0x20, KEY_3 },
  116. { 0x00, 0x21, KEY_4 },
  117. { 0x00, 0x22, KEY_5 },
  118. { 0x00, 0x23, KEY_6 },
  119. { 0x00, 0x24, KEY_7 },
  120. { 0x00, 0x25, KEY_8 },
  121. { 0x00, 0x26, KEY_9 },
  122. { 0x00, 0x27, KEY_0 },
  123. { 0x00, 0x28, KEY_ENTER },
  124. { 0x00, 0x4f, KEY_VOLUMEUP },
  125. { 0x00, 0x50, KEY_VOLUMEDOWN },
  126. { 0x00, 0x51, KEY_CHANNELDOWN },
  127. { 0x00, 0x52, KEY_CHANNELUP },
  128. };
  129. static u8 af9015_ir_table_leadtek[] = {
  130. 0x03, 0xfc, 0x00, 0xff, 0x1a, 0x01, 0x00,
  131. 0x03, 0xfc, 0x56, 0xa9, 0x00, 0x00, 0x00,
  132. 0x03, 0xfc, 0x4b, 0xb4, 0x00, 0x00, 0x00,
  133. 0x03, 0xfc, 0x4c, 0xb3, 0xb2, 0x04, 0x00,
  134. 0x03, 0xfc, 0x4d, 0xb2, 0x00, 0x00, 0x00,
  135. 0x03, 0xfc, 0x4e, 0xb1, 0x00, 0x00, 0x00,
  136. 0x03, 0xfc, 0x1f, 0xe0, 0x3d, 0x00, 0x00,
  137. 0x03, 0xfc, 0x40, 0xbf, 0x13, 0x01, 0x00,
  138. 0x03, 0xfc, 0x14, 0xeb, 0x10, 0x00, 0x00,
  139. 0x03, 0xfc, 0x49, 0xb6, 0x05, 0x01, 0x00,
  140. 0x03, 0xfc, 0x50, 0xaf, 0x29, 0x00, 0x00,
  141. 0x03, 0xfc, 0x0c, 0xf3, 0x52, 0x00, 0x00,
  142. 0x03, 0xfc, 0x03, 0xfc, 0x09, 0x00, 0x00,
  143. 0x03, 0xfc, 0x08, 0xf7, 0x50, 0x00, 0x00,
  144. 0x03, 0xfc, 0x13, 0xec, 0x28, 0x00, 0x00,
  145. 0x03, 0xfc, 0x04, 0xfb, 0x4f, 0x00, 0x00,
  146. 0x03, 0xfc, 0x4f, 0xb0, 0x0f, 0x01, 0x00,
  147. 0x03, 0xfc, 0x10, 0xef, 0x51, 0x00, 0x00,
  148. 0x03, 0xfc, 0x51, 0xae, 0x3f, 0x00, 0x00,
  149. 0x03, 0xfc, 0x42, 0xbd, 0x13, 0x00, 0x00,
  150. 0x03, 0xfc, 0x43, 0xbc, 0x00, 0x00, 0x00,
  151. 0x03, 0xfc, 0x44, 0xbb, 0x11, 0x00, 0x00,
  152. 0x03, 0xfc, 0x52, 0xad, 0x19, 0x00, 0x00,
  153. 0x03, 0xfc, 0x54, 0xab, 0x05, 0x00, 0x00,
  154. 0x03, 0xfc, 0x46, 0xb9, 0x29, 0x00, 0x00,
  155. 0x03, 0xfc, 0x55, 0xaa, 0x2b, 0x00, 0x00,
  156. 0x03, 0xfc, 0x53, 0xac, 0x41, 0x00, 0x00,
  157. 0x03, 0xfc, 0x05, 0xfa, 0x1e, 0x00, 0x00,
  158. 0x03, 0xfc, 0x06, 0xf9, 0x1f, 0x00, 0x00,
  159. 0x03, 0xfc, 0x07, 0xf8, 0x20, 0x00, 0x00,
  160. 0x03, 0xfc, 0x1e, 0xe1, 0x19, 0x00, 0x00,
  161. 0x03, 0xfc, 0x09, 0xf6, 0x21, 0x00, 0x00,
  162. 0x03, 0xfc, 0x0a, 0xf5, 0x22, 0x00, 0x00,
  163. 0x03, 0xfc, 0x0b, 0xf4, 0x23, 0x00, 0x00,
  164. 0x03, 0xfc, 0x1b, 0xe4, 0x16, 0x00, 0x00,
  165. 0x03, 0xfc, 0x0d, 0xf2, 0x24, 0x00, 0x00,
  166. 0x03, 0xfc, 0x0e, 0xf1, 0x25, 0x00, 0x00,
  167. 0x03, 0xfc, 0x0f, 0xf0, 0x26, 0x00, 0x00,
  168. 0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00,
  169. 0x03, 0xfc, 0x41, 0xbe, 0x37, 0x00, 0x00,
  170. 0x03, 0xfc, 0x12, 0xed, 0x27, 0x00, 0x00,
  171. 0x03, 0xfc, 0x11, 0xee, 0x2a, 0x00, 0x00,
  172. 0x03, 0xfc, 0x48, 0xb7, 0x2c, 0x00, 0x00,
  173. 0x03, 0xfc, 0x4a, 0xb5, 0x3c, 0x00, 0x00,
  174. 0x03, 0xfc, 0x47, 0xb8, 0x15, 0x01, 0x00,
  175. 0x03, 0xfc, 0x45, 0xba, 0x0b, 0x01, 0x00,
  176. 0x03, 0xfc, 0x5e, 0xa1, 0x43, 0x00, 0x00,
  177. 0x03, 0xfc, 0x5a, 0xa5, 0x42, 0x00, 0x00,
  178. 0x03, 0xfc, 0x5b, 0xa4, 0x4b, 0x00, 0x00,
  179. 0x03, 0xfc, 0x5f, 0xa0, 0x4e, 0x00, 0x00,
  180. };
  181. /* TwinHan AzureWave AD-TU700(704J) */
  182. static struct dvb_usb_rc_key af9015_rc_keys_twinhan[] = {
  183. { 0x05, 0x3f, KEY_POWER },
  184. { 0x00, 0x19, KEY_FAVORITES }, /* Favorite List */
  185. { 0x00, 0x04, KEY_TEXT }, /* Teletext */
  186. { 0x00, 0x0e, KEY_POWER },
  187. { 0x00, 0x0e, KEY_INFO }, /* Preview */
  188. { 0x00, 0x08, KEY_EPG }, /* Info/EPG */
  189. { 0x00, 0x0f, KEY_LIST }, /* Record List */
  190. { 0x00, 0x1e, KEY_1 },
  191. { 0x00, 0x1f, KEY_2 },
  192. { 0x00, 0x20, KEY_3 },
  193. { 0x00, 0x21, KEY_4 },
  194. { 0x00, 0x22, KEY_5 },
  195. { 0x00, 0x23, KEY_6 },
  196. { 0x00, 0x24, KEY_7 },
  197. { 0x00, 0x25, KEY_8 },
  198. { 0x00, 0x26, KEY_9 },
  199. { 0x00, 0x27, KEY_0 },
  200. { 0x00, 0x29, KEY_CANCEL }, /* Cancel */
  201. { 0x00, 0x4c, KEY_CLEAR }, /* Clear */
  202. { 0x00, 0x2a, KEY_BACK }, /* Back */
  203. { 0x00, 0x2b, KEY_TAB }, /* Tab */
  204. { 0x00, 0x52, KEY_UP }, /* up arrow */
  205. { 0x00, 0x51, KEY_DOWN }, /* down arrow */
  206. { 0x00, 0x4f, KEY_RIGHT }, /* right arrow */
  207. { 0x00, 0x50, KEY_LEFT }, /* left arrow */
  208. { 0x00, 0x28, KEY_ENTER }, /* Enter / ok */
  209. { 0x02, 0x52, KEY_VOLUMEUP },
  210. { 0x02, 0x51, KEY_VOLUMEDOWN },
  211. { 0x00, 0x4e, KEY_CHANNELDOWN },
  212. { 0x00, 0x4b, KEY_CHANNELUP },
  213. { 0x00, 0x4a, KEY_RECORD },
  214. { 0x01, 0x11, KEY_PLAY },
  215. { 0x00, 0x17, KEY_PAUSE },
  216. { 0x00, 0x0c, KEY_REWIND }, /* FR << */
  217. { 0x00, 0x11, KEY_FASTFORWARD }, /* FF >> */
  218. { 0x01, 0x15, KEY_PREVIOUS }, /* Replay */
  219. { 0x01, 0x0e, KEY_NEXT }, /* Skip */
  220. { 0x00, 0x13, KEY_CAMERA }, /* Capture */
  221. { 0x01, 0x0f, KEY_LANGUAGE }, /* SAP */
  222. { 0x01, 0x13, KEY_TV2 }, /* PIP */
  223. { 0x00, 0x1d, KEY_ZOOM }, /* Full Screen */
  224. { 0x01, 0x17, KEY_SUBTITLE }, /* Subtitle / CC */
  225. { 0x00, 0x10, KEY_MUTE },
  226. { 0x01, 0x19, KEY_AUDIO }, /* L/R */ /* TODO better event */
  227. { 0x01, 0x16, KEY_SLEEP }, /* Hibernate */
  228. { 0x01, 0x16, KEY_SWITCHVIDEOMODE },
  229. /* A/V */ /* TODO does not work */
  230. { 0x00, 0x06, KEY_AGAIN }, /* Recall */
  231. { 0x01, 0x16, KEY_KPPLUS }, /* Zoom+ */ /* TODO does not work */
  232. { 0x01, 0x16, KEY_KPMINUS }, /* Zoom- */ /* TODO does not work */
  233. { 0x02, 0x15, KEY_RED },
  234. { 0x02, 0x0a, KEY_GREEN },
  235. { 0x02, 0x1c, KEY_YELLOW },
  236. { 0x02, 0x05, KEY_BLUE },
  237. };
  238. static u8 af9015_ir_table_twinhan[] = {
  239. 0x00, 0xff, 0x16, 0xe9, 0x3f, 0x05, 0x00,
  240. 0x00, 0xff, 0x07, 0xf8, 0x16, 0x01, 0x00,
  241. 0x00, 0xff, 0x14, 0xeb, 0x11, 0x01, 0x00,
  242. 0x00, 0xff, 0x1a, 0xe5, 0x4d, 0x00, 0x00,
  243. 0x00, 0xff, 0x4c, 0xb3, 0x17, 0x00, 0x00,
  244. 0x00, 0xff, 0x12, 0xed, 0x11, 0x00, 0x00,
  245. 0x00, 0xff, 0x40, 0xbf, 0x0c, 0x00, 0x00,
  246. 0x00, 0xff, 0x11, 0xee, 0x4a, 0x00, 0x00,
  247. 0x00, 0xff, 0x54, 0xab, 0x13, 0x00, 0x00,
  248. 0x00, 0xff, 0x41, 0xbe, 0x15, 0x01, 0x00,
  249. 0x00, 0xff, 0x42, 0xbd, 0x0e, 0x01, 0x00,
  250. 0x00, 0xff, 0x43, 0xbc, 0x17, 0x01, 0x00,
  251. 0x00, 0xff, 0x50, 0xaf, 0x0f, 0x01, 0x00,
  252. 0x00, 0xff, 0x4d, 0xb2, 0x1d, 0x00, 0x00,
  253. 0x00, 0xff, 0x47, 0xb8, 0x13, 0x01, 0x00,
  254. 0x00, 0xff, 0x05, 0xfa, 0x4b, 0x00, 0x00,
  255. 0x00, 0xff, 0x02, 0xfd, 0x4e, 0x00, 0x00,
  256. 0x00, 0xff, 0x0e, 0xf1, 0x06, 0x00, 0x00,
  257. 0x00, 0xff, 0x1e, 0xe1, 0x52, 0x02, 0x00,
  258. 0x00, 0xff, 0x0a, 0xf5, 0x51, 0x02, 0x00,
  259. 0x00, 0xff, 0x10, 0xef, 0x10, 0x00, 0x00,
  260. 0x00, 0xff, 0x49, 0xb6, 0x19, 0x01, 0x00,
  261. 0x00, 0xff, 0x15, 0xea, 0x27, 0x00, 0x00,
  262. 0x00, 0xff, 0x03, 0xfc, 0x1e, 0x00, 0x00,
  263. 0x00, 0xff, 0x01, 0xfe, 0x1f, 0x00, 0x00,
  264. 0x00, 0xff, 0x06, 0xf9, 0x20, 0x00, 0x00,
  265. 0x00, 0xff, 0x09, 0xf6, 0x21, 0x00, 0x00,
  266. 0x00, 0xff, 0x1d, 0xe2, 0x22, 0x00, 0x00,
  267. 0x00, 0xff, 0x1f, 0xe0, 0x23, 0x00, 0x00,
  268. 0x00, 0xff, 0x0d, 0xf2, 0x24, 0x00, 0x00,
  269. 0x00, 0xff, 0x19, 0xe6, 0x25, 0x00, 0x00,
  270. 0x00, 0xff, 0x1b, 0xe4, 0x26, 0x00, 0x00,
  271. 0x00, 0xff, 0x00, 0xff, 0x2b, 0x00, 0x00,
  272. 0x00, 0xff, 0x4a, 0xb5, 0x4c, 0x00, 0x00,
  273. 0x00, 0xff, 0x4b, 0xb4, 0x52, 0x00, 0x00,
  274. 0x00, 0xff, 0x51, 0xae, 0x51, 0x00, 0x00,
  275. 0x00, 0xff, 0x52, 0xad, 0x4f, 0x00, 0x00,
  276. 0x00, 0xff, 0x4e, 0xb1, 0x50, 0x00, 0x00,
  277. 0x00, 0xff, 0x0c, 0xf3, 0x29, 0x00, 0x00,
  278. 0x00, 0xff, 0x4f, 0xb0, 0x28, 0x00, 0x00,
  279. 0x00, 0xff, 0x13, 0xec, 0x2a, 0x00, 0x00,
  280. 0x00, 0xff, 0x17, 0xe8, 0x19, 0x00, 0x00,
  281. 0x00, 0xff, 0x04, 0xfb, 0x0f, 0x00, 0x00,
  282. 0x00, 0xff, 0x48, 0xb7, 0x0e, 0x00, 0x00,
  283. 0x00, 0xff, 0x0f, 0xf0, 0x04, 0x00, 0x00,
  284. 0x00, 0xff, 0x1c, 0xe3, 0x08, 0x00, 0x00,
  285. 0x00, 0xff, 0x18, 0xe7, 0x15, 0x02, 0x00,
  286. 0x00, 0xff, 0x53, 0xac, 0x0a, 0x02, 0x00,
  287. 0x00, 0xff, 0x5e, 0xa1, 0x1c, 0x02, 0x00,
  288. 0x00, 0xff, 0x5f, 0xa0, 0x05, 0x02, 0x00,
  289. };
  290. /* A-Link DTU(m) */
  291. static struct dvb_usb_rc_key af9015_rc_keys_a_link[] = {
  292. { 0x00, 0x1e, KEY_1 },
  293. { 0x00, 0x1f, KEY_2 },
  294. { 0x00, 0x20, KEY_3 },
  295. { 0x00, 0x21, KEY_4 },
  296. { 0x00, 0x22, KEY_5 },
  297. { 0x00, 0x23, KEY_6 },
  298. { 0x00, 0x24, KEY_7 },
  299. { 0x00, 0x25, KEY_8 },
  300. { 0x00, 0x26, KEY_9 },
  301. { 0x00, 0x27, KEY_0 },
  302. { 0x00, 0x2e, KEY_CHANNELUP },
  303. { 0x00, 0x2d, KEY_CHANNELDOWN },
  304. { 0x04, 0x28, KEY_ZOOM },
  305. { 0x00, 0x41, KEY_MUTE },
  306. { 0x00, 0x42, KEY_VOLUMEDOWN },
  307. { 0x00, 0x43, KEY_VOLUMEUP },
  308. { 0x00, 0x44, KEY_GOTO }, /* jump */
  309. { 0x05, 0x45, KEY_POWER },
  310. };
  311. static u8 af9015_ir_table_a_link[] = {
  312. 0x08, 0xf7, 0x12, 0xed, 0x45, 0x05, 0x00, /* power */
  313. 0x08, 0xf7, 0x1a, 0xe5, 0x41, 0x00, 0x00, /* mute */
  314. 0x08, 0xf7, 0x01, 0xfe, 0x1e, 0x00, 0x00, /* 1 */
  315. 0x08, 0xf7, 0x1c, 0xe3, 0x21, 0x00, 0x00, /* 4 */
  316. 0x08, 0xf7, 0x03, 0xfc, 0x24, 0x00, 0x00, /* 7 */
  317. 0x08, 0xf7, 0x05, 0xfa, 0x28, 0x04, 0x00, /* zoom */
  318. 0x08, 0xf7, 0x00, 0xff, 0x43, 0x00, 0x00, /* volume up */
  319. 0x08, 0xf7, 0x16, 0xe9, 0x42, 0x00, 0x00, /* volume down */
  320. 0x08, 0xf7, 0x0f, 0xf0, 0x1f, 0x00, 0x00, /* 2 */
  321. 0x08, 0xf7, 0x0d, 0xf2, 0x22, 0x00, 0x00, /* 5 */
  322. 0x08, 0xf7, 0x1b, 0xe4, 0x25, 0x00, 0x00, /* 8 */
  323. 0x08, 0xf7, 0x06, 0xf9, 0x27, 0x00, 0x00, /* 0 */
  324. 0x08, 0xf7, 0x14, 0xeb, 0x2e, 0x00, 0x00, /* channel up */
  325. 0x08, 0xf7, 0x1d, 0xe2, 0x2d, 0x00, 0x00, /* channel down */
  326. 0x08, 0xf7, 0x02, 0xfd, 0x20, 0x00, 0x00, /* 3 */
  327. 0x08, 0xf7, 0x18, 0xe7, 0x23, 0x00, 0x00, /* 6 */
  328. 0x08, 0xf7, 0x04, 0xfb, 0x26, 0x00, 0x00, /* 9 */
  329. 0x08, 0xf7, 0x07, 0xf8, 0x44, 0x00, 0x00, /* jump */
  330. };
  331. /* MSI DIGIVOX mini II V3.0 */
  332. static struct dvb_usb_rc_key af9015_rc_keys_msi[] = {
  333. { 0x00, 0x1e, KEY_1 },
  334. { 0x00, 0x1f, KEY_2 },
  335. { 0x00, 0x20, KEY_3 },
  336. { 0x00, 0x21, KEY_4 },
  337. { 0x00, 0x22, KEY_5 },
  338. { 0x00, 0x23, KEY_6 },
  339. { 0x00, 0x24, KEY_7 },
  340. { 0x00, 0x25, KEY_8 },
  341. { 0x00, 0x26, KEY_9 },
  342. { 0x00, 0x27, KEY_0 },
  343. { 0x03, 0x0f, KEY_CHANNELUP },
  344. { 0x03, 0x0e, KEY_CHANNELDOWN },
  345. { 0x00, 0x42, KEY_VOLUMEDOWN },
  346. { 0x00, 0x43, KEY_VOLUMEUP },
  347. { 0x05, 0x45, KEY_POWER },
  348. { 0x00, 0x52, KEY_UP }, /* up */
  349. { 0x00, 0x51, KEY_DOWN }, /* down */
  350. { 0x00, 0x28, KEY_ENTER },
  351. };
  352. static u8 af9015_ir_table_msi[] = {
  353. 0x03, 0xfc, 0x17, 0xe8, 0x45, 0x05, 0x00, /* power */
  354. 0x03, 0xfc, 0x0d, 0xf2, 0x51, 0x00, 0x00, /* down */
  355. 0x03, 0xfc, 0x03, 0xfc, 0x52, 0x00, 0x00, /* up */
  356. 0x03, 0xfc, 0x1a, 0xe5, 0x1e, 0x00, 0x00, /* 1 */
  357. 0x03, 0xfc, 0x02, 0xfd, 0x1f, 0x00, 0x00, /* 2 */
  358. 0x03, 0xfc, 0x04, 0xfb, 0x20, 0x00, 0x00, /* 3 */
  359. 0x03, 0xfc, 0x1c, 0xe3, 0x21, 0x00, 0x00, /* 4 */
  360. 0x03, 0xfc, 0x08, 0xf7, 0x22, 0x00, 0x00, /* 5 */
  361. 0x03, 0xfc, 0x1d, 0xe2, 0x23, 0x00, 0x00, /* 6 */
  362. 0x03, 0xfc, 0x11, 0xee, 0x24, 0x00, 0x00, /* 7 */
  363. 0x03, 0xfc, 0x0b, 0xf4, 0x25, 0x00, 0x00, /* 8 */
  364. 0x03, 0xfc, 0x10, 0xef, 0x26, 0x00, 0x00, /* 9 */
  365. 0x03, 0xfc, 0x09, 0xf6, 0x27, 0x00, 0x00, /* 0 */
  366. 0x03, 0xfc, 0x14, 0xeb, 0x43, 0x00, 0x00, /* volume up */
  367. 0x03, 0xfc, 0x1f, 0xe0, 0x42, 0x00, 0x00, /* volume down */
  368. 0x03, 0xfc, 0x15, 0xea, 0x0f, 0x03, 0x00, /* channel up */
  369. 0x03, 0xfc, 0x05, 0xfa, 0x0e, 0x03, 0x00, /* channel down */
  370. 0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00, /* enter */
  371. };
  372. /* MYGICTV U718 */
  373. static struct dvb_usb_rc_key af9015_rc_keys_mygictv[] = {
  374. { 0x00, 0x3d, KEY_SWITCHVIDEOMODE },
  375. /* TV / AV */
  376. { 0x05, 0x45, KEY_POWER },
  377. { 0x00, 0x1e, KEY_1 },
  378. { 0x00, 0x1f, KEY_2 },
  379. { 0x00, 0x20, KEY_3 },
  380. { 0x00, 0x21, KEY_4 },
  381. { 0x00, 0x22, KEY_5 },
  382. { 0x00, 0x23, KEY_6 },
  383. { 0x00, 0x24, KEY_7 },
  384. { 0x00, 0x25, KEY_8 },
  385. { 0x00, 0x26, KEY_9 },
  386. { 0x00, 0x27, KEY_0 },
  387. { 0x00, 0x41, KEY_MUTE },
  388. { 0x00, 0x2a, KEY_ESC }, /* Esc */
  389. { 0x00, 0x2e, KEY_CHANNELUP },
  390. { 0x00, 0x2d, KEY_CHANNELDOWN },
  391. { 0x00, 0x42, KEY_VOLUMEDOWN },
  392. { 0x00, 0x43, KEY_VOLUMEUP },
  393. { 0x00, 0x52, KEY_UP }, /* up arrow */
  394. { 0x00, 0x51, KEY_DOWN }, /* down arrow */
  395. { 0x00, 0x4f, KEY_RIGHT }, /* right arrow */
  396. { 0x00, 0x50, KEY_LEFT }, /* left arrow */
  397. { 0x00, 0x28, KEY_ENTER }, /* ok */
  398. { 0x01, 0x15, KEY_RECORD },
  399. { 0x03, 0x13, KEY_PLAY },
  400. { 0x01, 0x13, KEY_PAUSE },
  401. { 0x01, 0x16, KEY_STOP },
  402. { 0x03, 0x07, KEY_REWIND }, /* FR << */
  403. { 0x03, 0x09, KEY_FASTFORWARD }, /* FF >> */
  404. { 0x00, 0x3b, KEY_TIME }, /* TimeShift */
  405. { 0x00, 0x3e, KEY_CAMERA }, /* Snapshot */
  406. { 0x03, 0x16, KEY_CYCLEWINDOWS }, /* yellow, min / max */
  407. { 0x00, 0x00, KEY_ZOOM }, /* 'select' (?) */
  408. { 0x03, 0x16, KEY_SHUFFLE }, /* Shuffle */
  409. { 0x03, 0x45, KEY_POWER },
  410. };
  411. static u8 af9015_ir_table_mygictv[] = {
  412. 0x02, 0xbd, 0x0c, 0xf3, 0x3d, 0x00, 0x00, /* TV / AV */
  413. 0x02, 0xbd, 0x14, 0xeb, 0x45, 0x05, 0x00, /* power */
  414. 0x02, 0xbd, 0x00, 0xff, 0x1e, 0x00, 0x00, /* 1 */
  415. 0x02, 0xbd, 0x01, 0xfe, 0x1f, 0x00, 0x00, /* 2 */
  416. 0x02, 0xbd, 0x02, 0xfd, 0x20, 0x00, 0x00, /* 3 */
  417. 0x02, 0xbd, 0x03, 0xfc, 0x21, 0x00, 0x00, /* 4 */
  418. 0x02, 0xbd, 0x04, 0xfb, 0x22, 0x00, 0x00, /* 5 */
  419. 0x02, 0xbd, 0x05, 0xfa, 0x23, 0x00, 0x00, /* 6 */
  420. 0x02, 0xbd, 0x06, 0xf9, 0x24, 0x00, 0x00, /* 7 */
  421. 0x02, 0xbd, 0x07, 0xf8, 0x25, 0x00, 0x00, /* 8 */
  422. 0x02, 0xbd, 0x08, 0xf7, 0x26, 0x00, 0x00, /* 9 */
  423. 0x02, 0xbd, 0x09, 0xf6, 0x27, 0x00, 0x00, /* 0 */
  424. 0x02, 0xbd, 0x0a, 0xf5, 0x41, 0x00, 0x00, /* mute */
  425. 0x02, 0xbd, 0x1c, 0xe3, 0x2a, 0x00, 0x00, /* esc */
  426. 0x02, 0xbd, 0x1f, 0xe0, 0x43, 0x00, 0x00, /* volume up */
  427. 0x02, 0xbd, 0x12, 0xed, 0x52, 0x00, 0x00, /* up arrow */
  428. 0x02, 0xbd, 0x11, 0xee, 0x50, 0x00, 0x00, /* left arrow */
  429. 0x02, 0xbd, 0x15, 0xea, 0x28, 0x00, 0x00, /* ok */
  430. 0x02, 0xbd, 0x10, 0xef, 0x4f, 0x00, 0x00, /* right arrow */
  431. 0x02, 0xbd, 0x13, 0xec, 0x51, 0x00, 0x00, /* down arrow */
  432. 0x02, 0xbd, 0x0e, 0xf1, 0x42, 0x00, 0x00, /* volume down */
  433. 0x02, 0xbd, 0x19, 0xe6, 0x15, 0x01, 0x00, /* record */
  434. 0x02, 0xbd, 0x1e, 0xe1, 0x13, 0x03, 0x00, /* play */
  435. 0x02, 0xbd, 0x16, 0xe9, 0x16, 0x01, 0x00, /* stop */
  436. 0x02, 0xbd, 0x0b, 0xf4, 0x28, 0x04, 0x00, /* yellow, min / max */
  437. 0x02, 0xbd, 0x0f, 0xf0, 0x3b, 0x00, 0x00, /* time shift */
  438. 0x02, 0xbd, 0x18, 0xe7, 0x2e, 0x00, 0x00, /* channel up */
  439. 0x02, 0xbd, 0x1a, 0xe5, 0x2d, 0x00, 0x00, /* channel down */
  440. 0x02, 0xbd, 0x17, 0xe8, 0x3e, 0x00, 0x00, /* snapshot */
  441. 0x02, 0xbd, 0x40, 0xbf, 0x13, 0x01, 0x00, /* pause */
  442. 0x02, 0xbd, 0x41, 0xbe, 0x09, 0x03, 0x00, /* FF >> */
  443. 0x02, 0xbd, 0x42, 0xbd, 0x07, 0x03, 0x00, /* FR << */
  444. 0x02, 0xbd, 0x43, 0xbc, 0x00, 0x00, 0x00, /* 'select' (?) */
  445. 0x02, 0xbd, 0x44, 0xbb, 0x16, 0x03, 0x00, /* shuffle */
  446. 0x02, 0xbd, 0x45, 0xba, 0x45, 0x03, 0x00, /* power */
  447. };
  448. /* KWorld PlusTV Dual DVB-T Stick (DVB-T 399U) */
  449. static u8 af9015_ir_table_kworld[] = {
  450. 0x86, 0x6b, 0x0c, 0xf3, 0x2e, 0x07, 0x00,
  451. 0x86, 0x6b, 0x16, 0xe9, 0x2d, 0x07, 0x00,
  452. 0x86, 0x6b, 0x1d, 0xe2, 0x37, 0x07, 0x00,
  453. 0x86, 0x6b, 0x00, 0xff, 0x1e, 0x07, 0x00,
  454. 0x86, 0x6b, 0x01, 0xfe, 0x1f, 0x07, 0x00,
  455. 0x86, 0x6b, 0x02, 0xfd, 0x20, 0x07, 0x00,
  456. 0x86, 0x6b, 0x03, 0xfc, 0x21, 0x07, 0x00,
  457. 0x86, 0x6b, 0x04, 0xfb, 0x22, 0x07, 0x00,
  458. 0x86, 0x6b, 0x05, 0xfa, 0x23, 0x07, 0x00,
  459. 0x86, 0x6b, 0x06, 0xf9, 0x24, 0x07, 0x00,
  460. 0x86, 0x6b, 0x07, 0xf8, 0x25, 0x07, 0x00,
  461. 0x86, 0x6b, 0x08, 0xf7, 0x26, 0x07, 0x00,
  462. 0x86, 0x6b, 0x09, 0xf6, 0x4d, 0x07, 0x00,
  463. 0x86, 0x6b, 0x0a, 0xf5, 0x4e, 0x07, 0x00,
  464. 0x86, 0x6b, 0x14, 0xeb, 0x4f, 0x07, 0x00,
  465. 0x86, 0x6b, 0x1e, 0xe1, 0x50, 0x07, 0x00,
  466. 0x86, 0x6b, 0x17, 0xe8, 0x52, 0x07, 0x00,
  467. 0x86, 0x6b, 0x1f, 0xe0, 0x51, 0x07, 0x00,
  468. 0x86, 0x6b, 0x0e, 0xf1, 0x0b, 0x07, 0x00,
  469. 0x86, 0x6b, 0x20, 0xdf, 0x0c, 0x07, 0x00,
  470. 0x86, 0x6b, 0x42, 0xbd, 0x0d, 0x07, 0x00,
  471. 0x86, 0x6b, 0x0b, 0xf4, 0x0e, 0x07, 0x00,
  472. 0x86, 0x6b, 0x43, 0xbc, 0x0f, 0x07, 0x00,
  473. 0x86, 0x6b, 0x10, 0xef, 0x10, 0x07, 0x00,
  474. 0x86, 0x6b, 0x21, 0xde, 0x11, 0x07, 0x00,
  475. 0x86, 0x6b, 0x13, 0xec, 0x12, 0x07, 0x00,
  476. 0x86, 0x6b, 0x11, 0xee, 0x13, 0x07, 0x00,
  477. 0x86, 0x6b, 0x12, 0xed, 0x14, 0x07, 0x00,
  478. 0x86, 0x6b, 0x19, 0xe6, 0x15, 0x07, 0x00,
  479. 0x86, 0x6b, 0x1a, 0xe5, 0x16, 0x07, 0x00,
  480. 0x86, 0x6b, 0x1b, 0xe4, 0x17, 0x07, 0x00,
  481. 0x86, 0x6b, 0x4b, 0xb4, 0x18, 0x07, 0x00,
  482. 0x86, 0x6b, 0x40, 0xbf, 0x19, 0x07, 0x00,
  483. 0x86, 0x6b, 0x44, 0xbb, 0x1a, 0x07, 0x00,
  484. 0x86, 0x6b, 0x41, 0xbe, 0x1b, 0x07, 0x00,
  485. 0x86, 0x6b, 0x22, 0xdd, 0x1c, 0x07, 0x00,
  486. 0x86, 0x6b, 0x15, 0xea, 0x1d, 0x07, 0x00,
  487. 0x86, 0x6b, 0x0f, 0xf0, 0x3f, 0x07, 0x00,
  488. 0x86, 0x6b, 0x1c, 0xe3, 0x40, 0x07, 0x00,
  489. 0x86, 0x6b, 0x4a, 0xb5, 0x41, 0x07, 0x00,
  490. 0x86, 0x6b, 0x48, 0xb7, 0x42, 0x07, 0x00,
  491. 0x86, 0x6b, 0x49, 0xb6, 0x43, 0x07, 0x00,
  492. 0x86, 0x6b, 0x18, 0xe7, 0x44, 0x07, 0x00,
  493. 0x86, 0x6b, 0x23, 0xdc, 0x45, 0x07, 0x00,
  494. };
  495. #endif