af9005.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. /* DVB USB compliant Linux driver for the Afatech 9005
  2. * USB1.1 DVB-T receiver.
  3. *
  4. * Copyright (C) 2007 Luca Olivetti (luca@ventoso.org)
  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. * see Documentation/dvb/REDME.dvb-usb for more information
  23. */
  24. #include "af9005.h"
  25. /* debug */
  26. int dvb_usb_af9005_debug;
  27. module_param_named(debug, dvb_usb_af9005_debug, int, 0644);
  28. MODULE_PARM_DESC(debug,
  29. "set debugging level (1=info,xfer=2,rc=4,reg=8,i2c=16,fw=32 (or-able))."
  30. DVB_USB_DEBUG_STATUS);
  31. /* enable obnoxious led */
  32. int dvb_usb_af9005_led = 1;
  33. module_param_named(led, dvb_usb_af9005_led, bool, 0644);
  34. MODULE_PARM_DESC(led, "enable led (default: 1).");
  35. /* eeprom dump */
  36. int dvb_usb_af9005_dump_eeprom = 0;
  37. module_param_named(dump_eeprom, dvb_usb_af9005_dump_eeprom, int, 0);
  38. MODULE_PARM_DESC(dump_eeprom, "dump contents of the eeprom.");
  39. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  40. /* remote control decoder */
  41. int (*rc_decode) (struct dvb_usb_device * d, u8 * data, int len, u32 * event,
  42. int *state);
  43. void *rc_keys;
  44. int *rc_keys_size;
  45. u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
  46. struct af9005_device_state {
  47. u8 sequence;
  48. int led_state;
  49. };
  50. int af9005_usb_generic_rw(struct dvb_usb_device *d, u8 * wbuf, u16 wlen,
  51. u8 * rbuf, u16 rlen, int delay_ms)
  52. {
  53. int actlen, ret = -ENOMEM;
  54. if (wbuf == NULL || wlen == 0)
  55. return -EINVAL;
  56. if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
  57. return ret;
  58. deb_xfer(">>> ");
  59. debug_dump(wbuf, wlen, deb_xfer);
  60. ret = usb_bulk_msg(d->udev, usb_sndbulkpipe(d->udev,
  61. 2), wbuf, wlen,
  62. &actlen, 2000);
  63. if (ret)
  64. err("bulk message failed: %d (%d/%d)", ret, wlen, actlen);
  65. else
  66. ret = actlen != wlen ? -1 : 0;
  67. /* an answer is expected, and no error before */
  68. if (!ret && rbuf && rlen) {
  69. if (delay_ms)
  70. msleep(delay_ms);
  71. ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
  72. 0x01), rbuf,
  73. rlen, &actlen, 2000);
  74. if (ret)
  75. err("recv bulk message failed: %d", ret);
  76. else {
  77. deb_xfer("<<< ");
  78. debug_dump(rbuf, actlen, deb_xfer);
  79. }
  80. }
  81. mutex_unlock(&d->usb_mutex);
  82. return ret;
  83. }
  84. int af9005_usb_generic_write(struct dvb_usb_device *d, u8 * buf, u16 len)
  85. {
  86. return af9005_usb_generic_rw(d, buf, len, NULL, 0, 0);
  87. }
  88. int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
  89. int readwrite, int type, u8 * values, int len)
  90. {
  91. struct af9005_device_state *st = d->priv;
  92. u8 obuf[16] = { 0 };
  93. u8 ibuf[17] = { 0 };
  94. u8 command;
  95. int i;
  96. int ret;
  97. if (len < 1) {
  98. err("generic read/write, less than 1 byte. Makes no sense.");
  99. return -EINVAL;
  100. }
  101. if (len > 8) {
  102. err("generic read/write, more than 8 bytes. Not supported.");
  103. return -EINVAL;
  104. }
  105. obuf[0] = 14; /* rest of buffer length low */
  106. obuf[1] = 0; /* rest of buffer length high */
  107. obuf[2] = AF9005_REGISTER_RW; /* register operation */
  108. obuf[3] = 12; /* rest of buffer length */
  109. obuf[4] = st->sequence++; /* sequence number */
  110. obuf[5] = (u8) (reg >> 8); /* register address */
  111. obuf[6] = (u8) (reg & 0xff);
  112. if (type == AF9005_OFDM_REG) {
  113. command = AF9005_CMD_OFDM_REG;
  114. } else {
  115. command = AF9005_CMD_TUNER;
  116. }
  117. if (len > 1)
  118. command |=
  119. AF9005_CMD_BURST | AF9005_CMD_AUTOINC | (len - 1) << 3;
  120. command |= readwrite;
  121. if (readwrite == AF9005_CMD_WRITE)
  122. for (i = 0; i < len; i++)
  123. obuf[8 + i] = values[i];
  124. else if (type == AF9005_TUNER_REG)
  125. /* read command for tuner, the first byte contains the i2c address */
  126. obuf[8] = values[0];
  127. obuf[7] = command;
  128. ret = af9005_usb_generic_rw(d, obuf, 16, ibuf, 17, 0);
  129. if (ret)
  130. return ret;
  131. /* sanity check */
  132. if (ibuf[2] != AF9005_REGISTER_RW_ACK) {
  133. err("generic read/write, wrong reply code.");
  134. return -EIO;
  135. }
  136. if (ibuf[3] != 0x0d) {
  137. err("generic read/write, wrong length in reply.");
  138. return -EIO;
  139. }
  140. if (ibuf[4] != obuf[4]) {
  141. err("generic read/write, wrong sequence in reply.");
  142. return -EIO;
  143. }
  144. /*
  145. Windows driver doesn't check these fields, in fact sometimes
  146. the register in the reply is different that what has been sent
  147. if (ibuf[5] != obuf[5] || ibuf[6] != obuf[6]) {
  148. err("generic read/write, wrong register in reply.");
  149. return -EIO;
  150. }
  151. if (ibuf[7] != command) {
  152. err("generic read/write wrong command in reply.");
  153. return -EIO;
  154. }
  155. */
  156. if (ibuf[16] != 0x01) {
  157. err("generic read/write wrong status code in reply.");
  158. return -EIO;
  159. }
  160. if (readwrite == AF9005_CMD_READ)
  161. for (i = 0; i < len; i++)
  162. values[i] = ibuf[8 + i];
  163. return 0;
  164. }
  165. int af9005_read_ofdm_register(struct dvb_usb_device *d, u16 reg, u8 * value)
  166. {
  167. int ret;
  168. deb_reg("read register %x ", reg);
  169. ret = af9005_generic_read_write(d, reg,
  170. AF9005_CMD_READ, AF9005_OFDM_REG,
  171. value, 1);
  172. if (ret)
  173. deb_reg("failed\n");
  174. else
  175. deb_reg("value %x\n", *value);
  176. return ret;
  177. }
  178. int af9005_read_ofdm_registers(struct dvb_usb_device *d, u16 reg,
  179. u8 * values, int len)
  180. {
  181. int ret;
  182. deb_reg("read %d registers %x ", len, reg);
  183. ret = af9005_generic_read_write(d, reg,
  184. AF9005_CMD_READ, AF9005_OFDM_REG,
  185. values, len);
  186. if (ret)
  187. deb_reg("failed\n");
  188. else
  189. debug_dump(values, len, deb_reg);
  190. return ret;
  191. }
  192. int af9005_write_ofdm_register(struct dvb_usb_device *d, u16 reg, u8 value)
  193. {
  194. int ret;
  195. u8 temp = value;
  196. deb_reg("write register %x value %x ", reg, value);
  197. ret = af9005_generic_read_write(d, reg,
  198. AF9005_CMD_WRITE, AF9005_OFDM_REG,
  199. &temp, 1);
  200. if (ret)
  201. deb_reg("failed\n");
  202. else
  203. deb_reg("ok\n");
  204. return ret;
  205. }
  206. int af9005_write_ofdm_registers(struct dvb_usb_device *d, u16 reg,
  207. u8 * values, int len)
  208. {
  209. int ret;
  210. deb_reg("write %d registers %x values ", len, reg);
  211. debug_dump(values, len, deb_reg);
  212. ret = af9005_generic_read_write(d, reg,
  213. AF9005_CMD_WRITE, AF9005_OFDM_REG,
  214. values, len);
  215. if (ret)
  216. deb_reg("failed\n");
  217. else
  218. deb_reg("ok\n");
  219. return ret;
  220. }
  221. int af9005_read_register_bits(struct dvb_usb_device *d, u16 reg, u8 pos,
  222. u8 len, u8 * value)
  223. {
  224. u8 temp;
  225. int ret;
  226. deb_reg("read bits %x %x %x", reg, pos, len);
  227. ret = af9005_read_ofdm_register(d, reg, &temp);
  228. if (ret) {
  229. deb_reg(" failed\n");
  230. return ret;
  231. }
  232. *value = (temp >> pos) & regmask[len - 1];
  233. deb_reg(" value %x\n", *value);
  234. return 0;
  235. }
  236. int af9005_write_register_bits(struct dvb_usb_device *d, u16 reg, u8 pos,
  237. u8 len, u8 value)
  238. {
  239. u8 temp, mask;
  240. int ret;
  241. deb_reg("write bits %x %x %x value %x\n", reg, pos, len, value);
  242. if (pos == 0 && len == 8)
  243. return af9005_write_ofdm_register(d, reg, value);
  244. ret = af9005_read_ofdm_register(d, reg, &temp);
  245. if (ret)
  246. return ret;
  247. mask = regmask[len - 1] << pos;
  248. temp = (temp & ~mask) | ((value << pos) & mask);
  249. return af9005_write_ofdm_register(d, reg, temp);
  250. }
  251. static int af9005_usb_read_tuner_registers(struct dvb_usb_device *d,
  252. u16 reg, u8 * values, int len)
  253. {
  254. return af9005_generic_read_write(d, reg,
  255. AF9005_CMD_READ, AF9005_TUNER_REG,
  256. values, len);
  257. }
  258. static int af9005_usb_write_tuner_registers(struct dvb_usb_device *d,
  259. u16 reg, u8 * values, int len)
  260. {
  261. return af9005_generic_read_write(d, reg,
  262. AF9005_CMD_WRITE,
  263. AF9005_TUNER_REG, values, len);
  264. }
  265. int af9005_write_tuner_registers(struct dvb_usb_device *d, u16 reg,
  266. u8 * values, int len)
  267. {
  268. /* don't let the name of this function mislead you: it's just used
  269. as an interface from the firmware to the i2c bus. The actual
  270. i2c addresses are contained in the data */
  271. int ret, i, done = 0, fail = 0;
  272. u8 temp;
  273. ret = af9005_usb_write_tuner_registers(d, reg, values, len);
  274. if (ret)
  275. return ret;
  276. if (reg != 0xffff) {
  277. /* check if write done (0xa40d bit 1) or fail (0xa40d bit 2) */
  278. for (i = 0; i < 200; i++) {
  279. ret =
  280. af9005_read_ofdm_register(d,
  281. xd_I2C_i2c_m_status_wdat_done,
  282. &temp);
  283. if (ret)
  284. return ret;
  285. done = temp & (regmask[i2c_m_status_wdat_done_len - 1]
  286. << i2c_m_status_wdat_done_pos);
  287. if (done)
  288. break;
  289. fail = temp & (regmask[i2c_m_status_wdat_fail_len - 1]
  290. << i2c_m_status_wdat_fail_pos);
  291. if (fail)
  292. break;
  293. msleep(50);
  294. }
  295. if (i == 200)
  296. return -ETIMEDOUT;
  297. if (fail) {
  298. /* clear write fail bit */
  299. af9005_write_register_bits(d,
  300. xd_I2C_i2c_m_status_wdat_fail,
  301. i2c_m_status_wdat_fail_pos,
  302. i2c_m_status_wdat_fail_len,
  303. 1);
  304. return -EIO;
  305. }
  306. /* clear write done bit */
  307. ret =
  308. af9005_write_register_bits(d,
  309. xd_I2C_i2c_m_status_wdat_fail,
  310. i2c_m_status_wdat_done_pos,
  311. i2c_m_status_wdat_done_len, 1);
  312. if (ret)
  313. return ret;
  314. }
  315. return 0;
  316. }
  317. int af9005_read_tuner_registers(struct dvb_usb_device *d, u16 reg, u8 addr,
  318. u8 * values, int len)
  319. {
  320. /* don't let the name of this function mislead you: it's just used
  321. as an interface from the firmware to the i2c bus. The actual
  322. i2c addresses are contained in the data */
  323. int ret, i;
  324. u8 temp, buf[2];
  325. buf[0] = addr; /* tuner i2c address */
  326. buf[1] = values[0]; /* tuner register */
  327. values[0] = addr + 0x01; /* i2c read address */
  328. if (reg == APO_REG_I2C_RW_SILICON_TUNER) {
  329. /* write tuner i2c address to tuner, 0c00c0 undocumented, found by sniffing */
  330. ret = af9005_write_tuner_registers(d, 0x00c0, buf, 2);
  331. if (ret)
  332. return ret;
  333. }
  334. /* send read command to ofsm */
  335. ret = af9005_usb_read_tuner_registers(d, reg, values, 1);
  336. if (ret)
  337. return ret;
  338. /* check if read done */
  339. for (i = 0; i < 200; i++) {
  340. ret = af9005_read_ofdm_register(d, 0xa408, &temp);
  341. if (ret)
  342. return ret;
  343. if (temp & 0x01)
  344. break;
  345. msleep(50);
  346. }
  347. if (i == 200)
  348. return -ETIMEDOUT;
  349. /* clear read done bit (by writing 1) */
  350. ret = af9005_write_ofdm_register(d, xd_I2C_i2c_m_data8, 1);
  351. if (ret)
  352. return ret;
  353. /* get read data (available from 0xa400) */
  354. for (i = 0; i < len; i++) {
  355. ret = af9005_read_ofdm_register(d, 0xa400 + i, &temp);
  356. if (ret)
  357. return ret;
  358. values[i] = temp;
  359. }
  360. return 0;
  361. }
  362. static int af9005_i2c_write(struct dvb_usb_device *d, u8 i2caddr, u8 reg,
  363. u8 * data, int len)
  364. {
  365. int ret, i;
  366. u8 buf[3];
  367. deb_i2c("i2c_write i2caddr %x, reg %x, len %d data ", i2caddr,
  368. reg, len);
  369. debug_dump(data, len, deb_i2c);
  370. for (i = 0; i < len; i++) {
  371. buf[0] = i2caddr;
  372. buf[1] = reg + (u8) i;
  373. buf[2] = data[i];
  374. ret =
  375. af9005_write_tuner_registers(d,
  376. APO_REG_I2C_RW_SILICON_TUNER,
  377. buf, 3);
  378. if (ret) {
  379. deb_i2c("i2c_write failed\n");
  380. return ret;
  381. }
  382. }
  383. deb_i2c("i2c_write ok\n");
  384. return 0;
  385. }
  386. static int af9005_i2c_read(struct dvb_usb_device *d, u8 i2caddr, u8 reg,
  387. u8 * data, int len)
  388. {
  389. int ret, i;
  390. u8 temp;
  391. deb_i2c("i2c_read i2caddr %x, reg %x, len %d\n ", i2caddr, reg, len);
  392. for (i = 0; i < len; i++) {
  393. temp = reg + i;
  394. ret =
  395. af9005_read_tuner_registers(d,
  396. APO_REG_I2C_RW_SILICON_TUNER,
  397. i2caddr, &temp, 1);
  398. if (ret) {
  399. deb_i2c("i2c_read failed\n");
  400. return ret;
  401. }
  402. data[i] = temp;
  403. }
  404. deb_i2c("i2c data read: ");
  405. debug_dump(data, len, deb_i2c);
  406. return 0;
  407. }
  408. static int af9005_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
  409. int num)
  410. {
  411. /* only implements what the mt2060 module does, don't know how
  412. to make it really generic */
  413. struct dvb_usb_device *d = i2c_get_adapdata(adap);
  414. int ret;
  415. u8 reg, addr;
  416. u8 *value;
  417. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  418. return -EAGAIN;
  419. if (num > 2)
  420. warn("more than 2 i2c messages at a time is not handled yet. TODO.");
  421. if (num == 2) {
  422. /* reads a single register */
  423. reg = *msg[0].buf;
  424. addr = msg[0].addr;
  425. value = msg[1].buf;
  426. ret = af9005_i2c_read(d, addr, reg, value, 1);
  427. if (ret == 0)
  428. ret = 2;
  429. } else {
  430. /* write one or more registers */
  431. reg = msg[0].buf[0];
  432. addr = msg[0].addr;
  433. value = &msg[0].buf[1];
  434. ret = af9005_i2c_write(d, addr, reg, value, msg[0].len - 1);
  435. if (ret == 0)
  436. ret = 1;
  437. }
  438. mutex_unlock(&d->i2c_mutex);
  439. return ret;
  440. }
  441. static u32 af9005_i2c_func(struct i2c_adapter *adapter)
  442. {
  443. return I2C_FUNC_I2C;
  444. }
  445. static struct i2c_algorithm af9005_i2c_algo = {
  446. .master_xfer = af9005_i2c_xfer,
  447. .functionality = af9005_i2c_func,
  448. };
  449. int af9005_send_command(struct dvb_usb_device *d, u8 command, u8 * wbuf,
  450. int wlen, u8 * rbuf, int rlen)
  451. {
  452. struct af9005_device_state *st = d->priv;
  453. int ret, i, packet_len;
  454. u8 buf[64];
  455. u8 ibuf[64];
  456. if (wlen < 0) {
  457. err("send command, wlen less than 0 bytes. Makes no sense.");
  458. return -EINVAL;
  459. }
  460. if (wlen > 54) {
  461. err("send command, wlen more than 54 bytes. Not supported.");
  462. return -EINVAL;
  463. }
  464. if (rlen > 54) {
  465. err("send command, rlen more than 54 bytes. Not supported.");
  466. return -EINVAL;
  467. }
  468. packet_len = wlen + 5;
  469. buf[0] = (u8) (packet_len & 0xff);
  470. buf[1] = (u8) ((packet_len & 0xff00) >> 8);
  471. buf[2] = 0x26; /* packet type */
  472. buf[3] = wlen + 3;
  473. buf[4] = st->sequence++;
  474. buf[5] = command;
  475. buf[6] = wlen;
  476. for (i = 0; i < wlen; i++)
  477. buf[7 + i] = wbuf[i];
  478. ret = af9005_usb_generic_rw(d, buf, wlen + 7, ibuf, rlen + 7, 0);
  479. if (ret)
  480. return ret;
  481. if (ibuf[2] != 0x27) {
  482. err("send command, wrong reply code.");
  483. return -EIO;
  484. }
  485. if (ibuf[4] != buf[4]) {
  486. err("send command, wrong sequence in reply.");
  487. return -EIO;
  488. }
  489. if (ibuf[5] != 0x01) {
  490. err("send command, wrong status code in reply.");
  491. return -EIO;
  492. }
  493. if (ibuf[6] != rlen) {
  494. err("send command, invalid data length in reply.");
  495. return -EIO;
  496. }
  497. for (i = 0; i < rlen; i++)
  498. rbuf[i] = ibuf[i + 7];
  499. return 0;
  500. }
  501. int af9005_read_eeprom(struct dvb_usb_device *d, u8 address, u8 * values,
  502. int len)
  503. {
  504. struct af9005_device_state *st = d->priv;
  505. u8 obuf[16], ibuf[14];
  506. int ret, i;
  507. memset(obuf, 0, sizeof(obuf));
  508. memset(ibuf, 0, sizeof(ibuf));
  509. obuf[0] = 14; /* length of rest of packet low */
  510. obuf[1] = 0; /* length of rest of packer high */
  511. obuf[2] = 0x2a; /* read/write eeprom */
  512. obuf[3] = 12; /* size */
  513. obuf[4] = st->sequence++;
  514. obuf[5] = 0; /* read */
  515. obuf[6] = len;
  516. obuf[7] = address;
  517. ret = af9005_usb_generic_rw(d, obuf, 16, ibuf, 14, 0);
  518. if (ret)
  519. return ret;
  520. if (ibuf[2] != 0x2b) {
  521. err("Read eeprom, invalid reply code");
  522. return -EIO;
  523. }
  524. if (ibuf[3] != 10) {
  525. err("Read eeprom, invalid reply length");
  526. return -EIO;
  527. }
  528. if (ibuf[4] != obuf[4]) {
  529. err("Read eeprom, wrong sequence in reply ");
  530. return -EIO;
  531. }
  532. if (ibuf[5] != 1) {
  533. err("Read eeprom, wrong status in reply ");
  534. return -EIO;
  535. }
  536. for (i = 0; i < len; i++) {
  537. values[i] = ibuf[6 + i];
  538. }
  539. return 0;
  540. }
  541. static int af9005_boot_packet(struct usb_device *udev, int type, u8 * reply)
  542. {
  543. u8 buf[FW_BULKOUT_SIZE + 2];
  544. u16 checksum;
  545. int act_len, i, ret;
  546. memset(buf, 0, sizeof(buf));
  547. buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff);
  548. buf[1] = (u8) ((FW_BULKOUT_SIZE >> 8) & 0xff);
  549. switch (type) {
  550. case FW_CONFIG:
  551. buf[2] = 0x11;
  552. buf[3] = 0x04;
  553. buf[4] = 0x00; /* sequence number, original driver doesn't increment it here */
  554. buf[5] = 0x03;
  555. checksum = buf[4] + buf[5];
  556. buf[6] = (u8) ((checksum >> 8) & 0xff);
  557. buf[7] = (u8) (checksum & 0xff);
  558. break;
  559. case FW_CONFIRM:
  560. buf[2] = 0x11;
  561. buf[3] = 0x04;
  562. buf[4] = 0x00; /* sequence number, original driver doesn't increment it here */
  563. buf[5] = 0x01;
  564. checksum = buf[4] + buf[5];
  565. buf[6] = (u8) ((checksum >> 8) & 0xff);
  566. buf[7] = (u8) (checksum & 0xff);
  567. break;
  568. case FW_BOOT:
  569. buf[2] = 0x10;
  570. buf[3] = 0x08;
  571. buf[4] = 0x00; /* sequence number, original driver doesn't increment it here */
  572. buf[5] = 0x97;
  573. buf[6] = 0xaa;
  574. buf[7] = 0x55;
  575. buf[8] = 0xa5;
  576. buf[9] = 0x5a;
  577. checksum = 0;
  578. for (i = 4; i <= 9; i++)
  579. checksum += buf[i];
  580. buf[10] = (u8) ((checksum >> 8) & 0xff);
  581. buf[11] = (u8) (checksum & 0xff);
  582. break;
  583. default:
  584. err("boot packet invalid boot packet type");
  585. return -EINVAL;
  586. }
  587. deb_fw(">>> ");
  588. debug_dump(buf, FW_BULKOUT_SIZE + 2, deb_fw);
  589. ret = usb_bulk_msg(udev,
  590. usb_sndbulkpipe(udev, 0x02),
  591. buf, FW_BULKOUT_SIZE + 2, &act_len, 2000);
  592. if (ret)
  593. err("boot packet bulk message failed: %d (%d/%d)", ret,
  594. FW_BULKOUT_SIZE + 2, act_len);
  595. else
  596. ret = act_len != FW_BULKOUT_SIZE + 2 ? -1 : 0;
  597. if (ret)
  598. return ret;
  599. memset(buf, 0, 9);
  600. ret = usb_bulk_msg(udev,
  601. usb_rcvbulkpipe(udev, 0x01), buf, 9, &act_len, 2000);
  602. if (ret) {
  603. err("boot packet recv bulk message failed: %d", ret);
  604. return ret;
  605. }
  606. deb_fw("<<< ");
  607. debug_dump(buf, act_len, deb_fw);
  608. checksum = 0;
  609. switch (type) {
  610. case FW_CONFIG:
  611. if (buf[2] != 0x11) {
  612. err("boot bad config header.");
  613. return -EIO;
  614. }
  615. if (buf[3] != 0x05) {
  616. err("boot bad config size.");
  617. return -EIO;
  618. }
  619. if (buf[4] != 0x00) {
  620. err("boot bad config sequence.");
  621. return -EIO;
  622. }
  623. if (buf[5] != 0x04) {
  624. err("boot bad config subtype.");
  625. return -EIO;
  626. }
  627. for (i = 4; i <= 6; i++)
  628. checksum += buf[i];
  629. if (buf[7] * 256 + buf[8] != checksum) {
  630. err("boot bad config checksum.");
  631. return -EIO;
  632. }
  633. *reply = buf[6];
  634. break;
  635. case FW_CONFIRM:
  636. if (buf[2] != 0x11) {
  637. err("boot bad confirm header.");
  638. return -EIO;
  639. }
  640. if (buf[3] != 0x05) {
  641. err("boot bad confirm size.");
  642. return -EIO;
  643. }
  644. if (buf[4] != 0x00) {
  645. err("boot bad confirm sequence.");
  646. return -EIO;
  647. }
  648. if (buf[5] != 0x02) {
  649. err("boot bad confirm subtype.");
  650. return -EIO;
  651. }
  652. for (i = 4; i <= 6; i++)
  653. checksum += buf[i];
  654. if (buf[7] * 256 + buf[8] != checksum) {
  655. err("boot bad confirm checksum.");
  656. return -EIO;
  657. }
  658. *reply = buf[6];
  659. break;
  660. case FW_BOOT:
  661. if (buf[2] != 0x10) {
  662. err("boot bad boot header.");
  663. return -EIO;
  664. }
  665. if (buf[3] != 0x05) {
  666. err("boot bad boot size.");
  667. return -EIO;
  668. }
  669. if (buf[4] != 0x00) {
  670. err("boot bad boot sequence.");
  671. return -EIO;
  672. }
  673. if (buf[5] != 0x01) {
  674. err("boot bad boot pattern 01.");
  675. return -EIO;
  676. }
  677. if (buf[6] != 0x10) {
  678. err("boot bad boot pattern 10.");
  679. return -EIO;
  680. }
  681. for (i = 4; i <= 6; i++)
  682. checksum += buf[i];
  683. if (buf[7] * 256 + buf[8] != checksum) {
  684. err("boot bad boot checksum.");
  685. return -EIO;
  686. }
  687. break;
  688. }
  689. return 0;
  690. }
  691. int af9005_download_firmware(struct usb_device *udev, const struct firmware *fw)
  692. {
  693. int i, packets, ret, act_len;
  694. u8 buf[FW_BULKOUT_SIZE + 2];
  695. u8 reply;
  696. ret = af9005_boot_packet(udev, FW_CONFIG, &reply);
  697. if (ret)
  698. return ret;
  699. if (reply != 0x01) {
  700. err("before downloading firmware, FW_CONFIG expected 0x01, received 0x%x", reply);
  701. return -EIO;
  702. }
  703. packets = fw->size / FW_BULKOUT_SIZE;
  704. buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff);
  705. buf[1] = (u8) ((FW_BULKOUT_SIZE >> 8) & 0xff);
  706. for (i = 0; i < packets; i++) {
  707. memcpy(&buf[2], fw->data + i * FW_BULKOUT_SIZE,
  708. FW_BULKOUT_SIZE);
  709. deb_fw(">>> ");
  710. debug_dump(buf, FW_BULKOUT_SIZE + 2, deb_fw);
  711. ret = usb_bulk_msg(udev,
  712. usb_sndbulkpipe(udev, 0x02),
  713. buf, FW_BULKOUT_SIZE + 2, &act_len, 1000);
  714. if (ret) {
  715. err("firmware download failed at packet %d with code %d", i, ret);
  716. return ret;
  717. }
  718. }
  719. ret = af9005_boot_packet(udev, FW_CONFIRM, &reply);
  720. if (ret)
  721. return ret;
  722. if (reply != (u8) (packets & 0xff)) {
  723. err("after downloading firmware, FW_CONFIRM expected 0x%x, received 0x%x", packets & 0xff, reply);
  724. return -EIO;
  725. }
  726. ret = af9005_boot_packet(udev, FW_BOOT, &reply);
  727. if (ret)
  728. return ret;
  729. ret = af9005_boot_packet(udev, FW_CONFIG, &reply);
  730. if (ret)
  731. return ret;
  732. if (reply != 0x02) {
  733. err("after downloading firmware, FW_CONFIG expected 0x02, received 0x%x", reply);
  734. return -EIO;
  735. }
  736. return 0;
  737. }
  738. int af9005_led_control(struct dvb_usb_device *d, int onoff)
  739. {
  740. struct af9005_device_state *st = d->priv;
  741. int temp, ret;
  742. if (onoff && dvb_usb_af9005_led)
  743. temp = 1;
  744. else
  745. temp = 0;
  746. if (st->led_state != temp) {
  747. ret =
  748. af9005_write_register_bits(d, xd_p_reg_top_locken1,
  749. reg_top_locken1_pos,
  750. reg_top_locken1_len, temp);
  751. if (ret)
  752. return ret;
  753. ret =
  754. af9005_write_register_bits(d, xd_p_reg_top_lock1,
  755. reg_top_lock1_pos,
  756. reg_top_lock1_len, temp);
  757. if (ret)
  758. return ret;
  759. st->led_state = temp;
  760. }
  761. return 0;
  762. }
  763. static int af9005_frontend_attach(struct dvb_usb_adapter *adap)
  764. {
  765. u8 buf[8];
  766. int i;
  767. /* without these calls the first commands after downloading
  768. the firmware fail. I put these calls here to simulate
  769. what it is done in dvb-usb-init.c.
  770. */
  771. struct usb_device *udev = adap->dev->udev;
  772. usb_clear_halt(udev, usb_sndbulkpipe(udev, 2));
  773. usb_clear_halt(udev, usb_rcvbulkpipe(udev, 1));
  774. if (dvb_usb_af9005_dump_eeprom) {
  775. printk("EEPROM DUMP\n");
  776. for (i = 0; i < 255; i += 8) {
  777. af9005_read_eeprom(adap->dev, i, buf, 8);
  778. printk("ADDR %x ", i);
  779. debug_dump(buf, 8, printk);
  780. }
  781. }
  782. adap->fe = af9005_fe_attach(adap->dev);
  783. return 0;
  784. }
  785. static int af9005_rc_query(struct dvb_usb_device *d, u32 * event, int *state)
  786. {
  787. struct af9005_device_state *st = d->priv;
  788. int ret, len;
  789. u8 obuf[5];
  790. u8 ibuf[256];
  791. *state = REMOTE_NO_KEY_PRESSED;
  792. if (rc_decode == NULL) {
  793. /* it shouldn't never come here */
  794. return 0;
  795. }
  796. /* deb_info("rc_query\n"); */
  797. obuf[0] = 3; /* rest of packet length low */
  798. obuf[1] = 0; /* rest of packet lentgh high */
  799. obuf[2] = 0x40; /* read remote */
  800. obuf[3] = 1; /* rest of packet length */
  801. obuf[4] = st->sequence++; /* sequence number */
  802. ret = af9005_usb_generic_rw(d, obuf, 5, ibuf, 256, 0);
  803. if (ret) {
  804. err("rc query failed");
  805. return ret;
  806. }
  807. if (ibuf[2] != 0x41) {
  808. err("rc query bad header.");
  809. return -EIO;
  810. }
  811. if (ibuf[4] != obuf[4]) {
  812. err("rc query bad sequence.");
  813. return -EIO;
  814. }
  815. len = ibuf[5];
  816. if (len > 246) {
  817. err("rc query invalid length");
  818. return -EIO;
  819. }
  820. if (len > 0) {
  821. deb_rc("rc data (%d) ", len);
  822. debug_dump((ibuf + 6), len, deb_rc);
  823. ret = rc_decode(d, &ibuf[6], len, event, state);
  824. if (ret) {
  825. err("rc_decode failed");
  826. return ret;
  827. } else {
  828. deb_rc("rc_decode state %x event %x\n", *state, *event);
  829. if (*state == REMOTE_KEY_REPEAT)
  830. *event = d->last_event;
  831. }
  832. }
  833. return 0;
  834. }
  835. static int af9005_power_ctrl(struct dvb_usb_device *d, int onoff)
  836. {
  837. return 0;
  838. }
  839. static int af9005_pid_filter_control(struct dvb_usb_adapter *adap, int onoff)
  840. {
  841. int ret;
  842. deb_info("pid filter control onoff %d\n", onoff);
  843. if (onoff) {
  844. ret =
  845. af9005_write_ofdm_register(adap->dev, XD_MP2IF_DMX_CTRL, 1);
  846. if (ret)
  847. return ret;
  848. ret =
  849. af9005_write_register_bits(adap->dev,
  850. XD_MP2IF_DMX_CTRL, 1, 1, 1);
  851. if (ret)
  852. return ret;
  853. ret =
  854. af9005_write_ofdm_register(adap->dev, XD_MP2IF_DMX_CTRL, 1);
  855. } else
  856. ret =
  857. af9005_write_ofdm_register(adap->dev, XD_MP2IF_DMX_CTRL, 0);
  858. if (ret)
  859. return ret;
  860. deb_info("pid filter control ok\n");
  861. return 0;
  862. }
  863. static int af9005_pid_filter(struct dvb_usb_adapter *adap, int index,
  864. u16 pid, int onoff)
  865. {
  866. u8 cmd = index & 0x1f;
  867. int ret;
  868. deb_info("set pid filter, index %d, pid %x, onoff %d\n", index,
  869. pid, onoff);
  870. if (onoff) {
  871. /* cannot use it as pid_filter_ctrl since it has to be done
  872. before setting the first pid */
  873. if (adap->feedcount == 1) {
  874. deb_info("first pid set, enable pid table\n");
  875. ret = af9005_pid_filter_control(adap, onoff);
  876. if (ret)
  877. return ret;
  878. }
  879. ret =
  880. af9005_write_ofdm_register(adap->dev,
  881. XD_MP2IF_PID_DATA_L,
  882. (u8) (pid & 0xff));
  883. if (ret)
  884. return ret;
  885. ret =
  886. af9005_write_ofdm_register(adap->dev,
  887. XD_MP2IF_PID_DATA_H,
  888. (u8) (pid >> 8));
  889. if (ret)
  890. return ret;
  891. cmd |= 0x20 | 0x40;
  892. } else {
  893. if (adap->feedcount == 0) {
  894. deb_info("last pid unset, disable pid table\n");
  895. ret = af9005_pid_filter_control(adap, onoff);
  896. if (ret)
  897. return ret;
  898. }
  899. }
  900. ret = af9005_write_ofdm_register(adap->dev, XD_MP2IF_PID_IDX, cmd);
  901. if (ret)
  902. return ret;
  903. deb_info("set pid ok\n");
  904. return 0;
  905. }
  906. static int af9005_identify_state(struct usb_device *udev,
  907. struct dvb_usb_device_properties *props,
  908. struct dvb_usb_device_description **desc,
  909. int *cold)
  910. {
  911. int ret;
  912. u8 reply;
  913. ret = af9005_boot_packet(udev, FW_CONFIG, &reply);
  914. if (ret)
  915. return ret;
  916. deb_info("result of FW_CONFIG in identify state %d\n", reply);
  917. if (reply == 0x01)
  918. *cold = 1;
  919. else if (reply == 0x02)
  920. *cold = 0;
  921. else
  922. return -EIO;
  923. deb_info("Identify state cold = %d\n", *cold);
  924. return 0;
  925. }
  926. static struct dvb_usb_device_properties af9005_properties;
  927. static int af9005_usb_probe(struct usb_interface *intf,
  928. const struct usb_device_id *id)
  929. {
  930. return dvb_usb_device_init(intf, &af9005_properties,
  931. THIS_MODULE, NULL, adapter_nr);
  932. }
  933. static struct usb_device_id af9005_usb_table[] = {
  934. {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9005)},
  935. {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE)},
  936. {USB_DEVICE(USB_VID_ANSONIC, USB_PID_ANSONIC_DVBT_USB)},
  937. {0},
  938. };
  939. MODULE_DEVICE_TABLE(usb, af9005_usb_table);
  940. static struct dvb_usb_device_properties af9005_properties = {
  941. .caps = DVB_USB_IS_AN_I2C_ADAPTER,
  942. .usb_ctrl = DEVICE_SPECIFIC,
  943. .firmware = "af9005.fw",
  944. .download_firmware = af9005_download_firmware,
  945. .no_reconnect = 1,
  946. .size_of_priv = sizeof(struct af9005_device_state),
  947. .num_adapters = 1,
  948. .adapter = {
  949. {
  950. .caps =
  951. DVB_USB_ADAP_HAS_PID_FILTER |
  952. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  953. .pid_filter_count = 32,
  954. .pid_filter = af9005_pid_filter,
  955. /* .pid_filter_ctrl = af9005_pid_filter_control, */
  956. .frontend_attach = af9005_frontend_attach,
  957. /* .tuner_attach = af9005_tuner_attach, */
  958. /* parameter for the MPEG2-data transfer */
  959. .stream = {
  960. .type = USB_BULK,
  961. .count = 10,
  962. .endpoint = 0x04,
  963. .u = {
  964. .bulk = {
  965. .buffersize = 4096, /* actual size seen is 3948 */
  966. }
  967. }
  968. },
  969. }
  970. },
  971. .power_ctrl = af9005_power_ctrl,
  972. .identify_state = af9005_identify_state,
  973. .i2c_algo = &af9005_i2c_algo,
  974. .rc_interval = 200,
  975. .rc_key_map = NULL,
  976. .rc_key_map_size = 0,
  977. .rc_query = af9005_rc_query,
  978. .num_device_descs = 3,
  979. .devices = {
  980. {.name = "Afatech DVB-T USB1.1 stick",
  981. .cold_ids = {&af9005_usb_table[0], NULL},
  982. .warm_ids = {NULL},
  983. },
  984. {.name = "TerraTec Cinergy T USB XE",
  985. .cold_ids = {&af9005_usb_table[1], NULL},
  986. .warm_ids = {NULL},
  987. },
  988. {.name = "Ansonic DVB-T USB1.1 stick",
  989. .cold_ids = {&af9005_usb_table[2], NULL},
  990. .warm_ids = {NULL},
  991. },
  992. {NULL},
  993. }
  994. };
  995. /* usb specific object needed to register this driver with the usb subsystem */
  996. static struct usb_driver af9005_usb_driver = {
  997. .name = "dvb_usb_af9005",
  998. .probe = af9005_usb_probe,
  999. .disconnect = dvb_usb_device_exit,
  1000. .id_table = af9005_usb_table,
  1001. };
  1002. /* module stuff */
  1003. static int __init af9005_usb_module_init(void)
  1004. {
  1005. int result;
  1006. if ((result = usb_register(&af9005_usb_driver))) {
  1007. err("usb_register failed. (%d)", result);
  1008. return result;
  1009. }
  1010. rc_decode = symbol_request(af9005_rc_decode);
  1011. rc_keys = symbol_request(af9005_rc_keys);
  1012. rc_keys_size = symbol_request(af9005_rc_keys_size);
  1013. if (rc_decode == NULL || rc_keys == NULL || rc_keys_size == NULL) {
  1014. err("af9005_rc_decode function not found, disabling remote");
  1015. af9005_properties.rc_query = NULL;
  1016. } else {
  1017. af9005_properties.rc_key_map = rc_keys;
  1018. af9005_properties.rc_key_map_size = *rc_keys_size;
  1019. }
  1020. return 0;
  1021. }
  1022. static void __exit af9005_usb_module_exit(void)
  1023. {
  1024. /* release rc decode symbols */
  1025. if (rc_decode != NULL)
  1026. symbol_put(af9005_rc_decode);
  1027. if (rc_keys != NULL)
  1028. symbol_put(af9005_rc_keys);
  1029. if (rc_keys_size != NULL)
  1030. symbol_put(af9005_rc_keys_size);
  1031. /* deregister this driver from the USB subsystem */
  1032. usb_deregister(&af9005_usb_driver);
  1033. }
  1034. module_init(af9005_usb_module_init);
  1035. module_exit(af9005_usb_module_exit);
  1036. MODULE_AUTHOR("Luca Olivetti <luca@ventoso.org>");
  1037. MODULE_DESCRIPTION("Driver for Afatech 9005 DVB-T USB1.1 stick");
  1038. MODULE_VERSION("1.0");
  1039. MODULE_LICENSE("GPL");