我需要在我的 /dev/input/event* 设备列表中找到一个游戏手柄,我唯一知道的是,当我这样做时,evtest
它会显示名称G13
。问题是每次我重新启动时它都会得到不同的数字。我想自动查找路径,以便可以将其传递给变量中的此命令$G13
:我尝试过evtest | grep G13
,但问题是 evtest 命令不会自行终止,它是交互式的,因此我的脚本卡在提示符上。
xboxdrv --evdev $G13 --config ~/.config/xboxdrv/G13.conf &
答案1
您想要设置一个乌德夫规则为您的设备提供持久的符号链接。首先为udevadm info -a /dev/input/eventXX
当前代表您的游戏手柄的任何设备运行。
你会看到类似的输出:
ATTR{power/runtime_suspended_time}=="0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/input/input29':
KERNELS=="input29"
SUBSYSTEMS=="input"
DRIVERS==""
...
ATTRS{id/product}=="c21d"
ATTRS{id/vendor}=="046d"
...
创建一个包含以下内容的文件/etc/udev/rules.d/90-gamepad.rules
:
SUBSYSTEMS=="input", ATTRS{id/product}=="c21d", ATTRS{id/vendor}=="046d", SYMLINK += "gamepad"
...将产品和供应商的值替换为您在输出中看到的值。
保存文件并运行:
udevadm control -R
拔下游戏手柄并将其重新插入,您应该看到现在有一个/dev/gamepad
指向相应
/dev/input/...
设备的符号链接。
现在您可以使用设备路径/dev/gamepad
而不是变化的
/dev/input
路径。
答案2
我遇到了类似的问题,将我的解决方案分享给其他人:
在 Ubuntu 22.04 上,安装xboxdrv
检查我的情况下的 udev 属性事件5(迭代所有事件以找到正确的事件):
$ udevadm info -a /dev/input/event5
looking at device '/devices/virtual/input/input5/event5':
KERNEL=="event5"
SUBSYSTEM=="input"
DRIVER==""
ATTR{power/control}=="auto"
ATTR{power/runtime_active_time}=="0"
ATTR{power/runtime_status}=="unsupported"
ATTR{power/runtime_suspended_time}=="0"
looking at parent device '/devices/virtual/input/input5':
KERNELS=="input5"
SUBSYSTEMS=="input"
DRIVERS==""
ATTRS{capabilities/abs}=="3061b"
ATTRS{capabilities/ev}=="b"
ATTRS{capabilities/ff}=="0"
ATTRS{capabilities/key}=="7cdb000000000000 0 0 0 0"
ATTRS{capabilities/led}=="0"
ATTRS{capabilities/msc}=="0"
ATTRS{capabilities/rel}=="0"
ATTRS{capabilities/snd}=="0"
ATTRS{capabilities/sw}=="0"
ATTRS{id/bustype}=="0000"
ATTRS{id/product}=="0000"
ATTRS{id/vendor}=="0000"
ATTRS{id/version}=="0000"
ATTRS{inhibited}=="0"
ATTRS{name}=="Xbox Gamepad (userspace driver)"
ATTRS{phys}==""
ATTRS{power/control}=="auto"
ATTRS{power/runtime_active_time}=="0"
ATTRS{power/runtime_status}=="unsupported"
ATTRS{power/runtime_suspended_time}=="0"
ATTRS{properties}=="0"
ATTRS{uniq}==""
将以下内容放入 /etc/udev/rules.d 中,使用名称进行过滤:
SUBSYSTEMS=="input" ATTRS{name}=="Xbox Gamepad (userspace driver)" MODE="0666" SYMLINK+="/input/xbox-controller"
重新加载 udev 规则
sudo udevadm control --reload-rules && sudo udevadm trigger
检查符号链接是否确实指向 event5 而不是 js0:
$ ll /dev/input/xbox-controller
lrwxrwxrwx 1 root root 6 dec 29 15:11 /dev/input/xbox-controller -> event5
就我而言,我需要在 Docker 中使用该设备,并且使用直接符号链接不起作用。所以我解决了符号链接使用“阅读链接”在我使用它之前:
docker run --device=$(readlink -f /dev/input/xbox-controller)
因此,在您的情况下,您可能可以将 $G13 变量替换为
$(readlink -f /dev/input/xbox-controller)