PERFORCE change 156644 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sun Jan 25 03:12:05 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=156644

Change 156644 by hselasky at hselasky_laptop001 on 2009/01/25 11:11:59

	
	Patches to make LibUSBHID work with new USB stack.

Affected files ...

.. //depot/projects/usb/src/lib/libusbhid/descr.c#2 edit
.. //depot/projects/usb/src/lib/libusbhid/usbhid.3#2 edit
.. //depot/projects/usb/src/lib/libusbhid/usbhid.h#2 edit

Differences ...

==== //depot/projects/usb/src/lib/libusbhid/descr.c#2 (text+ko) ====

@@ -39,21 +39,68 @@
 #include <sys/time.h>
 #include <sys/ioctl.h>
 
-#include <dev/usb/usb.h>
+#include <dev/usb2/include/usb2_ioctl.h>
 
 #include "usbhid.h"
 #include "usbvar.h"
 
+int
+hid_get_report_id(int fd)
+{
+	int temp = -1;
+
+	if (ioctl(fd, USB_GET_REPORT_ID, &temp) < 0)
+		return (-1);
+
+	return (temp);
+}
+
 report_desc_t
 hid_get_report_desc(int fd)
 {
-	struct usb_ctl_report_desc rep;
+	struct usb2_gen_descriptor ugd;
+	report_desc_t rep;
+	void *data;
+	int size;
+
+	size = 256;			/* be conservative */
+
+retry:
+
+	memset(&ugd, 0, sizeof(ugd));
+
+	data = malloc(size);
+	if (data == NULL)
+		return (NULL);
+
+	/* 
+	 * We subtract one from size so that the maximum descriptor
+	 * size is 65535 bytes, because "ugd_maxlen" is a 16-bit
+	 * variable!
+	 */
+	ugd.ugd_data = data;
+	ugd.ugd_maxlen = size-1;
+	if (ioctl(fd, USB_GET_REPORT_DESC, &ugd) < 0) {
+		/* could not read descriptor */
+		free(data);
+		return (NULL);
+	}
 
-	rep.ucrd_size = 0;
-	if (ioctl(fd, USB_GET_REPORT_DESC, &rep) < 0)
+	if (ugd.ugd_maxlen == ugd.ugd_actlen) {
+		/* buffer is too small */
+		free (data);
+		size *= 4;
+		if (size <= 65536)
+			goto retry;
+		/* maximum reached - should not happen */
 		return (NULL);
+	}
+
+	rep = hid_use_report_desc(data, ugd.ugd_actlen);
 
-	return hid_use_report_desc(rep.ucrd_data, (unsigned int)rep.ucrd_size);
+	free(data);
+
+	return (rep);
 }
 
 report_desc_t

==== //depot/projects/usb/src/lib/libusbhid/usbhid.3#2 (text+ko) ====

@@ -32,6 +32,7 @@
 .Sh NAME
 .Nm usbhid ,
 .Nm hid_get_report_desc ,
+.Nm hid_get_report_id ,
 .Nm hid_use_report_desc ,
 .Nm hid_dispose_report_desc ,
 .Nm hid_start_parse ,
@@ -51,6 +52,8 @@
 .In usbhid.h
 .Ft report_desc_t
 .Fn hid_get_report_desc "int file"
+.Ft int
+.Fn hid_get_report_id "int file"
 .Ft report_desc_t
 .Fn hid_use_report_desc "unsigned char *data" "unsigned int size"
 .Ft void
@@ -95,6 +98,8 @@
 parsing of the descriptor, translating to/from symbolic names, and
 data manipulation.
 .Ss Descriptor Functions
+The report descriptor ID can be obtained by calling
+.Fn hid_get_report_id .
 A report descriptor can be obtained by calling
 .Fn hid_get_report_desc
 with a file descriptor obtained by opening a

==== //depot/projects/usb/src/lib/libusbhid/usbhid.h#2 (text+ko) ====

@@ -87,6 +87,7 @@
 report_desc_t hid_get_report_desc(int file);
 report_desc_t hid_use_report_desc(unsigned char *data, unsigned int size);
 void hid_dispose_report_desc(report_desc_t);
+int hid_get_report_id(int file);
 
 /* Parsing of a HID report descriptor, parse.c: */
 hid_data_t hid_start_parse(report_desc_t d, int kindset, int id);


More information about the p4-projects mailing list