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