簡體   English   中英

如何使用 IOKit 寫入 IOHIDDevice 端點

[英]How to write to IOHIDDevice endpoint with IOKit

我正在為 Mac OS Catalina 編寫一個桌面應用程序。 目前 GPL 許可。 將來我可能會使其獲得 MIT 許可,但這是次要的。 它是用 Swift 編寫的,並支持一些使用用戶空間 IOKit 的游戲手柄。 我使用 HID API 讓它適用於 Dualshock 4 和 Xbox 360 controller。 現在我正在實現對 Xbox One controller 的支持,但它需要在開始發送報告(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
}

您可以使用IOHIDDeviceGetService()獲取與 IOHIDDevice 對應的IOService IOHIDDevice的引用。 然后,您可以沿着 I/O 注冊表提供程序鏈查找底層IOUSBInterface / IOUSBHostInterface object。 但是,通用 HID 驅動程序可能已經獲得了對 USB 接口的獨占訪問權限,因此如果不首先啟動 HID 驅動程序,可能不允許在 pipe 上提交傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM