我正在寻找一种方法来重新排列我的游戏手柄。我的意思是,我有多个插入或无线的游戏手柄,它们受到 /dev/input/js0(播放器 1)、/dev/input/js1(播放器 2)等的影响。我希望能够说一个游戏手柄变成 /dev/input/js0(播放器 1)并且它会与另一个游戏手柄切换位置(就像在 PS3 上一样)。
有没有办法使用实用程序或命令行来做到这一点?
无法更改 /dev 目录中的设备名称。也许这不适用于游戏手柄等输入设备。我无法测试这个,因为我周围没有游戏手柄。
但这对于您的方法来说是必要的。所以,第一个答案是:不可能。
第二个答案更多地暗示了一种可以帮助您处理您的想法的方法:
由于您可以使用 udev 规则将符号链接分配给设备,因此也许您可以这样处理它。我将通过 U 盘来解释它。
我们所做的是:
- Disconnect the usb stick using a command
- create a temporary rule for assigning a symlink
- Reconnect the usb stick using a command
- delete the temporary rule
有关背景知识,请阅读以下文章:udev、有关 udev 规则、授权 USB 设备和sudo echo 访问被拒绝
作为先决条件,我们需要一些有关目标 U 盘的信息。移除棒并运行命令
udevadm monitor
Run Code Online (Sandbox Code Playgroud)
插入棒后,您会在屏幕上看到大量信息。我从第一行输出中提取 USB 总线上的设备路径:
add /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.1 (usb)
^^^^^
Run Code Online (Sandbox Code Playgroud)
使用此信息运行命令
udevadm test /sys/bus/usb/devices/4-1.1
^^^^^
Run Code Online (Sandbox Code Playgroud)
再次有很多输出。我们感兴趣的是
ID_SERIAL_SHORT=08606E5EDA173E6D3F37746D
Run Code Online (Sandbox Code Playgroud)
这是 USB 设备的唯一序列号。
现在让我们给这个棒一个符号链接。
首先我们必须断开 U 盘:
echo 0 | sudo tee /sys/bus/usb/devices/4-1.1/authorized > /dev/null
Run Code Online (Sandbox Code Playgroud)
现在我们为udev创建一个临时规则:
echo "KERNEL==\"sd?1\", SUBSYSTEMS==\"usb\", ATTRS{serial}==\"08606E5EDA173E6D3F37746D\", SYMLINK+=\"myusb300\"" | sudo tee /etc/udev/rules.d/90-tmp-001.rules > /dev/null
Run Code Online (Sandbox Code Playgroud)
下一步是重新连接 U 盘:
echo 1 | sudo tee /sys/bus/usb/devices/4-1.1/authorized > /dev/null
Run Code Online (Sandbox Code Playgroud)
现在你找到了一个符号链接 /dev/myusb300 到 /deb/sdb1
所有这一切背后的想法是,即使您无法重命名/dev/js0
,您也可以创建符号链接,即/dev/js10
到游戏手柄控制器。该符号链接可以即时交换,也可以通过编程断开并重新连接控制器来交换。应用程序(游戏)本身应配置为使用游戏手柄 /dev/js10、/dev/js11 等。
通过游戏手柄的唯一序列号,您始终可以为所选游戏手柄分配特定的符号链接。
也许可以找到更多处理 udev 的可能性。这不仅取决于您正在寻找的具体解决方案,还取决于应用程序、控制器和其他事物。
好吧,这不是一个完整的解决方案,但我对“没有办法做到这一点”的无意义感到有点恼火。
就在这儿:
$ sudo mknod /dev/lol b 8 0
$ ls -l /dev/lol
brw-r--r-- 1 root root 8, 0 Mar 15 15:51 /dev/lol
$ sudo rm /dev/lol
$ ls -l /dev/lol
ls: cannot access /dev/lol: No such file or directory
Run Code Online (Sandbox Code Playgroud)
其中表示创建一个块设备,主设备号为 8,次设备号为 0,名为 /dev/lol。ls,向我们表明它是一个块设备。然后,我就把它删除了。
我们需要了解您的设备的类型:(字符或块)、权限、期望的输入类型等。设备插入后,
$ls -l /dev/input/js0
会告诉我们大部分内容。它不会告诉我们它是否需要熟数据或原始数据。使用这些详细信息更新您的问题,我将尝试编写脚本或其他内容来解决问题。需要根电源。
此外,连接控制器后,显示输出$lsusb
(我假设首先插入哪个设备,枚举 /dev/input/js0 ,并且该软件不会做一些愚蠢的事情,例如显式枚举特定控制器作为特定设备文件)