дескриптор устройства libusb: возможные значения bcdUSB

Я разрабатываю приложение C, используя libusb-1.0. Я хочу получить некоторые параметры конфигурации, связанные с USB-устройствами. Мой вопрос связан с параметром bcdUSB. Мой код выглядит следующим образом:

libusb_device *dev;
struct libusb_device_descriptor desc;

....

ret = libusb_get_device_descriptor(dev, &desc);

if (ret<0) {
    fprintf(stderr, "error in getting device descriptor\n");
    return 1;
}

printf("bcdUSB: %04x\n", desc.bcdUSB);

Для некоторых устройств я получаю значение 0401:

bcdUSB: 0401

Я не понимаю, что именно означает это значение.

В коде libusb я нашел этот комментарий в коде структуры libusb_device_descriptor:

/** USB specification release number in binary-coded decimal. A value of
 * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */
uint16_t bcdUSB;

Он указывает только значения 0200 и 0110. Есть ли документация всех возможных значений bcdUSB, включая 0401?


person Kallel Omar    schedule 17.07.2019    source источник


Ответы (1)


Я не знаю какой-либо документации, в которой описаны все возможные значения bcdUSB, но должен упомянуть одну вещь. Ничто не мешает USB-устройству отправлять недопустимое содержимое дескриптора устройства. Хотя я точно не проверял его на чем-либо, мне кажется вполне вероятным, что ОС будет игнорировать неправильный bcdUSB, а устройство продолжит работать, как и ожидалось.

Удостоверьтесь, что у вас есть разумные значения по умолчанию, на случай, если вы встретите там недопустимое значение.

Просто чтобы продемонстрировать, вот как определяется дескриптор устройства на стороне устройства. В значительной степени "жестко запрограммировано". И да, это настоящий код из реальной библиотеки, работающий на реальном устройстве.

/*-----------------------------------------------------------------------------+
| Device Descriptor 
|-----------------------------------------------------------------------------*/
uint8_t const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR] = {
    SIZEOF_DEVICE_DESCRIPTOR,               // Length of this descriptor
    DESC_TYPE_DEVICE,                       // Type code of this descriptor
    0x00, 0x02,                             // Release of USB spec
    0x02,                                   // Device's base class code
    0x00,                                   // Device's sub class code
    0x00,                                   // Device's protocol type code
    EP0_PACKET_SIZE,                        // End point 0's packet size
    USB_VID&0xFF, USB_VID>>8,               // Vendor ID for device, TI=0x0451
                                            // You can order your own VID at www.usb.org"
    USB_PID&0xFF, USB_PID>>8,               // Product ID for device,
                                            // this ID is to only with this example
    VER_FW_L, VER_FW_H,                     // Revision level of device
    1,                                      // Index of manufacturer name string desc
    2,                                      // Index of product name string desc
    USB_STR_INDEX_SERNUM,                   // Index of serial number string desc
    1                                       //  Number of configurations supported
};
person Boris Lipschitz    schedule 28.07.2019