Some consumer control descriptor reports uses an array of usages instead
authoranton <anton@openbsd.org>
Tue, 24 Aug 2021 10:53:43 +0000 (10:53 +0000)
committeranton <anton@openbsd.org>
Tue, 24 Aug 2021 10:53:43 +0000 (10:53 +0000)
commit08861470aa4a25489317b6d6271454765825da25
tree63270a8a047e3fcbaa921329589f3b392e597b50
parentb6c74373464ef602584be98cdfb88646eebb5365
Some consumer control descriptor reports uses an array of usages instead
of enumerating all supported ones. This representation is more compact
as all supported usages are given by the array min and max boundaries.

In enumerating mode, the interrupt report has one level indirection as
it includes the bit offset of the usage requiring the driver to map bits
to usages in order to resolve the key press.
In array mode, the interrupt report includes the usage without any
indirection, removing the need map bits to usages.

ucc(4) can now operate either in enumerating or array mode depending on
the descriptor report. This should make more keyboards usable.

Thanks to Alessandro De Laurenzis <just22 at atlantide dot mooo dot com>
for testing.
sys/dev/usb/ucc.c