On Sat, 31 Jan 2015 12:43:03 +0100 Martin Pieuchot <mpieuc...@nolizard.org> wrote:
> On 18/01/15(Sun) 17:39, Benjamin Baier wrote: > > > > usbhidaction(1) still works fine with these changes. > > as for my stock usbhidctl(1) it now shows > > $ usbhidctl -f /dev/uhid1 -l > > Volume_Decrement=1 > > usbhidctl: Excessive collection ends > > Here's a diff for libusbhid that should fix that. Could you give it a > go? Yes, works for me. Loops as expected. $ usbhidctl -f /dev/uhid1 -l -vvv report ID=2 Consumer:Consumer_Control.Consumer:Unassigned=1 Consumer:Consumer_Control.Consumer:Mute=1 Consumer:Consumer_Control.Consumer:Unassigned=1 Consumer:Consumer_Control.Consumer:Volume_Decrement=1 Consumer:Consumer_Control.Consumer:Unassigned=1 Consumer:Consumer_Control.Consumer:Volume_Decrement=1 Consumer:Consumer_Control.Consumer:Unassigned=1 Consumer:Consumer_Control.Consumer:Volume_Decrement=1 Consumer:Consumer_Control.Consumer:Unassigned=1 One Question, why is there an extra newline? Index: usbhid.c =================================================================== RCS file: /cvs/src/usr.bin/usbhidctl/usbhid.c,v retrieving revision 1.11 diff -u -p -r1.11 usbhid.c --- usbhid.c 27 Nov 2013 00:13:23 -0000 1.11 +++ usbhid.c 31 Jan 2015 14:08:59 -0000 @@ -641,7 +641,6 @@ devloop(int hidfd, report_desc_t rd, str inreport.buffer->ucr_data); } hid_end_parse(hdata); - printf("\n"); } /* NOTREACHED */ } > Index: parse.c > =================================================================== > RCS file: /cvs/src/lib/libusbhid/parse.c,v > retrieving revision 1.10 > diff -u -p -r1.10 parse.c > --- parse.c 18 Jan 2015 17:16:06 -0000 1.10 > +++ parse.c 31 Jan 2015 11:34:55 -0000 > @@ -67,6 +67,8 @@ struct hid_data { > uint8_t ousage; /* current "usages_min/max" offset */ > uint8_t susage; /* usage set flags */ > int32_t reportid; /* requested report ID */ > + struct hid_item savedcoll; /* save coll until we know the ID */ > + uint8_t hassavedcoll; > }; > > static void > @@ -151,6 +153,7 @@ hid_start_parse(report_desc_t d, int kin > s->end = d->data + d->size; > s->kindset = kindset; > s->reportid = id; > + s->hassavedcoll = 0; > return (s); > } > > @@ -191,10 +194,20 @@ hid_get_byte(struct hid_data *s, const u > return (retval); > } > > +#define REPORT_SAVED_COLL \ > + do { \ > + if (s->hassavedcoll) { \ > + *h = s->savedcoll; \ > + h->report_ID = c->report_ID; \ > + s->hassavedcoll = 0; \ > + return (1); \ > + } \ > + } while(0) > + > static int > hid_get_item_raw(hid_data_t s, hid_item_t *h) > { > - hid_item_t *c; > + hid_item_t nc, *c; > unsigned int bTag, bType, bSize; > int32_t mask; > int32_t dval; > @@ -207,6 +220,7 @@ hid_get_item_raw(hid_data_t s, hid_item_ > top: > /* check if there is an array of items */ > if (s->icount < s->ncount) { > + REPORT_SAVED_COLL; > /* get current usage */ > if (s->iusage < s->nusage) { > dval = s->usages_min[s->iusage] + s->ousage; > @@ -328,13 +342,23 @@ hid_get_item_raw(hid_data_t s, hid_item_ > c->collection = dval; > c->collevel++; > c->usage = s->usage_last; > - *h = *c; > - return (1); > + nc = *c; > + if (s->hassavedcoll) { > + *h = s->savedcoll; > + h->report_ID = nc.report_ID; > + s->savedcoll = nc; > + return (1); > + } else { > + s->hassavedcoll = 1; > + s->savedcoll = nc; > + } > + goto top; > case 11: /* Feature */ > c->kind = hid_feature; > c->flags = dval; > goto ret; > case 12: /* End collection */ > + REPORT_SAVED_COLL; > c->kind = hid_endcollection; > if (c->collevel == 0) { > /* Invalid end collection. */ >