Jump to content

    
Сергей Борщ

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

Recommended Posts

Делал достаточно много устройств с 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\INFO@RRT.LV:'
[ 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. В линухе работет, в виндовсе - нет. Сделал композитное устройство - те же яйца, только в профиль. Прошу помощи у участников форума.

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

Share this post


Link to post
Share on other sites

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

 

image.png.a3218268096e400c3c1558ccb9d543cc.png

Edited by GenaSPB

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

 

 

Edited by GenaSPB

Share this post


Link to post
Share on other sites
32 минуты назад, GenaSPB сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 часов назад, GenaSPB сказал:

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

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

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.