Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Oct 2008 15:03:33 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 151807 for review
Message-ID:  <200810231503.m9NF3XDU029745@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=151807

Change 151807 by hselasky@hselasky_laptop001 on 2008/10/23 15:03:22

	
	Add full support for LibUSB v0.1.12 through the FreeBSD
	specific USB library. LibUSB applications should link
	with libusb20 on FreeBSD in the future.

Affected files ...

.. //depot/projects/usb/src/lib/libusb20/Makefile#2 edit
.. //depot/projects/usb/src/lib/libusb20/libusb20.c#3 edit
.. //depot/projects/usb/src/lib/libusb20/libusb20.h#4 edit
.. //depot/projects/usb/src/lib/libusb20/libusb20_compat01.c#1 add
.. //depot/projects/usb/src/lib/libusb20/libusb20_compat01.h#1 add
.. //depot/projects/usb/src/lib/libusb20/libusb20_compat10.c#1 add
.. //depot/projects/usb/src/lib/libusb20/libusb20_compat10.h#1 add
.. //depot/projects/usb/src/lib/libusb20/libusb20_int.h#3 edit

Differences ...

==== //depot/projects/usb/src/lib/libusb20/Makefile#2 (text+ko) ====

@@ -7,8 +7,15 @@
 LIB=		usb20
 SHLIB_MAJOR=	1
 SHLIB_MINOR=	0
-SRCS=		libusb20.c libusb20_desc.c libusb20_ugen20.c
-INCS=		libusb20.h libusb20_desc.h
+SRCS=		libusb20.c
+SRCS+=		libusb20_desc.c
+SRCS+=		libusb20_ugen20.c
+SRCS+=		libusb20_compat01.c
+SRCS+=		libusb20_compat10.c
+INCS+=		libusb20.h
+INCS+=		libusb20_desc.h
+INCS+=		libusb20_compat01.h
+INCS+=		libusb20_compat10.h
 MAN=		libusb20.3
 MKLINT=		no
 NOGCCERROR=

==== //depot/projects/usb/src/lib/libusb20/libusb20.c#3 (text+ko) ====

@@ -28,6 +28,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <poll.h>
+#include <ctype.h>
 #include <sys/queue.h>
 
 #include "libusb20.h"
@@ -632,9 +633,9 @@
 }
 
 int
-libusb20_dev_request_sync(struct libusb20_device *pdev, struct LIBUSB20_CONTROL_SETUP_DECODED *setup,
-    void *data, uint16_t *pactlen, uint32_t timeout,
-    uint8_t flags)
+libusb20_dev_request_sync(struct libusb20_device *pdev,
+    struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data,
+    uint16_t *pactlen, uint32_t timeout, uint8_t flags)
 {
 	int error;
 
@@ -643,6 +644,128 @@
 	return (error);
 }
 
+int
+libusb20_dev_req_string_sync(struct libusb20_device *pdev,
+    uint8_t index, uint16_t langid, void *ptr, uint16_t len)
+{
+	struct LIBUSB20_CONTROL_SETUP_DECODED req;
+	int error;
+
+	if (len < 4) {
+		/* invalid length */
+		return (LIBUSB20_ERROR_INVALID_PARAM);
+	}
+	LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP, &req);
+
+	/*
+	 * We need to read the USB string in two steps else some USB
+	 * devices will complain.
+	 */
+	req.wValue = (256 * LIBUSB20_DT_STRING) | index;
+	req.wIndex = langid;
+	req.wLength = 4;		/* bytes */
+
+	error = libusb20_dev_request_sync(pdev, &req,
+	    ptr, NULL, 1000, LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK);
+	if (error) {
+		return (error);
+	}
+	req.wLength = *(uint8_t *)ptr;	/* bytes */
+	if (req.wLength > len) {
+		/* partial string read */
+		req.wLength = len;
+	}
+	error = libusb20_dev_request_sync(pdev, &req,
+	    ptr, NULL, 1000, LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK);
+
+	if (error) {
+		return (error);
+	}
+	if (((uint8_t *)ptr)[1] != LIBUSB20_DT_STRING) {
+		return (LIBUSB20_ERROR_OTHER);
+	}
+	return (0);			/* success */
+}
+
+int
+libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev,
+    uint8_t index, void *ptr, uint16_t len)
+{
+	char *buf;
+	int error;
+	uint16_t langid;
+	uint16_t n;
+	uint16_t i;
+	uint16_t c;
+	uint8_t temp[255];
+	uint8_t swap;
+
+	/* the following code derives from the FreeBSD USB kernel */
+
+	if (len < 1) {
+		/* too short buffer */
+		return (LIBUSB20_ERROR_INVALID_PARAM);
+	}
+	error = libusb20_dev_req_string_sync(pdev,
+	    0, 0, temp, sizeof(temp));
+	if (error < 0)
+		return (error);
+
+	langid = temp[2] | (temp[3] << 8);
+
+	error = libusb20_dev_req_string_sync(pdev, index,
+	    langid, temp, sizeof(temp));
+	if (error < 0)
+		return (error);
+
+	if (temp[0] < 2) {
+		/* string length is too short */
+		return (LIBUSB20_ERROR_OTHER);
+	}
+	/* reserve one byte for terminating zero */
+	len--;
+
+	/* find maximum length */
+	n = (temp[0] / 2) - 1;
+	if (n > len) {
+		n = len;
+	}
+	/* reset swap state */
+	swap = 3;
+
+	/* setup output buffer pointer */
+	buf = ptr;
+
+	/* convert and filter */
+	for (i = 0; (i != n); i++) {
+		c = temp[(2 * i) + 2] | (temp[(2 * i) + 3] << 8);
+
+		/* convert from Unicode, handle buggy strings */
+		if (((c & 0xff00) == 0) && (swap & 1)) {
+			/* Little Endian, default */
+			*buf = c;
+			swap = 1;
+		} else if (((c & 0x00ff) == 0) && (swap & 2)) {
+			/* Big Endian */
+			*buf = c >> 8;
+			swap = 2;
+		} else {
+			*buf = '.';
+		}
+		/*
+		 * Filter by default - we don't allow greater and less than
+		 * signs because they might confuse the dmesg printouts!
+		 */
+		if ((*buf == '<') || (*buf == '>') || (!isprint(*buf))) {
+			*buf = '.';
+		}
+		buf++;
+	}
+	*buf = 0;			/* zero terminate string */
+
+	return (0);
+}
+
 struct libusb20_config *
 libusb20_dev_alloc_config(struct libusb20_device *pdev, uint8_t configIndex)
 {

==== //depot/projects/usb/src/lib/libusb20/libusb20.h#4 (text+ko) ====

@@ -31,6 +31,7 @@
 
 #include <stdint.h>
 #include <time.h>
+#include <string.h>
 
 #include <sys/time.h>
 #include <sys/types.h>
@@ -235,6 +236,8 @@
 int	libusb20_dev_process(struct libusb20_device *pdev);
 int	libusb20_dev_release_interface(struct libusb20_device *pdev, uint8_t iface_index);
 int	libusb20_dev_request_sync(struct libusb20_device *pdev, struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data, uint16_t *pactlen, uint32_t timeout, uint8_t flags);
+int	libusb20_dev_req_string_sync(struct libusb20_device *pdev, uint8_t index, uint16_t langid, void *ptr, uint16_t len);
+int	libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, uint8_t index, void *ptr, uint16_t len);
 int	libusb20_dev_reset(struct libusb20_device *pdev);
 int	libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode);
 uint8_t	libusb20_dev_get_power_mode(struct libusb20_device *pdev);

==== //depot/projects/usb/src/lib/libusb20/libusb20_int.h#3 (text+ko) ====

@@ -210,6 +210,9 @@
 	/* private backend data */
 	void   *privBeData;
 
+	/* libUSB v0.1 compat data */
+	void   *priv01Data;
+
 	/* claimed interfaces */
 	uint32_t claimed_interfaces;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810231503.m9NF3XDU029745>