如何使用IOKit写入IOHIDDevice端点

马可·七月

我正在为Mac OS Catalina编写桌面应用程序。GPL目前已获得许可。将来我可能会让它获得MIT的许可,但这是次要的。它是用Swift编写的,并使用用户空间IOKit支持某些游戏手柄。我使用HID API将其用于Dualshock 4和Xbox 360控制器。现在,我正在实现对Xbox One控制器的支持,但是它需要先接收一个字节序列,然后才能开始发送报告(0x05、0x20)。我在几个C / C ++ kext项目中看到了这一点,但是我在努力寻找如何在用户空间的应用程序中执行此操作的过程。我可以获取IOHIDDevice,但无法弄清楚如何从那里获取端点。甚至可以从HID级别完成此操作,还是需要使用较低级别的API(例如USB或蓝牙)?我想避免仅为此使用libusb,因为我已经将它与其他控制器一起使用了。

我发现的另一个建议是关于这个问题的:用户空间中Mac OS X上的游戏手柄和操纵杆支持,但未提供Mac的示例代码。替换设备描述符对于我来说听起来有些矫kill过正。另外,它建议使用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
}
pmdj

您可以获取IOServiceIOHIDDeviceusing对应对象的引用IOHIDDeviceGetService()然后,您可以遍历I / O注册表提供程序链以找到基础IOUSBInterface/IOUSBHostInterface对象。但是,一般的HID驱动程序可能已经获得了对USB接口的独占访问权限,因此,在未首先启动HID驱动程序的情况下,不允许在管道上提交传输。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用IOKit使用中断输入端点获取回调

来自分类Dev

如何使用theos链接IOKit?

来自分类Dev

如何使用theos链接IOKit?

来自分类Dev

如何从 ASMX 端点异步创建/写入文件?

来自分类Dev

如何使用IOKit在macOS中以编程方式更改鼠标设置

来自分类Dev

如何将CPU的DMA地址写入FPGA(PCIe端点)?

来自分类Dev

如何在Java中将Sparql端点写入DBpedia

来自分类Dev

如何使用FusionAuth的自省端点?

来自分类Dev

使用IOKit与USB设备通信

来自分类Dev

如何使用Groovy更改端点URL

来自分类Dev

如何使用PassportJS保护API端点?

来自分类Dev

如何使用Virtuoso创建SPARQL端点?

来自分类Dev

Camel:如何使用CamelContext启用/禁用端点

来自分类Dev

如何使用Passport保护路由端点?

来自分类Dev

Camel:如何使用CamelContext启用/禁用端点

来自分类Dev

如何为 Symfony NexySlackBundle 使用多个端点

来自分类Dev

如何使用 odata 端点检索地址

来自分类Dev

如何测试使用 Wagtail Hooks 注册的端点?

来自分类Dev

如何从Swift访问iokit / pwr_mgt?

来自分类Dev

使用IOKit搜索串行端口-Swift

来自分类Dev

如何使用QProcess正确写入?

来自分类Dev

如何使用StreamWriter写入文件?

来自分类Dev

如何使用Python写入文件?

来自分类Dev

如何使用Pandas写入Excel?

来自分类Dev

如何使用php写入文件

来自分类Dev

如何使用fileoutputstream写入数字

来自分类Dev

如何使用FPGA写入文件

来自分类Dev

两个实体是否会使用此端点写入数据存储?

来自分类Dev

如何通过使用流利的Azure Mgmt SDK获取端点统计信息和危险端点列表