Я разрабатываю USB-устройство на базе микроконтроллера STM32. Ничего особенного, одна конфигурация с одним интерфейсом, не использующим конечные точки (кроме конечной точки 0 по умолчанию). Устройство отлично работает в Ubuntu, проблема возникает, когда я подключаю устройство к компьютеру с Windows. Это не работает, и я не смог найти больше информации, чем это, из-за дескриптора конфигурации:
Вот снимок экрана дескриптора конфигурации, как это видно на машине с Ubuntu:
Wireshark на компьютере с Windows по какой-то причине не видит связи с этим устройством (связь с другими устройствами отображается нормально). Журналы устройства показывают, что устройство принимает адрес и отправляет дескриптор конфигурации, но никогда не получает команду SET CONFIGURATION.
Подскажите, пожалуйста, как мне найти более подробное сообщение об ошибке в Windows или что может быть не так с моим устройством.
Нет, кастомного драйвера не было. Попробую, спасибо за совет. Интуитивно понятно, что ОС должна перечислить устройство, прежде чем назначать ему драйвер.
Разве вы не говорили, что устройство принимает адрес? Разве это не пронумеровано?
Выяснил это.
Мое устройство отправляло дескриптор конфигурации неправильной длины.
Моя машина Linux сначала запросила 9 байт дескриптора, чтобы определить его общую длину, затем снова запросила дескриптор, запрашивая количество байтов <total_length>. Что ж, мое устройство было запрограммировано на отправку обратно точного количества байтов, запрошенного хостом, а именно:
HAL_PCD_EP_Transmit(hpcd, 0x00, configuration_descriptor, requested_length);
Хотя моя машина с Windows запросила дескриптор конфигурации только один раз, запрашивая 255 байт. Не говоря уже о том, что это было больше, чем вместил мой буфер, мое устройство способно отправить только один пакет. Поскольку максимальный размер пакета был настроен на 64 байта, хост ожидал большего количества пакетов после получения всего дескриптора. Короче говоря, исправление заключалось в следующем:
if (requested_length > sizeof(configuration_descriptor)) {
requested_length = sizeof(configuration_descriptor);
}
HAL_PCD_EP_Transmit(hpcd, 0x00, configuration_descriptor, requested_length);
Просто рассеянная искра в глубине моей памяти, когда я исследовал аналогичную проблему много лет назад: Windows общеизвестно плохо работает с USB, и ей нужен назначенный драйвер. Вы предоставили его для VID/PID? Это может быть просто INF-файл, указывающий на какой-либо существующий драйвер.