Tinyuf2
UF2 bootloader based on TinyUSB for embedded devices such as ESP32S2, STM32F4 and iMX RT10xx
Install / Use
/learn @adafruit/Tinyuf2README
TinyUF2 Bootloader
This repo is cross-platform UF2 Bootloader projects for MCUs based on TinyUSB
.
├── apps # Useful applications such as self-update, erase firmware
├── lib # Sources from 3rd party such as tinyusb, mcu drivers ...
├── ports # Port/family specific sources
│ ├── espressif
│ │ └── boards/ # Board specific sources
│ │ └── Makefile # Makefile for this port
│ └── mimxrt10xx
├── src # Cross-platform bootloader sources files
Features
Supported features are
- Double tap to enter DFU, reboot to DFU and quick reboot from application
- DFU with MassStorage (MSC)
- Self update with uf2 file
- Indicator: LED, RGB, TFT
- Debug log with uart/swd
Not all features are implemented for all MCUs, following is supported MCUs and its feature
| MCU | MSC | Double Reset | Self-update | Write Protection | Neopixel | TFT | |:------------| :--: | :----------: |:-----------:| :--------------: |:--------:| :--: | | ESP32 S2/S3 | ✔ | Need RC | ✔ | | ✔ | ✔ | | K32L2 | ✔ | ✔ | | | | | | LPC55 | ✔ | ✔ | | | ✔ | | | iMXRT | ✔ | ✔ | ✔ | | ✔ | | | STM32F3 | ✔ | ✔ | ✔ | ✔ | ✔ | | | STM32F4 | ✔ | ✔ | ✔ | ✔ | ✔ | | | STM32H5 | ✔ | ✔ | ✔ | ✔ | | |
Supported MCUs and Boards
Please refer to supported boards for the complete list of supported MCUs and boards.
Build and Flash
Following is generic compiling information. Each port may require extra set-up and slight different process e.g esp32s2 require ESP-IDF.
Clone
Clone this repo with its submodule
git clone git@github.com:adafruit/tinyuf2.git tinyuf2
cd tinyuf2
git submodule update --init
Compile
Firstly we need to get all submodule dependency for our board using tools/get_deps.py script with either family input or using --board option. You only need to do this once for each family
python tools/get_deps.py stm32f4
python tools/get_deps.py --board feather_stm32f405_express
To build this for a specific board, we need to change current directory to its port folder
cd ports/stm32f4
Then compile with all target:
make BOARD=feather_stm32f405_express all
Flash
flash target will use the default on-board debugger (jlink/cmsisdap/stlink/dfu) to flash the binary, please install those support software in advance. Some board use bootloader/DFU via serial which is required to pass to make command
make BOARD=feather_stm32f405_express flash
If you use an external debugger, there is flash-jlink, flash-stlink, flash-pyocd which are mostly like to work out of the box for most of the supported board.
Debug
To compile for debugging add DEBUG=1, this will mostly change the compiler optimization
make BOARD=feather_stm32f405_express DEBUG=1 all
Log
Should you have an issue running example and/or submitting an bug report. You could enable TinyUSB built-in debug logging with optional LOG=.
- LOG=1 will print message from bootloader and error if any from TinyUSB stack.
- LOG=2 and LOG=3 will print more information with TinyUSB stack events
make BOARD=feather_stm32f405_express LOG=1 all
Logger
By default log message is printed via on-board UART which is slow and take lots of CPU time comparing to USB speed. If your board support on-board/external debugger, it would be more efficient to use it for logging. There are 2 protocols:
LOGGER=rtt: use Segger RTT protocol- Cons: requires jlink as the debugger.
- Pros: work with most if not all MCUs
- Software viewer is JLink RTT Viewer/Client/Logger which is bundled with JLink driver package.
make BOARD=feather_stm32f405_express LOG=2 LOGGER=rtt all
