xintrea 0 8 апреля, 2022 Опубликовано 8 апреля, 2022 (изменено) · Жалоба Привет, народ. Пытаюсь разобраться как прошивать плату STM32F103C8T6 (Blue Pill) по miniUSB-кабелю. Свои изыскания я записываю здесь: Как прошивать Blue Pill STM32 F103 через обычный USB-кабель в Linux Затык происходит на том, что я прошиваю DFU-бутлоадер в плату, плата становится видна по USB: [25760.232130] usb 2-2: new full-speed USB device number 7 using xhci_hcd [25760.385437] usb 2-2: New USB device found, idVendor=1eaf, idProduct=0004, bcdDevice= 2.00 [25760.385444] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [25760.385447] usb 2-2: Product: Maple [25760.385449] usb 2-2: Manufacturer: LeafLabs [25760.424009] cdc_acm 2-2:1.0: ttyACM0: USB ACM device [25760.424307] usbcore: registered new interface driver cdc_acm [25760.424310] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters Однако утилита dfu-util (версии 0.9) ни одной платы не видит. И версия 0.8 тоже не видит: > dfu-util --list dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Пробовал давать команду с указанием id-шников устройства: dfu-util -d 1eaf:0004 --list так тоже DFU-устройство не обнаруживается. Пробовал и под рутом, и от обычного пользователя, хотя DBUS правило для доступа пользователем прописывается при установке пакета dfu-util (Debian Linux 11). Что еще нужно донастроить, чтобы увидеть DFU-устройство? Изменено 8 апреля, 2022 пользователем xintrea Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 9 апреля, 2022 Опубликовано 9 апреля, 2022 (изменено) · Жалоба А с чего бы DFU-util вдруг "увидел" STM32F103, если этот МК не умеет DFU? Да там даже встроенной подтяжки USB нет! И dmesg подтверждает, что ничего не появилось, кроме какого-то CDC, который вообще к делу отношения не имеет. Если хочешь прошить через USART-бутлоадер, используй утилиту stm32flash. UPD: почитал изыскания по ссылке. Теперь понятно: прошитый загрузчик либо работает со своим протоколом и инициировать его нужно через терминал по CDC, либо же это - вообще никакой не DFU! Т.к. был бы DFU, dmesg показал бы подключение DFU устройства. Есть исходники того, что ты туда прошил? Изменено 9 апреля, 2022 пользователем Eddy_Em Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 9 апреля, 2022 Опубликовано 9 апреля, 2022 · Жалоба 13 часов назад, xintrea сказал: Что еще нужно донастроить, чтобы увидеть DFU-устройство? врядли этот бутлоадер поддерживает dfu. попробуйте для проверки sudo minicom -D /dev/ttyACM0 если по вашей ссылке подняться на два уровня выше, то там будет README.md, в котором сказано: Цитата Bootloader for STM32F103 boards, for use with the Arduino_STM32 repo and the Arduino IDE т.е. ставите "Arduino IDE" и там смотрите в настройках как рулить таргетом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xintrea 0 9 апреля, 2022 Опубликовано 9 апреля, 2022 · Жалоба 49 minutes ago, Jury093 said: врядли этот бутлоадер поддерживает dfu И все-таки поддерживает. Я разобрался в чем дело было. Чтобы включился DFU-режим, надо поставить джампера boot в недокументированное состояние: boot0=0, boot=1. Этот момент уже просили добавить в документацию/описание, но автор делать этого почему-то не стал: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/issues/90 После этого плата по USB (после нажатия Reset и перетыкания в USB-генезде) начинает видиться по-другому: [ 4304.984940] usb 2-2: new full-speed USB device number 35 using xhci_hcd [ 4305.133726] usb 2-2: New USB device found, idVendor=1eaf, idProduct=0003, bcdDevice= 2.01 [ 4305.133733] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 4305.133735] usb 2-2: Product: Maple 003 [ 4305.133738] usb 2-2: Manufacturer: LeafLabs [ 4305.133739] usb 2-2: SerialNumber: LLM 003 И начинает работать dfu-util: > dfu-util --list Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=2, name="STM32duino bootloader v1.0 Upload to Flash 0x8002000", serial="LLM 003" Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=1, name="STM32duino bootloader v1.0 Upload to Flash 0x8005000", serial="LLM 003" Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=0, name="STM32duino bootloader v1.0 ERROR. Upload to RAM not supported.", serial="LLM 003" Однако далее возникает проблема. Длина DFU-загрузчика 0x56fc, значит, если он прописывается во FLASH с 0x8000000, то он будет занимать область вплоть до адреса 0x80056fc. И при этом сам DFU-загрузчик предоставляет возможность прошивать, начиная с адреса 0x8005000. Вот это как понимать? Получается, что сам себе затрет хвост. Или я чего-то не догоняю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 9 апреля, 2022 Опубликовано 9 апреля, 2022 · Жалоба 6 часов назад, Eddy_Em сказал: И dmesg подтверждает, что ничего не появилось, кроме какого-то CDC, который вообще к делу отношения не имеет. Вот dmesg моего устройства: [516667.339860] usb 1-1.2: new full-speed USB device number 27 using ehci-pci [516667.450691] usb 1-1.2: New USB device found, idVendor=16c0, idProduct=05e1, bcdDevice= 1.00 [516667.450700] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [516667.450702] usb 1-1.2: Product: [затерто] [516667.450704] usb 1-1.2: Manufacturer: [и здесь затерто]. (www.[тоже затерто].com) [516667.450706] usb 1-1.2: SerialNumber: 1 [516667.451366] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device [516667.451707] cdc_acm 1-1.2:1.2: ttyACM1: USB ACM device Тем не менее это устройство умеет DFU вот прямо так, без джамперов и перетыканий. С линуксовой dfu-util "из коробки", с виндовой после небольшой пляски с zadig. И все строго в соотвествии с "Universal Serial Bus Device Class Specification for Device Firmware Upgrade Version 1.1 Aug 5, 2004". А вот его lsusb -d 16c0:05e1 -vv: Скрытый текст Bus 001 Device 031: 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 1.00 iManufacturer 1 [затерто]. (www.[тоже затерто].com) iProduct 2 [и здесь затерто] iSerial 3 1 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x009f bNumInterfaces 5 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 500mA 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 Association: bLength 8 bDescriptorType 11 bFirstInterface 2 bInterfaceCount 2 bFunctionClass 2 Communications bFunctionSubClass 2 Abstract (modem) bFunctionProtocol 0 iFunction 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 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 3 CDC ACM: bmCapabilities 0x02 line coding and serial state CDC Union: bMasterInterface 2 bSlaveInterface 3 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 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 3 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 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 0x83 EP 3 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 4 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 53 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) Да, там не F103, а L083, F072, F042, F107, F407, но в первых трех USB такой же, как у F103 не считая встроенной подтяжки. DFU в Run-time mode не показывается в линухе. И в винде не должно (согласно спецификации DFU), но у винды свое представление о прекрасном. Вы который раз уже "машете шашкой" в темах, в которых, мягко говоря, плаваете. Постарайтесь сдерживать себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xintrea 0 9 апреля, 2022 Опубликовано 9 апреля, 2022 (изменено) · Жалоба 3 hours ago, Jury093 said: попробуйте для проверки sudo minicom -D /dev/ttyACM0 И кстати, при джамперах boot0=0 boot1=0 COM-порт отвечает. Вот что он показывает: Congratulations, you have installed the STM32duino bootloader See https://github.com/rogerclarkmelbourne/STM32duino-bootloader For more information about Arduino on STM32 See https://www.stm32duino.com Осталось только понять, почему загрузчик при заливке программы перетирает свой хвост. * * * UPD: Похоже, начал понимать что происходит. Образ предкомпиленного DFU-bootloaderа на самом деле не чистый DFU-bootloader, а DFU-bootloader + программа эмуляции COM-порта на USB. Сам DFU-butloader имеет длинну примерно 0x1c00. А программа эмуляции COM-порта начинается со смещения 0x2000. и тянется до 0x56fc. То есть, DFU-bootloader не имеет двух режимов. То, на что я наткнулся вначале и думал что является вторым режимом (при обоих boot джамперов в нуле) - это на самом деле просто работа программы эмуляции COM-порта. Получается, что для заливки программы можно пользоваться даже устройством Upload to Flash 0x8002000, не обязательно даже Upload to Flash 0x8005000, все равно никакой хвост загрузчика затираться не будет. "Чистый" DFU-загрузчик лежит не в каталоге /binaries, а в каталоге /bootloader_only_binaries. То есть, для платы STM32F103C8T6 ссылка на DFU-бутлоадер в данном проекте будет такой: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/blob/master/bootloader_only_binaries/generic_boot20_pc13.bin * * * Теперь осталось разобраться, как компилировать программы с начальным адресом 0x8002000 вместо классических 0x8000000, и можно будет проверять заливку по DFU. Изменено 9 апреля, 2022 пользователем xintrea Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 9 апреля, 2022 Опубликовано 9 апреля, 2022 (изменено) · Жалоба 1 hour ago, Сергей Борщ said: DFU в Run-time mode не показывается в линухе. Тогда это - не честный DFU. Советую ввести в режим DFU тот же F072 и посмотреть dmesg: там явно будет обозначено устройство. А в этом самопальном бутлоадере, похоже, нужно какую-то команду дать по CDC и лишь тогда устройство перейдет в режим DFU... P.S. Честно говоря, я вообще не вижу смысла в таких вот чужих бутлоадерах! Одно дело - когда ты воткнул бутлоадер в свою прошивку, чтобы иметь возможность легко обновить ее через USB без необходимости заставлять пользователя подключать USB2USART или st-link. А когда оно само по себе - смысл? Изменено 9 апреля, 2022 пользователем Eddy_Em Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZodiaK 0 9 апреля, 2022 Опубликовано 9 апреля, 2022 · Жалоба для кейла можно юзать типа такого, создавать скаттер файл и подключать его в проект, внутри писать какой необходим адрес для последующей компиляции. ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x00004500 0x40000 { ; load region size_region ER_IROM1 0x00004500 0x40000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00008000 { ; RW data .ANY (+RW +ZI) } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться