不是太理解要问的是什么,就从我的理解来说一下吧,我认为题主要问的是:为什么USB HID的report格式要设计成这样,以及为什么以现在这种轮询方式工作。
首先,USB协议设计的时候,一个指导思想就是:只允许主机发起轮询式,不允许设备主动上报中断。这样的设计可以最大程度上减轻设备端的芯片复杂度,也能节约系统资源(减少中断号占用),但坏处也很明显:不能像PS/2键盘那样主动上报状态。
那么这种情况下,USB键盘如果上报的格式仍然是PS/2的那种扫描码的通码或者断码的话,主机如果性能比较差,或者总线比较忙的话,很有可能会丢掉某个键码,导致键盘状态异常,因为软件层面的轮询效率要远远低于中断模式。解决的方法就是:改成报告按键状态的模式。
好了,既然是report模式,那么问题来了:为什么report最多只容纳了6个按键(不含modifier)?
因为当年DOS上能处理的按键中断队列也不过6-8个键码,USB HID上来就支持6个按键,并不少了,这就跟当年认为640KB内存足够用了是一个道理,理论上当年的机械键盘确实可以做到全无冲,问题是有多少人会用呢?拿PC去玩游戏的人太少了。
况且对于USB芯片来说,只支持interrupt传输(HID协议)和同时支持interrupt传输和bulk传输(U盘)的硬件成本是不一样的,既然interrupt传输足够用(最大包长是8字节,也就是HID report的长度),那么何必要增加成本做的像U盘那样复杂呢?
总结原因基本就是上面这两点:1、当年设计规范的人觉得6个键码足够用了;2、设计太复杂的话会增加成本。
USB协议层面上,在保持兼容HID协议的基础上,做到全键无冲其实是有很多方法的,比如多interface方式,hub方式等等,只有高端一点的键盘厂商才会这么做,难倒是不难,就是成本问题。
升级HID协议的可能性,我认为是不太大的,虽然这个协议已经用了快20年了,从长远上看,USB键盘这种外设还能在民用市场存活多久都是个问题,USB-IF没有必要再设计一套全新的规范出来,况且这种需求实在是太小了。