diff --git a/sys/dev/usb/usb_hid.c b/sys/dev/usb/usb_hid.c --- a/sys/dev/usb/usb_hid.c +++ b/sys/dev/usb/usb_hid.c @@ -111,7 +111,8 @@ c->loc.count = 0; c->loc.size = 0; - c->usage = 0; + c->nusages = 0; + memset(c->usages, 0, sizeof(c->usages)); c->usage_minimum = 0; c->usage_maximum = 0; c->designator_index = 0; @@ -273,6 +274,15 @@ DPRINTFN(1, "Using last usage\n"); dval = s->usage_last; } + c->nusages = 1; + /* array type HID item may have multiple usages */ + while ((c->flags & HIO_VARIABLE) == 0 && s->ousage == 0 && + s->iusage < s->nusage && c->nusages < HI_MAXUSAGE) + c->usages[c->nusages++] = s->usages_min[s->iusage++]; + if ((c->flags & HIO_VARIABLE) == 0 && s->ousage == 0 && + s->iusage < s->nusage) + DPRINTF("HI_MAXUSAGE should be increased up to %hhu " + "to parse the HID report descriptor\n", s->nusage); s->icount ++; /* * Only copy HID item, increment position and return @@ -381,6 +391,7 @@ c->collection = dval; c->collevel++; c->usage = s->usage_last; + c->nusages = 1; *h = *c; return (1); case 11: /* Feature */ diff --git a/sys/dev/usb/usbhid.h b/sys/dev/usb/usbhid.h --- a/sys/dev/usb/usbhid.h +++ b/sys/dev/usb/usbhid.h @@ -208,6 +208,8 @@ #if defined(_KERNEL) || defined(_STANDALONE) struct usb_config_descriptor; +#define HI_MAXUSAGE 4 + enum hid_kind { hid_input, hid_output, hid_feature, hid_collection, hid_endcollection }; @@ -229,7 +231,11 @@ int32_t unit; int32_t report_ID; /* Local */ - int32_t usage; + int nusages; + union { + int32_t usage; + int32_t usages[HI_MAXUSAGE]; + }; int32_t usage_minimum; int32_t usage_maximum; int32_t designator_index;