7

几天来,我一直在寻找如何在 Mac 上支持游戏手柄和操纵杆,我发现的所有资源似乎都建议使用预安装的驱动程序以及使用 Apple 的 HID API,它可以工作。

这种方法的缺点是每个操纵杆和游戏手柄都需要加载另一个内核扩展,因此它可以被 HID 管理器识别,或者至少没有代码Info.plist说明它符合早期安装的驱动程序。例如,当我有一个 360 Xbox 驱动程序KEXT时,微软的 Xbox 控制器可以工作,但罗技的控制器不行(我试过 F710)。

正如 Apple 建议的那样,使用游戏手柄或操纵杆的应用程序应该能够在用户空间自行操作,而无需引入任何 KEXT 内容。有没有办法做到这一点?

我想到的是在插入设备时使用 IORegistry 或 IOUSB API 来获取设备(USB Prober 至少显示了它)。然后以某种方式获取设备的描述,然后使用该描述将设备注册为 HID 设备。然后可以使用整个 HID 管理器。

我在正确的轨道上吗?或者有没有其他方法可以做到这一点?

由于 IOKit API 实际上提供了 kHIDUsage_GD_Joystick 之类的关键字,并且有一个 ForceFeedback.h 库,我想 Apple 在设计 HID API 时考虑了操纵杆和力反馈。这是我希望这可能奏效的渺茫希望。

一些参考文档和开源项目:

4

1 回答 1

2

After revisiting this, I found out the solution to be operating directly on the file descriptors of the device. libusb is an excellent library which greatly simplify your life on this and they have Mac supported.

xboxdrv link is a great example on how to operate on file socket using libusb.

In pseudo code, it should look like this:

  1. enumerate device
  2. detect kernel driver and detach it if possible
  3. open device
  4. file off a initial transfer
  5. wait on the callback function to handle msg and error properly
  6. start run loop or select on fd to call libusb_event_handle

Check libusb for more info link.

于 2013-01-24T19:13:52.890 回答