portenta h7 firmware update

energyun·2022년 5월 29일
0

zephyr portenta h7

목록 보기
2/3

arduino portenta h7의 부트로더는 MCUboot 기반으로 작성되었다. (git : https://github.com/arduino/mcuboot-arduino-stm32h7.git)

mcuboot는 오픈소스 부트로더로 mcu의 secure boot, boot image 생성, 관리를 포함한다. 다만 펌웨어 업데이트 기능은 추가적으로 작성해주어야 하는데, 관련 예제가 많으니 참고 하면 되겠다. 기본적으로 usb기반의 dfu에 대한 예제는 많이 제공하니 스킵하고, 아두이노에서 추가적으로 Arduino IoT Cloud에서 OTA기능을 수행하기 위한 feature들도 추가된 것을 볼 수 있다.

새로운 어플리케이션을 올리기위해 boot address를 확인해보자. mcuboot-arduino-stm32h7의 define된 BOOT_ADDRESS 매크로를 찾을 수 있었다. 주소값은 0x8040000 으로 사용자 사용자 어플리케이션을 올리기위해서는 해당 주소로 지정해주어야 한다.

Arduino Portenta H7은 기본적으로 USB-DFU를 지원하기 때문에 간단히 dfu-util을 통해 바이너리를 업데이트 할 수 있다.

# debian
sudo apt-get install dfu-utill

# macos
brew install dfu-util

또는

# install from git
git clone git://git.code.sf.net/p/dfu-util/dfu-util

cd dfu-util
./configure
make && sudo make install

dfu-util 설치 후 아두이노를 부트모드로 진입한다. 부트모드는 스위치를 빠르게 두번 누르면 LED가 Dimming 하는 것을 보고 알 수 있다.

dfu-device가 정상적으로 잡히는지 확인하려면 아래와 같이 입력 후 DFU 디바이스가 잡힌 것을 확인 할 수 있다.

$ dfu-util -l
dfu-util 0.11

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 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/

Found DFU: [2341:035b] ver=0200, devnum=1, cfg=1, intf=0, path="2-1", alt=2, name="@Bootloader version 22 /0x00000000/0*4Kg", serial="003700283330XXXXXXXXXXXX"
Found DFU: [2341:035b] ver=0200, devnum=1, cfg=1, intf=0, path="2-1", alt=1, name="@External Flash   /0x90000000/4096*4Kg", serial="003700283330XXXXXXXXXXXX"
Found DFU: [2341:035b] ver=0200, devnum=1, cfg=1, intf=0, path="2-1", alt=0, name="@Internal Flash   /0x08000000/01*128Ka,15*128Kg", serial="003700283330XXXXXXXXXXXX"

아두이노 portenta는 외부플레시 인터페이스를 지원하기 때문에, 어플리케이션의 어드레서 맵핑을 통해 외부플래시에서 프로그램을 실행하도록 설정 할 수 있다.

펌웨어 업데이트용 테스트 어플리케이션 blinky 예제를 빌드하였다. arduino sketch, arduino-cli 모두 상관 없다. arduino IDE를 사용한다면 export binary를 통해 바이너리를 가져오자.

arduino-cli의 경우 프로젝트 폴더에서 아래와 같이 컴파일 한면 바이너리 파일을 가져올 수 있다.

arduino-cli compile --build-path=./build

DFU mode 진입 후 아래 커맨드 실행

dfu-util --device 2341:035b -w -a0 -s 0x08040000:leave -D ./build/blinky.bin
...
Device returned transfer size 4096
DfuSe interface name: "Internal Flash   "
Downloading element to address = 0x08040000, size = 136984
Erase           [=========================] 100%       136984 bytes
Erase    done.
Download        [=========================] 100%       136984 bytes
Download done.
File downloaded successfully
...

다운로드 완료.

0개의 댓글