USBHost - Testing - Keyboard object not top-level object instead USBHIDParser

KurtE

Senior Member+
I am sort of getting tired of seeing different keyboards, that don't work as they don't default into BOOT mode and even if they
are marked as BOOT mode, not all actually default to using that format...

So, I have built a version that no longer has the Keyboard as a Top-level object, but instead has it always receiving its data from
a USBHidParser object (actually it will typically claim two of these objects).

This also allows me to remove the code from HID.cpp that special cased keyboard to not claim if boot...

Note: I tried to have the HID parser process all of the data, but it appears to have issues with the HID Descriptor for the boot format. At least on the keyboard I tried it with. So, the code now checks to see if the data is 8 bytes long. If so, it processes it using the boot format parsing code.

So far, I have tried it on a few keyboards. I will pull out a few more.

Note: my testing did fault once, on the gigabyte keyboard. The crashreport showed NULL pointer. Pretty sure same issue I reported back in
https://forum.pjrc.com/threads/6925...yboard-Problem?p=311528&viewfull=1#post311528
Where, early on, we get an USB ISR with an ERROR flag marked on it, and the code in followup_Error() then walks the transfers looking to recover, and it finds a transfer that it wants to process that has a NULL pipe:
Code:
				Pipe_t *haltedpipe = p->pipe;
is NULL and faults on the line:
Code:
				p = (Transfer_t *)(haltedpipe->qh.next & ~0x1F);
But that is secondary to this thread.

I pushed the current code up to:
https://github.com/KurtE/USBHost_t36/tree/HID_keyboard

Note: There is still some debug Serial outputs I will remove.

Now to try with several more keyboards.
 
@KurtE

Just downloaded and gave your changes a try with gigabyte K83 and the Gigabyte Aorus keyboards that I picked up.

Both worked just fine with HIDDeviceInfo sketch with no reboots after I changed this:
Code:
  Serial1.begin(2000000);
  if (CrashReport) Serial.println(CrashReport);

to

Code:
  Serial.begin(2000000);
  if (CrashReport) Serial.println(CrashReport);

NOTE: The Aorus didn't work before with DevicInfo sketch unless I edited the keyboard.cpp file.

Did get a error message from the Mouse example sketch:
Code:
D:\Users\Merli\Documents\Arduino\libraries\USBHost_t36-master\examples\Mouse\Mouse.ino:26:115: error: cannot convert 'KeyboardController*' to 'USBDriver*' in initialization
 USBDriver *drivers[] = {&hub1, &hub2,&keyboard1, &keyboard2, &joystick1, &bluet, &hid1, &hid2, &hid3, &hid4, &hid5};
                                                                                                                   ^
D:\Users\Merli\Documents\Arduino\libraries\USBHost_t36-master\examples\Mouse\Mouse.ino:26:115: error: cannot convert 'KeyboardController*' to 'USBDriver*' in initialization
D:\Users\Merli\Documents\Arduino\libraries\USBHost_t36-master\examples\Mouse\Mouse.ino: In function 'void loop()':
D:\Users\Merli\Documents\Arduino\libraries\USBHost_t36-master\examples\Mouse\Mouse.ino:111:28: error: comparison between distinct pointer types 'USBDriver*' and 'KeyboardController*' lacks a cast
         if (drivers[i] == &keyboard1) {
                            ^

exit status 1
so looks like examples need to change.
 
Thanks,
I forgot to mention that.

An alternative was/is for me to still let it be derived from Device but claim nothing. Could still although it might be deceiving.
 
Hooked up my wireless keyboard and mouse: https://www.amazon.com/gp/product/B07BF3LFN3/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1

Code:
USBDeviceInfo claim this=2000CAE8

****************************************
** Device Level **
  vid=276D
  pid=3257
  bDeviceClass = 0
  bDeviceSubClass = 0
  bDeviceProtocol = 0
09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 49 00 07 05 81 03 08 00 01 09 04 01 00 01 03 01
02 00 09 21 10 01 00 01 22 B9 00 07 05 82 03 08 00 01 

USBDeviceInfo claim this=2000CAE8

****************************************
** Interface Level **
09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 49 00 07 05 81 03 08 00 01 09 04 01 00 01 03 01
02 00 09 21 10 01 00 01 22 B9 00 07 05 82 03 08 00 01 
 bInterfaceNumber = 0
 number end points = 1
 bInterfaceClass =    3
 bInterfaceSubClass = 1
    HID (BOOT)
 bInterfaceProtocol = 1
    Keyboard
report descriptor size = 73
  endpoint = 81
    attributes = 3 Interrupt
    size = 8
    interval = 1

USBDeviceInfo claim this=2000CAE8

****************************************
** Interface Level **
09 04 01 00 01 03 01 02 00 09 21 10 01 00 01 22 B9 00 07 05 82 03 08 00 01 
 bInterfaceNumber = 1
 number end points = 1
 bInterfaceClass =    3
 bInterfaceSubClass = 1
    HID (BOOT)
 bInterfaceProtocol = 2
    Mouse
report descriptor size = 185
  endpoint = 82
    attributes = 3 Interrupt
    size = 8
    interval = 1
*** Device HID1 276d:3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
*** Device HID2 276d:3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
HIDDumpController(1 : 0x200041e0 : 0x20009640) Claim: 276d:3257 usage: 10006 - Yes

HID Report Descriptor (0x20009670) size: 73
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  A1 01	// Collection(1) top Usage(10000)
    05 08	// Usage Page(8) - LEDs
    19 01	// Usage Minimum(1) - 
    29 05	// Usage Maximum(5) - 
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 05	// Report Count(5)
    75 01	// Report Size(1)
    91 02	// Output(2)	// (Data, Variable, Absolute)
    95 01	// Report Count(1)
    75 03	// Report Size(3)
    91 01	// Output(1)	// (Constant, Array, Absolute)
    05 07	// Usage Page(7) - Keycode
    1A E0 00	// Usage Minimum(e0) - (Left Control)
    2A E7 00	// Usage Maximum(e7) - (Right)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 FF	// Usage Page(ff) - Other ?
    09 03	// Usage(3) -
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 07	// Usage Page(7) - Keycode
    19 00	// Usage Minimum(0) - (Keycode 0)
    2A FF 00	// Usage Maximum(ff) - (Keycode 255)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    95 06	// Report Count(6)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
*** HID Device hdc1 276d: 3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
HIDDumpController(1 : 0x200041e0 : 0x20009d00) Claim: 276d:3257 usage: ffb50001 - NO (Usage: 10006)
HIDDumpController(2 : 0x200052c0 : 0x20009d00) Claim: 276d:3257 usage: ffb50001 - Yes

HID Report Descriptor (0x20009d30) size: 185
  06 B5 FF	// Usage Page(ffb5) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ffb50000)
    85 B5	// Report ID(b5)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    91 02	// Output(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 02	// Usage(2) -(Mouse)
  A1 01	// Collection(1) top Usage(10000)
    85 02	// Report ID(2)
    09 01	// Usage(1) -(?)
    A1 00	// Collection(0)
    05 09	// Usage Page(9) - Button
    19 01	// Usage Minimum(1) -  (BUTTON 1)
    29 08	// Usage Maximum(8) -  (BUTTON 8)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 01	// Usage Page(1) - Generic Desktop
    09 30	// Usage(30) -(X)
    09 31	// Usage(31) -(Y)
    16 01 F8	// Logical Minimum(f801)
    26 FF 07	// Logical maximum(7ff)
    75 0C	// Report Size(c)
    95 02	// Report Count(2)
    81 06	// Input(6)	// (Data, Variable, Relative)
    09 38	// Usage(38) -(Wheel)
    15 81	// Logical Minimum(81)
    25 7F	// Logical maximum(7f)
    75 08	// Report Size(8)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    05 0C	// Usage Page(c) - Consumer
    0A 38 02	// Usage(238) -(AC Pan)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    C0	// End Collection
  C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 01	// Report ID(1)
    19 01	// Usage Minimum(1) - (Consumer Controls)
    2A FF 03	// Usage Maximum(3ff) - (?)
    15 01	// Logical Minimum(1)
    26 FF 03	// Logical maximum(3ff)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 03	// Report ID(3)
    1A 81 00	// Usage Minimum(81) - (System Power Down)
    2A 83 00	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 03	// Report Count(3)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 BC FF	// Usage Page(ffbc) - Vendor Defined
  09 88	// Usage(88) -
  A1 01	// Collection(1) top Usage(ffbc0088)
    85 04	// Report ID(4)
    19 00	// Usage Minimum(0) - 
    2A FF 00	// Usage Maximum(ff) - 
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x200041e0 : 0x20009d00) Claim: 276d:3257 usage: 10002 - NO (Usage: 10006)
HIDDumpController(2 : 0x200052c0 : 0x20009d00) Claim: 276d:3257 usage: 10002 - NO (Usage: ffb50001)
HIDDumpController(3 : 0x200063a0 : 0x20009d00) Claim: 276d:3257 usage: 10002 - Yes

HID Report Descriptor (0x20009d30) size: 185
  06 B5 FF	// Usage Page(ffb5) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ffb50000)
    85 B5	// Report ID(b5)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    91 02	// Output(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 02	// Usage(2) -(Mouse)
  A1 01	// Collection(1) top Usage(10000)
    85 02	// Report ID(2)
    09 01	// Usage(1) -(?)
    A1 00	// Collection(0)
    05 09	// Usage Page(9) - Button
    19 01	// Usage Minimum(1) -  (BUTTON 1)
    29 08	// Usage Maximum(8) -  (BUTTON 8)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 01	// Usage Page(1) - Generic Desktop
    09 30	// Usage(30) -(X)
    09 31	// Usage(31) -(Y)
    16 01 F8	// Logical Minimum(f801)
    26 FF 07	// Logical maximum(7ff)
    75 0C	// Report Size(c)
    95 02	// Report Count(2)
    81 06	// Input(6)	// (Data, Variable, Relative)
    09 38	// Usage(38) -(Wheel)
    15 81	// Logical Minimum(81)
    25 7F	// Logical maximum(7f)
    75 08	// Report Size(8)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    05 0C	// Usage Page(c) - Consumer
    0A 38 02	// Usage(238) -(AC Pan)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    C0	// End Collection
  C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 01	// Report ID(1)
    19 01	// Usage Minimum(1) - (Consumer Controls)
    2A FF 03	// Usage Maximum(3ff) - (?)
    15 01	// Logical Minimum(1)
    26 FF 03	// Logical maximum(3ff)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 03	// Report ID(3)
    1A 81 00	// Usage Minimum(81) - (System Power Down)
    2A 83 00	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 03	// Report Count(3)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 BC FF	// Usage Page(ffbc) - Vendor Defined
  09 88	// Usage(88) -
  A1 01	// Collection(1) top Usage(ffbc0088)
    85 04	// Report ID(4)
    19 00	// Usage Minimum(0) - 
    2A FF 00	// Usage Maximum(ff) - 
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x200041e0 : 0x20009d00) Claim: 276d:3257 usage: c0001 - NO (Usage: 10006)
HIDDumpController(2 : 0x200052c0 : 0x20009d00) Claim: 276d:3257 usage: c0001 - NO (Usage: ffb50001)
HIDDumpController(3 : 0x200063a0 : 0x20009d00) Claim: 276d:3257 usage: c0001 - NO (Usage: 10002)
HIDDumpController(4 : 0x20007480 : 0x20009d00) Claim: 276d:3257 usage: c0001 - Yes

HID Report Descriptor (0x20009d30) size: 185
  06 B5 FF	// Usage Page(ffb5) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ffb50000)
    85 B5	// Report ID(b5)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    91 02	// Output(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 02	// Usage(2) -(Mouse)
  A1 01	// Collection(1) top Usage(10000)
    85 02	// Report ID(2)
    09 01	// Usage(1) -(?)
    A1 00	// Collection(0)
    05 09	// Usage Page(9) - Button
    19 01	// Usage Minimum(1) -  (BUTTON 1)
    29 08	// Usage Maximum(8) -  (BUTTON 8)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 01	// Usage Page(1) - Generic Desktop
    09 30	// Usage(30) -(X)
    09 31	// Usage(31) -(Y)
    16 01 F8	// Logical Minimum(f801)
    26 FF 07	// Logical maximum(7ff)
    75 0C	// Report Size(c)
    95 02	// Report Count(2)
    81 06	// Input(6)	// (Data, Variable, Relative)
    09 38	// Usage(38) -(Wheel)
    15 81	// Logical Minimum(81)
    25 7F	// Logical maximum(7f)
    75 08	// Report Size(8)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    05 0C	// Usage Page(c) - Consumer
    0A 38 02	// Usage(238) -(AC Pan)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    C0	// End Collection
  C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 01	// Report ID(1)
    19 01	// Usage Minimum(1) - (Consumer Controls)
    2A FF 03	// Usage Maximum(3ff) - (?)
    15 01	// Logical Minimum(1)
    26 FF 03	// Logical maximum(3ff)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 03	// Report ID(3)
    1A 81 00	// Usage Minimum(81) - (System Power Down)
    2A 83 00	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 03	// Report Count(3)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 BC FF	// Usage Page(ffbc) - Vendor Defined
  09 88	// Usage(88) -
  A1 01	// Collection(1) top Usage(ffbc0088)
    85 04	// Report ID(4)
    19 00	// Usage Minimum(0) - 
    2A FF 00	// Usage Maximum(ff) - 
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x200041e0 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: 10006)
HIDDumpController(2 : 0x200052c0 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: ffb50001)
HIDDumpController(3 : 0x200063a0 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: 10002)
HIDDumpController(4 : 0x20007480 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: c0001)
HIDDumpController(5 : 0x20008560 : 0x20009d00) Claim: 276d:3257 usage: 10080 - Yes

HID Report Descriptor (0x20009d30) size: 185
  06 B5 FF	// Usage Page(ffb5) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ffb50000)
    85 B5	// Report ID(b5)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    09 02	// Usage(2) -
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    91 02	// Output(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 02	// Usage(2) -(Mouse)
  A1 01	// Collection(1) top Usage(10000)
    85 02	// Report ID(2)
    09 01	// Usage(1) -(?)
    A1 00	// Collection(0)
    05 09	// Usage Page(9) - Button
    19 01	// Usage Minimum(1) -  (BUTTON 1)
    29 08	// Usage Maximum(8) -  (BUTTON 8)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    05 01	// Usage Page(1) - Generic Desktop
    09 30	// Usage(30) -(X)
    09 31	// Usage(31) -(Y)
    16 01 F8	// Logical Minimum(f801)
    26 FF 07	// Logical maximum(7ff)
    75 0C	// Report Size(c)
    95 02	// Report Count(2)
    81 06	// Input(6)	// (Data, Variable, Relative)
    09 38	// Usage(38) -(Wheel)
    15 81	// Logical Minimum(81)
    25 7F	// Logical maximum(7f)
    75 08	// Report Size(8)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    05 0C	// Usage Page(c) - Consumer
    0A 38 02	// Usage(238) -(AC Pan)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    C0	// End Collection
  C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 01	// Report ID(1)
    19 01	// Usage Minimum(1) - (Consumer Controls)
    2A FF 03	// Usage Maximum(3ff) - (?)
    15 01	// Logical Minimum(1)
    26 FF 03	// Logical maximum(3ff)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 03	// Report ID(3)
    1A 81 00	// Usage Minimum(81) - (System Power Down)
    2A 83 00	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 03	// Report Count(3)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 BC FF	// Usage Page(ffbc) - Vendor Defined
  09 88	// Usage(88) -
  A1 01	// Collection(1) top Usage(ffbc0088)
    85 04	// Report ID(4)
    19 00	// Usage Minimum(0) - 
    2A FF 00	// Usage Maximum(ff) - 
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
*** HID Device hdc2 276d: 3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
*** HID Device hdc3 276d: 3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
*** HID Device hdc4 276d: 3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
*** HID Device hdc5 276d: 3257 - connected ***
  product: 2.4G RF Keyboard & Mouse
So it looks like its recognizing the combo.

For the mouse:
Code:
HID(2 : ffb50001): B5 67 11 1A 10 36 05 01 
Begin topusage:ffb50000 type:2 min:0 max:255
  usage=FFB50100, value=103:g
  usage=FFB50101, value=17
  usage=FFB50102, value=26
  usage=FFB50103, value=16
  usage=FFB50104, value=54:6
  usage=FFB50105, value=5
  usage=FFB50106, value=1
END:
END:
END:
END:
HID(2 : ffb50001): 02 00 01 00 00 00 00 00 
END:
Begin topusage:10000 type:2 min:0 max:1
usage=90001, value=0 (BUTTON 1)
usage=90002, value=0 (BUTTON 2)
usage=90003, value=0 (BUTTON 3)
usage=90004, value=0 (BUTTON 4)
usage=90005, value=0 (BUTTON 5)
usage=90006, value=0 (BUTTON 6)
usage=90007, value=0 (BUTTON 7)
usage=90008, value=0 (BUTTON 8)
Begin topusage:10000 type:6 min:-2047 max:2047
  usage=10030, value=1(X)
  usage=10031, value=0(Y)
  Begin topusage:10000 type:6 min:-127 max:127
    usage=10038, value=0(Wheel)
    Begin topusage:10000 type:6 min:-127 max:127
    usage=C0238, value=0(AC Pan)
  END:
END:
END:
HID(2 : ffb50001): 02 00 01 00 00 00 00 01 
END:
  Begin topusage:10000 type:2 min:0 max:1
    usage=90001, value=0 (BUTTON 1)
    usage=90002, value=0 (BUTTON 2)
    usage=90003, value=0 (BUTTON 3)
    usage=90004, value=0 (BUTTON 4)
    usage=90005, value=0 (BUTTON 5)
    usage=90006, value=0 (BUTTON 6)
    usage=90007, value=0 (BUTTON 7)
    usage=90008, value=0 (BUTTON 8)
    Begin topusage:10000 type:6 min:-2047 max:2047
    usage=10030, value=1(X)
    usage=10031, value=0(Y)
    Begin topusage:10000 type:6 min:-127 max:127
    usage=10038, value=0(Wheel)
    Begin topusage:10000 type:6 min:-127 max:127
    usage=C0238, value=0(AC Pan)
  END:
END:
END:
Looks like its working

Now for the keyboard. If I press the 'a' key
Code:
HID(2 : ffb50001): B5 69 72 57 35 22 00 00 
Begin topusage:ffb50000 type:2 min:0 max:255
  usage=FFB50100, value=105:i
  usage=FFB50101, value=114:r
  usage=FFB50102, value=87:W
  usage=FFB50103, value=53:5
  usage=FFB50104, value=34:"
  usage=FFB50105, value=0
  usage=FFB50106, value=0
END:
END:
END: 
END:
which is a bit wierd. For it to register another keystroke have to wait about 30 seconds, press the "c"
Code:
HID(2 : ffb50001): B5 69 72 57 35 22 00 00 
Begin topusage:ffb50000 type:2 min:0 max:255
  usage=FFB50100, value=105:i
  usage=FFB50101, value=114:r
  usage=FFB50102, value=87:W
  usage=FFB50103, value=53:5
  usage=FFB50104, value=34:"
  usage=FFB50105, value=0
  usage=FFB50106, value=0
END:
END:
END:
END:
get the same thing
 
I also I think put in commit comments about wanting the code to properly handle the Boot format, but was getting garbage out of HID:
For example, in input which a keyboard I have keeps outputting: HID(1 : 10006): 00 00 00 00 00 00 00 00

Code:
HID(1 : 10006): 00 00 00 00 00 00 00 00 
begin, usage=10000
       type= 2
       min=  0
       max=  1
       reportcount=8
       usage count=255
Begin topusage:10000 type:2 min:0 max:1
Input, total bits=8
  usage = 700E0  data = 0
  usage=700E0, value=0 (Left Control)
  usage = 700E1  data = 0
  usage=700E1, value=0 (Left Shift)
  usage = 700E2  data = 0
  usage=700E2, value=0 (Left Alt)
  usage = 700E3  data = 0
  usage=700E3, value=0 (Left GUI)
  usage = 700E4  data = 0
  usage=700E4, value=0 (Right Control)
  usage = 700E5  data = 0
  usage=700E5, value=0 (Right Shift)
  usage = 700E6  data = 0
  usage=700E6, value=0 (Right Alt)
  usage = 700E7  data = 0
  usage=700E7, value=0 (Right GUI)
begin, usage=10000
       type= 0
       min=  0
       max=  255
       reportcount=6
       usage count=255
  Begin topusage:10000 type:0 min:0 max:255
Input, total bits=48
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  END:

The combination of The HIDDumper and the USB Host debug printing above, we see that it is giving me data = 1 for the 6 scan code fields ???

I am pretty sure the HID code is busted. HINT: usage = 70000 data = 1

I believe this code is just plain wrong. Paul?
Code:
				} else {
					// array format, each item is a usage number
					for (uint32_t i=0; i < report_count; i++) {
						uint32_t u = bitfield(data, bitindex, report_size);
						int n = u;
						if (n >= logical_min && n <= logical_max) {
							u |= (uint32_t)usage_page << 16;
							[COLOR="#FF0000"]print("  usage = ", u, HEX);
							println("  data = 1");[/COLOR]
							driver->hid_input_data(u, 1);
						} else {
							print ("  usage =", u, HEX);
							print(" out of range: ", logical_min, HEX);
							println(" ", logical_max, HEX);
						}
						bitindex += report_size;
					}
				}
			}
I believe that maybe it should be The usage maybe should be: i | (uint32_t)usage_page << 16;
And U should be the value returned... Will try that and see about processing it...

Or are we to know that the low word is the value and value is nothing?
 
@KurtE

It is interesting with that RII wireless keyboard I am testing its showing:
Code:
HIDDumpController(1 : 0x200041e0 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: 10006)
HIDDumpController(2 : 0x200052c0 : 0x20009d00) Claim: 276d:3257 usage: 10080 - NO (Usage: ffb50001) ...

but its selecting HIDController 2 for the keyboard when it should be selecting 1
Code:
HID(2 : ffb50001): B5 69 72 57 35 22 00 00
but other keyboards seem to be doing it correctly, i.e.:
Code:
HID(1 : 10006): 00 00 00 00 00 00 00 00

DELETED

EDIT: also noticed that you define
Code:
#define TOPUSAGE_KEYBOARD 0X10006

so not sure whats going on....

Figured it out - Device info sketch had it redefined for process_in_data and claim collection

Did run the keyboard mouse forward sketch - mouse works but no keyboard
 
Last edited:
I think I figured out what to do with the stuff I mentioned in the previous post:
Code:
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  END:

Here is holding down: a s d
Code:
HID(1 : 10006): 00 00 16 07 04 00 00 00 
begin, usage=10000
       type= 2
       min=  0
       max=  1
       reportcount=8
       usage count=255
Begin topusage:10000 type:2 min:0 max:1
Input, total bits=8
  usage = 700E0  data = 0
  usage=700E0, value=0 (Left Control)
  usage = 700E1  data = 0
  usage=700E1, value=0 (Left Shift)
  usage = 700E2  data = 0
  usage=700E2, value=0 (Left Alt)
  usage = 700E3  data = 0
  usage=700E3, value=0 (Left GUI)
  usage = 700E4  data = 0
  usage=700E4, value=0 (Right Control)
  usage = 700E5  data = 0
  usage=700E5, value=0 (Right Shift)
  usage = 700E6  data = 0
  usage=700E6, value=0 (Right Alt)
  usage = 700E7  data = 0
  usage=700E7, value=0 (Right GUI)
begin, usage=10000
       type= 0
       min=  0
       max=  255
       reportcount=6
       usage count=255
  Begin topusage:10000 type:0 min:0 max:255
Input, total bits=48
  usage = 70016  data = 1
    usage=70016, value=1 (s and S)
  usage = 70007  data = 1
    usage=70007, value=1 (d and D)
  usage = 70004  data = 1
    usage=70004, value=1 (a and A)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  usage = 70000  data = 1
    usage=70000, value=1 (Keycode 0)
  END:

So it gives us the Down transitions for the keys but no up... And ignore all 70000

Will convert to, will do first in the hid dumper and then migrate back into keyboard.
 
Pushed up some changes to keyboard code.

It can now process the boot format using the callback from the HID parsing. I still bypass that if I know I can.

What it does is detects the hid data type of 0 (the 0x2 bit not set) or array, and then it stores those away into a
boot like format, and when we get the end, it processes it like when we bypassed the hid parser.

Did not change the HID parser example sketch as it is simply reporting what the HID data we are processing, not how we interpolate it.

Done for the night
 
@mjs513 @PaulStoffregen and all,

Been playing more with the HID_keyboard branch where keyboard is no longer top level object, but always works from HID. Although again it bypasses the HID parsing if it thinks it can.
I will put in some more verification on it.

Goal is to not have to tell keyboards to go into Boot mode. But simply use what they give us.

Side note: with the Gigabyte keyboard, sometimes it still faults at startup. But not consistent.

I was curious about other N-Key rollover keyboards, so I purchased another one: https://smile.amazon.com/dp/B016MAK38U
Which I picked up today at my PMB box.

Sort of pretty - lights up all the keys with different color LEDS... Might use it on my secondary machine, to replace the old Dell keyboard.

So I ran my current version of the HID Dumper.

Code:
USB HID Device Info Program

This Sketch shows information about plugged in HID devices

*** You can control the output by simple character input to Serial ***
R - Turns on or off showing the raw data
C - Toggles showing changed data only on or off
<anything else> - toggles showing the Hid formatted breakdown of the data


USBDeviceInfo claim this=2000CE20

****************************************
** Device Level **
  vid=258A
  pid=2A
  bDeviceClass = 0
  bDeviceSubClass = 0
  bDeviceProtocol = 0
09 04 00 00 01 03 01 01 00 09 21 11 01 00 01 22 43 00 07 05 81 03 08 00 01 09 04 01 00 01 03 00
00 00 09 21 11 01 00 01 22 CC 00 07 05 82 03 10 00 01 

USBDeviceInfo claim this=2000CE20

****************************************
** Interface Level **
09 04 00 00 01 03 01 01 00 09 21 11 01 00 01 22 43 00 07 05 81 03 08 00 01 09 04 01 00 01 03 00
00 00 09 21 11 01 00 01 22 CC 00 07 05 82 03 10 00 01 
 bInterfaceNumber = 0
 number end points = 1
 bInterfaceClass =    3
 bInterfaceSubClass = 1
    HID (BOOT)
 bInterfaceProtocol = 1
    Keyboard
report descriptor size = 67
  endpoint = 81
    attributes = 3 Interrupt
    size = 8
    interval = 1

USBDeviceInfo claim this=2000CE20

****************************************
** Interface Level **
09 04 01 00 01 03 00 00 00 09 21 11 01 00 01 22 CC 00 07 05 82 03 10 00 01 
 bInterfaceNumber = 1
 number end points = 1
 bInterfaceClass =    3
 bInterfaceSubClass = 0
    HID
 bInterfaceProtocol = 0
    None
report descriptor size = 204
  endpoint = 82
    attributes = 3 Interrupt
    size = 16
    interval = 1
*** Device HID1 258a:2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB 
*** Device HID2 258a:2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB 
HIDDumpController(1 : 0x20004220 : 0x20009680) Claim: 258a:2a usage: 10006 SubClass: 1 Protcol: 1 - Yes
>> Boot Keyboard - Send SET_IDLE <<
>>> SendControlPacket: 21 a 0 0 0 return: 1

HID Report Descriptor (0x200096b4) size: 67
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  A1 01	// Collection(1) top Usage(10000)
    05 07	// Usage Page(7) - Keycode
    19 E0	// Usage Minimum(e0) - (Left Control)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    95 08	// Report Count(8)
    75 01	// Report Size(1)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 03	// Input(3)	// (Constant, Variable, Absolute)
    95 06	// Report Count(6)
    75 08	// Report Size(8)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    05 07	// Usage Page(7) - Keycode
    19 00	// Usage Minimum(0) - (Keycode 0)
    2A FF 00	// Usage Maximum(ff) - (Keycode 255)
    81 00	// Input(0)	// (Data, Array, Absolute)
    25 01	// Logical maximum(1)
    95 05	// Report Count(5)
    75 01	// Report Size(1)
    05 08	// Usage Page(8) - LEDs
    19 01	// Usage Minimum(1) - 
    29 05	// Usage Maximum(5) - 
    91 02	// Output(2)	// (Data, Variable, Absolute)
    95 01	// Report Count(1)
    75 03	// Report Size(3)
    91 03	// Output(3)	// (Constant, Variable, Absolute)
    C0	// End Collection
*** HID Device hdc1 258a: 2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB 
HIDDumpController(1 : 0x20004220 : 0x20009d40) Claim: 258a:2a usage: 10080 SubClass: 0 Protcol: 0 - NO (Usage: 10006)
HIDDumpController(2 : 0x20005300 : 0x20009d40) Claim: 258a:2a usage: 10080 SubClass: 0 Protcol: 0 - Yes

HID Report Descriptor (0x20009d74) size: 204
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 01	// Report ID(1)
    19 81	// Usage Minimum(81) - (System Power Down)
    29 83	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 03	// Report Count(3)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 02	// Report ID(2)
    19 00	// Usage Minimum(0) - (?)
    2A 3C 02	// Usage Maximum(23c) - (AC Format)
    15 00	// Logical Minimum(0)
    26 3C 02	// Logical maximum(23c)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 05	// Report ID(5)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    19 01	// Usage Minimum(1) - 
    29 02	// Usage Maximum(2) - 
    75 08	// Report Size(8)
    95 05	// Report Count(5)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  A1 01	// Collection(1) top Usage(10000)
    85 06	// Report ID(6)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 70	// Report Count(70)
    05 07	// Usage Page(7) - Keycode
    19 E0	// Usage Minimum(e0) - (Left Control)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 67	// Usage Maximum(67) - (Keypad =)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 08	// Report Count(8)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 09	// Report ID(9)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 F8 01	// Report Count(1f8)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0A	// Report ID(a)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 29	// Report Count(29)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0B	// Report ID(b)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 7E	// Report Count(7e)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0C	// Report ID(c)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 80 07	// Report Count(780)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x20004220 : 0x20009d40) Claim: 258a:2a usage: c0001 SubClass: 0 Protcol: 0 - NO (Usage: 10006)
HIDDumpController(2 : 0x20005300 : 0x20009d40) Claim: 258a:2a usage: c0001 SubClass: 0 Protcol: 0 - NO (Usage: 10080)
HIDDumpController(3 : 0x200063e0 : 0x20009d40) Claim: 258a:2a usage: c0001 SubClass: 0 Protcol: 0 - Yes

HID Report Descriptor (0x20009d74) size: 204
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 01	// Report ID(1)
    19 81	// Usage Minimum(81) - (System Power Down)
    29 83	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 03	// Report Count(3)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 02	// Report ID(2)
    19 00	// Usage Minimum(0) - (?)
    2A 3C 02	// Usage Maximum(23c) - (AC Format)
    15 00	// Logical Minimum(0)
    26 3C 02	// Logical maximum(23c)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 05	// Report ID(5)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    19 01	// Usage Minimum(1) - 
    29 02	// Usage Maximum(2) - 
    75 08	// Report Size(8)
    95 05	// Report Count(5)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  A1 01	// Collection(1) top Usage(10000)
    85 06	// Report ID(6)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 70	// Report Count(70)
    05 07	// Usage Page(7) - Keycode
    19 E0	// Usage Minimum(e0) - (Left Control)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 67	// Usage Maximum(67) - (Keypad =)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 08	// Report Count(8)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 09	// Report ID(9)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 F8 01	// Report Count(1f8)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0A	// Report ID(a)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 29	// Report Count(29)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0B	// Report ID(b)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 7E	// Report Count(7e)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0C	// Report ID(c)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 80 07	// Report Count(780)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x20004220 : 0x20009d40) Claim: 258a:2a usage: ff000001 SubClass: 0 Protcol: 0 - NO (Usage: 10006)
HIDDumpController(2 : 0x20005300 : 0x20009d40) Claim: 258a:2a usage: ff000001 SubClass: 0 Protcol: 0 - NO (Usage: 10080)
HIDDumpController(3 : 0x200063e0 : 0x20009d40) Claim: 258a:2a usage: ff000001 SubClass: 0 Protcol: 0 - NO (Usage: c0001)
HIDDumpController(4 : 0x200074c0 : 0x20009d40) Claim: 258a:2a usage: ff000001 SubClass: 0 Protcol: 0 - Yes

HID Report Descriptor (0x20009d74) size: 204
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 01	// Report ID(1)
    19 81	// Usage Minimum(81) - (System Power Down)
    29 83	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 03	// Report Count(3)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 02	// Report ID(2)
    19 00	// Usage Minimum(0) - (?)
    2A 3C 02	// Usage Maximum(23c) - (AC Format)
    15 00	// Logical Minimum(0)
    26 3C 02	// Logical maximum(23c)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 05	// Report ID(5)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    19 01	// Usage Minimum(1) - 
    29 02	// Usage Maximum(2) - 
    75 08	// Report Size(8)
    95 05	// Report Count(5)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  A1 01	// Collection(1) top Usage(10000)
    85 06	// Report ID(6)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 70	// Report Count(70)
    05 07	// Usage Page(7) - Keycode
    19 E0	// Usage Minimum(e0) - (Left Control)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 67	// Usage Maximum(67) - (Keypad =)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 08	// Report Count(8)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 09	// Report ID(9)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 F8 01	// Report Count(1f8)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0A	// Report ID(a)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 29	// Report Count(29)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0B	// Report ID(b)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    95 7E	// Report Count(7e)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
  06 00 FF	// Usage Page(ff00) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff000000)
    85 0C	// Report ID(c)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 00	// Usage(0) -
    75 08	// Report Size(8)
    96 80 07	// Report Count(780)
    B1 02	// Feature(2)	// (Data, Variable, Absolute)
    C0	// End Collection
HIDDumpController(1 : 0x20004220 : 0x20009d40) Claim: 258a:2a usage: 10006 SubClass: 0 Protcol: 0 - Yes
*** HID Device hdc2 258a: 2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB 
*** HID Device hdc3 258a: 2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB 
*** HID Device hdc4 258a: 2a - connected ***
  manufacturer: SINO WEALTH
  product: Gaming KB

Now what is sort of interesting, and that I may need to update the handling code.
If I just hit the A key you see something like:
Code:
HID(1 : 10006): 00 00 04 00 00 00 00 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=70004, value=1 (a and A)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:
HID(1 : 10006): 00 00 00 00 00 00 00 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:
If I press let's say ASDF keys like:
Code:
HID(1 : 10006): 00 00 04 09 07 16 00 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=70004, value=1 (a and A)
    usage=70009, value=1 (f and F)
    usage=70007, value=1 (d and D)
    usage=70016, value=1 (s and S)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:

But if I hold down more than 6 keys, things change:
Code:
HID(1 : 10006): 00 00 04 16 07 09 0A 0B 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=70004, value=1 (a and A)
    usage=70016, value=1 (s and S)
    usage=70007, value=1 (d and D)
    usage=70009, value=1 (f and F)
    usage=7000A, value=1 (g and G)
    usage=7000B, value=1 (h and H)
  END:
HID(2 : 10080): 06 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
  Begin topusage:10000 type:2 min:0 max:1
    usage=70000, value=0 (Keycode 0)
    usage=70001, value=0 (Keycode 1)
    usage=70002, value=0 (Keycode 2)
    usage=70003, value=0 (Keycode 3)
    usage=70004, value=0 (a and A)
    usage=70005, value=0 (b and B)
    usage=70006, value=0 (c and C)
    usage=70007, value=0 (d and D)
    usage=70008, value=0 (e and E)
    usage=70009, value=0 (f and F)
    usage=7000A, value=0 (g and G)
    usage=7000B, value=0 (h and H)
    usage=7000C, value=0 (i and I)
    usage=7000D, value=0 (j and J)
    usage=7000E, value=0 (k and K)
    usage=7000F, value=0 (l and L)
    usage=70010, value=0 (m and M)
    usage=70011, value=0 (n and N)
    usage=70012, value=0 (o and O)
    usage=70013, value=0 (p and P)
    usage=70014, value=0 (q and Q)
    usage=70015, value=1 (r and R)
    usage=70016, value=0 (s and S)
    usage=70017, value=0 (t and T)
    usage=70018, value=0 (u and U)
    usage=70019, value=0 (v and V)
    usage=7001A, value=0 (w and W)
    usage=7001B, value=0 (x and X)
    usage=7001C, value=0 (y and Y)
    usage=7001D, value=0 (z and Z)
    usage=7001E, value=0 (1 and !)
    usage=7001F, value=0 (2 and @)
    usage=70020, value=0 (3 and #)
    usage=70021, value=0 (4 and $)
    usage=70022, value=0 (5 and %)
    usage=70023, value=0 (6 and ^)
    usage=70024, value=0 (7 and &)
    usage=70025, value=0 (8 and *)
    usage=70026, value=0 (9 and ()
    usage=70027, value=0 (0 and ))
    usage=70028, value=0 (Return (ENTER))
    usage=70029, value=0 (ESCAPE)
    usage=7002A, value=0 (DELETE (Backspace))
    usage=7002B, value=0 (Tab)
    usage=7002C, value=0 (Spacebar)
    usage=7002D, value=0 (- and (underscore))
    usage=7002E, value=0 (= and +)
    usage=7002F, value=0 ([ and {)
    usage=70030, value=0 (] and })
    usage=70031, value=0 (nd |)
    usage=70032, value=0 (Non-US # and ˜)
    usage=70033, value=0 (; and :)
    usage=70034, value=0 (‘ and “)
    usage=70035, value=0 (Grave Accent and Tilde)
    usage=70036, value=0 (, and <)
    usage=70037, value=0 (. and >)
    usage=70038, value=0 (/ and ?)
    usage=70039, value=0 (Caps Lock)
    usage=7003A, value=0 (F1)
    usage=7003B, value=0 (F2)
    usage=7003C, value=0 (F3)
    usage=7003D, value=0 (F4)
    usage=7003E, value=0 (F5)
    usage=7003F, value=0 (F6)
    usage=70040, value=0 (F7)
    usage=70041, value=0 (F8)
    usage=70042, value=0 (F9)
    usage=70043, value=0 (F10)
    usage=70044, value=0 (F11)
    usage=70045, value=0 (F12)
    usage=70046, value=0 (PrintScreen)
    usage=70047, value=0 (Scroll Lock)
    usage=70048, value=0 (Pause)
    usage=70049, value=0 (Insert)
    usage=7004A, value=0 (Home)
    usage=7004B, value=0 (PageUp)
    usage=7004C, value=0 (Delete Forward)
    usage=7004D, value=0 (End)
    usage=7004E, value=0 (PageDown)
    usage=7004F, value=0 (RightArrow)
    usage=70050, value=0 (LeftArrow)
    usage=70051, value=0 (DownArrow)
    usage=70052, value=0 (UpArrow)
    usage=70053, value=0 (Keypad Num Lock and Clear)
    usage=70054, value=0 (Keypad /)
    usage=70055, value=0 (Keypad *)
    usage=70056, value=0 (Keypad -)
    usage=70057, value=0 (Keypad +)
    usage=70058, value=0 (Keypad ENTER)
    usage=70059, value=0 (Keypad 1 and End)
    usage=7005A, value=0 (Keypad 2 and Down Arrow)
    usage=7005B, value=0 (Keypad 3 and PageDn)
    usage=7005C, value=0 (Keypad 4 and Left Arrow)
    usage=7005D, value=0 (Keypad 5)
    usage=7005E, value=0 (Keypad 6 and Right Arrow)
    usage=7005F, value=0 (Keypad 7 and Home)
    usage=70060, value=0 (Keypad 8 and Up Arrow)
    usage=70061, value=0 (Keypad 9 and PageUp)
    usage=70062, value=0 (Keypad 0 and Insert)
    usage=70063, value=0 (Keypad . and Delete)
    usage=70064, value=0 (Non-US nd |)
    usage=70065, value=0 (Application)
    usage=70066, value=0 (Power)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
  END:
HID(2 : 10080): 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
  Begin topusage:10000 type:2 min:0 max:1
    usage=70000, value=0 (Keycode 0)
    usage=70001, value=0 (Keycode 1)
    usage=70002, value=0 (Keycode 2)
    usage=70003, value=0 (Keycode 3)
    usage=70004, value=0 (a and A)
    usage=70005, value=0 (b and B)
    usage=70006, value=0 (c and C)
    usage=70007, value=0 (d and D)
    usage=70008, value=0 (e and E)
    usage=70009, value=0 (f and F)
    usage=7000A, value=0 (g and G)
    usage=7000B, value=0 (h and H)
    usage=7000C, value=0 (i and I)
    usage=7000D, value=0 (j and J)
    usage=7000E, value=0 (k and K)
    usage=7000F, value=0 (l and L)
    usage=70010, value=0 (m and M)
    usage=70011, value=0 (n and N)
    usage=70012, value=0 (o and O)
    usage=70013, value=0 (p and P)
    usage=70014, value=0 (q and Q)
    usage=70015, value=0 (r and R)
    usage=70016, value=0 (s and S)
    usage=70017, value=0 (t and T)
    usage=70018, value=0 (u and U)
    usage=70019, value=0 (v and V)
    usage=7001A, value=0 (w and W)
    usage=7001B, value=0 (x and X)
    usage=7001C, value=0 (y and Y)
    usage=7001D, value=0 (z and Z)
    usage=7001E, value=0 (1 and !)
    usage=7001F, value=0 (2 and @)
    usage=70020, value=0 (3 and #)
    usage=70021, value=0 (4 and $)
    usage=70022, value=0 (5 and %)
    usage=70023, value=0 (6 and ^)
    usage=70024, value=0 (7 and &)
    usage=70025, value=0 (8 and *)
    usage=70026, value=0 (9 and ()
    usage=70027, value=0 (0 and ))
    usage=70028, value=0 (Return (ENTER))
    usage=70029, value=0 (ESCAPE)
    usage=7002A, value=0 (DELETE (Backspace))
    usage=7002B, value=0 (Tab)
    usage=7002C, value=0 (Spacebar)
    usage=7002D, value=0 (- and (underscore))
    usage=7002E, value=0 (= and +)
    usage=7002F, value=0 ([ and {)
    usage=70030, value=0 (] and })
    usage=70031, value=0 (nd |)
    usage=70032, value=0 (Non-US # and ˜)
    usage=70033, value=0 (; and :)
    usage=70034, value=0 (‘ and “)
    usage=70035, value=0 (Grave Accent and Tilde)
    usage=70036, value=0 (, and <)
    usage=70037, value=0 (. and >)
    usage=70038, value=0 (/ and ?)
    usage=70039, value=0 (Caps Lock)
    usage=7003A, value=0 (F1)
    usage=7003B, value=0 (F2)
    usage=7003C, value=0 (F3)
    usage=7003D, value=0 (F4)
    usage=7003E, value=0 (F5)
    usage=7003F, value=0 (F6)
    usage=70040, value=0 (F7)
    usage=70041, value=0 (F8)
    usage=70042, value=0 (F9)
    usage=70043, value=0 (F10)
    usage=70044, value=0 (F11)
    usage=70045, value=0 (F12)
    usage=70046, value=0 (PrintScreen)
    usage=70047, value=0 (Scroll Lock)
    usage=70048, value=0 (Pause)
    usage=70049, value=0 (Insert)
    usage=7004A, value=0 (Home)
    usage=7004B, value=0 (PageUp)
    usage=7004C, value=0 (Delete Forward)
    usage=7004D, value=0 (End)
    usage=7004E, value=0 (PageDown)
    usage=7004F, value=0 (RightArrow)
    usage=70050, value=0 (LeftArrow)
    usage=70051, value=0 (DownArrow)
    usage=70052, value=0 (UpArrow)
    usage=70053, value=0 (Keypad Num Lock and Clear)
    usage=70054, value=0 (Keypad /)
    usage=70055, value=0 (Keypad *)
    usage=70056, value=0 (Keypad -)
    usage=70057, value=0 (Keypad +)
    usage=70058, value=0 (Keypad ENTER)
    usage=70059, value=0 (Keypad 1 and End)
    usage=7005A, value=0 (Keypad 2 and Down Arrow)
    usage=7005B, value=0 (Keypad 3 and PageDn)
    usage=7005C, value=0 (Keypad 4 and Left Arrow)
    usage=7005D, value=0 (Keypad 5)
    usage=7005E, value=0 (Keypad 6 and Right Arrow)
    usage=7005F, value=0 (Keypad 7 and Home)
    usage=70060, value=0 (Keypad 8 and Up Arrow)
    usage=70061, value=0 (Keypad 9 and PageUp)
    usage=70062, value=0 (Keypad 0 and Insert)
    usage=70063, value=0 (Keypad . and Delete)
    usage=70064, value=0 (Non-US nd |)
    usage=70065, value=0 (Application)
    usage=70066, value=0 (Power)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
  END:
HID(1 : 10006): 00 00 04 16 07 09 0A 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=70004, value=1 (a and A)
    usage=70016, value=1 (s and S)
    usage=70007, value=1 (d and D)
    usage=70009, value=1 (f and F)
    usage=7000A, value=1 (g and G)
    usage=70000, value=1 (Keycode 0)
  END:
HID(1 : 10006): 00 00 00 00 00 00 0A 00
Not sure yet, it looks like the new message is only reporting the excess?

So may need to figure out how the handling code should switch between input modes.

EDIT: Also not sure on how on how the parsing is working with the extra key(s) as the bits processed don't appear to match what keys I am adding/removing
 
Last edited:
Follow on to previous post:
I am thinking that the HID parsing code is not working properly. Need to make sure it is simply not the HID Dumper issue.

But:
Code:
  A1 01	// Collection(1) top Usage(10000)
    85 06	// Report ID(6)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 70	// Report Count(70)
    05 07	// Usage Page(7) - Keycode
    19 E0	// Usage Minimum(e0) - (Left Control)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 67	// Usage Maximum(67) - (Keypad =)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 08	// Report Count(8)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection

So we receive a report 6 (first byte).
And it starts off with : usage=70000, value=0 (Keycode 0)

Looks like we are not handling multiple usages MIN/MAX setup.

Code:
HID(2 : 10080): 06 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
  Begin topusage:10000 type:2 min:0 max:1
    usage=70000, value=0 (Keycode 0)
    usage=70001, value=0 (Keycode 1)
    usage=70002, value=0 (Keycode 2)
    usage=70003, value=0 (Keycode 3)
    usage=70004, value=0 (a and A)
    usage=70005, value=0 (b and B)
    usage=70006, value=0 (c and C)
    usage=70007, value=0 (d and D)
    usage=70008, value=0 (e and E)
    usage=70009, value=0 (f and F)
    usage=7000A, value=0 (g and G)
    usage=7000B, value=0 (h and H)
    usage=7000C, value=0 (i and I)
    usage=7000D, value=0 (j and J)
    usage=7000E, value=0 (k and K)
    usage=7000F, value=0 (l and L)
    usage=70010, value=0 (m and M)
    usage=70011, value=0 (n and N)
    usage=70012, value=0 (o and O)
    usage=70013, value=0 (p and P)
    usage=70014, value=0 (q and Q)
    usage=70015, value=0 (r and R)
    usage=70016, value=1 (s and S)
    usage=70017, value=0 (t and T)
    usage=70018, value=0 (u and U)
    usage=70019, value=0 (v and V)
    usage=7001A, value=0 (w and W)
    usage=7001B, value=0 (x and X)
    usage=7001C, value=0 (y and Y)
    usage=7001D, value=0 (z and Z)
    usage=7001E, value=0 (1 and !)
    usage=7001F, value=0 (2 and @)
    usage=70020, value=0 (3 and #)
    usage=70021, value=0 (4 and $)
    usage=70022, value=0 (5 and %)
    usage=70023, value=0 (6 and ^)
    usage=70024, value=0 (7 and &)
    usage=70025, value=0 (8 and *)
    usage=70026, value=0 (9 and ()
    usage=70027, value=0 (0 and ))
    usage=70028, value=0 (Return (ENTER))
    usage=70029, value=0 (ESCAPE)
    usage=7002A, value=0 (DELETE (Backspace))
    usage=7002B, value=0 (Tab)
    usage=7002C, value=0 (Spacebar)
    usage=7002D, value=0 (- and (underscore))
    usage=7002E, value=0 (= and +)
    usage=7002F, value=0 ([ and {)
    usage=70030, value=0 (] and })
    usage=70031, value=0 (nd |)
    usage=70032, value=0 (Non-US # and ˜)
    usage=70033, value=0 (; and :)
    usage=70034, value=0 (‘ and “)
    usage=70035, value=0 (Grave Accent and Tilde)
    usage=70036, value=0 (, and <)
    usage=70037, value=0 (. and >)
    usage=70038, value=0 (/ and ?)
    usage=70039, value=0 (Caps Lock)
    usage=7003A, value=0 (F1)
    usage=7003B, value=0 (F2)
    usage=7003C, value=0 (F3)
    usage=7003D, value=0 (F4)
    usage=7003E, value=0 (F5)
    usage=7003F, value=0 (F6)
    usage=70040, value=0 (F7)
    usage=70041, value=0 (F8)
    usage=70042, value=0 (F9)
    usage=70043, value=0 (F10)
    usage=70044, value=0 (F11)
    usage=70045, value=0 (F12)
    usage=70046, value=0 (PrintScreen)
    usage=70047, value=0 (Scroll Lock)
    usage=70048, value=0 (Pause)
    usage=70049, value=0 (Insert)
    usage=7004A, value=0 (Home)
    usage=7004B, value=0 (PageUp)
    usage=7004C, value=0 (Delete Forward)
    usage=7004D, value=0 (End)
    usage=7004E, value=0 (PageDown)
    usage=7004F, value=0 (RightArrow)
    usage=70050, value=0 (LeftArrow)
    usage=70051, value=0 (DownArrow)
    usage=70052, value=0 (UpArrow)
    usage=70053, value=0 (Keypad Num Lock and Clear)
    usage=70054, value=0 (Keypad /)
    usage=70055, value=0 (Keypad *)
    usage=70056, value=0 (Keypad -)
    usage=70057, value=0 (Keypad +)
    usage=70058, value=0 (Keypad ENTER)
    usage=70059, value=0 (Keypad 1 and End)
    usage=7005A, value=0 (Keypad 2 and Down Arrow)
    usage=7005B, value=0 (Keypad 3 and PageDn)
    usage=7005C, value=0 (Keypad 4 and Left Arrow)
    usage=7005D, value=0 (Keypad 5)
    usage=7005E, value=0 (Keypad 6 and Right Arrow)
    usage=7005F, value=0 (Keypad 7 and Home)
    usage=70060, value=0 (Keypad 8 and Up Arrow)
    usage=70061, value=0 (Keypad 9 and PageUp)
    usage=70062, value=0 (Keypad 0 and Insert)
    usage=70063, value=0 (Keypad . and Delete)
    usage=70064, value=0 (Non-US nd |)
    usage=70065, value=0 (Application)
    usage=70066, value=0 (Power)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
    usage=70067, value=0 (Keypad =)
  END:
 
Pushed up change to my HID_keyboard branch
That handles the Report 6 above.

The j was the last key pressed:
Code:
HID(2 : 10080): 06 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
$$ e0 e7 0 67
  Begin topusage:10000 type:2 min:0 max:1
TU:10000 US:7 2 0 1: C:112, 255, MM:1, e0 e7
    usage=700E0, value=0 (Left Control)
    usage=700E1, value=0 (Left Shift)
    usage=700E2, value=0 (Left Alt)
    usage=700E3, value=0 (Left GUI)
    usage=700E4, value=0 (Right Control)
    usage=700E5, value=0 (Right Shift)
    usage=700E6, value=0 (Right Alt)
$$ next min/max pair: 1 0 103
    usage=700E7, value=0 (Right GUI)
    usage=70000, value=0 (Keycode 0)
    usage=70001, value=0 (Keycode 1)
    usage=70002, value=0 (Keycode 2)
    usage=70003, value=0 (Keycode 3)
    usage=70004, value=0 (a and A)
    usage=70005, value=0 (b and B)
    usage=70006, value=0 (c and C)
    usage=70007, value=0 (d and D)
    usage=70008, value=0 (e and E)
    usage=70009, value=0 (f and F)
    usage=7000A, value=0 (g and G)
    usage=7000B, value=0 (h and H)
    usage=7000C, value=0 (i and I)
    usage=7000D, value=1 (j and J)
    usage=7000E, value=0 (k and K)
    usage=7000F, value=0 (l and L)
    usage=70010, value=0 (m and M)
    usage=70011, value=0 (n and N)
    usage=70012, value=0 (o and O)
    usage=70013, value=0 (p and P)
    usage=70014, value=0 (q and Q)
    usage=70015, value=0 (r and R)
    usage=70016, value=0 (s and S)
    usage=70017, value=0 (t and T)
    usage=70018, value=0 (u and U)
    usage=70019, value=0 (v and V)
    usage=7001A, value=0 (w and W)
    usage=7001B, value=0 (x and X)
    usage=7001C, value=0 (y and Y)
    usage=7001D, value=0 (z and Z)
    usage=7001E, value=0 (1 and !)
    usage=7001F, value=0 (2 and @)
    usage=70020, value=0 (3 and #)
    usage=70021, value=0 (4 and $)
    usage=70022, value=0 (5 and %)
    usage=70023, value=0 (6 and ^)
    usage=70024, value=0 (7 and &)
    usage=70025, value=0 (8 and *)
    usage=70026, value=0 (9 and ()
    usage=70027, value=0 (0 and ))
    usage=70028, value=0 (Return (ENTER))
    usage=70029, value=0 (ESCAPE)
    usage=7002A, value=0 (DELETE (Backspace))
    usage=7002B, value=0 (Tab)
    usage=7002C, value=0 (Spacebar)
    usage=7002D, value=0 (- and (underscore))
    usage=7002E, value=0 (= and +)
    usage=7002F, value=0 ([ and {)
    usage=70030, value=0 (] and })
    usage=70031, value=0 (nd |)
    usage=70032, value=0 (Non-US # and ˜)
    usage=70033, value=0 (; and :)
    usage=70034, value=0 (‘ and “)
    usage=70035, value=0 (Grave Accent and Tilde)
    usage=70036, value=0 (, and <)
    usage=70037, value=0 (. and >)
    usage=70038, value=0 (/ and ?)
    usage=70039, value=0 (Caps Lock)
    usage=7003A, value=0 (F1)
    usage=7003B, value=0 (F2)
    usage=7003C, value=0 (F3)
    usage=7003D, value=0 (F4)
    usage=7003E, value=0 (F5)
    usage=7003F, value=0 (F6)
    usage=70040, value=0 (F7)
    usage=70041, value=0 (F8)
    usage=70042, value=0 (F9)
    usage=70043, value=0 (F10)
    usage=70044, value=0 (F11)
    usage=70045, value=0 (F12)
    usage=70046, value=0 (PrintScreen)
    usage=70047, value=0 (Scroll Lock)
    usage=70048, value=0 (Pause)
    usage=70049, value=0 (Insert)
    usage=7004A, value=0 (Home)
    usage=7004B, value=0 (PageUp)
    usage=7004C, value=0 (Delete Forward)
    usage=7004D, value=0 (End)
    usage=7004E, value=0 (PageDown)
    usage=7004F, value=0 (RightArrow)
    usage=70050, value=0 (LeftArrow)
    usage=70051, value=0 (DownArrow)
    usage=70052, value=0 (UpArrow)
    usage=70053, value=0 (Keypad Num Lock and Clear)
    usage=70054, value=0 (Keypad /)
    usage=70055, value=0 (Keypad *)
    usage=70056, value=0 (Keypad -)
    usage=70057, value=0 (Keypad +)
    usage=70058, value=0 (Keypad ENTER)
    usage=70059, value=0 (Keypad 1 and End)
    usage=7005A, value=0 (Keypad 2 and Down Arrow)
    usage=7005B, value=0 (Keypad 3 and PageDn)
    usage=7005C, value=0 (Keypad 4 and Left Arrow)
    usage=7005D, value=0 (Keypad 5)
    usage=7005E, value=0 (Keypad 6 and Right Arrow)
    usage=7005F, value=0 (Keypad 7 and Home)
    usage=70060, value=0 (Keypad 8 and Up Arrow)
    usage=70061, value=0 (Keypad 9 and PageUp)
    usage=70062, value=0 (Keypad 0 and Insert)
    usage=70063, value=0 (Keypad . and Delete)
    usage=70064, value=0 (Non-US nd |)
    usage=70065, value=0 (Application)
    usage=70066, value=0 (Power)
$$ next min/max pair: 2 0 0
    usage=70067, value=0 (Keypad =)
  END:
HID(2 : 10080): 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

@mjs513 - now wondering about yours... Is it this one?
https://smile.amazon.com/Gigabyte-GK-AORUS-Cherry-Mechanical-Keyboard/dp/B08CMWBW1Q

Your previous info on it showed:
Code:
HID Report Descriptor (0x20009d74) size: 181
  05 01	// Usage Page(1) - Generic Desktop
  09 02	// Usage(2) -(Mouse)
  A1 01	// Collection(1) top Usage(10000)
    85 01	// Report ID(1)
    09 01	// Usage(1) -(?)
    A1 00	// Collection(0)
    05 09	// Usage Page(9) - Button
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    19 01	// Usage Minimum(1) -  (BUTTON 1)
    29 05	// Usage Maximum(5) -  (BUTTON 5)
    75 01	// Report Size(1)
    95 05	// Report Count(5)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 03	// Report Count(3)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    05 01	// Usage Page(1) - Generic Desktop
    16 01 80	// Logical Minimum(8001)
    26 FF 7F	// Logical maximum(7fff)
    09 30	// Usage(30) -(X)
    09 31	// Usage(31) -(Y)
    75 10	// Report Size(10)
    95 02	// Report Count(2)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    15 81	// Logical Minimum(81)
    25 7F	// Logical maximum(7f)
    09 38	// Usage(38) -(Wheel)
    75 08	// Report Size(8)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    05 0C	// Usage Page(c) - Consumer
    0A 38 02	// Usage(238) -(AC Pan)
    95 01	// Report Count(1)
    81 06	// Input(6)	// (Data, Variable, Relative)
    C0	// End Collection
  C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 80	// Usage(80) -(?)
  A1 01	// Collection(1) top Usage(10080)
    85 02	// Report ID(2)
    19 81	// Usage Minimum(81) - (System Power Down)
    29 83	// Usage Maximum(83) - (System Wake Up)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    75 01	// Report Size(1)
    95 03	// Report Count(3)
    81 02	// Input(2)	// (Data, Variable, Absolute)
    95 05	// Report Count(5)
    81 01	// Input(1)	// (Constant, Array, Absolute)
    C0	// End Collection
  05 0C	// Usage Page(c) - Consumer
  09 01	// Usage(1) -(Consumer Controls)
  A1 01	// Collection(1) top Usage(c0000)
    85 03	// Report ID(3)
    19 00	// Usage Minimum(0) - (?)
    2A FF 07	// Usage Maximum(7ff) - (?)
    15 00	// Logical Minimum(0)
    26 FF 07	// Logical maximum(7ff)
    95 01	// Report Count(1)
    75 10	// Report Size(10)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  06 02 FF	// Usage Page(ff02) - Vendor Defined
  09 01	// Usage(1) -
  A1 01	// Collection(1) top Usage(ff020000)
    85 04	// Report ID(4)
    15 00	// Logical Minimum(0)
    26 FF 00	// Logical maximum(ff)
    09 03	// Usage(3) -
    75 08	// Report Size(8)
    95 07	// Report Count(7)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection
  05 01	// Usage Page(1) - Generic Desktop
  09 06	// Usage(6) -(Keyboard)
  [COLOR="#FF0000"]A1 01	// Collection(1) top Usage(10000)
    85 05	// Report ID(5)
    05 07	// Usage Page(7) - Keycode
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 03	// Input(3)	// (Constant, Variable, Absolute)
    95 E8	// Report Count(e8)
    75 01	// Report Size(1)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    05 07	// Usage Page(7) - Keycode
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection[/COLOR]

When you exceeded the boot level of 6 keys, you had messages like:
Code:
HID(2 : 10002): 05 00 00 40 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
END:
HID(2 : 10002): 05 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
END:
END:
HID(2 : 10002): 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
Which appears like we are not processing the report 5. Again wonder why?

Also what are the messages you see for keys like system or multimedia? Wondering if that is coming from HID(2 as well?

Now back to playing
 
@KurtE said:
@mjs513 - now wondering about yours... Is it this one?
https://smile.amazon.com/Gigabyte-GK.../dp/B08CMWBW1Q
Yep thats the keyboard.

Which appears like we are not processing the report 5. Again wonder why?

Also what are the messages you see for keys like system or multimedia? Wondering if that is coming from HID(2 as well?

Interesting that you ask that one. Looks like some of the function keys (FN+Fx) come through as c00xx and 10002 HID, eg
Code:
usage=C00CD, value=1 (Pause/Continue)
END:
END:
HID(2 : 10002): 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C0000, value=1 (?)
END:
END:
HID(2 : 10002): 03 CD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C00CD, value=1 (Pause/Continue)
END:
END:
HID(2 : 10002): 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C0000, value=1 (?)
END:
END:
HID(2 : 10002): 03 E2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C00E2, value=1 (Mute)
END:
END:
HID(2 : 10002): 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C0000, value=1 (?)
END:
END:
HID(2 : 10002): 03 EA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C00EA, value=1 (Volume Down)
END:
END:
HID(2 : 10002): 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C0000, value=1 (?)
END:
END:
HID(2 : 10002): 03 E9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C00E9, value=1 (Volume Up)
END:
END:
HID(2 : 10002): 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
END:
END:
Begin topusage:c0000 type:0 min:0 max:2047
usage=C0000, value=1 (?)
END:
END:

Just hitting a Function key like F1 comes through as 10006:
Code:
HID(1 : 10006): 00 00 41 00 00 00 00 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=0 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=0 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
[B]    usage=70041, value=1 (F8)
[/B]    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:

for crtl+alt+del
Code:
HID(1 : 10006): 05 00 4C 00 00 00 00 00 
Begin topusage:10000 type:2 min:0 max:1
  usage=700E0, value=1 (Left Control)
  usage=700E1, value=0 (Left Shift)
  usage=700E2, value=1 (Left Alt)
  usage=700E3, value=0 (Left GUI)
  usage=700E4, value=0 (Right Control)
  usage=700E5, value=0 (Right Shift)
  usage=700E6, value=0 (Right Alt)
  usage=700E7, value=0 (Right GUI)
  Begin topusage:10000 type:0 min:0 max:255
    usage=7004C, value=1 (Delete Forward)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:

Here is the log of me playing
View attachment TyCommander-12158020-Teensy-1.zip
 
@mjs513 @PaulStoffregen

Now trying to understand the Report 5 above and why we were/are not processing the report 5...

Code:
  A1 01	// Collection(1) top Usage(10000)
    85 05	// Report ID(5)
    05 07	// Usage Page(7) - Keycode
    95 01	// Report Count(1)
    75 08	// Report Size(8)
    81 03	// Input(3)	// (Constant, Variable, Absolute)
    95 E8	// Report Count(e8)
    75 01	// Report Size(1)
    15 00	// Logical Minimum(0)
    25 01	// Logical maximum(1)
    05 07	// Usage Page(7) - Keycode
    19 00	// Usage Minimum(0) - (Keycode 0)
    29 E7	// Usage Maximum(e7) - (Right GUI)
    81 00	// Input(0)	// (Data, Array, Absolute)
    C0	// End Collection

First thing we ran into was:
This Report Descriptor has more top-level collections than the define in the class allowed... So increased.

But now running into issue with how arrays are handled in the HID parser.

With the HID process keyboard BOOT format:
The last 6 bytes are an array of size 8 bit elements.
The array code in this case: gets the next field adds it onto the Top Usage and always passes value=1

HID(1 : 10006): 00 00 41 00 00 00 00 00
Begin topusage:10000 type:2 min:0 max:1
usage=700E0, value=0 (Left Control)
usage=700E1, value=0 (Left Shift)
usage=700E2, value=0 (Left Alt)
usage=700E3, value=0 (Left GUI)
usage=700E4, value=0 (Right Control)
usage=700E5, value=0 (Right Shift)
usage=700E6, value=0 (Right Alt)
usage=700E7, value=0 (Right GUI)
Code:
  Begin topusage:10000 type:0 min:0 max:255
    usage=70041, value=1 (F8)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
    usage=70000, value=1 (Keycode 0)
  END:
Which sort of works for this case. 70041 is the F8...

However, in the new keyboards case, we have:
0xe7 count of 1 bit fields, which imples we will get 231 callbacks where all of the 0 bits will be to
Code:
    usage=70000, value=1 (Keycode 0)
And those bits that are on:
    usage=70001, value=1 (Keycode 0)
Which is not really what we want here...
I will probably detect that in the array processing in HID and instead, use USAGE_MIN and walk up to USAGE_MAX and send value = 0 or 1
 
Quick update - I pushed up a fix in the branch that handles the input(0) differently when Usage Min and Max are set. More like the case Input(2)

Now trying to decide when to issue PR on this. Also questions on if Keyboard without being top level object will be accepted. or not.

What we have not yet done is to add the ability for USB Type of Keyboard from Teensy to PC to be able to do N key rollover.
But that is a different issue.
 
@KurtE @PaulStoffregen

With the round of changes this morning looks like my two problem children keyboards are fully operational with USBHost and displaying what it should for N-Key rollover :)

Great job on getting the Aorus Keyboard working.
 
Thanks, could not have done it without your help.

I just pushed up a new branch: https://github.com/KurtE/USBHost_t36/tree/HID_keyboard_pr

and issued a PR: https://github.com/PaulStoffregen/USBHost_t36/pull/97

Decided it was easier than showing 18 commits and/or trying to git rebase -i HEAD~17 it...

Hopefully done with keyboards for now!

Edit: I updated the PR slightly, that the new keyboard viewer can run using the ILI9341_t3 library as it ships with TD.

Here is a view, where I (actually a tape measure) am holding down something like 10-11 keys on Gigabyte K83
Screenshot.png
 
Last edited:
Back
Top