我正在寻找一种重新排序游戏手柄的方法。我的意思是,我有多个插入式或无线式游戏手柄,它们会受到 /dev/input/js0(玩家 1)、/dev/input/js1(玩家 2)等的影响。我希望能够将一个游戏手柄变为 /dev/input/js0(玩家 1),并且它会与另一个游戏手柄交换位置(就像在 PS3 上一样)。
有没有办法使用实用程序或命令行来做到这一点?
答案1
有无法更改 /dev 目录中的设备名称。这可能不适用于游戏手柄等输入设备。我无法测试这一点,因为我身边没有游戏手柄。
但这对你的方法来说是必要的。所以,第一个答案是:这是不可能的。
第二个答案更多地暗示了可以帮助你处理你的想法的方法:
由于您可能使用 udev 规则为设备分配符号链接,因此也许您可以用这种方式处理。我将通过 USB 棒来解释这一点。
我们所做的是:
- 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 访问被拒绝
作为先决条件,我们需要一些有关目标 USB 盘的信息。拔下 USB 盘并运行命令
udevadm monitor
插入存储棒后,屏幕上会显示大量信息。我从第一行输出中提取了 USB 总线上的设备路径:
add /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.1 (usb)
^^^^^
利用这些信息运行命令
udevadm test /sys/bus/usb/devices/4-1.1
^^^^^
再次有很多输出。我们感兴趣的是
ID_SERIAL_SHORT=08606E5EDA173E6D3F37746D
这是 USB 设备的唯一序列号。
现在让我们给这根棍子一个符号链接。
首先我们必须断开 USB 连接:
echo 0 | sudo tee /sys/bus/usb/devices/4-1.1/authorized > /dev/null
现在我们为udev创建一个临时规则:
echo "KERNEL==\"sd?1\", SUBSYSTEMS==\"usb\", ATTRS{serial}==\"08606E5EDA173E6D3F37746D\", SYMLINK+=\"myusb300\"" | sudo tee /etc/udev/rules.d/90-tmp-001.rules > /dev/null
下一步是重新连接 USB 驱动器:
echo 1 | sudo tee /sys/bus/usb/devices/4-1.1/authorized > /dev/null
现在你找到了一个符号链接 /dev/myusb300 到 /deb/sdb1
所有这些背后的想法是,即使您无法重命名/dev/js0
,您也可以创建符号链接,即/dev/js10
指向游戏手柄控制器的符号链接。可以随时交换此符号链接,也可以通过编程断开并重新连接控制器。应用程序(游戏)本身应配置为使用游戏手柄 /dev/js10、/dev/js11 等。
通过游戏手柄的唯一序列号,您可以始终为选定的游戏手柄分配特定的符号链接。
也许可以找到更多处理 udev 的可能性。这不仅取决于您正在寻找的具体解决方案,还取决于应用程序、控制器和其他事物。
答案2
好吧,这不是一个完整的解决方案,但我对“没有办法做到这一点”的废话有点恼火。
就在这儿:
$ 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
它说创建一个块设备,主设备号为 8,次设备号为 0,名为 /dev/lol。ls 显示它是一个块设备。然后,我删除了它。
我们需要了解您的设备类型:(字符或块)、权限、它期望的输入类型等。插入设备后,我们
$ls -l /dev/input/js0
会知道大部分信息。它不会告诉我们它需要的是加工数据还是原始数据。用这些详细信息更新您的问题,我会尝试编写脚本或其他东西来解决问题。需要 Rootly 电源。
此外,连接控制器后,显示$lsusb
(我假设首先插入的设备都会被枚举 /dev/input/js0 ,并且软件不会做一些愚蠢的事情,例如明确地将特定的控制器枚举为特定的设备文件)