我认为
HID_MAX_USAGES
之所以“小”,是因为在HID设备报告描述符的情况下,如果hid设备报告的大小正确,那么大小会更小,而且在这种情况下,它的描述符不会超过硬编码的
HID_MAX_USAGES
限制。
当你遇到键盘或鼠标无法工作的问题,并在重新编译内核并增加
HID_MAX_USES
后,你的设备开始工作。这很可能是因为较低的限制会拒绝解析报告的描述符。
在阅读和搜索一些内容后,我检查了一些Linux驱动程序,发现它们似乎覆盖了设备自己报告的内容。例如,如果设备报告它有2^15个用途,驱动程序可以将其覆盖为
HID_MAX_USAGES
允许的最大值,或者与设备用途实际大小相同。
简而言之,基本上发生的情况是,hid设备报告描述符指定了过多的消费者用途(例如2^15),这超过了
HID_MAX_USAGES
。这会阻止对报告的描述符进行正确解析,很可能导致设备或其中的某些部分无法工作。
我自己在生产环境中一直在使用增加“HID_MAX_USAGES”的肮脏技巧。我曾经问过这个技巧有多肮脏,但没有得到好的答案。但是根据我的知识,我可以看出这个技巧会占用更多的内存空间,我还没有研究过它是否可能稍微影响性能。我没有看到这个技巧会带来任何安全风险。(如果我错了,请纠正我。)
我认为在任何主线内核中增加“HID_MAX_USAGES”是不可行的解决方案。相反,我建议您提交一个详细的错误报告,说明您的hid键盘/鼠标无法工作的问题。您还可以联系您产品的制造商,在驱动程序中添加适当的支持。
扩展(
source):
On Tue, 21 May 2013, Christian Ohm wrote:
> Is there any reason why HID_MAX_USAGES shouldn't be more than 12288?
Well, the reasoning is a mixture of current implementation, and
reasonability.
- we currently have statically allocated arrays on a per-parser basis, for
parsing usages and collection indices. If the number of max usages is
going to grow in an uncontrolled manner, we'll have to change the way
our parser works (which is not impossible, of course).
- most of the ocurences of huge max usages being presented by the devices
have actually turned out to be bogus and could have been fixed by
patching the report descriptor in order to reflect the real behavior of
the device
Thanks,
--
Jiri Kosina
SUSE Labs
以上代码片段来自于hid子系统内核维护者。