From owner-p4-projects@FreeBSD.ORG Sun Jun 14 15:36:07 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2360E1065674; Sun, 14 Jun 2009 15:36:07 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A88B91065670 for ; Sun, 14 Jun 2009 15:36:06 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 95C6C8FC13 for ; Sun, 14 Jun 2009 15:36:06 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5EFa6Cc031969 for ; Sun, 14 Jun 2009 15:36:06 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5EFa6qx031967 for perforce@freebsd.org; Sun, 14 Jun 2009 15:36:06 GMT (envelope-from syl@FreeBSD.org) Date: Sun, 14 Jun 2009 15:36:06 GMT Message-Id: <200906141536.n5EFa6qx031967@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to syl@FreeBSD.org using -f From: Sylvestre Gallon To: Perforce Change Reviews Cc: Subject: PERFORCE change 164347 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 Jun 2009 15:36:09 -0000 http://perforce.freebsd.org/chv.cgi?CH=164347 Change 164347 by syl@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) ====