0001
0002
0003
0004
0005
0006 #include "dib0700.h"
0007
0008
0009 int dvb_usb_dib0700_debug;
0010 module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
0011 MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);
0012
0013 static int nb_packet_buffer_size = 21;
0014 module_param(nb_packet_buffer_size, int, 0644);
0015 MODULE_PARM_DESC(nb_packet_buffer_size,
0016 "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)");
0017
0018 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
0019
0020
0021 int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
0022 u32 *romversion, u32 *ramversion, u32 *fwtype)
0023 {
0024 struct dib0700_state *st = d->priv;
0025 int ret;
0026
0027 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0028 err("could not acquire lock");
0029 return -EINTR;
0030 }
0031
0032 ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
0033 REQUEST_GET_VERSION,
0034 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
0035 st->buf, 16, USB_CTRL_GET_TIMEOUT);
0036 if (hwversion != NULL)
0037 *hwversion = (st->buf[0] << 24) | (st->buf[1] << 16) |
0038 (st->buf[2] << 8) | st->buf[3];
0039 if (romversion != NULL)
0040 *romversion = (st->buf[4] << 24) | (st->buf[5] << 16) |
0041 (st->buf[6] << 8) | st->buf[7];
0042 if (ramversion != NULL)
0043 *ramversion = (st->buf[8] << 24) | (st->buf[9] << 16) |
0044 (st->buf[10] << 8) | st->buf[11];
0045 if (fwtype != NULL)
0046 *fwtype = (st->buf[12] << 24) | (st->buf[13] << 16) |
0047 (st->buf[14] << 8) | st->buf[15];
0048 mutex_unlock(&d->usb_mutex);
0049 return ret;
0050 }
0051
0052
0053 static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
0054 {
0055 int status;
0056
0057 deb_data(">>> ");
0058 debug_dump(tx, txlen, deb_data);
0059
0060 status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
0061 tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
0062 USB_CTRL_GET_TIMEOUT);
0063
0064 if (status != txlen)
0065 deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
0066
0067 return status < 0 ? status : 0;
0068 }
0069
0070
0071 int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
0072 {
0073 u16 index, value;
0074 int status;
0075
0076 if (txlen < 2) {
0077 err("tx buffer length is smaller than 2. Makes no sense.");
0078 return -EINVAL;
0079 }
0080 if (txlen > 4) {
0081 err("tx buffer length is larger than 4. Not supported.");
0082 return -EINVAL;
0083 }
0084
0085 deb_data(">>> ");
0086 debug_dump(tx,txlen,deb_data);
0087
0088 value = ((txlen - 2) << 8) | tx[1];
0089 index = 0;
0090 if (txlen > 2)
0091 index |= (tx[2] << 8);
0092 if (txlen > 3)
0093 index |= tx[3];
0094
0095 status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
0096 USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
0097 USB_CTRL_GET_TIMEOUT);
0098
0099 if (status < 0)
0100 deb_info("ep 0 read error (status = %d)\n",status);
0101
0102 deb_data("<<< ");
0103 debug_dump(rx, rxlen, deb_data);
0104
0105 return status;
0106 }
0107
0108 int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
0109 {
0110 struct dib0700_state *st = d->priv;
0111 int ret;
0112
0113 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0114 err("could not acquire lock");
0115 return -EINTR;
0116 }
0117
0118 st->buf[0] = REQUEST_SET_GPIO;
0119 st->buf[1] = gpio;
0120 st->buf[2] = ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6);
0121
0122 ret = dib0700_ctrl_wr(d, st->buf, 3);
0123
0124 mutex_unlock(&d->usb_mutex);
0125 return ret;
0126 }
0127
0128 static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
0129 {
0130 struct dib0700_state *st = d->priv;
0131 int ret;
0132
0133 if (st->fw_version >= 0x10201) {
0134 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0135 err("could not acquire lock");
0136 return -EINTR;
0137 }
0138
0139 st->buf[0] = REQUEST_SET_USB_XFER_LEN;
0140 st->buf[1] = (nb_ts_packets >> 8) & 0xff;
0141 st->buf[2] = nb_ts_packets & 0xff;
0142
0143 deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);
0144
0145 ret = dib0700_ctrl_wr(d, st->buf, 3);
0146 mutex_unlock(&d->usb_mutex);
0147 } else {
0148 deb_info("this firmware does not allow to change the USB xfer len\n");
0149 ret = -EIO;
0150 }
0151
0152 return ret;
0153 }
0154
0155
0156
0157
0158 static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg,
0159 int num)
0160 {
0161
0162
0163
0164 struct dvb_usb_device *d = i2c_get_adapdata(adap);
0165 struct dib0700_state *st = d->priv;
0166 uint8_t bus_mode = 1;
0167 uint8_t gen_mode = 0;
0168 uint8_t en_start = 0;
0169 uint8_t en_stop = 0;
0170 int result, i;
0171
0172
0173
0174 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
0175 return -EINTR;
0176
0177 for (i = 0; i < num; i++) {
0178 if (i == 0) {
0179
0180 en_start = 1;
0181 } else if (!(msg[i].flags & I2C_M_NOSTART)) {
0182
0183 en_start = 1;
0184 } else {
0185
0186
0187 en_start = 0;
0188 }
0189 if (i == (num - 1)) {
0190
0191 en_stop = 1;
0192 }
0193
0194 if (msg[i].flags & I2C_M_RD) {
0195
0196 u16 index, value;
0197 uint8_t i2c_dest;
0198
0199 i2c_dest = (msg[i].addr << 1);
0200 value = ((en_start << 7) | (en_stop << 6) |
0201 (msg[i].len & 0x3F)) << 8 | i2c_dest;
0202
0203 index = ((gen_mode << 6) & 0xC0) |
0204 ((bus_mode << 4) & 0x30);
0205
0206 result = usb_control_msg(d->udev,
0207 usb_rcvctrlpipe(d->udev, 0),
0208 REQUEST_NEW_I2C_READ,
0209 USB_TYPE_VENDOR | USB_DIR_IN,
0210 value, index, st->buf,
0211 msg[i].len,
0212 USB_CTRL_GET_TIMEOUT);
0213 if (result < 0) {
0214 deb_info("i2c read error (status = %d)\n", result);
0215 goto unlock;
0216 }
0217
0218 if (msg[i].len > sizeof(st->buf)) {
0219 deb_info("buffer too small to fit %d bytes\n",
0220 msg[i].len);
0221 result = -EIO;
0222 goto unlock;
0223 }
0224
0225 memcpy(msg[i].buf, st->buf, msg[i].len);
0226
0227 deb_data("<<< ");
0228 debug_dump(msg[i].buf, msg[i].len, deb_data);
0229
0230 } else {
0231
0232 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0233 err("could not acquire lock");
0234 result = -EINTR;
0235 goto unlock;
0236 }
0237 st->buf[0] = REQUEST_NEW_I2C_WRITE;
0238 st->buf[1] = msg[i].addr << 1;
0239 st->buf[2] = (en_start << 7) | (en_stop << 6) |
0240 (msg[i].len & 0x3F);
0241
0242 st->buf[3] = ((gen_mode << 6) & 0xC0) |
0243 ((bus_mode << 4) & 0x30);
0244
0245 if (msg[i].len > sizeof(st->buf) - 4) {
0246 deb_info("i2c message to big: %d\n",
0247 msg[i].len);
0248 mutex_unlock(&d->usb_mutex);
0249 result = -EIO;
0250 goto unlock;
0251 }
0252
0253
0254 memcpy(&st->buf[4], msg[i].buf, msg[i].len);
0255
0256 deb_data(">>> ");
0257 debug_dump(st->buf, msg[i].len + 4, deb_data);
0258
0259 result = usb_control_msg(d->udev,
0260 usb_sndctrlpipe(d->udev, 0),
0261 REQUEST_NEW_I2C_WRITE,
0262 USB_TYPE_VENDOR | USB_DIR_OUT,
0263 0, 0, st->buf, msg[i].len + 4,
0264 USB_CTRL_GET_TIMEOUT);
0265 mutex_unlock(&d->usb_mutex);
0266 if (result < 0) {
0267 deb_info("i2c write error (status = %d)\n", result);
0268 break;
0269 }
0270 }
0271 }
0272 result = i;
0273
0274 unlock:
0275 mutex_unlock(&d->i2c_mutex);
0276 return result;
0277 }
0278
0279
0280
0281
0282 static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
0283 struct i2c_msg *msg, int num)
0284 {
0285 struct dvb_usb_device *d = i2c_get_adapdata(adap);
0286 struct dib0700_state *st = d->priv;
0287 int i, len, result;
0288
0289 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
0290 return -EINTR;
0291 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0292 err("could not acquire lock");
0293 mutex_unlock(&d->i2c_mutex);
0294 return -EINTR;
0295 }
0296
0297 for (i = 0; i < num; i++) {
0298
0299 st->buf[1] = msg[i].addr << 1;
0300
0301 if (msg[i].len > sizeof(st->buf) - 2) {
0302 deb_info("i2c xfer to big: %d\n",
0303 msg[i].len);
0304 result = -EIO;
0305 goto unlock;
0306 }
0307 memcpy(&st->buf[2], msg[i].buf, msg[i].len);
0308
0309
0310 if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
0311 st->buf[0] = REQUEST_I2C_READ;
0312 st->buf[1] |= 1;
0313
0314
0315 len = dib0700_ctrl_rd(d, st->buf, msg[i].len + 2,
0316 st->buf, msg[i + 1].len);
0317 if (len <= 0) {
0318 deb_info("I2C read failed on address 0x%02x\n",
0319 msg[i].addr);
0320 result = -EIO;
0321 goto unlock;
0322 }
0323
0324 if (msg[i + 1].len > sizeof(st->buf)) {
0325 deb_info("i2c xfer buffer to small for %d\n",
0326 msg[i].len);
0327 result = -EIO;
0328 goto unlock;
0329 }
0330 memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);
0331
0332 msg[i+1].len = len;
0333
0334 i++;
0335 } else {
0336 st->buf[0] = REQUEST_I2C_WRITE;
0337 result = dib0700_ctrl_wr(d, st->buf, msg[i].len + 2);
0338 if (result < 0)
0339 goto unlock;
0340 }
0341 }
0342 result = i;
0343 unlock:
0344 mutex_unlock(&d->usb_mutex);
0345 mutex_unlock(&d->i2c_mutex);
0346
0347 return result;
0348 }
0349
0350 static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
0351 int num)
0352 {
0353 struct dvb_usb_device *d = i2c_get_adapdata(adap);
0354 struct dib0700_state *st = d->priv;
0355
0356 if (st->fw_use_new_i2c_api == 1) {
0357
0358 return dib0700_i2c_xfer_new(adap, msg, num);
0359 } else {
0360
0361 return dib0700_i2c_xfer_legacy(adap, msg, num);
0362 }
0363 }
0364
0365 static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
0366 {
0367 return I2C_FUNC_I2C;
0368 }
0369
0370 struct i2c_algorithm dib0700_i2c_algo = {
0371 .master_xfer = dib0700_i2c_xfer,
0372 .functionality = dib0700_i2c_func,
0373 };
0374
0375 int dib0700_identify_state(struct usb_device *udev,
0376 const struct dvb_usb_device_properties *props,
0377 const struct dvb_usb_device_description **desc,
0378 int *cold)
0379 {
0380 s16 ret;
0381 u8 *b;
0382
0383 b = kmalloc(16, GFP_KERNEL);
0384 if (!b)
0385 return -ENOMEM;
0386
0387
0388 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
0389 REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);
0390
0391 deb_info("FW GET_VERSION length: %d\n",ret);
0392
0393 *cold = ret <= 0;
0394 deb_info("cold: %d\n", *cold);
0395
0396 kfree(b);
0397 return 0;
0398 }
0399
0400 static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll,
0401 u8 pll_src, u8 pll_range, u8 clock_gpio3, u16 pll_prediv,
0402 u16 pll_loopdiv, u16 free_div, u16 dsuScaler)
0403 {
0404 struct dib0700_state *st = d->priv;
0405 int ret;
0406
0407 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0408 err("could not acquire lock");
0409 return -EINTR;
0410 }
0411
0412 st->buf[0] = REQUEST_SET_CLOCK;
0413 st->buf[1] = (en_pll << 7) | (pll_src << 6) |
0414 (pll_range << 5) | (clock_gpio3 << 4);
0415 st->buf[2] = (pll_prediv >> 8) & 0xff;
0416 st->buf[3] = pll_prediv & 0xff;
0417 st->buf[4] = (pll_loopdiv >> 8) & 0xff;
0418 st->buf[5] = pll_loopdiv & 0xff;
0419 st->buf[6] = (free_div >> 8) & 0xff;
0420 st->buf[7] = free_div & 0xff;
0421 st->buf[8] = (dsuScaler >> 8) & 0xff;
0422 st->buf[9] = dsuScaler & 0xff;
0423
0424 ret = dib0700_ctrl_wr(d, st->buf, 10);
0425 mutex_unlock(&d->usb_mutex);
0426
0427 return ret;
0428 }
0429
0430 int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
0431 {
0432 struct dib0700_state *st = d->priv;
0433 u16 divider;
0434 int ret;
0435
0436 if (scl_kHz == 0)
0437 return -EINVAL;
0438
0439 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0440 err("could not acquire lock");
0441 return -EINTR;
0442 }
0443
0444 st->buf[0] = REQUEST_SET_I2C_PARAM;
0445 divider = (u16) (30000 / scl_kHz);
0446 st->buf[1] = 0;
0447 st->buf[2] = (u8) (divider >> 8);
0448 st->buf[3] = (u8) (divider & 0xff);
0449 divider = (u16) (72000 / scl_kHz);
0450 st->buf[4] = (u8) (divider >> 8);
0451 st->buf[5] = (u8) (divider & 0xff);
0452 divider = (u16) (72000 / scl_kHz);
0453 st->buf[6] = (u8) (divider >> 8);
0454 st->buf[7] = (u8) (divider & 0xff);
0455
0456 deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
0457 (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
0458 st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
0459
0460 ret = dib0700_ctrl_wr(d, st->buf, 8);
0461 mutex_unlock(&d->usb_mutex);
0462
0463 return ret;
0464 }
0465
0466
0467 int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
0468 {
0469 switch (clk_MHz) {
0470 case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
0471 default: return -EINVAL;
0472 }
0473 return 0;
0474 }
0475
0476 static int dib0700_jumpram(struct usb_device *udev, u32 address)
0477 {
0478 int ret = 0, actlen;
0479 u8 *buf;
0480
0481 buf = kmalloc(8, GFP_KERNEL);
0482 if (!buf)
0483 return -ENOMEM;
0484 buf[0] = REQUEST_JUMPRAM;
0485 buf[1] = 0;
0486 buf[2] = 0;
0487 buf[3] = 0;
0488 buf[4] = (address >> 24) & 0xff;
0489 buf[5] = (address >> 16) & 0xff;
0490 buf[6] = (address >> 8) & 0xff;
0491 buf[7] = address & 0xff;
0492
0493 if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
0494 deb_fw("jumpram to 0x%x failed\n",address);
0495 goto out;
0496 }
0497 if (actlen != 8) {
0498 deb_fw("jumpram to 0x%x failed\n",address);
0499 ret = -EIO;
0500 goto out;
0501 }
0502 out:
0503 kfree(buf);
0504 return ret;
0505 }
0506
0507 int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
0508 {
0509 struct hexline hx;
0510 int pos = 0, ret, act_len, i, adap_num;
0511 u8 *buf;
0512 u32 fw_version;
0513
0514 buf = kmalloc(260, GFP_KERNEL);
0515 if (!buf)
0516 return -ENOMEM;
0517
0518 while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
0519 deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
0520 hx.addr, hx.len, hx.chk);
0521
0522 buf[0] = hx.len;
0523 buf[1] = (hx.addr >> 8) & 0xff;
0524 buf[2] = hx.addr & 0xff;
0525 buf[3] = hx.type;
0526 memcpy(&buf[4],hx.data,hx.len);
0527 buf[4+hx.len] = hx.chk;
0528
0529 ret = usb_bulk_msg(udev,
0530 usb_sndbulkpipe(udev, 0x01),
0531 buf,
0532 hx.len + 5,
0533 &act_len,
0534 1000);
0535
0536 if (ret < 0) {
0537 err("firmware download failed at %d with %d",pos,ret);
0538 goto out;
0539 }
0540 }
0541
0542 if (ret == 0) {
0543
0544 if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
0545 info("firmware started successfully.");
0546 msleep(500);
0547 }
0548 } else
0549 ret = -EIO;
0550
0551
0552 if (nb_packet_buffer_size < 1)
0553 nb_packet_buffer_size = 1;
0554
0555
0556 usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
0557 REQUEST_GET_VERSION,
0558 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
0559 buf, 16, USB_CTRL_GET_TIMEOUT);
0560 fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
0561
0562
0563
0564 for (i = 0; i < dib0700_device_count; i++) {
0565 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
0566 adap_num++) {
0567 if (fw_version >= 0x10201) {
0568 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
0569 } else {
0570
0571
0572 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
0573 if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
0574 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
0575 }
0576 }
0577 }
0578 out:
0579 kfree(buf);
0580 return ret;
0581 }
0582
0583 int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
0584 {
0585 struct dib0700_state *st = adap->dev->priv;
0586 int ret, adapt_nr;
0587
0588 if ((onoff != 0) && (st->fw_version >= 0x10201)) {
0589
0590
0591 ret = dib0700_set_usb_xfer_len(adap->dev,
0592 st->nb_packet_buffer_size);
0593 if (ret < 0) {
0594 deb_info("can not set the USB xfer len\n");
0595 return ret;
0596 }
0597 }
0598
0599 mutex_lock(&adap->dev->usb_mutex);
0600
0601 st->buf[0] = REQUEST_ENABLE_VIDEO;
0602
0603
0604 st->buf[1] = (onoff << 4) | 0x00;
0605
0606 if (st->disable_streaming_master_mode == 1)
0607 st->buf[2] = 0x00;
0608 else
0609 st->buf[2] = 0x01 << 4;
0610
0611 st->buf[3] = 0x00;
0612
0613 if ((adap->fe_adap[0].stream.props.endpoint != 2)
0614 && (adap->fe_adap[0].stream.props.endpoint != 3)) {
0615 deb_info("the endpoint number (%i) is not correct, use the adapter id instead\n",
0616 adap->fe_adap[0].stream.props.endpoint);
0617 adapt_nr = adap->id;
0618 } else {
0619 adapt_nr = adap->fe_adap[0].stream.props.endpoint - 2;
0620 }
0621
0622 if (onoff)
0623 st->channel_state |= 1 << adapt_nr;
0624 else
0625 st->channel_state &= ~(1 << adapt_nr);
0626
0627 st->buf[2] |= st->channel_state;
0628
0629 deb_info("adapter %d, streaming %s: %*ph\n",
0630 adapt_nr, onoff ? "ON" : "OFF", 3, st->buf);
0631
0632 ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
0633 mutex_unlock(&adap->dev->usb_mutex);
0634
0635 return ret;
0636 }
0637
0638 int dib0700_change_protocol(struct rc_dev *rc, u64 *rc_proto)
0639 {
0640 struct dvb_usb_device *d = rc->priv;
0641 struct dib0700_state *st = d->priv;
0642 int new_proto, ret;
0643
0644 if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
0645 err("could not acquire lock");
0646 return -EINTR;
0647 }
0648
0649 st->buf[0] = REQUEST_SET_RC;
0650 st->buf[1] = 0;
0651 st->buf[2] = 0;
0652
0653
0654 if (*rc_proto & RC_PROTO_BIT_RC5) {
0655 new_proto = 1;
0656 *rc_proto = RC_PROTO_BIT_RC5;
0657 } else if (*rc_proto & RC_PROTO_BIT_NEC) {
0658 new_proto = 0;
0659 *rc_proto = RC_PROTO_BIT_NEC;
0660 } else if (*rc_proto & RC_PROTO_BIT_RC6_MCE) {
0661 if (st->fw_version < 0x10200) {
0662 ret = -EINVAL;
0663 goto out;
0664 }
0665 new_proto = 2;
0666 *rc_proto = RC_PROTO_BIT_RC6_MCE;
0667 } else {
0668 ret = -EINVAL;
0669 goto out;
0670 }
0671
0672 st->buf[1] = new_proto;
0673
0674 ret = dib0700_ctrl_wr(d, st->buf, 3);
0675 if (ret < 0) {
0676 err("ir protocol setup failed");
0677 goto out;
0678 }
0679
0680 d->props.rc.core.protocol = *rc_proto;
0681
0682 out:
0683 mutex_unlock(&d->usb_mutex);
0684 return ret;
0685 }
0686
0687
0688 struct dib0700_rc_response {
0689 u8 report_id;
0690 u8 data_state;
0691 union {
0692 struct {
0693 u8 system;
0694 u8 not_system;
0695 u8 data;
0696 u8 not_data;
0697 } nec;
0698 struct {
0699 u8 not_used;
0700 u8 system;
0701 u8 data;
0702 u8 not_data;
0703 } rc5;
0704 };
0705 };
0706 #define RC_MSG_SIZE_V1_20 6
0707
0708 static void dib0700_rc_urb_completion(struct urb *purb)
0709 {
0710 struct dvb_usb_device *d = purb->context;
0711 struct dib0700_rc_response *poll_reply;
0712 enum rc_proto protocol;
0713 u32 keycode;
0714 u8 toggle;
0715
0716 deb_info("%s()\n", __func__);
0717 if (d->rc_dev == NULL) {
0718
0719 kfree(purb->transfer_buffer);
0720 usb_free_urb(purb);
0721 return;
0722 }
0723
0724 poll_reply = purb->transfer_buffer;
0725
0726 if (purb->status < 0) {
0727 deb_info("discontinuing polling\n");
0728 kfree(purb->transfer_buffer);
0729 usb_free_urb(purb);
0730 return;
0731 }
0732
0733 if (purb->actual_length != RC_MSG_SIZE_V1_20) {
0734 deb_info("malformed rc msg size=%d\n", purb->actual_length);
0735 goto resubmit;
0736 }
0737
0738 deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
0739 poll_reply->report_id, poll_reply->data_state,
0740 poll_reply->nec.system, poll_reply->nec.not_system,
0741 poll_reply->nec.data, poll_reply->nec.not_data,
0742 purb->actual_length);
0743
0744 switch (d->props.rc.core.protocol) {
0745 case RC_PROTO_BIT_NEC:
0746 toggle = 0;
0747
0748
0749 if (poll_reply->nec.system == 0x00 &&
0750 poll_reply->nec.not_system == 0x00 &&
0751 poll_reply->nec.data == 0x00 &&
0752 poll_reply->nec.not_data == 0xff) {
0753 poll_reply->data_state = 2;
0754 rc_repeat(d->rc_dev);
0755 goto resubmit;
0756 }
0757
0758 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
0759 deb_data("NEC32 protocol\n");
0760 keycode = RC_SCANCODE_NEC32(poll_reply->nec.system << 24 |
0761 poll_reply->nec.not_system << 16 |
0762 poll_reply->nec.data << 8 |
0763 poll_reply->nec.not_data);
0764 protocol = RC_PROTO_NEC32;
0765 } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
0766 deb_data("NEC extended protocol\n");
0767 keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
0768 poll_reply->nec.not_system,
0769 poll_reply->nec.data);
0770
0771 protocol = RC_PROTO_NECX;
0772 } else {
0773 deb_data("NEC normal protocol\n");
0774 keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
0775 poll_reply->nec.data);
0776 protocol = RC_PROTO_NEC;
0777 }
0778
0779 break;
0780 default:
0781 deb_data("RC5 protocol\n");
0782 protocol = RC_PROTO_RC5;
0783 toggle = poll_reply->report_id;
0784 keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);
0785
0786 if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
0787
0788 err("key failed integrity check: %02x %02x %02x %02x",
0789 poll_reply->rc5.not_used, poll_reply->rc5.system,
0790 poll_reply->rc5.data, poll_reply->rc5.not_data);
0791 goto resubmit;
0792 }
0793
0794 break;
0795 }
0796
0797 rc_keydown(d->rc_dev, protocol, keycode, toggle);
0798
0799 resubmit:
0800
0801 memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
0802
0803
0804 usb_submit_urb(purb, GFP_ATOMIC);
0805 }
0806
0807 int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
0808 {
0809 struct dib0700_state *st = d->priv;
0810 struct urb *purb;
0811 const struct usb_endpoint_descriptor *e;
0812 int ret, rc_ep = 1;
0813 unsigned int pipe = 0;
0814
0815
0816 if (st->fw_version < 0x10200 || !intf)
0817 return 0;
0818
0819
0820
0821 if (intf->cur_altsetting->desc.bNumEndpoints < rc_ep + 1)
0822 return -ENODEV;
0823
0824 purb = usb_alloc_urb(0, GFP_KERNEL);
0825 if (purb == NULL)
0826 return -ENOMEM;
0827
0828 purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
0829 if (purb->transfer_buffer == NULL) {
0830 err("rc kzalloc failed");
0831 usb_free_urb(purb);
0832 return -ENOMEM;
0833 }
0834
0835 purb->status = -EINPROGRESS;
0836
0837
0838
0839
0840
0841 e = &intf->cur_altsetting->endpoint[rc_ep].desc;
0842 if (usb_endpoint_dir_in(e)) {
0843 if (usb_endpoint_xfer_bulk(e)) {
0844 pipe = usb_rcvbulkpipe(d->udev, rc_ep);
0845 usb_fill_bulk_urb(purb, d->udev, pipe,
0846 purb->transfer_buffer,
0847 RC_MSG_SIZE_V1_20,
0848 dib0700_rc_urb_completion, d);
0849
0850 } else if (usb_endpoint_xfer_int(e)) {
0851 pipe = usb_rcvintpipe(d->udev, rc_ep);
0852 usb_fill_int_urb(purb, d->udev, pipe,
0853 purb->transfer_buffer,
0854 RC_MSG_SIZE_V1_20,
0855 dib0700_rc_urb_completion, d, 1);
0856 }
0857 }
0858
0859 if (!pipe) {
0860 err("There's no endpoint for remote controller");
0861 kfree(purb->transfer_buffer);
0862 usb_free_urb(purb);
0863 return 0;
0864 }
0865
0866 ret = usb_submit_urb(purb, GFP_ATOMIC);
0867 if (ret) {
0868 err("rc submit urb failed");
0869 kfree(purb->transfer_buffer);
0870 usb_free_urb(purb);
0871 }
0872
0873 return ret;
0874 }
0875
0876 static int dib0700_probe(struct usb_interface *intf,
0877 const struct usb_device_id *id)
0878 {
0879 int i;
0880 struct dvb_usb_device *dev;
0881
0882 for (i = 0; i < dib0700_device_count; i++)
0883 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
0884 &dev, adapter_nr) == 0) {
0885 struct dib0700_state *st = dev->priv;
0886 u32 hwversion, romversion, fw_version, fwtype;
0887
0888 dib0700_get_version(dev, &hwversion, &romversion,
0889 &fw_version, &fwtype);
0890
0891 deb_info("Firmware version: %x, %d, 0x%x, %d\n",
0892 hwversion, romversion, fw_version, fwtype);
0893
0894 st->fw_version = fw_version;
0895 st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
0896
0897
0898 if (st->fw_version >= 0x10200)
0899 dev->props.rc.core.bulk_mode = true;
0900 else
0901 dev->props.rc.core.bulk_mode = false;
0902
0903 dib0700_rc_setup(dev, intf);
0904
0905 return 0;
0906 }
0907
0908 return -ENODEV;
0909 }
0910
0911 static void dib0700_disconnect(struct usb_interface *intf)
0912 {
0913 struct dvb_usb_device *d = usb_get_intfdata(intf);
0914 struct dib0700_state *st = d->priv;
0915 struct i2c_client *client;
0916
0917
0918 client = st->i2c_client_tuner;
0919 if (client) {
0920 module_put(client->dev.driver->owner);
0921 i2c_unregister_device(client);
0922 }
0923
0924
0925 client = st->i2c_client_demod;
0926 if (client) {
0927 module_put(client->dev.driver->owner);
0928 i2c_unregister_device(client);
0929 }
0930
0931 dvb_usb_device_exit(intf);
0932 }
0933
0934
0935 static struct usb_driver dib0700_driver = {
0936 .name = "dvb_usb_dib0700",
0937 .probe = dib0700_probe,
0938 .disconnect = dib0700_disconnect,
0939 .id_table = dib0700_usb_id_table,
0940 };
0941
0942 module_usb_driver(dib0700_driver);
0943
0944 MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
0945 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
0946 MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
0947 MODULE_VERSION("1.0");
0948 MODULE_LICENSE("GPL");