From owner-p4-projects@FreeBSD.ORG Fri May 1 16:41:52 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C83BE1065679; Fri, 1 May 2009 16:41:51 +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 870641065672 for ; Fri, 1 May 2009 16:41:51 +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 747ED8FC14 for ; Fri, 1 May 2009 16:41:51 +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 n41GfplV076431 for ; Fri, 1 May 2009 16:41:51 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n41GfpGD076429 for perforce@freebsd.org; Fri, 1 May 2009 16:41:51 GMT (envelope-from syl@FreeBSD.org) Date: Fri, 1 May 2009 16:41:51 GMT Message-Id: <200905011641.n41GfpGD076429@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 161437 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: Fri, 01 May 2009 16:41:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=161437 Change 161437 by syl@syl_atuin on 2009/05/01 16:41:34 - Adding strlen to string descriptor func following Hans Petter Selasky fix. - Adding altsetting handling to get_config. - Implementing libusb_get_max_packet_size. - Implementing libusb_alloc_transfer. - Implementing libusb_free_transfer. Affected files ... .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#4 edit .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#2 edit .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_desc.c#6 edit Differences ... ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#4 (text+ko) ==== @@ -310,7 +310,7 @@ unsigned int length; unsigned int actual_length; enum libusb_transfer_status status; -} libusb_iso_packet_descriptor; +} libusb_iso_packet_descriptor __aligned(sizeof(void *)); struct libusb_transfer; @@ -330,7 +330,7 @@ unsigned char *buffer; int num_iso_packets; struct libusb_iso_packet_descriptor iso_packet_desc[0]; -} libusb_transfer; +} libusb_transfer __aligned(sizeof(void *)); typedef struct libusb_pollfd { int fd; ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#2 (text+ko) ==== @@ -186,9 +186,35 @@ } int -libusb_get_max_packet_size(libusb_device * dev, unsigned char endpoint) +libusb_get_max_packet_size(libusb_device *dev, unsigned char endpoint) { - return (0); + struct libusb_config_descriptor *pdconf; + struct libusb_interface *pinf; + struct libusb_interface_descriptor *pdinf; + struct libusb_endpoint_descriptor *pdend; + int i, j, k, ret; + + if (libusb_get_active_config_descriptor(dev, &pdconf) < 0) + return (LIBUSB_ERROR_OTHER); + + ret = LIBUSB_ERROR_NOT_FOUND; + for (i = 0 ; i < pdconf->bNumInterfaces ; i++) { + pinf = &pdconf->interface[i]; + for (j = 0 ; j < pinf->num_altsetting ; j++) { + pdinf = &pinf->altsetting[j]; + for (k = 0 ; k < pdinf->bNumEndpoints ; k++) { + pdend = &pdinf->endpoint[k]; + if (pdend->bEndpointAddress == endpoint) { + ret = pdend->wMaxPacketSize; + goto out; + } + } + } + } + +out: + libusb_free_config_descriptor(pdconf); + return (ret); } libusb_device * @@ -425,12 +451,33 @@ struct libusb_transfer * libusb_alloc_transfer(int iso_packets) { - return (NULL); + struct libusb_transfer *tr; + int len; + + len = sizeof(libusb_transfer) + + (iso_packets * sizeof(libusb_iso_packet_descriptor)); + + tr = malloc(len); + if (tr == NULL) + return (NULL); + + memset(tr, 0, len); + + return (tr); } void libusb_free_transfer(struct libusb_transfer *transfer) { + if (transfer == NULL) + return ; + + if (transfer->buffer) + free(transfer->buffer); + if (transfer->user_data) + free(transfer->user_data); + + free (transfer); return; } int ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_desc.c#6 (text+ko) ==== @@ -78,6 +78,10 @@ return (libusb_get_config_descriptor(dev, idx, config)); } +/* + * XXX Need to check if extra need a dup because + * XXX free pconf could free this char * + */ int libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config) @@ -88,7 +92,7 @@ struct libusb20_endpoint *pend; libusb_interface_descriptor *ifd; libusb_endpoint_descriptor *endd; - uint8_t nif, nend, i, j; + uint8_t nif, nend, nalt, i, j; if (dev == NULL || config == NULL) return (LIBUSB_ERROR_NO_MEM); @@ -99,14 +103,22 @@ if (pconf == NULL) return (LIBUSB_ERROR_NOT_FOUND); - nif = pconf->num_interface; + nalt = nif = pconf->num_interface; nend = 0; - for (i = 0 ; i < nif ; i++) + for (i = 0 ; i < nif ; i++) { + if (pconf->interface[i].num_altsetting > 1) + { + nalt += pconf->interface[i].num_altsetting; + for (j = 0 ; j < nalt ; j++) { + nend += pconf->interface[i].altsetting[j].num_endpoints; + } + } nend += pconf->interface[i].num_endpoints; + } *config = malloc(sizeof(libusb_config_descriptor) + (nif * sizeof(libusb_interface)) + - (nif * sizeof(libusb_interface_descriptor)) + + (nalt * sizeof(libusb_interface_descriptor)) + (nend * sizeof(libusb_endpoint_descriptor))); if (*config == NULL) { free(pconf); @@ -127,36 +139,39 @@ for ( i = 0 ; i < nif ; i++) { pinf = &pconf->interface[i]; - (*config)->interface[i].num_altsetting = pinf->num_altsetting; - ifd = (*config)->interface[i].altsetting; - ifd->bLength = pinf->desc.bLength; - ifd->bDescriptorType = pinf->desc.bDescriptorType; - ifd->bInterfaceNumber = pinf->desc.bInterfaceNumber; - ifd->bAlternateSetting = pinf->desc.bAlternateSetting; - ifd->bNumEndpoints = pinf->desc.bNumEndpoints; - ifd->bInterfaceClass = pinf->desc.bInterfaceClass; - ifd->bInterfaceSubClass = pinf->desc.bInterfaceSubClass; - ifd->bInterfaceProtocol = pinf->desc.bInterfaceProtocol; - ifd->iInterface = pinf->desc.iInterface; - ifd->extra_length = pinf->extra.len; - if (ifd->extra_length != 0) - ifd->extra = pinf->extra.ptr; - - for (j = 0 ; j < pinf->num_endpoints ; j++) { - pend = &pconf->interface[i].endpoints[j]; - endd = &ifd->endpoint[j]; - endd->bLength = pend->desc.bLength; - endd->bDescriptorType = pend->desc.bDescriptorType; - endd->bEndpointAddress = pend->desc.bEndpointAddress; - endd->bmAttributes = pend->desc.bmAttributes; - endd->wMaxPacketSize = pend->desc.wMaxPacketSize; - endd->bInterval = pend->desc.bInterval; - endd->bRefresh = pend->desc.bRefresh; - endd->bSynchAddress = pend->desc.bSynchAddress; - endd->extra_length = pend->extra.len; - if (endd->extra_length != 0) - endd->extra = pend->extra.ptr; - } + (*config)->interface[i].num_altsetting = pinf->num_altsetting + 1; + for (j = 0 ; j <= pinf->num_altsetting ; j++) { + if (j != 0) + pinf = &pconf->interface[i].altsetting[j]; + ifd = &(*config)->interface[i].altsetting[j]; + ifd->bLength = pinf->desc.bLength; + ifd->bDescriptorType = pinf->desc.bDescriptorType; + ifd->bInterfaceNumber = pinf->desc.bInterfaceNumber; + ifd->bAlternateSetting = pinf->desc.bAlternateSetting; + ifd->bNumEndpoints = pinf->desc.bNumEndpoints; + ifd->bInterfaceClass = pinf->desc.bInterfaceClass; + ifd->bInterfaceSubClass = pinf->desc.bInterfaceSubClass; + ifd->bInterfaceProtocol = pinf->desc.bInterfaceProtocol; + ifd->iInterface = pinf->desc.iInterface; + ifd->extra_length = pinf->extra.len; + if (ifd->extra_length != 0) + ifd->extra = pinf->extra.ptr; + for (j = 0 ; j < pinf->num_endpoints ; j++) { + pend = &pinf->endpoints[j]; + endd = &ifd->endpoint[j]; + endd->bLength = pend->desc.bLength; + endd->bDescriptorType = pend->desc.bDescriptorType; + endd->bEndpointAddress = pend->desc.bEndpointAddress; + endd->bmAttributes = pend->desc.bmAttributes; + endd->wMaxPacketSize = pend->desc.wMaxPacketSize; + endd->bInterval = pend->desc.bInterval; + endd->bRefresh = pend->desc.bRefresh; + endd->bSynchAddress = pend->desc.bSynchAddress; + endd->extra_length = pend->extra.len; + if (endd->extra_length != 0) + endd->extra = pend->extra.ptr; + } + } } free(pconf); @@ -210,6 +225,6 @@ pdev = dev->os_priv; if (libusb20_dev_req_string_simple_sync(pdev, desc_index, data, length) == 0) - return (length); + return (strlen(data)); return (LIBUSB_ERROR_OTHER); }