【发布时间】:2020-10-10 22:57:50
【问题描述】:
我正在为 Mac OS Catalina 编写一个桌面应用程序。目前 GPL 许可。将来我可能会使其获得 MIT 许可,但这是次要的。它是用 Swift 编写的,并支持一些使用用户空间 IOKit 的游戏手柄。我使用 HID API 让它适用于 Dualshock 4 和 Xbox 360 控制器。现在我正在实现对 Xbox One 控制器的支持,但它需要在开始发送报告(0x05、0x20)之前接收一个字节序列。我在几个 C/C++ kext 项目中看到了这一点,但我正在努力弄清楚如何在我的应用程序中的用户空间中做到这一点。我能够获得一个 IOHIDDevice,但我不知道如何从那里获得一个端点。这甚至可以从 HID 级别完成,还是我需要使用 USB 或蓝牙等较低级别的 API?我想避免仅仅为此使用 libusb,因为我已经让它与其他控制器一起使用。
我发现的其他建议是关于这个问题:Gamepad and joystick support on Mac OS X in user space,但没有提供 Mac 的示例代码。替换设备描述符对我来说听起来有点矫枉过正。另外,它建议使用 libusb。
我的部分代码:
let hidManager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))
let deviceCriteria:NSArray = [
[
kIOHIDDeviceUsagePageKey: kHIDPage_GenericDesktop,
kIOHIDDeviceUsageKey: kHIDUsage_GD_GamePad
]
]
IOHIDManagerSetDeviceMatchingMultiple(hidManager, deviceCriteria)
IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)
IOHIDManagerOpen(hidManager, IOOptionBits(kIOHIDOptionsTypeNone))
IOHIDManagerRegisterDeviceMatchingCallback(...)
func hidDeviceAddedCallback(_ result:IOReturn, sender:UnsafeMutableRawPointer, device:IOHIDDevice) {
// from here I usually send hid reports using IOHIDDeviceSetReport(device, kIOHIDReportTypeOutput, etc...)
// but now I need to write directly to and endpoint of an interface
}
【问题讨论】: