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, struct dvb_usb_device_properties *props,
376 struct dvb_usb_device_description **desc, int *cold)
377{
378 s16 ret;
379 u8 *b;
380
381 b = kmalloc(16, GFP_KERNEL);
382 if (!b)
383 return -ENOMEM;
384
385
386 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
387 REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);
388
389 deb_info("FW GET_VERSION length: %d\n",ret);
390
391 *cold = ret <= 0;
392 deb_info("cold: %d\n", *cold);
393
394 kfree(b);
395 return 0;
396}
397
398static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll,
399 u8 pll_src, u8 pll_range, u8 clock_gpio3, u16 pll_prediv,
400 u16 pll_loopdiv, u16 free_div, u16 dsuScaler)
401{
402 struct dib0700_state *st = d->priv;
403 int ret;
404
405 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
406 err("could not acquire lock");
407 return -EINTR;
408 }
409
410 st->buf[0] = REQUEST_SET_CLOCK;
411 st->buf[1] = (en_pll << 7) | (pll_src << 6) |
412 (pll_range << 5) | (clock_gpio3 << 4);
413 st->buf[2] = (pll_prediv >> 8) & 0xff;
414 st->buf[3] = pll_prediv & 0xff;
415 st->buf[4] = (pll_loopdiv >> 8) & 0xff;
416 st->buf[5] = pll_loopdiv & 0xff;
417 st->buf[6] = (free_div >> 8) & 0xff;
418 st->buf[7] = free_div & 0xff;
419 st->buf[8] = (dsuScaler >> 8) & 0xff;
420 st->buf[9] = dsuScaler & 0xff;
421
422 ret = dib0700_ctrl_wr(d, st->buf, 10);
423 mutex_unlock(&d->usb_mutex);
424
425 return ret;
426}
427
428int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
429{
430 struct dib0700_state *st = d->priv;
431 u16 divider;
432 int ret;
433
434 if (scl_kHz == 0)
435 return -EINVAL;
436
437 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
438 err("could not acquire lock");
439 return -EINTR;
440 }
441
442 st->buf[0] = REQUEST_SET_I2C_PARAM;
443 divider = (u16) (30000 / scl_kHz);
444 st->buf[1] = 0;
445 st->buf[2] = (u8) (divider >> 8);
446 st->buf[3] = (u8) (divider & 0xff);
447 divider = (u16) (72000 / scl_kHz);
448 st->buf[4] = (u8) (divider >> 8);
449 st->buf[5] = (u8) (divider & 0xff);
450 divider = (u16) (72000 / scl_kHz);
451 st->buf[6] = (u8) (divider >> 8);
452 st->buf[7] = (u8) (divider & 0xff);
453
454 deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
455 (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
456 st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
457
458 ret = dib0700_ctrl_wr(d, st->buf, 8);
459 mutex_unlock(&d->usb_mutex);
460
461 return ret;
462}
463
464
465int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
466{
467 switch (clk_MHz) {
468 case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
469 default: return -EINVAL;
470 }
471 return 0;
472}
473
474static int dib0700_jumpram(struct usb_device *udev, u32 address)
475{
476 int ret = 0, actlen;
477 u8 *buf;
478
479 buf = kmalloc(8, GFP_KERNEL);
480 if (!buf)
481 return -ENOMEM;
482 buf[0] = REQUEST_JUMPRAM;
483 buf[1] = 0;
484 buf[2] = 0;
485 buf[3] = 0;
486 buf[4] = (address >> 24) & 0xff;
487 buf[5] = (address >> 16) & 0xff;
488 buf[6] = (address >> 8) & 0xff;
489 buf[7] = address & 0xff;
490
491 if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
492 deb_fw("jumpram to 0x%x failed\n",address);
493 goto out;
494 }
495 if (actlen != 8) {
496 deb_fw("jumpram to 0x%x failed\n",address);
497 ret = -EIO;
498 goto out;
499 }
500out:
501 kfree(buf);
502 return ret;
503}
504
505int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
506{
507 struct hexline hx;
508 int pos = 0, ret, act_len, i, adap_num;
509 u8 *buf;
510 u32 fw_version;
511
512 buf = kmalloc(260, GFP_KERNEL);
513 if (!buf)
514 return -ENOMEM;
515
516 while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
517 deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
518 hx.addr, hx.len, hx.chk);
519
520 buf[0] = hx.len;
521 buf[1] = (hx.addr >> 8) & 0xff;
522 buf[2] = hx.addr & 0xff;
523 buf[3] = hx.type;
524 memcpy(&buf[4],hx.data,hx.len);
525 buf[4+hx.len] = hx.chk;
526
527 ret = usb_bulk_msg(udev,
528 usb_sndbulkpipe(udev, 0x01),
529 buf,
530 hx.len + 5,
531 &act_len,
532 1000);
533
534 if (ret < 0) {
535 err("firmware download failed at %d with %d",pos,ret);
536 goto out;
537 }
538 }
539
540 if (ret == 0) {
541
542 if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
543 info("firmware started successfully.");
544 msleep(500);
545 }
546 } else
547 ret = -EIO;
548
549
550 if (nb_packet_buffer_size < 1)
551 nb_packet_buffer_size = 1;
552
553
554 usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
555 REQUEST_GET_VERSION,
556 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
557 buf, 16, USB_CTRL_GET_TIMEOUT);
558 fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
559
560
561
562 for (i = 0; i < dib0700_device_count; i++) {
563 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
564 adap_num++) {
565 if (fw_version >= 0x10201) {
566 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
567 } else {
568
569
570 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
571 if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
572 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
573 }
574 }
575 }
576out:
577 kfree(buf);
578 return ret;
579}
580
581int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
582{
583 struct dib0700_state *st = adap->dev->priv;
584 int ret;
585
586 if ((onoff != 0) && (st->fw_version >= 0x10201)) {
587
588
589 ret = dib0700_set_usb_xfer_len(adap->dev,
590 st->nb_packet_buffer_size);
591 if (ret < 0) {
592 deb_info("can not set the USB xfer len\n");
593 return ret;
594 }
595 }
596
597 mutex_lock(&adap->dev->usb_mutex);
598
599 st->buf[0] = REQUEST_ENABLE_VIDEO;
600
601
602 st->buf[1] = (onoff << 4) | 0x00;
603
604 if (st->disable_streaming_master_mode == 1)
605 st->buf[2] = 0x00;
606 else
607 st->buf[2] = 0x01 << 4;
608
609 st->buf[3] = 0x00;
610
611 deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
612
613 st->channel_state &= ~0x3;
614 if ((adap->fe_adap[0].stream.props.endpoint != 2)
615 && (adap->fe_adap[0].stream.props.endpoint != 3)) {
616 deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
617 if (onoff)
618 st->channel_state |= 1 << (adap->id);
619 else
620 st->channel_state |= 1 << ~(adap->id);
621 } else {
622 if (onoff)
623 st->channel_state |= 1 << (adap->fe_adap[0].stream.props.endpoint-2);
624 else
625 st->channel_state |= 1 << (3-adap->fe_adap[0].stream.props.endpoint);
626 }
627
628 st->buf[2] |= st->channel_state;
629
630 deb_info("data for streaming: %x %x\n", st->buf[1], st->buf[2]);
631
632 ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
633 mutex_unlock(&adap->dev->usb_mutex);
634
635 return ret;
636}
637
638int dib0700_change_protocol(struct rc_dev *rc, u64 *rc_proto)
639{
640 struct dvb_usb_device *d = rc->priv;
641 struct dib0700_state *st = d->priv;
642 int new_proto, ret;
643
644 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
645 err("could not acquire lock");
646 return -EINTR;
647 }
648
649 st->buf[0] = REQUEST_SET_RC;
650 st->buf[1] = 0;
651 st->buf[2] = 0;
652
653
654 if (*rc_proto & RC_PROTO_BIT_RC5) {
655 new_proto = 1;
656 *rc_proto = RC_PROTO_BIT_RC5;
657 } else if (*rc_proto & RC_PROTO_BIT_NEC) {
658 new_proto = 0;
659 *rc_proto = RC_PROTO_BIT_NEC;
660 } else if (*rc_proto & RC_PROTO_BIT_RC6_MCE) {
661 if (st->fw_version < 0x10200) {
662 ret = -EINVAL;
663 goto out;
664 }
665 new_proto = 2;
666 *rc_proto = RC_PROTO_BIT_RC6_MCE;
667 } else {
668 ret = -EINVAL;
669 goto out;
670 }
671
672 st->buf[1] = new_proto;
673
674 ret = dib0700_ctrl_wr(d, st->buf, 3);
675 if (ret < 0) {
676 err("ir protocol setup failed");
677 goto out;
678 }
679
680 d->props.rc.core.protocol = *rc_proto;
681
682out:
683 mutex_unlock(&d->usb_mutex);
684 return ret;
685}
686
687
688struct dib0700_rc_response {
689 u8 report_id;
690 u8 data_state;
691 union {
692 struct {
693 u8 system;
694 u8 not_system;
695 u8 data;
696 u8 not_data;
697 } nec;
698 struct {
699 u8 not_used;
700 u8 system;
701 u8 data;
702 u8 not_data;
703 } rc5;
704 };
705};
706#define RC_MSG_SIZE_V1_20 6
707
708static void dib0700_rc_urb_completion(struct urb *purb)
709{
710 struct dvb_usb_device *d = purb->context;
711 struct dib0700_rc_response *poll_reply;
712 enum rc_proto protocol;
713 u32 keycode;
714 u8 toggle;
715
716 deb_info("%s()\n", __func__);
717 if (d->rc_dev == NULL) {
718
719 kfree(purb->transfer_buffer);
720 usb_free_urb(purb);
721 return;
722 }
723
724 poll_reply = purb->transfer_buffer;
725
726 if (purb->status < 0) {
727 deb_info("discontinuing polling\n");
728 kfree(purb->transfer_buffer);
729 usb_free_urb(purb);
730 return;
731 }
732
733 if (purb->actual_length != RC_MSG_SIZE_V1_20) {
734 deb_info("malformed rc msg size=%d\n", purb->actual_length);
735 goto resubmit;
736 }
737
738 deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
739 poll_reply->report_id, poll_reply->data_state,
740 poll_reply->nec.system, poll_reply->nec.not_system,
741 poll_reply->nec.data, poll_reply->nec.not_data,
742 purb->actual_length);
743
744 switch (d->props.rc.core.protocol) {
745 case RC_PROTO_BIT_NEC:
746 toggle = 0;
747
748
749 if (poll_reply->nec.system == 0x00 &&
750 poll_reply->nec.not_system == 0x00 &&
751 poll_reply->nec.data == 0x00 &&
752 poll_reply->nec.not_data == 0xff) {
753 poll_reply->data_state = 2;
754 rc_repeat(d->rc_dev);
755 goto resubmit;
756 }
757
758 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
759 deb_data("NEC32 protocol\n");
760 keycode = RC_SCANCODE_NEC32(poll_reply->nec.system << 24 |
761 poll_reply->nec.not_system << 16 |
762 poll_reply->nec.data << 8 |
763 poll_reply->nec.not_data);
764 protocol = RC_PROTO_NEC32;
765 } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
766 deb_data("NEC extended protocol\n");
767 keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
768 poll_reply->nec.not_system,
769 poll_reply->nec.data);
770
771 protocol = RC_PROTO_NECX;
772 } else {
773 deb_data("NEC normal protocol\n");
774 keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
775 poll_reply->nec.data);
776 protocol = RC_PROTO_NEC;
777 }
778
779 break;
780 default:
781 deb_data("RC5 protocol\n");
782 protocol = RC_PROTO_RC5;
783 toggle = poll_reply->report_id;
784 keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);
785
786 if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
787
788 err("key failed integrity check: %02x %02x %02x %02x",
789 poll_reply->rc5.not_used, poll_reply->rc5.system,
790 poll_reply->rc5.data, poll_reply->rc5.not_data);
791 goto resubmit;
792 }
793
794 break;
795 }
796
797 rc_keydown(d->rc_dev, protocol, keycode, toggle);
798
799resubmit:
800
801 memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
802
803
804 usb_submit_urb(purb, GFP_ATOMIC);
805}
806
807int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
808{
809 struct dib0700_state *st = d->priv;
810 struct urb *purb;
811 const struct usb_endpoint_descriptor *e;
812 int ret, rc_ep = 1;
813 unsigned int pipe = 0;
814
815
816 if (st->fw_version < 0x10200 || !intf)
817 return 0;
818
819
820
821 if (intf->altsetting[0].desc.bNumEndpoints < rc_ep + 1)
822 return -ENODEV;
823
824 purb = usb_alloc_urb(0, GFP_KERNEL);
825 if (purb == NULL)
826 return -ENOMEM;
827
828 purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
829 if (purb->transfer_buffer == NULL) {
830 err("rc kzalloc failed");
831 usb_free_urb(purb);
832 return -ENOMEM;
833 }
834
835 purb->status = -EINPROGRESS;
836
837
838
839
840
841 e = &intf->altsetting[0].endpoint[rc_ep].desc;
842 if (usb_endpoint_dir_in(e)) {
843 if (usb_endpoint_xfer_bulk(e)) {
844 pipe = usb_rcvbulkpipe(d->udev, rc_ep);
845 usb_fill_bulk_urb(purb, d->udev, pipe,
846 purb->transfer_buffer,
847 RC_MSG_SIZE_V1_20,
848 dib0700_rc_urb_completion, d);
849
850 } else if (usb_endpoint_xfer_int(e)) {
851 pipe = usb_rcvintpipe(d->udev, rc_ep);
852 usb_fill_int_urb(purb, d->udev, pipe,
853 purb->transfer_buffer,
854 RC_MSG_SIZE_V1_20,
855 dib0700_rc_urb_completion, d, 1);
856 }
857 }
858
859 if (!pipe) {
860 err("There's no endpoint for remote controller");
861 kfree(purb->transfer_buffer);
862 usb_free_urb(purb);
863 return 0;
864 }
865
866 ret = usb_submit_urb(purb, GFP_ATOMIC);
867 if (ret) {
868 err("rc submit urb failed");
869 kfree(purb->transfer_buffer);
870 usb_free_urb(purb);
871 }
872
873 return ret;
874}
875
876static int dib0700_probe(struct usb_interface *intf,
877 const struct usb_device_id *id)
878{
879 int i;
880 struct dvb_usb_device *dev;
881
882 for (i = 0; i < dib0700_device_count; i++)
883 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
884 &dev, adapter_nr) == 0) {
885 struct dib0700_state *st = dev->priv;
886 u32 hwversion, romversion, fw_version, fwtype;
887
888 dib0700_get_version(dev, &hwversion, &romversion,
889 &fw_version, &fwtype);
890
891 deb_info("Firmware version: %x, %d, 0x%x, %d\n",
892 hwversion, romversion, fw_version, fwtype);
893
894 st->fw_version = fw_version;
895 st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
896
897
898 if (st->fw_version >= 0x10200)
899 dev->props.rc.core.bulk_mode = true;
900 else
901 dev->props.rc.core.bulk_mode = false;
902
903 dib0700_rc_setup(dev, intf);
904
905 return 0;
906 }
907
908 return -ENODEV;
909}
910
911static void dib0700_disconnect(struct usb_interface *intf)
912{
913 struct dvb_usb_device *d = usb_get_intfdata(intf);
914 struct dib0700_state *st = d->priv;
915 struct i2c_client *client;
916
917
918 client = st->i2c_client_tuner;
919 if (client) {
920 module_put(client->dev.driver->owner);
921 i2c_unregister_device(client);
922 }
923
924
925 client = st->i2c_client_demod;
926 if (client) {
927 module_put(client->dev.driver->owner);
928 i2c_unregister_device(client);
929 }
930
931 dvb_usb_device_exit(intf);
932}
933
934
935static struct usb_driver dib0700_driver = {
936 .name = "dvb_usb_dib0700",
937 .probe = dib0700_probe,
938 .disconnect = dib0700_disconnect,
939 .id_table = dib0700_usb_id_table,
940};
941
942module_usb_driver(dib0700_driver);
943
944MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
945MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
946MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
947MODULE_VERSION("1.0");
948MODULE_LICENSE("GPL");
949