17. xpad - 用于 Xbox 兼容控制器的 Linux USB 驱动程序¶
此驱动程序公开了所有第一方和第三方 Xbox 兼容控制器。它历史悠久,并且由于 Windows 的 xinput 库导致大多数 PC 游戏专注于 Xbox 控制器兼容性,因此得到了广泛使用。
由于向后兼容性,所有按钮都报告为数字的。这仅影响初代 Xbox 控制器。所有后续的控制器型号都只有数字式正面按钮。
某些型号的 Xbox 360 控制器支持震动,但初代 Xbox 控制器和 Xbox One 控制器不支持。在撰写本文时,Xbox One 的震动协议尚未被逆向工程,但将来可能会支持。
17.1. 注意事项¶
报告的按钮/轴数量取决于 3 个因素
您是否正在使用已知的控制器
您是否正在使用已知的跳舞毯
如果使用未知设备(下面未列出的设备),您在模块配置中为“将 D-PAD 映射到按钮而不是未知垫的轴”设置的内容(模块选项 dpad_to_buttons)
如果您将 dpad_to_buttons 设置为 N 并且您正在使用未知设备,则驱动程序会将方向键映射到轴 (X/Y)。如果您设置为 Y,它会将方向键映射到按钮,这对于跳舞类游戏正常运行是必需的。默认值为 Y。
dpad_to_buttons 对已知垫没有影响。一个错误的提交消息声称 dpad_to_buttons 可以用来强制已知设备的行为。这不是真的。dpad_to_buttons 和 triggers_to_buttons 都只影响未知控制器。
17.1.1. 普通控制器¶
使用普通控制器,方向键会映射到其自己的 X/Y 轴。来自 joystick-1.2.15 (jstest-version 2.1.0) 的 jstest 程序将报告 8 个轴和 10 个按钮。
所有 8 个轴都工作,尽管它们都具有相同的范围 (-32768..32767),并且触发器的零设置不正确(我不知道这是否是 jstest 的某些限制,因为输入设备设置应该没问题。我还没有看过 jstest 本身)。
所有 10 个按钮都工作(在数字模式下)。右侧的六个按钮(A、B、X、Y、黑色、白色)被称为“模拟”并将其值报告为 8 位无符号数,不确定这有什么用。
我使用 quake3 测试了控制器,配置和游戏中的功能都正常。但是,我发现使用手柄玩第一人称射击游戏相当困难。您的使用情况可能会有所不同。
17.1.2. Xbox 跳舞毯¶
当使用已知的跳舞毯时,jstest 将报告 6 个轴和 14 个按钮。
对于跳舞类跳舞毯(如 redoctane 跳舞毯)已进行了一些更改。旧的驱动程序会将方向键映射到轴,导致驱动程序无法报告用户何时同时按下左+右或上+下,从而使 DDR 风格的游戏无法玩。
已知的跳舞毯会自动将方向键映射到按钮,并且开箱即用即可正常工作。
如果您的跳舞毯被驱动程序识别,但使用的是轴而不是按钮,请参阅第 0.3 节 - 未知控制器
我用 Stepmania 测试了这个,效果很好。
17.1.3. 未知控制器¶
如果您有一个未知的 Xbox 控制器,它应该可以使用默认设置正常工作。
但是,如果您有一个未在下面列出的未知跳舞毯,则除非您在模块配置中将“dpad_to_buttons”设置为 1,否则它将无法工作。
17.2. USB 适配器¶
所有代的 Xbox 控制器都通过电线进行 USB 通信。
初代 Xbox 控制器使用专有连接器,需要适配器。
无线 Xbox 360 控制器需要“用于 Windows 的 Xbox 360 无线游戏接收器”
有线 Xbox 360 控制器使用标准 USB 连接器。
Xbox One 控制器可以是无线的,但使用 Wi-Fi Direct 进行通信,目前尚不支持。
Xbox One 控制器可以是有线的,并使用标准的 Micro-USB 连接器。
17.2.1. 初代 Xbox USB 适配器¶
将此驱动程序与初代 Xbox 控制器一起使用需要一个适配器电缆,将专有连接器的引脚分离到 USB。您可以在网上以相当便宜的价格购买这些电缆,也可以自己构建。
这样的电缆很容易构建。控制器本身是一个 USB 复合设备(一个集线器,带有两个扩展槽的三个端口和一个控制器设备),唯一的区别是非标准连接器(5 个引脚,而标准 USB 1.0 连接器上有 4 个引脚)。
您只需要将 USB 连接器焊接到电缆上并保持黄线未连接。其他引脚在两个连接器上的顺序相同,因此没有任何诀窍。有关这些事项的详细信息可以在网上找到 ([1]、[2]、[3])。
感谢电缆上的行程分配器,您甚至不需要剪断原来的电缆。您可以购买延长线并剪断它。这样,如果您有 Xbox,仍然可以将控制器与 Xbox 一起使用;)
17.3. 驱动程序安装¶
一旦您有了适配器电缆(如果需要)并且控制器已连接,xpad 模块应该会自动加载。要确认,您可以 cat /sys/kernel/debug/usb/devices。应该有一个类似以下的条目
T: Bus=01 Lev=03 Prnt=04 Port=00 Cnt=01 Dev#= 5 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=32 #Cfgs= 1
P: Vendor=05fd ProdID=107a Rev= 1.00
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=58(unk. ) Sub=42 Prot=00 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 32 Ivl= 10ms
E: Ad=02(O) Atr=03(Int.) MxPS= 32 Ivl= 10ms
T: Bus=01 Lev=02 Prnt=09 Port=00 Cnt=01 Dev#= 10 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0c12 ProdID=8809 Rev= 0.01
S: Product=XBOX DDR
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=58(unk. ) Sub=42 Prot=00 Driver=xpad
E: Ad=82(I) Atr=03(Int.) MxPS= 32 Ivl=4ms
E: Ad=02(O) Atr=03(Int.) MxPS= 32 Ivl=4ms
17.4. 支持的控制器¶
有关支持的控制器以及相关的供应商和产品 ID 的完整列表,请参阅 xpad_device[] 数组[4]。
从历史版本 0.0.6 (2006-10-10) 开始,支持以下设备
original Microsoft XBOX controller (US), vendor=0x045e, product=0x0202
smaller Microsoft XBOX controller (US), vendor=0x045e, product=0x0289
original Microsoft XBOX controller (Japan), vendor=0x045e, product=0x0285
InterAct PowerPad Pro (Germany), vendor=0x05fd, product=0x107a
RedOctane Xbox Dance Pad (US), vendor=0x0c12, product=0x8809
无法识别的 Xbox 控制器型号应作为通用 Xbox 控制器运行。无法识别的跳舞毯控制器需要设置模块选项“dpad_to_buttons”。
如果您有无法识别的控制器,请参阅 0.3 - 未知控制器
17.5. 手动测试¶
要测试此驱动程序的功能,您可以使用“jstest”。
例如
> modprobe xpad
> modprobe joydev
> jstest /dev/js0
如果您使用的是普通控制器,则应该有一行显示 18 个输入(8 个轴,10 个按钮),如果您移动摇杆并按下按钮,其值应该会改变。如果您使用的是跳舞毯,则应该显示 20 个输入(6 个轴,14 个按钮)。
它工作吗?瞧,您完成了;)
17.6. 鸣谢¶
- 我必须感谢 ITO Takayuki 在其网站上提供的详细信息
他有用的信息以及 usb-skeleton 以及 iforce 输入驱动程序(Greg Kroah-Hartmann;Vojtech Pavlik)在快速原型化基本功能方面提供了很大帮助。
17.7. 参考¶
17.8. 历史编辑¶
- 2002-07-16 - Marko Friedemann <mfr@bmx-chemnitz.de>
原始文档
- 2005-03-19 - Dominic Cerquetti <binary1230@yahoo.com>
为跳舞毯添加了内容,新的方向键->轴映射
可以通过 “git log --follow xpad - 用于 Xbox 兼容控制器的 Linux USB 驱动程序” 查看以后的更改