af9005.c 27 KB

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