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