HID_MAX_USAGES是什么意思?

问题: HID_MAX_USAGES是什么?它用于什么?为什么值这么小?
(代码行:
#define HID_MAX_USAGES                        12288

/usr/src/linux/include/linux/hid.h 

背景信息: 我需要将值设置为32k并重新编译内核。否则,我的游戏鼠标在Ubuntu上无法被识别。因此,在更改我的系统之前,我想知道这个值有什么作用。
1个回答

我认为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子系统内核维护者。

谢谢你的回答。因为这只鼠标是由下一个版本的Ubuntu支持的,所以我没有追踪过这个问题。这个解释证实了我的直觉,即这是其他地方的一个错误。 - Sergej Werfel
@sergejWerfel 只是出于好奇,是哪款鼠标呢? - Anders F. U. Kiær
1有点晚了...我想是Sharkoon Drakonia,但我不确定了 ;) - Sergej Werfel