Jump to content

    

stm32 DFU over USB

Всем привет.

я давно знал что начиная с stm32f2 через USB интерфейс можно читать писать микросхему. но руки не доходили. наконецто мне жеско объявили что в девайсе не будет житага и уарта. серийные изделие отавалось програмить по dfu через юсб. пришлось разобратся. также мне изветно было что у стм есть утилитки которые под виндой делает этот функционал. до данного место наверно Всем колегам я нового не расказал.

 

далее возник вопрос а как это делать под нашим любимым линуксом. оказалось как всегда проще простого. люди уже позаботились и ежечасно и еженочно заботтся сдавая комиты в репозитории :) Имется открытая тулза dfu-util (http://dfu-util.gnumonks.org/) wiki (http://www.seeedstudio.com/wiki/Dfu-util)

итак.

1. есть плата с впаяной STM32F4, PA11 PA12 подпаяны к юсб разъему. boot1 накорпус, boot0 подтянут к нулю и может быть перемычкой затянут на +3,3v

2. есть бинарник которы хочется залить. при наличие elf его генерим :

arm-kgp-eabi-objcopy --strip-all  -O binary image.elf image.bin

 

3. втыкаем перемычку boot0 -> 3.3 заставляем грузанутся из системной памяти в корой ST-шный загрузчик

4. С помощью тулзы нарезаем страницы флеша:

klen@klen-desktop:/opt/home/polygon/dfu-util-0.7/src$ ./dfu-util -a 0 --dfuse-address 0x08000000 -D image.bin

dfu-util 0.7

 

Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.

Copyright 2010-2012 Tormod Volden and Stefan Schmidt

This program is Free Software and has ABSOLUTELY NO WARRANTY

Please report bugs to dfu-util@lists.gnumonks.org

 

Opening DFU capable USB device... ID 0483:df11

Run-time device DFU version 011a

Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg"

Claiming USB DFU Interface...

Setting Alternate Setting #0 ...

Determining device status: state = dfuERROR, status = 10

dfuERROR, clearing status

Determining device status: state = dfuIDLE, status = 0

dfuIDLE, continuing

DFU mode device DFU version 011a

Device returned transfer size 2048

No valid DFU suffix signature

Warning: File has no DFU suffix

DfuSe interface name: "Internal Flash "

Downloading to address = 0x08000000, size = 112052

.......................................................

File downloaded successfully

 

5. вытягиваем джампер и ресетим. наслождаемся. в качестве джампера наверно микротактовую кнопку лучше впаять - нажал заресетил отпустил, пертыкать тогда не нада будет.

 

утилитка ничего особого не тянет из системы

klen@klen-desktop:/opt/home/polygon/dfu-util-0.7/src$ ldd ./dfu-util 
    linux-vdso.so.1 =>  (0x00007fff8bb7f000)
    libusb-1.0.so.0 => /usr/local/lib/libusb-1.0.so.0 (0x00007fba65d16000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fba6597e000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fba65775000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fba65557000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fba65f5b000)

 

есть еще в dfu-suffix только я еще непросек нафига оно надо.

отныне dfu-utils будет в моей сборке тулсов как вкусная и полезная витаминная добавка.

 

для сильно обездоленных и страждущих за иноземную веру можно процес прикрутиь к винде. не вижу проблем.

dfu_utils_x86_64.tar.7z

Share this post


Link to post
Share on other sites
...

для сильно обездоленных и страждущих за иноземную веру можно процес прикрутиь к винде. не вижу проблем.

Разрабатываем под linux, а вот устройства иногда эксплуатируются под виндой. У меня с ходу не получилось загрузить по DFU через самосборный dfu-util прошивку =( т.к. dfu-util использует libusb версии 1.0, то под винду приходится собирать с libusbx. libusbx умеет работать через 3 драйвера: libusb0-win32, libusbk и через "супостатский" winusb. Со всеми тремя драйверами dfu-util в процессе заливки ломается в разных местах. Разработчики libusbx предполагают, что проблема где-то в dfu-util. Если вместе разберёмся как под виндой заставить работать dfu-util, то будет очень даже удобно пользоваться одним инструментом и под линь и под вынь.

Share this post


Link to post
Share on other sites
Разрабатываем под linux, а вот устройства иногда эксплуатируются под виндой. У меня с ходу не получилось загрузить по DFU через самосборный dfu-util прошивку =( т.к. dfu-util использует libusb версии 1.0, то под винду приходится собирать с libusbx. libusbx умеет работать через 3 драйвера: libusb0-win32, libusbk и через "супостатский" winusb. Со всеми тремя драйверами dfu-util в процессе заливки ломается в разных местах. Разработчики libusbx предполагают, что проблема где-то в dfu-util. Если вместе разберёмся как под виндой заставить работать dfu-util, то будет очень даже удобно пользоваться одним инструментом и под линь и под вынь.

куда не копнеш везде безнонная дыра...

окзываеццо! libusb-1.0 это уже некошерно, ее разработчики разосрались с маинтейнерами... плюнули им в рожу и сделали форк libusbx. выкачал из репа, собрал libusbx, чтоб все разом незавалилось попробывал статически попересаберёвывать всякую шнягу работающую через usb. вроде работает так же как и на родной для дистра моего линуха libusb-1.0. пересобрал dfu-util, тоже работает не падает. шъет и читает. в аот масдаем еще не пробывал.

 

ps. есть у меня одна теория - если по ходу ДЕЛА нужно обатится к масдаю - переформулируй условия задачи. напримен откажись от этих денег и заработай больше других (больше за счет уменьшения потраченных нервов и тд)! :)

Share this post


Link to post
Share on other sites

Что-то я не понял. Неужели ST никак не позаботился о софте под винду для работы с usb-dfu?

Помнится, что для прошивки по ком-порту были выложены и апноты и исходники...

А по делу - очень полезно, что вы попробовали-таки эту фичу. Спасибо за инфу!

Share this post


Link to post
Share on other sites

Никогда не заморачивался штатными фитюльками производителя. У меня 103-й с USB. Написал (адаптировал) простейший пример для работы как обычная флэшка (занимает около 10 К памяти всего, причем с декодированием). Прошивка изначально кодируется и передается для обновления устройства конечному пользователю в качестве обновления ПО. Он втыкает девайс хоть в виндовый комп, хоть линуксовый и просто переписывает этот файл на получившуюся флэшку.

Так-же был вариант и с подключенным к процу скалеру (RTD2662 от Realtek), в нем стоит свой CPU с выполнением команд из SPI флэши, так при этом имитировалась флэха с двумя дисками. Один для обновления ПО управления, второй для обновления ПО скалера.

 

Да, конечно сначала необходимо зашить загрузчик. Зато потом голова не болит, что прошивку кто-то использует для тиражирования...

И замыкать ничего не надо при обновлении ПО. Просто втыкнуть в USB.

Установка параметров происходит аналогично, только сначала необходимо подать питание устройству - потом втыкнуть USB. Работает уже само приложение и представляется стандартным HID устройством. Работа с ним обеспечивается через SetFeature/GetFeature и не требует установки никаких специальных драйверов.

Или по аналогии с загрузчиком прикидывается так-же флэшкой, только теперь в качестве файла выступает файл параметров устройства.

 

Share this post


Link to post
Share on other sites
Да, конечно сначала необходимо зашить загрузчик. Зато потом голова не болит, что прошивку кто-то использует для тиражирования...

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

 

2_demiurg_spb

есть их виндовые утилитки тока мне они не пришей, я хочу одной во всех системах шить ... хочу и буду.:)

Share this post


Link to post
Share on other sites
Что-то я не понял. Неужели ST никак не позаботился о софте под винду для работы с usb-dfu?

Помнится, что для прошивки по ком-порту были выложены и апноты и исходники...

А по делу - очень полезно, что вы попробовали-таки эту фичу. Спасибо за инфу!

Есть фирменный софт от ST, утилита DfuSe, давно её пользуюсь, работает хорошо.

Вот описание на неё: http://www.st.com/st-web-ui/static/active/.../CD00155676.pdf

Сама утилита недавно лежала на каждой страничке совместимых с ней контроллеров, сейчас её почему-то не вижу...

Если не найдёте, пишите - найду у себя на диске и пришлю.

Share this post


Link to post
Share on other sites

Я малость переделал dfu-util, чтобы работала под виндой.

 

https://github.com/blackyblack/LPC-DfuSe-Bootloader - смотрим по ссылке ридми. Там ссылка на чуть-чуть патченную libusbx (исправляет проблему с композитным устройством в винде), ссылка на чуть-чуть патченную dfu-util (исправляет проблему записи по нулевому адресу), а также прекомпилированные бинарники и образцы драйверов (INFы).

Share this post


Link to post
Share on other sites

а ктото может подсказать консольную программу для преобразования hex в dfu ?

 

шить буду утилитой по ссылке выше

 

но вот делать dfu утилитой что дает st - издевательство какое то.. столько раз мышкой нужно щелкнуть :-(

 

нет ли просто консольного конвертера из hex в dfu ?

Share this post


Link to post
Share on other sites
шить буду утилитой по ссылке выше

нет ли просто консольного конвертера из hex в dfu ?

можно просто bin заливать

dfu-util -v -d 0483:df11 -a 0 -s 0x08000000 -D firmware.bin
или проще:
dfu-util -a 0 -s 0x08000000 -D firmware.bin

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this