用户空间中Mac OS X上的游戏手柄和操纵杆支持

vgr*_*mer 6 macos iokit hid joystick

我一直在搜索如何在Mac上运行游戏手柄和操纵杆支持,我找到的所有资源似乎都建议使用预装的驱动程序以及使用Apple的HID API.

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

正如Apple建议使用游戏手柄或操纵杆的应用程序应该能够在用户空间自行完成,而不会引入任何KEXT内容.有办法吗?

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

我是在正确的轨道上吗?或者还有其他方法吗?

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

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

vgr*_*mer 2

重新审视这一点后,我找到了直接对设备的文件描述符进行操作的解决方案。libusb 是一个优秀的库,它极大地简化了您的生活,并且支持 Mac。

xboxdrv链接是关于如何使用 libusb 操作文件套接字的一个很好的示例。

在伪代码中,它应该如下所示:

  1. 枚举设备
  2. 检测内核驱动程序并在可能的情况下将其分离
  3. 打开设备
  4. 归档初始转移
  5. 等待回调函数正确处理消息和错误
  6. 启动运行循环或选择 fd 来调用 libusb_event_handle

检查 libusb 以获取更多信息链接