首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用IOKit写入IOHIDDevice端点

如何使用IOKit写入IOHIDDevice端点
EN

Stack Overflow用户
提问于 2020-06-21 04:41:55
回答 1查看 408关注 0票数 2

我正在为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。

我的代码的一些部分:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-21 19:58:34

您可以使用IOHIDDeviceGetService()获取对与IOHIDDevice对应的IOService对象的引用。然后,您可以使用walk up the I/O registry provider chain查找底层的IOUSBInterface/IOUSBHostInterface对象。但是,一般的HID驱动程序可能已经获得了对USB接口的独占访问权限,因此如果不先启动HID驱动程序,那么在管道上提交传输可能是不被允许的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62491424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档