1
2
3
4
5
6#include "dib0700.h"
7
8
9int dvb_usb_dib0700_debug;
10module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
11MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);
12
13static int nb_packet_buffer_size = 21;
14module_param(nb_packet_buffer_size, int, 0644);
15MODULE_PARM_DESC(nb_packet_buffer_size,
16 "Set the dib0700 driver data buffer size. This parameter corresponds to the number of TS packets. The actual size of the data buffer corresponds to this parameter multiplied by 188 (default: 21)");
17
18DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
19
20
21int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
22 u32 *romversion, u32 *ramversion, u32 *fwtype)
23{
24 struct dib0700_state *st = d->priv;
25 int ret;
26
27 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
28 err("could not acquire lock");
29 return -EINTR;
30 }
31
32 ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
33 REQUEST_GET_VERSION,
34 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
35 st->buf, 16, USB_CTRL_GET_TIMEOUT);
36 if (hwversion != NULL)
37 *hwversion = (st->buf[0] << 24) | (st->buf[1] << 16) |
38 (st->buf[2] << 8) | st->buf[3];
39 if (romversion != NULL)
40 *romversion = (st->buf[4] << 24) | (st->buf[5] << 16) |
41 (st->buf[6] << 8) | st->buf[7];
42 if (ramversion != NULL)
43 *ramversion = (st->buf[8] << 24) | (st->buf[9] << 16) |
44 (st->buf[10] << 8) | st->buf[11];
45 if (fwtype != NULL)
46 *fwtype = (st->buf[12] << 24) | (st->buf[13] << 16) |
47 (st->buf[14] << 8) | st->buf[15];
48 mutex_unlock(&d->usb_mutex);
49 return ret;
50}
51
52
53static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
54{
55 int status;
56
57 deb_data(">>> ");
58 debug_dump(tx, txlen, deb_data);
59
60 status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
61 tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
62 USB_CTRL_GET_TIMEOUT);
63
64 if (status != txlen)
65 deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
66
67 return status < 0 ? status : 0;
68}
69
70
71int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
72{
73 u16 index, value;
74 int status;
75
76 if (txlen < 2) {
77 err("tx buffer length is smaller than 2. Makes no sense.");
78 return -EINVAL;
79 }
80 if (txlen > 4) {
81 err("tx buffer length is larger than 4. Not supported.");
82 return -EINVAL;
83 }
84
85 deb_data(">>> ");
86 debug_dump(tx,txlen,deb_data);
87
88 value = ((txlen - 2) << 8) | tx[1];
89 index = 0;
90 if (txlen > 2)
91 index |= (tx[2] << 8);
92 if (txlen > 3)
93 index |= tx[3];
94
95 status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
96 USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
97 USB_CTRL_GET_TIMEOUT);
98
99 if (status < 0)
100 deb_info("ep 0 read error (status = %d)\n",status);
101
102 deb_data("<<< ");
103 debug_dump(rx, rxlen, deb_data);
104
105 return status;
106}
107
108int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
109{
110 struct dib0700_state *st = d->priv;
111 int ret;
112
113 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
114 err("could not acquire lock");
115 return -EINTR;
116 }
117
118 st->buf[0] = REQUEST_SET_GPIO;
119 st->buf[1] = gpio;
120 st->buf[2] = ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6);
121
122 ret = dib0700_ctrl_wr(d, st->buf, 3);
123
124 mutex_unlock(&d->usb_mutex);
125 return ret;
126}
127
128static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
129{
130 struct dib0700_state *st = d->priv;
131 int ret;
132
133 if (st->fw_version >= 0x10201) {
134 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
135 err("could not acquire lock");
136 return -EINTR;
137 }
138
139 st->buf[0] = REQUEST_SET_USB_XFER_LEN;
140 st->buf[1] = (nb_ts_packets >> 8) & 0xff;
141 st->buf[2] = nb_ts_packets & 0xff;
142
143 deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);
144
145 ret = dib0700_ctrl_wr(d, st->buf, 3);
146 mutex_unlock(&d->usb_mutex);
147 } else {
148 deb_info("this firmware does not allow to change the USB xfer len\n");
149 ret = -EIO;
150 }
151
152 return ret;
153}
154
155
156
157
158static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg,
159 int num)
160{
161
162
163
164 struct dvb_usb_device *d = i2c_get_adapdata(adap);
165 struct dib0700_state *st = d->priv;
166 uint8_t bus_mode = 1;
167 uint8_t gen_mode = 0;
168 uint8_t en_start = 0;
169 uint8_t en_stop = 0;
170 int result, i;
171
172
173
174 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
175 return -EINTR;
176
177 for (i = 0; i < num; i++) {
178 if (i == 0) {
179
180 en_start = 1;
181 } else if (!(msg[i].flags & I2C_M_NOSTART)) {
182
183 en_start = 1;
184 } else {
185
186
187 en_start = 0;
188 }
189 if (i == (num - 1)) {
190
191 en_stop = 1;
192 }
193
194 if (msg[i].flags & I2C_M_RD) {
195
196 u16 index, value;
197 uint8_t i2c_dest;
198
199 i2c_dest = (msg[i].addr << 1);
200 value = ((en_start << 7) | (en_stop << 6) |
201 (msg[i].len & 0x3F)) << 8 | i2c_dest;
202
203 index = ((gen_mode << 6) & 0xC0) |
204 ((bus_mode << 4) & 0x30);
205
206 result = usb_control_msg(d->udev,
207 usb_rcvctrlpipe(d->udev, 0),
208 REQUEST_NEW_I2C_READ,
209 USB_TYPE_VENDOR | USB_DIR_IN,
210 value, index, st->buf,
211 msg[i].len,
212 USB_CTRL_GET_TIMEOUT);
213 if (result < 0) {
214 deb_info("i2c read error (status = %d)\n", result);
215 goto unlock;
216 }
217
218 if (msg[i].len > sizeof(st->buf)) {
219 deb_info("buffer too small to fit %d bytes\n",
220 msg[i].len);
221 result = -EIO;
222 goto unlock;
223 }
224
225 memcpy(msg[i].buf, st->buf, msg[i].len);
226
227 deb_data("<<< ");
228 debug_dump(msg[i].buf, msg[i].len, deb_data);
229
230 } else {
231
232 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
233 err("could not acquire lock");
234 result = -EINTR;
235 goto unlock;
236 }
237 st->buf[0] = REQUEST_NEW_I2C_WRITE;
238 st->buf[1] = msg[i].addr << 1;
239 st->buf[2] = (en_start << 7) | (en_stop << 6) |
240 (msg[i].len & 0x3F);
241
242 st->buf[3] = ((gen_mode << 6) & 0xC0) |
243 ((bus_mode << 4) & 0x30);
244
245 if (msg[i].len > sizeof(st->buf) - 4) {
246 deb_info("i2c message to big: %d\n",
247 msg[i].len);
248 mutex_unlock(&d->usb_mutex);
249 result = -EIO;
250 goto unlock;
251 }
252
253
254 memcpy(&st->buf[4], msg[i].buf, msg[i].len);
255
256 deb_data(">>> ");
257 debug_dump(st->buf, msg[i].len + 4, deb_data);
258
259 result = usb_control_msg(d->udev,
260 usb_sndctrlpipe(d->udev, 0),
261 REQUEST_NEW_I2C_WRITE,
262 USB_TYPE_VENDOR | USB_DIR_OUT,
263 0, 0, st->buf, msg[i].len + 4,
264 USB_CTRL_GET_TIMEOUT);
265 mutex_unlock(&d->usb_mutex);
266 if (result < 0) {
267 deb_info("i2c write error (status = %d)\n", result);
268 break;
269 }
270 }
271 }
272 result = i;
273
274unlock:
275 mutex_unlock(&d->i2c_mutex);
276 return result;
277}
278
279
280
281
282static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
283 struct i2c_msg *msg, int num)
284{
285 struct dvb_usb_device *d = i2c_get_adapdata(adap);
286 struct dib0700_state *st = d->priv;
287 int i, len, result;
288
289 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
290 return -EINTR;
291 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
292 err("could not acquire lock");
293 mutex_unlock(&d->i2c_mutex);
294 return -EINTR;
295 }
296
297 for (i = 0; i < num; i++) {
298
299 st->buf[1] = msg[i].addr << 1;
300
301 if (msg[i].len > sizeof(st->buf) - 2) {
302 deb_info("i2c xfer to big: %d\n",
303 msg[i].len);
304 result = -EIO;
305 goto unlock;
306 }
307 memcpy(&st->buf[2], msg[i].buf, msg[i].len);
308
309
310 if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
311 st->buf[0] = REQUEST_I2C_READ;
312 st->buf[1] |= 1;
313
314
315 len = dib0700_ctrl_rd(d, st->buf, msg[i].len + 2,
316 st->buf, msg[i + 1].len);
317 if (len <= 0) {
318 deb_info("I2C read failed on address 0x%02x\n",
319 msg[i].addr);
320 result = -EIO;
321 goto unlock;
322 }
323
324 if (msg[i + 1].len > sizeof(st->buf)) {
325 deb_info("i2c xfer buffer to small for %d\n",
326 msg[i].len);
327 result = -EIO;
328 goto unlock;
329 }
330 memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);
331
332 msg[i+1].len = len;
333
334 i++;
335 } else {
336 st->buf[0] = REQUEST_I2C_WRITE;
337 result = dib0700_ctrl_wr(d, st->buf, msg[i].len + 2);
338 if (result < 0)
339 goto unlock;
340 }
341 }
342 result = i;
343unlock:
344 mutex_unlock(&d->usb_mutex);
345 mutex_unlock(&d->i2c_mutex);
346
347 return result;
348}
349
350static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
351 int num)
352{
353 struct dvb_usb_device *d = i2c_get_adapdata(adap);
354 struct dib0700_state *st = d->priv;
355
356 if (st->fw_use_new_i2c_api == 1) {
357
358 return dib0700_i2c_xfer_new(adap, msg, num);
359 } else {
360
361 return dib0700_i2c_xfer_legacy(adap, msg, num);
362 }
363}
364
365static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
366{
367 return I2C_FUNC_I2C;
368}
369
370struct i2c_algorithm dib0700_i2c_algo = {
371 .master_xfer = dib0700_i2c_xfer,
372 .functionality = dib0700_i2c_func,
373};
374
375int dib0700_identify_state(struct usb_device *udev,
376 const struct dvb_usb_device_properties *props,
377 const struct dvb_usb_device_description **desc,
378 int *cold)
379{
380 s16 ret;
381 u8 *b;
382
383 b = kmalloc(16, GFP_KERNEL);
384 if (!b)
385 return -ENOMEM;
386
387
388 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
389 REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);
390
391 deb_info("FW GET_VERSION length: %d\n",ret);
392
393 *cold = ret <= 0;
394 deb_info("cold: %d\n", *cold);
395
396 kfree(b);
397 return 0;
398}
399
400static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll,
401 u8 pll_src, u8 pll_range, u8 clock_gpio3, u16 pll_prediv,
402 u16 pll_loopdiv, u16 free_div, u16 dsuScaler)
403{
404 struct dib0700_state *st = d->priv;
405 int ret;
406
407 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
408 err("could not acquire lock");
409 return -EINTR;
410 }
411
412 st->buf[0] = REQUEST_SET_CLOCK;
413 st->buf[1] = (en_pll << 7) | (pll_src << 6) |
414 (pll_range << 5) | (clock_gpio3 << 4);
415 st->buf[2] = (pll_prediv >> 8) & 0xff;
416 st->buf[3] = pll_prediv & 0xff;
417 st->buf[4] = (pll_loopdiv >> 8) & 0xff;
418 st->buf[5] = pll_loopdiv & 0xff;
419 st->buf[6] = (free_div >> 8) & 0xff;
420 st->buf[7] = free_div & 0xff;
421 st->buf[8] = (dsuScaler >> 8) & 0xff;
422 st->buf[9] = dsuScaler & 0xff;
423
424 ret = dib0700_ctrl_wr(d, st->buf, 10);
425 mutex_unlock(&d->usb_mutex);
426
427 return ret;
428}
429
430int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
431{
432 struct dib0700_state *st = d->priv;
433 u16 divider;
434 int ret;
435
436 if (scl_kHz == 0)
437 return -EINVAL;
438
439 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
440 err("could not acquire lock");
441 return -EINTR;
442 }
443
444 st->buf[0] = REQUEST_SET_I2C_PARAM;
445 divider = (u16) (30000 / scl_kHz);
446 st->buf[1] = 0;
447 st->buf[2] = (u8) (divider >> 8);
448 st->buf[3] = (u8) (divider & 0xff);
449 divider = (u16) (72000 / scl_kHz);
450 st->buf[4] = (u8) (divider >> 8);
451 st->buf[5] = (u8) (divider & 0xff);
452 divider = (u16) (72000 / scl_kHz);
453 st->buf[6] = (u8) (divider >> 8);
454 st->buf[7] = (u8) (divider & 0xff);
455
456 deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
457 (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
458 st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
459
460 ret = dib0700_ctrl_wr(d, st->buf, 8);
461 mutex_unlock(&d->usb_mutex);
462
463 return ret;
464}
465
466
467int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
468{
469 switch (clk_MHz) {
470 case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
471 default: return -EINVAL;
472 }
473 return 0;
474}
475
476static int dib0700_jumpram(struct usb_device *udev, u32 address)
477{
478 int ret = 0, actlen;
479 u8 *buf;
480
481 buf = kmalloc(8, GFP_KERNEL);
482 if (!buf)
483 return -ENOMEM;
484 buf[0] = REQUEST_JUMPRAM;
485 buf[1] = 0;
486 buf[2] = 0;
487 buf[3] = 0;
488 buf[4] = (address >> 24) & 0xff;
489 buf[5] = (address >> 16) & 0xff;
490 buf[6] = (address >> 8) & 0xff;
491 buf[7] = address & 0xff;
492
493 if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
494 deb_fw("jumpram to 0x%x failed\n",address);
495 goto out;
496 }
497 if (actlen != 8) {
498 deb_fw("jumpram to 0x%x failed\n",address);
499 ret = -EIO;
500 goto out;
501 }
502out:
503 kfree(buf);
504 return ret;
505}
506
507int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
508{
509 struct hexline hx;
510 int pos = 0, ret, act_len, i, adap_num;
511 u8 *buf;
512 u32 fw_version;
513
514 buf = kmalloc(260, GFP_KERNEL);
515 if (!buf)
516 return -ENOMEM;
517
518 while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
519 deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
520 hx.addr, hx.len, hx.chk);
521
522 buf[0] = hx.len;
523 buf[1] = (hx.addr >> 8) & 0xff;
524 buf[2] = hx.addr & 0xff;
525 buf[3] = hx.type;
526 memcpy(&buf[4],hx.data,hx.len);
527 buf[4+hx.len] = hx.chk;
528
529 ret = usb_bulk_msg(udev,
530 usb_sndbulkpipe(udev, 0x01),
531 buf,
532 hx.len + 5,
533 &act_len,
534 1000);
535
536 if (ret < 0) {
537 err("firmware download failed at %d with %d",pos,ret);
538 goto out;
539 }
540 }
541
542 if (ret == 0) {
543
544 if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
545 info("firmware started successfully.");
546 msleep(500);
547 }
548 } else
549 ret = -EIO;
550
551
552 if (nb_packet_buffer_size < 1)
553 nb_packet_buffer_size = 1;
554
555
556 usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
557 REQUEST_GET_VERSION,
558 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
559 buf, 16, USB_CTRL_GET_TIMEOUT);
560 fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
561
562
563
564 for (i = 0; i < dib0700_device_count; i++) {
565 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
566 adap_num++) {
567 if (fw_version >= 0x10201) {
568 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
569 } else {
570
571
572 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
573 if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
574 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
575 }
576 }
577 }
578out:
579 kfree(buf);
580 return ret;
581}
582
583int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
584{
585 struct dib0700_state *st = adap->dev->priv;
586 int ret;
587
588 if ((onoff != 0) && (st->fw_version >= 0x10201)) {
589
590
591 ret = dib0700_set_usb_xfer_len(adap->dev,
592 st->nb_packet_buffer_size);
593 if (ret < 0) {
594 deb_info("can not set the USB xfer len\n");
595 return ret;
596 }
597 }
598
599 mutex_lock(&adap->dev->usb_mutex);
600
601 st->buf[0] = REQUEST_ENABLE_VIDEO;
602
603
604 st->buf[1] = (onoff << 4) | 0x00;
605
606 if (st->disable_streaming_master_mode == 1)
607 st->buf[2] = 0x00;
608 else
609 st->buf[2] = 0x01 << 4;
610
611 st->buf[3] = 0x00;
612
613 deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
614
615 st->channel_state &= ~0x3;
616 if ((adap->fe_adap[0].stream.props.endpoint != 2)
617 && (adap->fe_adap[0].stream.props.endpoint != 3)) {
618 deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
619 if (onoff)
620 st->channel_state |= 1 << (adap->id);
621 else
622 st->channel_state |= 1 << ~(adap->id);
623 } else {
624 if (onoff)
625 st->channel_state |= 1 << (adap->fe_adap[0].stream.props.endpoint-2);
626 else
627 st->channel_state |= 1 << (3-adap->fe_adap[0].stream.props.endpoint);
628 }
629
630 st->buf[2] |= st->channel_state;
631
632 deb_info("data for streaming: %x %x\n", st->buf[1], st->buf[2]);
633
634 ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
635 mutex_unlock(&adap->dev->usb_mutex);
636
637 return ret;
638}
639
640int dib0700_change_protocol(struct rc_dev *rc, u64 *rc_proto)
641{
642 struct dvb_usb_device *d = rc->priv;
643 struct dib0700_state *st = d->priv;
644 int new_proto, ret;
645
646 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
647 err("could not acquire lock");
648 return -EINTR;
649 }
650
651 st->buf[0] = REQUEST_SET_RC;
652 st->buf[1] = 0;
653 st->buf[2] = 0;
654
655
656 if (*rc_proto & RC_PROTO_BIT_RC5) {
657 new_proto = 1;
658 *rc_proto = RC_PROTO_BIT_RC5;
659 } else if (*rc_proto & RC_PROTO_BIT_NEC) {
660 new_proto = 0;
661 *rc_proto = RC_PROTO_BIT_NEC;
662 } else if (*rc_proto & RC_PROTO_BIT_RC6_MCE) {
663 if (st->fw_version < 0x10200) {
664 ret = -EINVAL;
665 goto out;
666 }
667 new_proto = 2;
668 *rc_proto = RC_PROTO_BIT_RC6_MCE;
669 } else {
670 ret = -EINVAL;
671 goto out;
672 }
673
674 st->buf[1] = new_proto;
675
676 ret = dib0700_ctrl_wr(d, st->buf, 3);
677 if (ret < 0) {
678 err("ir protocol setup failed");
679 goto out;
680 }
681
682 d->props.rc.core.protocol = *rc_proto;
683
684out:
685 mutex_unlock(&d->usb_mutex);
686 return ret;
687}
688
689
690struct dib0700_rc_response {
691 u8 report_id;
692 u8 data_state;
693 union {
694 struct {
695 u8 system;
696 u8 not_system;
697 u8 data;
698 u8 not_data;
699 } nec;
700 struct {
701 u8 not_used;
702 u8 system;
703 u8 data;
704 u8 not_data;
705 } rc5;
706 };
707};
708#define RC_MSG_SIZE_V1_20 6
709
710static void dib0700_rc_urb_completion(struct urb *purb)
711{
712 struct dvb_usb_device *d = purb->context;
713 struct dib0700_rc_response *poll_reply;
714 enum rc_proto protocol;
715 u32 keycode;
716 u8 toggle;
717
718 deb_info("%s()\n", __func__);
719 if (d->rc_dev == NULL) {
720
721 kfree(purb->transfer_buffer);
722 usb_free_urb(purb);
723 return;
724 }
725
726 poll_reply = purb->transfer_buffer;
727
728 if (purb->status < 0) {
729 deb_info("discontinuing polling\n");
730 kfree(purb->transfer_buffer);
731 usb_free_urb(purb);
732 return;
733 }
734
735 if (purb->actual_length != RC_MSG_SIZE_V1_20) {
736 deb_info("malformed rc msg size=%d\n", purb->actual_length);
737 goto resubmit;
738 }
739
740 deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
741 poll_reply->report_id, poll_reply->data_state,
742 poll_reply->nec.system, poll_reply->nec.not_system,
743 poll_reply->nec.data, poll_reply->nec.not_data,
744 purb->actual_length);
745
746 switch (d->props.rc.core.protocol) {
747 case RC_PROTO_BIT_NEC:
748 toggle = 0;
749
750
751 if (poll_reply->nec.system == 0x00 &&
752 poll_reply->nec.not_system == 0x00 &&
753 poll_reply->nec.data == 0x00 &&
754 poll_reply->nec.not_data == 0xff) {
755 poll_reply->data_state = 2;
756 rc_repeat(d->rc_dev);
757 goto resubmit;
758 }
759
760 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
761 deb_data("NEC32 protocol\n");
762 keycode = RC_SCANCODE_NEC32(poll_reply->nec.system << 24 |
763 poll_reply->nec.not_system << 16 |
764 poll_reply->nec.data << 8 |
765 poll_reply->nec.not_data);
766 protocol = RC_PROTO_NEC32;
767 } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
768 deb_data("NEC extended protocol\n");
769 keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
770 poll_reply->nec.not_system,
771 poll_reply->nec.data);
772
773 protocol = RC_PROTO_NECX;
774 } else {
775 deb_data("NEC normal protocol\n");
776 keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
777 poll_reply->nec.data);
778 protocol = RC_PROTO_NEC;
779 }
780
781 break;
782 default:
783 deb_data("RC5 protocol\n");
784 protocol = RC_PROTO_RC5;
785 toggle = poll_reply->report_id;
786 keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);
787
788 if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
789
790 err("key failed integrity check: %02x %02x %02x %02x",
791 poll_reply->rc5.not_used, poll_reply->rc5.system,
792 poll_reply->rc5.data, poll_reply->rc5.not_data);
793 goto resubmit;
794 }
795
796 break;
797 }
798
799 rc_keydown(d->rc_dev, protocol, keycode, toggle);
800
801resubmit:
802
803 memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
804
805
806 usb_submit_urb(purb, GFP_ATOMIC);
807}
808
809int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
810{
811 struct dib0700_state *st = d->priv;
812 struct urb *purb;
813 const struct usb_endpoint_descriptor *e;
814 int ret, rc_ep = 1;
815 unsigned int pipe = 0;
816
817
818 if (st->fw_version < 0x10200 || !intf)
819 return 0;
820
821
822
823 if (intf->cur_altsetting->desc.bNumEndpoints < rc_ep + 1)
824 return -ENODEV;
825
826 purb = usb_alloc_urb(0, GFP_KERNEL);
827 if (purb == NULL)
828 return -ENOMEM;
829
830 purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
831 if (purb->transfer_buffer == NULL) {
832 err("rc kzalloc failed");
833 usb_free_urb(purb);
834 return -ENOMEM;
835 }
836
837 purb->status = -EINPROGRESS;
838
839
840
841
842
843 e = &intf->cur_altsetting->endpoint[rc_ep].desc;
844 if (usb_endpoint_dir_in(e)) {
845 if (usb_endpoint_xfer_bulk(e)) {
846 pipe = usb_rcvbulkpipe(d->udev, rc_ep);
847 usb_fill_bulk_urb(purb, d->udev, pipe,
848 purb->transfer_buffer,
849 RC_MSG_SIZE_V1_20,
850 dib0700_rc_urb_completion, d);
851
852 } else if (usb_endpoint_xfer_int(e)) {
853 pipe = usb_rcvintpipe(d->udev, rc_ep);
854 usb_fill_int_urb(purb, d->udev, pipe,
855 purb->transfer_buffer,
856 RC_MSG_SIZE_V1_20,
857 dib0700_rc_urb_completion, d, 1);
858 }
859 }
860
861 if (!pipe) {
862 err("There's no endpoint for remote controller");
863 kfree(purb->transfer_buffer);
864 usb_free_urb(purb);
865 return 0;
866 }
867
868 ret = usb_submit_urb(purb, GFP_ATOMIC);
869 if (ret) {
870 err("rc submit urb failed");
871 kfree(purb->transfer_buffer);
872 usb_free_urb(purb);
873 }
874
875 return ret;
876}
877
878static int dib0700_probe(struct usb_interface *intf,
879 const struct usb_device_id *id)
880{
881 int i;
882 struct dvb_usb_device *dev;
883
884 for (i = 0; i < dib0700_device_count; i++)
885 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
886 &dev, adapter_nr) == 0) {
887 struct dib0700_state *st = dev->priv;
888 u32 hwversion, romversion, fw_version, fwtype;
889
890 dib0700_get_version(dev, &hwversion, &romversion,
891 &fw_version, &fwtype);
892
893 deb_info("Firmware version: %x, %d, 0x%x, %d\n",
894 hwversion, romversion, fw_version, fwtype);
895
896 st->fw_version = fw_version;
897 st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
898
899
900 if (st->fw_version >= 0x10200)
901 dev->props.rc.core.bulk_mode = true;
902 else
903 dev->props.rc.core.bulk_mode = false;
904
905 dib0700_rc_setup(dev, intf);
906
907 return 0;
908 }
909
910 return -ENODEV;
911}
912
913static void dib0700_disconnect(struct usb_interface *intf)
914{
915 struct dvb_usb_device *d = usb_get_intfdata(intf);
916 struct dib0700_state *st = d->priv;
917 struct i2c_client *client;
918
919
920 client = st->i2c_client_tuner;
921 if (client) {
922 module_put(client->dev.driver->owner);
923 i2c_unregister_device(client);
924 }
925
926
927 client = st->i2c_client_demod;
928 if (client) {
929 module_put(client->dev.driver->owner);
930 i2c_unregister_device(client);
931 }
932
933 dvb_usb_device_exit(intf);
934}
935
936
937static struct usb_driver dib0700_driver = {
938 .name = "dvb_usb_dib0700",
939 .probe = dib0700_probe,
940 .disconnect = dib0700_disconnect,
941 .id_table = dib0700_usb_id_table,
942};
943
944module_usb_driver(dib0700_driver);
945
946MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
947MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
948MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
949MODULE_VERSION("1.0");
950MODULE_LICENSE("GPL");
951