Swift 如何使用IOKit写入IOHIDDevice端点

Swift 如何使用IOKit写入IOHIDDevice端点,swift,macos,hid,iokit,Swift,Macos,Hid,Iokit,我正在为MacOS Catalina编写一个桌面应用程序。GPL目前已获得许可。我将来可能会让它获得麻省理工学院的许可证,但那是次要的。它是用Swift编写的,支持一些使用用户空间IOKit的游戏板。我使用HID API为Dualshock 4和Xbox 360控制器工作。现在我正在实现对Xbox One控制器的支持,但它需要在开始发送报告之前接收字节序列(0x05、0x20)。我在几个C/C++kext项目中看到了这一点,但我正在努力找出如何在我的应用程序用户空间中实现这一点。我可以得到一个I

我正在为MacOS Catalina编写一个桌面应用程序。GPL目前已获得许可。我将来可能会让它获得麻省理工学院的许可证,但那是次要的。它是用Swift编写的,支持一些使用用户空间IOKit的游戏板。我使用HID API为Dualshock 4和Xbox 360控制器工作。现在我正在实现对Xbox One控制器的支持,但它需要在开始发送报告之前接收字节序列(0x05、0x20)。我在几个C/C++kext项目中看到了这一点,但我正在努力找出如何在我的应用程序用户空间中实现这一点。我可以得到一个IOHID设备,但我不知道如何从那里得到一个端点。这甚至可以从HID级别完成,还是我需要使用较低级别的API,如USB或蓝牙?我想避免仅仅为了这个而使用libusb,因为我已经让它与其他控制器一起工作了

我发现的另一个建议是关于这个问题:但没有提供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
}

您可以使用获取与
IOHIDDevice
对应的
IOService
对象的引用。然后,您可以找到底层的
iIbHostInterface
/
iIbHostInterface
对象。但是,一般的HID驱动程序可能已经获得了对USB接口的独占访问权,因此,如果不首先启动HID驱动程序,则可能不允许在管道上提交传输