protaskin / LowCDC-Win10x64

A lowcdc.sys driver package for Windows 10 x64. Supports AVR-CDC and Digispark devices.
GNU General Public License v2.0
23 stars 5 forks source link

Unknown USB Device (Invalid Configuration Descriptor) #5

Open Kabron287 opened 3 years ago

Kabron287 commented 3 years ago

timestamp.verisign.com is not reachable now

http://timestamp.comodoca.com/authenticode works for me

Kabron287 commented 3 years ago

But the device still recognised as unknown with bad descriptor.

protaskin commented 3 years ago

Hello, Vladimir.

timestamp.verisign.com is not reachable now

Thanks for the information, I am supposed to update the repo anyway, have no time to spare though.

But the device still recognised as unknown with bad descriptor.

Not sure if I can help you right now. I haven't updated Windows in years, and am still using version 1903 :/

Kabron287 commented 3 years ago

Привет Артем. Спасибо за ответ.

  1. Обычный синий Digispark из чипдипа. USB\VID_16D0&PID_0753&REV_0202
  2. Скрипт отработал нормально, inf подхватывается успешно, явно драйвер с диска винда ставить отказывается.
  3. Попробую все проверить. В сети одна-две успешных попыток, а винда продолжает хужать.
protaskin commented 3 years ago

Обычный синий Digispark

Я не пользовался устройствами Digispark, а только своими поделками на ATtiny2313/4313 с самописным фирмварем на основе VUSB и драйвером AVR-CDC для Windows. В какой-то момент ко мне обратились с вопросом поддержки Digispark #2. И такая "поддержка" была с легкостью добавлена, потому что это устройство работает на основе тех же разработок. Собственно, коммит 8f951542ba4c0e1ece14b4557899728955036586. К сожалению, комьюнити Digispark не отличается настойчивостью в решении подобных проблем, и успешная работа было подтверждена только много месяцев спустя.

USB\VID_16D0&PID_0753&REV_0202

Драйвер поддерживает следующие устройства: AVR-CDC (USB\VID_16C0&PID_05E1), Digispark (USB\VID_16D0&PID_087E).

Я удивлен, что вы самостоятельно собрали пакет драйвера, решив возникшие проблемы, но не заметили, что этот USB PID не поддерживается.

Теперь я бы хотел получить от вас как можно больше информации об этом устройстве: ссылку на ЧипДип; ссылку на даташит/описание; репорт UsbTreeViewer/USBDeview/Thesycon USB Descriptor Dumper; ссылку на родной драйвер. Возможно, получится использовать этот драйвер после внесения небольших изменений.

явно драйвер с диска

Я правильно понял, что это при обновлении/установке драйвера через Диспетчер устройств?

винда продолжает хужать

Проблема не в Windows 10, а в драйвере AVR-CDC, который с помощью хуков изменяет правильное поведение usbser.sys на неправильное, но позволяющее работать со слабыми МК. Информацию о драйвере можно найти тут и в архиве с драйвером, который размещен здесь. Соответственно, с новым драйвером usbser.sys это извращение не работает.

Kabron287 commented 3 years ago

Девайс: https://aliexpress.ru/item/4000375205945.html? https://www.chipdip.ru/product0/8000901979 Родные драйверы: https://github.com/digistump/DigistumpArduino/tree/master/tools Wiki: http://digistump.com/wiki/digispark Отчет: USBView_DigiCDC.txt

Родные драйвера работают с DigiSerial VID_16D0&PID_087E Digispark Bootloader VID_16D0&PID_0753 DigiUSB VID_16C0&PID_05DF

Итак, после загрузки любого скетча для USBCDC девайс превращается в Неизвестное USB-устройство (недопустимый дескриптор конфигурации) Установка любого драйвера(родного или вашего) путем обновления из девайс менеджера сопровождается сообщением: WinError

Все .inf устанавливаются успешно.

Тестовый режим включен перманентно.

Windows 10 x64 LTSC. 17763.rs5_release

где то скачал ваш готовый драйвер LowCDC-Win10x64-1.0.1.6.zip - без такого же успеха.

protaskin commented 3 years ago

Ага, это все-таки клон Digispark. Другой любопытный факт, на который я не обращал раньше внимания, это отсутствие кварца. Все мои устройства разработаны с использованием кварца 12МГц.

Прошу вас, скачайте и используйте в дальнейшем UsbTreeView, его репорты гораздо подробнее.

Итак, после загрузки любого скетча для USBCDC девайс превращается в Неизвестное USB-устройство (недопустимый дескриптор конфигурации)

  1. Сформируйте репорт в UsbTreeView и укажите ссылку на загруженный скетч.

  2. Залейте другой скетч, с которым устройство определяется (дескриптор корректно считывается), также сформируйте репорт и укажите ссылку на скетч.

Kabron287 commented 3 years ago

OK UsbTreeView_DigisparkUSB.txt UsbTreeView_USBCDC.txt Прикольно, ВИД-ПИД таки есть

DigisparkCDC.zip не работает DigisparkUSB.zip работает любой пример годится.

Все из установочного пакета для ардуины.

protaskin commented 3 years ago

Прикольно, ВИД-ПИД таки есть

Да, непосредственно МК работает и начинает обмен с USB-хостом.

Попробуйте прочитать дескрипторы устройства с помощью Thesycon USB Descriptor Dumper.

Устройство подключено к USB-порту, размещенному непосредственно на материнской плате (или подключено с помощью пассивного удлинителя)? Порт USB3.x или 2.0?

Залейте один из скетчей DigisparkCDC и попробуйте подключать ко всем доступным портам (в т. ч. через хабы, PCI-карты, если есть), контролируя состояние "Неизвестное USB-устройство (недопустимый дескриптор конфигурации)". Репорты не нужны, просто следите за состоянием.

Kabron287 commented 3 years ago

Уже пробовал на всех портах и компьютерах. Dumper его находит, но сделать ничего не может. Софтовое отключение-включение не помогает.

Kabron287 commented 3 years ago

А нет пардон увидел:

Information for device USB\Vendor_16D0_Product_087E:

Connection Information:
------------------------------
Device current bus speed: LowSpeed
Device supports USB 1.1 specification
Device supports USB 2.0 specification
Device address: 0x000A
Current configuration value: 0x00
Number of open pipes: 0

Device Descriptor:
------------------------------
0x12    bLength
0x01    bDescriptorType
0x0110  bcdUSB
0x02    bDeviceClass      (Communication Device Class)
0x00    bDeviceSubClass   
0x00    bDeviceProtocol   
0x08    bMaxPacketSize0   (8 bytes)
0x16D0  idVendor
0x087E  idProduct
0x0100  bcdDevice
0x01    iManufacturer
0x02    iProduct     
0x00    iSerialNumber
0x01    bNumConfigurations

Configuration descriptor and all subsequent descriptors are not available. Error code: 0x00000002

Microsoft OS Descriptor is not available. Error code: 0x00000002

String Descriptor Table
--------------------------------
Index  LANGID  String

------------------------------

Connection path for device: 
xHCI-совместимый хост-контроллер USB
Root Hub
USB\Vendor_16D0_Product_087E Port: 6

Running on: Windows 10 or greater (Build Version 17763)

Brought to you by TDD v2.15.0, Jun  8 2020, 17:18:07
Kabron287 commented 3 years ago

DescriptorDump_VID16D0_PID087E.txt

protaskin commented 3 years ago

Уже пробовал на всех портах и компьютерах.

И везде "Неизвестное USB-устройство (недопустимый дескриптор конфигурации)"?

Если не затруднит, напишите модели материнских плат и/или южных мостов.

DescriptorDump_VID16D0_PID087E.txt

Ничего нового. Ну что же, последняя надежда на USBPcap. Может быть получится посмотреть, что же не так с этим дескриптором конфигурации.

  1. Установить Wireshark вместе с USBPcap (установить галочки в процессе установки).
  2. Подключить устройство.
  3. Запустить %ProgramFiles%\USBPcap\USBPcapCMD.exe, найти корневой хаб, к которому подключено устройство, и запомнить его номер.
  4. Отключить устройство. Ввести номер хаба и имя файла, подтвердить права. Снова подключить устройство.
  5. Закрыть программу (Ctrl+C).

На сайте USBPcap тоже самое, но на английском и с картинками.

Дамп сюда, его можно посмотреть в Wireshark.

Kabron287 commented 3 years ago

log1.zip PC1. Ryzen 7 MSI X570-a pro PC2. Note Acer Aspire A515-5S ХЗ какие такие там мосты. ИМХО дрова все таки не ставятся должным образом.

Kabron287 commented 3 years ago

На раритетной IBM T30 с хрюшей девайс правильно определяется (Digispark Serial) с вид-пид, но родные дрова не ставятся с ошибкой конфигурации inf файла. Думаю, без экстра затрат вопрос не решаем.

protaskin commented 3 years ago

дрова все таки не ставятся должным образом

Пока Windows не опознает устройство, контроль над устройством не будет передан драйверу высокого уровня. Вы сами видели, что в том же Диспетчере устройств отображается USB\VID_0000&PID_0006\... с соответствующей ошибкой.

Попробуйте повторно снять дамп с помощью USBPcap, но подключать Digispark к корневому хабу, к которому не подключены другие устройства. К использованному подключены 2 других устройства, в том числе приёмник Unifying.

Приведите последние записи из %SystemRoot%\inf\SetupAPI.dev.log с начала экспериментов с Digispark и драйверами. Можете просто выложить весь лог, если считаете, что там нет никакой "чувствительной" информации.

Kabron287 commented 3 years ago

ОК попробую позже как доберусь до тушки.

protaskin commented 3 years ago

На раритетной IBM T30 с хрюшей девайс правильно определяется

Если у вас есть доступ к этой железке или другой системе, где Digispark определяется, прочитайте дескрипторы устройства с помощью Thesycon USB Descriptor Dumper (если получится, я проверил работу обеих программ в виртуальной машине с WinXP, и утилита от Thesycon не запускается) или UsbTreeView. Первая программа обладает полезной в этом случае функциональностью — указывает на ошибки в дескрипторах.

без экстра затрат вопрос не решаем

Maybe the real Digispark was the friends we made along the way ¯\_(ツ)_/¯

И еще, можете полностью скопировать сюда состояние устройства "Неизвестное USB-устройство (недопустимый дескриптор конфигурации)" в Диспетчере устройств? Для оформления этой issue.

Kabron287 commented 3 years ago

Как то умудрился убить чип. Теперь когда посылка с новыми дойдет.

protaskin commented 3 years ago

Что за досадный поворот событий! И все же, прошу вас:

Между тем я нашел PCIe-карту с USB3.0, воспроизвел и изучаю проблему. Да, на моей материнской плате 0 (ноль) USB3.0 портов.

Kabron287 commented 3 years ago

Просю:.. Кстати, попробовал шить в погорельца их родной t85_default.hex - также плохой дескриптор, хотя чип вполне себе живой. Digispark.zip

protaskin commented 3 years ago

Пришлось потратить больше времени, чем хотелось бы, на адаптацию пакетного файла к последнему новшеству от MS — включению номера версии в путь к исполняемым файлам SDK/WDK.

Заменил timestamp-сервис на DigiCert, который используется в примерах на портале Windows Hardware Developer, bbc0272d91bd83d6c4bfcd8b75ccb56e95a0ff98. Рекомендую вам в будущем создавать для каждой проблемы отдельную issue.

Я тут обратил внимание, что UsbTreeView предоставляет возможность открыть отчет, что было бы очень удобно для оценки топологии USB. Вас не затруднит еще раз сформировать и приложить полный отчет в формате XML (File → Save XML Report)? Желательно отключить все неиспользуемые USB-устройства.

protaskin commented 3 years ago

Внимательно изучив записи в приложенном setupapi.dev.log, могу сделать следующие выводы:

Таким образом, непосредственно с пакетом драйвера LowCDC-Win10x64 проблем нет. Нужно продолжать исследовать вопрос совместимости устройств AVR-CDC и Digispark с USB хост-контроллерами и USB-стеком Windows 10.

protaskin commented 3 years ago

также плохой дескриптор, хотя чип вполне себе живой

Сегодня появилась похожая проблема.

Device Description       : Unknown USB Device (Device Descriptor Request Failed)
Device ID                : USB\VID_0000&PID_0002\7&4E1EB02&0&2
Hardware IDs             : USB\DEVICE_DESCRIPTOR_FAILURE

Не уверен, что послужило причиной данного изменения. Вчера я оставил устройство подключенным в USB3.0-порт на несколько часов. Сегодня включил ПК с подключенным устройством в том же порте. В USB2.0-порте работает без проблем.

К счастью, я еще несколько дней назад записал журнал событий при подключении устройства с состоянием Unknown USB Device (Invalid Configuration Descriptor), так что эта проблема не должна повлиять на ход исследования.

Апдейт. Ошибка будто пропадает и возвращается сама собой.

Несколько раз удалось устранить проблему удалением дерева USB-устройств до моего устройства (хост-контроллер, корневой хаб и устройство AVR-CDC) в Диспетчере устройств, выключением ПК со снятием напряжения с блока питания на пару минут.

Занятно, что в случае появления ошибки Device Descriptor Request Failed при подключения устройства AVR-CDC, все доступные мне USB1.1-устройства, в том числе Full-Speed (CH341A Mini Programmer), не определяются с такой же ошибкой.

Не могу исключать и проблем с устройством, которое представляет собой очень древнюю поделку, выполненную не на печатной плате.

Kabron287 commented 3 years ago

Внезапно наступили трудо-выебудни, так что до выходных.

protaskin commented 3 years ago

Как я и ожидал, проблема заключается в объявлении конечных точек типа Bulk в дескрипторе конфигурации.

UsbUcx:Dispatch URB_FUNCTION_CONTROL_TRANSFER_EX - Type: Standard, Request: GET_DESCRIPTOR(DEVICE)
UsbUcx:Complete URB_FUNCTION_CONTROL_TRANSFER_EX - Type: Standard, Request: GET_DESCRIPTOR(DEVICE)
UsbUcx:Dispatch URB_FUNCTION_CONTROL_TRANSFER_EX - Type: Standard, Request: GET_DESCRIPTOR(CONFIGURATION)
UsbUcx:Complete URB_FUNCTION_CONTROL_TRANSFER_EX - Type: Standard, Request: GET_DESCRIPTOR(CONFIGURATION)
UsbHub3:Descriptor validation failed for the device for the following reason: DescriptorValidationErrorBulkEndpointAtLowSpeed
UsbHub3:Descriptor validation failed for the device for the following reason: DescriptorValidationErrorBulkEndpointAtLowSpeed
UsbHub3:Validation Failure of Configuration Descriptor

Похоже, что в стеке драйверов USB3.0, который был добавлен в Windows 8, реализована более строгая валидация дескрипторов. Я полагаю, что "виноват" драйвер корневого хаба UsbHub3.sys, который непосредственно выполняет энумерацию подключенных устройств. Таким образом, если подключить устройство AVR-CDC в любой USB-порт (даже USB2.0) корневого хаба, входящего в состав хост-контроллера xHCI, то определяться и работать оно не будет.

Ликбез со страницы описания драйвера LowCDC:

CDC is a class that defines various communications over USB. The RS-232C procedure is included in CDC-ACM (Abstract Control Model) subclass. It uses two bulk transfer pipes for data, and one interrupt pipe for message, besides a control pipe. The mechanism that configures terminal settings (baudrate, parity bit, etc) to device is defined too. In the USB standard, low-speed (1.5Mbps) device is allowed to have two interrupt pipes only. In the case of using bulk transfer or using exceeded number of pipes, some host controller or hub transmits packets at critical intervals, and the V-USB device fails to respond. To reduce this trouble, a small patch driver assists the protocol operations on Windows.

Я посмотрел исходные коды драйвера LowCDC и пришел к выводу, что эту проблему не получится обойти. Можно было бы попробовать использовать конечные точки типа Interrupt вместо Bulk в дескрипторе конфигурации, но для этого необходимо вносить изменения в код драйвера, чтобы как-то иначе определять каким каналам нужно восстановить тип Bulk. Разумеется, нет никаких гарантий, что это заработает.

Возможные решения:

protaskin commented 3 years ago

Hello, @jaromaz.

I'm investigating this Invalid Configuration Descriptor problem and have come to the conclusion that there are compatibility issues with USB3.0 driver stack introduced in Windows 8.

I remember that you have successfully connected a Digispark CDC device to your laptop with Windows 10. Could you save UsbTreeView reports using that laptop and attach them here? I'm interested in the information regarding USB host controllers, (root) hubs, topology and used drivers.

To save reports, follow these steps:

  1. Unplug unused USB devices.
  2. Run the UsbTreeView program.
  3. Plug your Digispark device into a USB port.
  4. Save reports in text and XML formats (File → Save Text Report, Save XML Report).

If you are curious about the results of the investigation so far, read https://github.com/protaskin/LowCDC-Win10x64/issues/5#issuecomment-779824874 and https://github.com/protaskin/LowCDC-Win10x64/issues/5#issuecomment-784500352.

Thanks in advance!

XRay3D commented 11 months ago

Решение так и не нашлось? На работе компы обновили и все стенды на атмегах на...сь. Не охота всё переписывать и пререразводить.