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

What is the difference between /dev/input/eventX and /dev/input/jsX?

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

/dev/input/event23
/dev/input/js1

如果我 cat <file> | xxd 两个设备文件都提供游戏手柄事件信息。但是 event23js1.

冗长得多

此外,evtestjs1 上给出错误 Invalid Argument,但在 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 通常仍然可用。

"looks like a joystick button or axis" 启发式有时可能成为 joydev 的问题。连接 HID 游戏手柄时,evdevjoydev 使用设备 HID 报告描述符中的信息来检测按钮和轴输入的数量。 joydev 仅考虑 HID 按钮使用页面中的按钮,但较新的游戏手柄有时会定义具有不同用途的特殊按钮。这对于 Android 游戏手柄来说尤其常见,它们对 Home 和 Back 按钮具有非按钮用法。 joydev.

不会选择这些按钮

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