我需要一些帮助来理解 USB 游戏控制器(HID 设备)

I need some help to understand USB Game Controllers (HID devices)

我为奇怪的标题道歉,但这是我现在能想到的最好的。所以我有一个项目,我正在构建一个将充当游戏控制器的 HID 设备。我正在考虑模拟控制器,以便它在 Windows PC 上显示为 Xbox 360 控制器。有一个不错的 API 叫做 XInput API 用于游戏,这样他们就可以使用 360 控制器。我想利用它。

我目前正在研究如何编写微控制器代码,使其在 PC 上显示为 360 度控制器。我确实有一些问题,希望在该领域具有更多专业知识的人可以帮助我。

1) 我正在研究 HID 标准。我想知道,是否有一个单独的 HID 标准子 class 指定用于游戏控制器,我可以使用它与 XInput API 兼容?或者至少,HID 标准中是否有游戏控制器的规定?

2) 我在此处找到了有关如何使用 XInput API 的文档:https://docs.microsoft.com/en-us/windows/desktop/xinput/getting-started-with-xinput

现在,我想知道是否有任何文档说明如何使 HID 设备兼容 XInput API 或者我是否会在使用 API 来指导我如何对微控制器进行编码?

3) 最后,PC 用于与 Xbox One 控制器通信的 API 是否有任何文档?或者它仍然是 XInput API?或者是手柄 class (https://docs.microsoft.com/en-us/uwp/api/windows.gaming.input.gamepad)

感谢您花时间阅读本文,期待您的回复!

我掌握的一些信息:

Xbox 360 控制器 使用专有协议通过 USB 和无线与 PC\console 通信。 它的驱动程序在 Windows 附带的 XUSB22.sys 中实现(之前是单独的驱动程序包)。 在引擎盖下有所谓的 Krypton 数据包(codename of wired controller) on USB bus and Argon Packets (wireless controller RF codename) for wireless controllers. Driver produces XInput interface and HID 接口(由旧版 DirectInput 使用)。在 HID 下它缺乏振动支持并且 LT/RT 仅在一个轴下。

Xbox One 控制器 正在使用称为 GIP(游戏输入协议)的专有协议用于 USB 和无线,以及用于蓝牙的 HID(在较新的控制器上)。驱动程序实现位于 xboxgip.sys。提供XInput接口和USB HID接口。在 HID 下它没有振动,LT/RT 在一个轴下,LT/RT 电机(所谓的 冲击触发器 )不工作。 无线控制器在物理层面上使用 Wifi 数据包,其中包含封装的 GIP。

Windows.Gaming.Input - 是新的 WinRT/UWP API 除了 XInput、HID 和遗留的 DirectInput APIs .它在内部消耗 XUSB/GIP/HID(通过 XusbGameControllerProvider, GipGameControllerProvider, HidGameControllerProvider)。它是在 PC 上使用 Xbox One 控制器的本机界面,因为您只能通过此 API.

使用 impluse 触发器

您可以尝试通过 IDA PRO 调试器、USB 嗅探等方式对 protocols/drivers 进行逆向工程。PDB 符号可从 Microsoft Public PDB 服务获得(IDA 会自动下载): xusb.sys xboxgip.sys

Check this Linux Xbox Gamepad driver