Перейти к содержанию
    

USB DFU не работает под виндовсом, что-то с десткриптором?

Делал достаточно много устройств с USB - CDC. Загрузчик обновлял прошивку через этот же виртуальный COM-порт под линухом и виндой, все устраивало кроме того, что для заливки нужна была моя самописная программа для компа. Тут понадобилось сделать устройство с HID, мой загручик уже не подходит, решился на реализацию загрузки через DFU. Вроде как реализовал. Если устройство чистое, только с одним загрузчиком (отдает DFU mode descriptor set) -  то оно прекрасно видится и программируется как под линухом так и под виндой. Правда, чтобы работало под виндой пришлось реализовать M$ OS Descriptor но теперь драйвер WinUSB подхватывается автоматом. Если же устройство выполняет приложение и отдает Run-Time DFU Interface и Functional дескрипторы, то dfu-util под линухом его видит и обновляет, а под виндой ну ни в какую не хочет, пишет "Cannot open DFU device <VID>:<PID>". Вот отрывок из dfu-util -l -vvvv:

[ 0.267326] [00001730] libusb: debug [init_device] (bus: 1, addr: 2, depth: 1, port: 2): 'USB\VID_16C0&PID_05DC\[email protected]:'
[ 0.275436] [00001730] libusb: debug [libusb_get_device_descriptor]
[ 0.276590] [00001730] libusb: debug [libusb_get_config_descriptor] index 0
[ 0.277662] [00001730] libusb: debug [libusb_get_device_descriptor]
[ 0.278661] [00001730] libusb: debug [libusb_get_config_descriptor] index 0
[ 0.279619] [00001730] libusb: debug [libusb_get_device_descriptor]
[ 0.280453] [00001730] libusb: debug [libusb_get_config_descriptor] index 0
[ 0.280970] [00001730] libusb: debug [libusb_get_device_descriptor]
[ 0.281509] [00001730] libusb: debug [libusb_get_config_descriptor] index 0
[ 0.282009] [00001730] libusb: debug [parse_configuration] skipping descriptor 0xb
[ 0.282517] [00001730] libusb: debug [libusb_open] open 1.2
[ 0.283011] [00001730] libusb: debug [libusb_open] open 1.2 returns -5
Cannot open DFU device 16c0:05dc

Причем, что характерно, wireshark показывает, что оно даже не обращается к устройству. Полазил по интернету, везде пишут, что это ошибка libusb и причина - не установленный драйвер на DFU interface. Но у меня он установлен при помощи M$ OS  Descriptors, в диспетчере устройств восклицательных знаков нет, драйвер тот же, что и в DFU-mode. Подозреваю, что проблема в дескрипторах, вот они:

Bus 003 Device 054: ID 16c0:05e1 Van Ooijen Technische Informatica Free shared USB VID/PID pair for CDC devices
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x16c0 Van Ooijen Technische Informatica
  idProduct          0x05e1 Free shared USB VID/PID pair for CDC devices
  bcdDevice            2.00
  iManufacturer           1 RRT ltd.
  iProduct                2 UART to SD card logger
  iSerial                 3 ----@rrt.lv:
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x005d
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       0 
      iFunction               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 
      iInterface              0 
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x00
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             128
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1 
      iInterface              4 DFU interface
      Device Firmware Upgrade Interface Descriptor:
        bLength                             9
        bDescriptorType                    33
        bmAttributes                        9
          Will Detach
          Manifestation Intolerant
          Upload Unsupported
          Download Supported
        wDetachTimeout                      0 milliseconds
        wTransferSize                      64 bytes
        bcdDFUVersion                   1.01
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0000
  (Bus Powered)

Сначала делал строго по спецификации с usb.org - в дескриптор конфигурации добавил еще один интерфейсный дескриптор, прописал в него класс, подкласс и протокол DFU. В линухе работет, в виндовсе - нет. Сделал композитное устройство - те же яйца, только в профиль. Прошу помощи у участников форума.

Добавлено: а как вы простыни кода сворачиваете при создании сообщений?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переставить драйвер на НЕ WCID. Проблемы у dfu-util со множеством дескрипторов совместно с DFU начинаются если его номер больше чем девять - переставляем поближе к началу составного устройства.
image.png.a0a49aa28b349b7b99b006792c5ddd6e.png

 

image.png.a3218268096e400c3c1558ccb9d543cc.png

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно говоря я не знаю, что такое "WCID" и Zadig не использую. Без него совсем никак? Хотелось, чтобы работало "из коробки". Тот же самый драйвер в устройстве с одним-единственным интерфейсом DFU mode прекрасно позволяет распознать устройство и обновить его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня даже единственный с виндами после автоопределения не работает... пока zadig не обработать.

WCID это то что позволяет автоустановку провернуть.

https://github.com/pbatard/libwdi/wiki/WCID-Devices

 

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, GenaSPB сказал:

WCID это то что позволяет автоустановку провернуть.

А, это то, что я реализовал. 

37 минут назад, GenaSPB сказал:

У меня даже единственный с виндами после автоопределения не работает... пока zadig не обработать.

Там есть такая тонкость, что если виндовсу не удалось при первом подключении определить устройсво как это самое WCID, он заносит устройство в "черный список" в регистре HKLM/System/CCS/Control/usbflags и больше не пытается с ним бороться. Надо почистить эту ветку "и сразу польется вода".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Устройство впервые подключается к свежеустанрвленой винде 10ке. Такие условия эксперимента. Ставится винусб 10шны... да хоть какой. Не откликается. Как исправить я писал. Ждём, пока микрософт не поправит. А пока чиним что поставилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, GenaSPB сказал:

У меня даже единственный с виндами после автоопределения не работает

Но у меня же с одним интерфейсом работает. Я что-то делаю не так?

8 часов назад, GenaSPB сказал:

Как исправить я писал. Ждём, пока микрософт не поправит

или, может, у меня работает потому, что уже поправили?

11 часов назад, GenaSPB сказал:

Проблемы у dfu-util со множеством дескрипторов совместно с DFU начинаются если его номер больше чем девять

Номер интерфейса или номер дескриптора, считая и все дескрипторы вроде CDC Call Management?

 

Я же не чтоб придраться... У миллионов хомячков обновлялка из примеров STM как-то работает и про замену драйверов в ее описании я при беглом просмотре не нашел ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оговорился. Номер интерфейса.

5 minutes ago, Сергей Борщ said:

меня работает потому, что уже поправили?

Как раз это и не работало на update 20H2 свежепоставленой. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обновлялке из примеров стм требуется драйвер от производителя. Ставится вместе с соответствующим софтом из инствляшки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обновились dfu-util.
Теперь работает с автоматически установившимся по WCID WinUSB драйвером в Windows 10

http://dfu-util.sourceforge.net/releases/dfu-util-0.10-binaries.tar.xz

 

зы: речь про проблему отсюда:

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... у меня бинарник не запрограммировать... но хоть опозначать начал.
Хотя я сейчас и в этом не уверен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

месяц назад у меня 0.10 тоже не работал из-за ошибки 101. Думал более свежее, уже с устраненной ошибкой вышло 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрав параметр --device xxxx:xxxx получил возможность шить и читать устройство. Так же, dfu-util 0.10 и обновоишаяся до 21H1 винда теперь ставит WINUSB по WCID и все работает (но пока в случае единственного интерфейса). Compound Drvice по прежнему раьотает тольок после перестановки драйвера на не-WCID. Надо проверять на чистой винде....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...