我将错误的端点地址传递给CopyPipe()
.
要查找端点地址,您需要枚举IOUSBDescriptorHeader
s 中的 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;
}
}
}