当我在Linux内核v5.14上连接游戏手柄时,会出现两个新设备:
/dev/input/event23
/dev/input/js1
如果我cat <file> | xxd
,则两个设备文件都提供游戏手柄事件信息。但是event23
比js1
更为冗长。
[此外,evtest
在Invalid Argument
上给出错误js1
,但在event23
上工作正常。当我同时使用两个设备文件libevdev时,也会发生相同的情况。
看起来像每个事件,js1
转储input_event
结构的内容(在linux/input.h
中定义)
设备文件之间有什么区别?为什么它们具有不同的信息,并且event23
提供了比js1
更多的信息?
/dev/input/js*
设备是由joydev
传统游戏杆驱动程序创建的。它仅支持操纵杆和类似操纵杆的设备。https://www.kernel.org/doc/html/latest/input/joydev/joystick.html
/dev/input/event*
设备是通过evdev
输入事件接口创建的。它支持所有类型的输入设备,而不仅仅是操纵杆。
https://linux.die.net/man/4/evdev
joydev
界面公开了通过evdev
公开的信息的子集,特别是它仅在看起来像操纵杆按钮或轴的情况下才公开输入。新的应用程序应该更喜欢使用evdev
,但是joydev
通常仍然可用。
“看起来像操纵杆按钮或轴”启发式有时对于joydev
可能是个问题。连接HID游戏手柄时,evdev
和joydev
使用设备的HID报告描述符中的信息来检测按钮和轴输入的数量。 joydev
仅考虑“ HID按钮用法”页面中的按钮,但是较新的游戏手柄有时会定义具有不同用法的特殊按钮。这对于Android游戏手柄来说尤其常见,因为Home和Back按钮具有非Button用法。 joydev
不会拾取这些按钮。
另一个巨大的区别:joydev
纯粹是用于输入。 evdev
支持游戏手柄隆隆声和强制反馈效果。