Date: Sun, 25 Jan 2009 11:12:03 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 156644 for review Message-ID: <200901251112.n0PBC3me091177@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=156644 Change 156644 by hselasky@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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901251112.n0PBC3me091177>
