我正在为Mac OS Catalina编写一个桌面应用程序。GPL目前已获得许可。我可能会在将来让它获得麻省理工学院的许可,但这是次要的。它是用Swift编写的,支持一些使用用户空间IOKit的游戏手柄。我用HID让它在Dualshock 4和Xbox360控制器上工作。现在我正在实现对Xbox One控制器的支持,但是在开始发送报告(0x05,0x20)之前,它需要接收一个字节序列。我在几个C/C++ kext项目中看到了这一点,但我正在努力弄清楚如何在用户空间的应用程序中做到这一点。我可以得到一个IOHIDDevice,但我不知道如何从那里获得一个端点。这是否可以从HID级别完成,或者我是否需要使用较低级别的API,如USB或蓝牙?我想避免使用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
}发布于 2020-06-21 19:58:34
您可以使用IOHIDDeviceGetService()获取对与IOHIDDevice对应的IOService对象的引用。然后,您可以使用walk up the I/O registry provider chain查找底层的IOUSBInterface/IOUSBHostInterface对象。但是,一般的HID驱动程序可能已经获得了对USB接口的独占访问权限,因此如果不先启动HID驱动程序,那么在管道上提交传输可能是不被允许的。
https://stackoverflow.com/questions/62491424
复制相似问题