PERFORCE change 164347 for review
Sylvestre Gallon
syl at FreeBSD.org
Sun Jun 14 15:36:09 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=164347
Change 164347 by syl at syl_atuin on 2009/06/14 15:35:48
Update transfer code following Hans Petter Selasky linux USB cam code.
Need some work on isochronous endpoints.
Affected files ...
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#30 edit
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.h#5 edit
Differences ...
==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#30 (text+ko) ====
@@ -680,9 +680,48 @@
static void
libusb10_proxy(struct libusb20_transfer *xfer)
{
+ uint8_t status;
+ libusb_transfer *usb_xfer;
+
pthread_mutex_lock(&libusb20_lock);
- switch (libusb20_tr_get_status(xfer)) {
+ status = libusb20_tr_get_status(xfer);
+ usb_xfer = (libusb_transfer *)libusb20_tr_get_priv_sc0(xfer);
+
+ switch (status) {
+ case LIBUSB20_TRANSFER_COMPLETED:
+ usb_xfer->actual_length += libusb20_tr_get_actual_length(xfer);
+ break ;
+ case LIBUSB20_TRANSFER_START:
+ usb_xfer->actual_length = 0;
+ switch (usb_xfer->type)
+ {
+ case LIBUSB_TRANSFER_TYPE_CONTROL:
+ libusb20_tr_setup_control(xfer, usb_xfer->buffer,
+ (void *)(((uint8_t *) usb_xfer->buffer) +
+ sizeof(libusb_control_setup)),
+ usb_xfer->timeout);
+ break ;
+ case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
+ break ;
+ case LIBUSB_TRANSFER_TYPE_BULK:
+ libusb20_tr_setup_bulk(xfer, usb_xfer->buffer,
+ usb_xfer->length, usb_xfer->timeout);
+ break ;
+ case LIBUSB_TRANSFER_TYPE_INTERRUPT:
+ libusb20_tr_setup_intr(xfer, usb_xfer->buffer,
+ usb_xfer->length, usb_xfer->timeout);
+ break ;
+ }
+ libusb20_tr_submit(xfer);
+ break ;
+ default:
+ usb_xfer->actual_length = 0;
+ usb_xfer->status = LIBUSB_TRANSFER_CANCELLED;
+ break ;
+ }
+
+ switch (status) {
case LIBUSB20_TRANSFER_COMPLETED:
xfer->status = LIBUSB_TRANSFER_COMPLETED;
break ;
@@ -704,7 +743,6 @@
default:
xfer->status = LIBUSB_TRANSFER_ERROR;
}
- ((libusb_transfer_cb_fn)libusb20_tr_get_priv_sc0(xfer))(libusb20_tr_get_priv_sc1(xfer));
pthread_mutex_unlock(&libusb20_lock);
}
@@ -783,7 +821,7 @@
int
libusb_submit_transfer(struct libusb_transfer *xfer)
{
- struct libusb20_transfer *usb20_xfer;
+ struct libusb20_transfer **usb20_xfer;
struct usb_transfer *usb_backend;
struct usb_transfer *usb_node;
struct libusb20_device *pdev;
@@ -793,12 +831,17 @@
int maxframe;
int buffsize;
int num_frame;
+ int ep_idx;
int ret;
int i;
if (xfer == NULL)
return (LIBUSB_ERROR_NO_MEM);
+ usb20_xfer = malloc(2 * sizeof(struct libusb20_transfer *));
+ if (usb20_xfer == NULL)
+ return (LIBUSB_ERROR_NO_MEM);
+
ctx = xfer->dev_handle->dev->ctx;
pdev = xfer->dev_handle->os_priv;
@@ -845,8 +888,14 @@
out:
pthread_mutex_unlock(&ctx->flying_transfers_lock);
- /*libusb20 dependent code*/
- GET_XFER(usb20_xfer, xfer->endpoint, pdev);
+ usb20_xfer[0] = libusb20_tr_get_pointer(pdev,
+ (2 * xfer->endpoint) | (xfer->endpoint / 0x80));
+ usb20_xfer[1] = libusb20_tr_get_pointer(pdev,
+ ((2 * xfer->endpoint) | (xfer->endpoint / 0x80)) + 1);
+
+ if (usb20_xfer[0] == NULL)
+ return (LIBUSB_ERROR_OTHER);
+
xfer->os_priv = usb20_xfer;
pthread_mutex_lock(&libusb20_lock);
@@ -854,8 +903,11 @@
buffsize = libusb_get_buffsize(pdev, xfer);
maxframe = libusb_get_maxframe(pdev, xfer);
- ret = libusb20_tr_open(usb20_xfer, buffsize,
+ ret = libusb20_tr_open(usb20_xfer[0], buffsize,
maxframe, xfer->endpoint);
+ if (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
+ ret |= libusb20_tr_open(usb20_xfer[1], buffsize,
+ maxframe, xfer->endpoint);
if (ret != 0) {
pthread_mutex_unlock(&libusb20_lock);
@@ -865,31 +917,17 @@
return (LIBUSB_ERROR_OTHER);
}
- switch (xfer->type) {
- case LIBUSB_TRANSFER_TYPE_BULK:
- libusb20_tr_setup_intr(usb20_xfer, xfer->buffer, xfer->length, xfer->timeout);
- case LIBUSB_TRANSFER_TYPE_INTERRUPT:
- libusb20_tr_setup_bulk(usb20_xfer, xfer->buffer, xfer->length, xfer->timeout);
- break ;
- case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
- libusb20_tr_set_total_frames(usb20_xfer, xfer->num_iso_packets);
- /* XXX need to check libusb-1.0 for xfer->buffer xfer->length */
- for (i = 0 ; i < xfer->num_iso_packets ; i++)
- libusb20_tr_setup_isoc(usb20_xfer, xfer->buffer, xfer->length, i);
- break ;
- case LIBUSB_TRANSFER_TYPE_CONTROL:
- libusb20_tr_setup_control(usb20_xfer, xfer->buffer,
- (void *)(((uint8_t *) xfer->buffer) +
- sizeof(libusb_control_setup)), xfer->timeout);
- break ;
- }
+ libusb20_tr_set_priv_sc0(usb20_xfer[0], xfer);
+ libusb20_tr_set_callback(usb20_xfer[0], libusb10_proxy);
+ if (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {
+ libusb20_tr_set_priv_sc0(usb20_xfer[1], xfer);
+ libusb20_tr_set_callback(usb20_xfer[1], libusb10_proxy);
+ }
- libusb20_tr_set_priv_sc0(usb20_xfer, xfer->callback);
- libusb20_tr_set_priv_sc1(usb20_xfer, xfer->user_data);
- libusb20_tr_set_callback(usb20_xfer, libusb10_proxy);
+ libusb20_tr_start(usb20_xfer[0]);
+ if (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
+ libusb20_tr_start(usb20_xfer[1]);
- libusb20_tr_submit(usb20_xfer);
- libusb20_tr_start(usb20_xfer);
pthread_mutex_unlock(&libusb20_lock);
return (0);
==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.h#5 (text+ko) ====
More information about the p4-projects
mailing list