/dev/input/eventX 和 /dev/input/jsX 有什么区别?

Arj*_*ais 1 linux input joystick gamepad evdev

当我在 Linux 内核 v5.14 上连接游戏手柄时,会显示两个新设备:

/dev/input/event23
/dev/input/js1
Run Code Online (Sandbox Code Playgroud)

如果我cat <file> | xxd两个设备文件都提供游戏手柄事件信息。但event23比 更加冗长js1

另外,在 上evtest给出错误,但在 上工作正常。当我使用 libevdev 两个设备文件时,也会发生同样的情况。Invalid Argumentjs1event23

看起来每个事件都会js1转储结构的内容input_event(在 中定义linux/input.h

设备文件之间有什么区别?为什么他们有不同的信息以及event23提供了哪些更多信息js1

小智 5

/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 游戏手柄尤其常见,因为它的“主页”和“后退”按钮具有非按钮用途。这些按钮不会被 选取joydev

另一个很大的区别:joydev纯粹是为了输入。evdev支持游戏手柄隆隆声和力反馈效果。