1

为了我自己的启迪,我正在尝试使用 DriverKit 系统扩展从 USB 音频接口读取一些音频数据。

IOProviderClass的是IOUSBHostInterface。我可以成功Open()的接口,但CopyPipe()返回kIOReturnError0xe00002bc)。为什么我不能复制管道?

为了能够完全打开界面,我必须匹配,AppleUSBAudio所以我IOKitPersonalities明确匹配bConfigurationValue, bInterfaceNumber, idVendor,idProductbcdDevice键。此列表可能不是最少的。

ioreg我通常可以看到接口(有时只有我匹配的接口,尽管我认为这是一种退化的情况)。AppleUserUSBHostHIDDevice我在其他一些界面上看到了一个孩子。这可能是问题吗?通常,该设备既是 USBAudio 又是 HID 没有问题。我也试图不成功地匹配 HID。

4

1 回答 1

0

我将错误的端点地址传递给CopyPipe().

要查找端点地址,您需要枚举IOUSBDescriptorHeaders 中的 sIOUSBConfigurationDescriptor并检查bDescriptorType等于的描述符kIOUSBDescriptorTypeEndpoint

IOUSBGetNextDescriptor()fromUSBDriverKit/AppleUSBDescriptorParsing.h是为此而设计的,它将使您免于考虑指针操作。

如果端点处于不同的备用设置中,那么您需要将接口切换到带有SelectAlternateSetting().

void
enumerate_configs(const IOUSBConfigurationDescriptor *configDesc) {
    const IOUSBDescriptorHeader *curHeader = NULL;
    
    while ((curHeader = IOUSBGetNextDescriptor(configDesc, curHeader))) {
        switch (curHeader->bDescriptorType) {
            case kIOUSBDescriptorTypeEndpoint: {
                auto endpoint = (const IOUSBEndpointDescriptor *)curHeader;
                os_log(OS_LOG_DEFAULT, "Endpoint bLength: %{public}i, bDescriptorType: %i, bEndpointAddress: %i, bmAttributes: 0x%x, wMaxPacketSize: %i, bInterval: %i",
                       endpoint->bLength,
                       endpoint->bDescriptorType,
                       endpoint->bEndpointAddress,  // pass this to CopyPipe()
                       endpoint->bmAttributes,
                       endpoint->wMaxPacketSize,
                       endpoint->bInterval);
            }
                break;
            default:
                os_log(OS_LOG_DEFAULT, "some other type: %{public}i", curHeader->bDescriptorType);
                break;
        }
    }
}
于 2021-04-09T21:53:36.220 回答