Simplify libusb_fill_control_transfer()

Transfer length can be inferred from the setup packet.
This commit is contained in:
Daniel Drake 2008-03-10 11:32:15 +00:00
parent 7c5ea95297
commit aae05f688d
3 changed files with 10 additions and 10 deletions

View file

@ -168,8 +168,7 @@ static void cb_mode_changed(struct libusb_transfer *transfer)
static int set_mode_async(unsigned char data) static int set_mode_async(unsigned char data)
{ {
int bufsize = LIBUSB_CONTROL_SETUP_SIZE + 1; unsigned char *buf = malloc(LIBUSB_CONTROL_SETUP_SIZE + 1);
unsigned char *buf = malloc(bufsize);
struct libusb_transfer *transfer; struct libusb_transfer *transfer;
if (!buf) if (!buf)
@ -184,8 +183,8 @@ static int set_mode_async(unsigned char data)
printf("async set mode %02x\n", data); printf("async set mode %02x\n", data);
libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1); libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1);
buf[LIBUSB_CONTROL_SETUP_SIZE] = data; buf[LIBUSB_CONTROL_SETUP_SIZE] = data;
libusb_fill_control_transfer(transfer, devh, buf, bufsize, libusb_fill_control_transfer(transfer, devh, buf, cb_mode_changed, NULL,
cb_mode_changed, NULL, 1000); 1000);
return libusb_submit_transfer(transfer); return libusb_submit_transfer(transfer);
} }

View file

@ -270,15 +270,17 @@ void libusb_free_transfer(struct libusb_transfer *transfer);
static inline void libusb_fill_control_transfer( static inline void libusb_fill_control_transfer(
struct libusb_transfer *transfer, libusb_device_handle *dev_handle, struct libusb_transfer *transfer, libusb_device_handle *dev_handle,
unsigned char *buffer, int length, libusb_transfer_cb_fn callback, unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data,
void *user_data, unsigned int timeout) unsigned int timeout)
{ {
struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer;
transfer->dev_handle = dev_handle; transfer->dev_handle = dev_handle;
transfer->endpoint = 0; transfer->endpoint = 0;
transfer->endpoint_type = LIBUSB_ENDPOINT_TYPE_CONTROL; transfer->endpoint_type = LIBUSB_ENDPOINT_TYPE_CONTROL;
transfer->timeout = timeout; transfer->timeout = timeout;
transfer->buffer = buffer; transfer->buffer = buffer;
transfer->length = length; if (setup)
transfer->length = LIBUSB_CONTROL_SETUP_SIZE + setup->wLength;
transfer->user_data = user_data; transfer->user_data = user_data;
transfer->callback = callback; transfer->callback = callback;
} }

View file

@ -39,14 +39,13 @@ API_EXPORTED int libusb_control_transfer(libusb_device_handle *dev_handle,
{ {
struct libusb_transfer *transfer = libusb_alloc_transfer(); struct libusb_transfer *transfer = libusb_alloc_transfer();
unsigned char *buffer; unsigned char *buffer;
int length = wLength + LIBUSB_CONTROL_SETUP_SIZE;
int completed = 0; int completed = 0;
int r; int r;
if (!transfer) if (!transfer)
return -ENOMEM; return -ENOMEM;
buffer = malloc(length); buffer = malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength);
if (!buffer) { if (!buffer) {
libusb_free_transfer(transfer); libusb_free_transfer(transfer);
return -ENOMEM; return -ENOMEM;
@ -57,7 +56,7 @@ API_EXPORTED int libusb_control_transfer(libusb_device_handle *dev_handle,
if ((bRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) if ((bRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT)
memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength); memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength);
libusb_fill_control_transfer(transfer, dev_handle, buffer, length, libusb_fill_control_transfer(transfer, dev_handle, buffer,
ctrl_transfer_cb, &completed, timeout); ctrl_transfer_cb, &completed, timeout);
r = libusb_submit_transfer(transfer); r = libusb_submit_transfer(transfer);
if (r < 0) { if (r < 0) {