Thank you all for your answers.
Apparantly the USB HID (human interface device) protocol includes a listing for "full speed" USB (2.0). If you use this instead of "hi speed USB) (1.1) then you can get NKRO without any fancy tricks.
I'm a bit confused here. Why is NKRO with full speed without any tricks possible but with the nearly same high speed mode not? High speed has 1024 instead of 1023 bytes for payload and is very similar.
I have implemented firmware for NKRO on USB. I think you've over-analyzed the issue and confused yourself.
Good point! Maybe you're right, but I always want to clear my thoughts a learn as much as possible
.
USB keyboards use the HID spec. HID rides on top of USB and defines a set of data structures, protocol, and predefined input lists that can be used to implement just about any type of user input device without requiring special drivers.
Within the USB HID spec are some predefined input types that are strictly controlled on how they can act. This allows small softwares such as your PC's BIOS to be able to use these input types without much complicated code. One of them is the BOOT-compatible keyboard. The BOOT-compatible keyboard must always send 8-byte packets. These packets only leave room for 6 bytes to contain scancodes. That's where the 6KRO comes from.
Ok this is not clear for me. As I read here a lot of times before 13 bytes are enough for a full NKRO on full speed. So why can only 6 keys be decoded with 6 bytes on low speed? Is most of the data overhead or are more information transported withing the 6 bytes?
What makes NKRO over USB annoying is that a keyboard report has to be able to carry the state of the whole keyboard. PS/2 only transfers key up/down events and pushes remembering the state to the computer. A full blown USB host stack is fairly complicated to implement, esp. if you try to squeeze it into a BIOS. To mitigate this the USB-IF specified the "boot protocol" for keyboards and mice, allowing BIOS's to read these devices w/ minimal programming. The boot-protocol report of a keyboard has a pre-defined layout, one byte that carries the modifiers as a bitmap, one reserved byte, and six bytes that can carry a key code each, hence 6KRO (+ eight mods.) Unfortunately most keyboard manufacturers kept this format for the regular mode in order to keep their firmware/hardware as simple as possible.
The same thoughts as above. 1 bit for each key but with low speed you "need" one byte for a key (=6 Keys). Thats a part I dont understand atm.
Can you tell me what problems in the BIOS can occur when you use a USB full NKRO has a crappy firmware and you use e.g. more then six keys at one time (or other scenarios)
About speeds -- even today most keyboards are USB 1.1 low-speed (1.5Mb/s), only a few made the transition to USB 1.1/2.0 full-speed (12Mb/s) so far. I'm not aware of any board that implements USB 2.0 hi-speed (480Mb/s, a bit overkill for a keyboard anyways ) While it is true that the data payload sizes for a single transfer are 8, 64, and 1024 bytes (low-, full-, and hi-speed) you still can send larger reports via multiple transfers.
Are you sure that full-speed supports only 64 bytes for playload? I read
this source which said, that the payload size is 1023 bytes and with high speed 1024 bytes.