Skip to content

Commit 7f188ac

Browse files
committed
WIP: darwin: Create device descriptor from OS cached values
Still missing bcdUSB. References libusb#1564 Signed-off-by: Tormod Volden <[email protected]>
1 parent 467b6a8 commit 7f188ac

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

libusb/os/darwin_usb.c

+34
Original file line numberDiff line numberDiff line change
@@ -1105,12 +1105,45 @@ static enum libusb_error darwin_cache_device_descriptor (struct libusb_context *
11051105
(*device)->GetDeviceProduct (device, &idProduct);
11061106
(*device)->GetDeviceVendor (device, &idVendor);
11071107

1108+
/* Try synthesize a device descriptor from OS cached values */
1109+
do {
1110+
IOUSBDeviceDescriptor *desc = &dev->dev_descriptor;
1111+
UInt16 bcdDevice;
1112+
1113+
/* If anything fails, fall back to requesting descriptor from device */
1114+
if (!get_ioregistry_value_number (dev->service, CFSTR("bMaxPacketSize0"), kCFNumberSInt8Type, &desc->bMaxPacketSize0))
1115+
break;
1116+
1117+
desc->bcdUSB = libusb_cpu_to_le16(0x0200); // FIXME get from somewhere
1118+
1119+
desc->bDeviceClass = bDeviceClass;
1120+
(*device)->GetDeviceSubClass (device, &desc->bDeviceSubClass);
1121+
(*device)->GetDeviceProtocol (device, &desc->bDeviceProtocol);
1122+
1123+
desc->idVendor = libusb_cpu_to_le16(idVendor); // TODO: verify on BE
1124+
desc->idProduct = libusb_cpu_to_le16(idProduct);
1125+
(*device)->GetDeviceReleaseNumber (device, &bcdDevice);
1126+
desc->bcdDevice = libusb_cpu_to_le16(bcdDevice);
1127+
1128+
(*device)->USBGetManufacturerStringIndex (device, &desc->iManufacturer);
1129+
(*device)->USBGetProductStringIndex (device, &desc->iProduct);
1130+
(*device)->USBGetSerialNumberStringIndex (device, &desc->iSerialNumber);
1131+
(*device)->GetNumberOfConfigurations (device, &desc->bNumConfigurations);
1132+
1133+
// if needed do validity checks here (and reset descriptor on failure?)
1134+
1135+
desc->bDescriptorType = LIBUSB_DT_DEVICE;
1136+
desc->bLength = LIBUSB_DT_DEVICE_SIZE;
1137+
goto done_desc;
1138+
} while (0);
1139+
11081140
/* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some
11091141
* devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still,
11101142
* to follow the spec as closely as possible, try opening the device */
11111143
is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess);
11121144

11131145
do {
1146+
usbi_dbg (ctx, "requesting device descriptor from device");
11141147
/**** retrieve device descriptor ****/
11151148
ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor));
11161149

@@ -1201,6 +1234,7 @@ static enum libusb_error darwin_cache_device_descriptor (struct libusb_context *
12011234
return LIBUSB_ERROR_NO_DEVICE;
12021235
}
12031236

1237+
done_desc:
12041238
usbi_dbg (ctx, "cached device descriptor:");
12051239
usbi_dbg (ctx, " bDescriptorType: 0x%02x", dev->dev_descriptor.bDescriptorType);
12061240
usbi_dbg (ctx, " bcdUSB: 0x%04x", libusb_le16_to_cpu (dev->dev_descriptor.bcdUSB));

0 commit comments

Comments
 (0)