static int lme2510_download_firmware(struct usb_device *dev, const struct firmware *fw) { int ret = 0; u8 data[512] = {0}; u16 j, wlen, len_in, start, end; u8 packet_size, dlen, i; u8 *fw_data; packet_size = 0x31; len_in = 1; info("FRM Starting Firmware Download"); for (i = 1; i < 3; i++) { start = (i == 1) ? 0 : 512; end = (i == 1) ? 512 : fw->size; for (j = start; j < end; j += (packet_size+1)) { fw_data = (u8 *)(fw->data + j); if ((end - j) > packet_size) { data[0] = i; dlen = packet_size; } else { data[0] = i | 0x80; dlen = (u8)(end - j)-1; } data[1] = dlen; memcpy(&data[2], fw_data, dlen+1); wlen = (u8) dlen + 4; data[wlen-1] = check_sum(fw_data, dlen+1); deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3], data[dlen+2], data[dlen+3]); ret |= lme2510_bulk_write(dev, data, wlen, 1); ret |= lme2510_bulk_read(dev, data, len_in , 1); ret |= (data[0] == 0x88) ? 0 : -1; } } usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000); data[0] = 0x8a; len_in = 1; msleep(2000); ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Resetting*/ ret |= lme2510_bulk_read(dev, data, len_in, 1); msleep(400); if (ret < 0) info("FRM Firmware Download Failed (%04x)" , ret); else info("FRM Firmware Download Completed - Resetting Device"); return (ret < 0) ? -ENODEV : 0; }
static void lme_coldreset(struct usb_device *dev) { int ret = 0, len_in; u8 data[512] = {0}; data[0] = 0x0a; len_in = 1; info("FRM Firmware Cold Reset"); ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Cold Resetting*/ ret |= lme2510_bulk_read(dev, data, len_in, 1); return; }
static int lme2510_usb_talk(struct dvb_usb_device *d, u8 *wbuf, int wlen, u8 *rbuf, int rlen) { struct lme2510_state *st = d->priv; u8 *buff; int ret = 0; if (st->usb_buffer == NULL) { st->usb_buffer = kmalloc(512, GFP_KERNEL); if (st->usb_buffer == NULL) { info("MEM Error no memory"); return -ENOMEM; } } buff = st->usb_buffer; /* the read/write capped at 512 */ memcpy(buff, wbuf, (wlen > 512) ? 512 : wlen); ret = mutex_lock_interruptible(&d->usb_mutex); if (ret < 0) return -EAGAIN; ret |= usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, 0x01)); ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01); msleep(10); ret |= usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x01)); ret |= lme2510_bulk_read(d->udev, buff, (rlen > 512) ? 512 : rlen , 0x01); if (rlen > 0) memcpy(rbuf, buff, rlen); mutex_unlock(&d->usb_mutex); return (ret < 0) ? -ENODEV : 0; }
static int lme2510_usb_talk(struct dvb_usb_device *d, u8 *wbuf, int wlen, u8 *rbuf, int rlen) { struct lme2510_state *st = d->priv; u8 *buff; int ret = 0; if (st->usb_buffer == NULL) { st->usb_buffer = kmalloc(64, GFP_KERNEL); if (st->usb_buffer == NULL) { info("MEM Error no memory"); return -ENOMEM; } } buff = st->usb_buffer; ret = mutex_lock_interruptible(&d->usb_mutex); if (ret < 0) return -EAGAIN; memcpy(buff, wbuf, (wlen < 64) ? wlen : 64); ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01); ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ? rlen : 64 , 0x01); if (rlen > 0) memcpy(rbuf, buff, rlen); mutex_unlock(&d->usb_mutex); return (ret < 0) ? -ENODEV : 0; }