USB-enabled bootloaders for the nRF52 BLE SoC chips
This is a CDC/DFU/UF2 bootloader for nRF52 boards.
UF2 is an easy-to-use bootloader that appears as a flash drive. You can just copy
.uf2-format application images to the flash drive to load new firmware. See https://github.com/Microsoft/uf2 and https://github.com/adafruit/uf2-samdx1 for more information.
python3if it is not installed already and run this command to install adafruit-nrfutil from PyPi:
$ pip3 install --user adafruit-nrfutil
Clone this repo with following commands, or fork it for your own development
git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader cd Adafruit_nRF52_Bootloader git submodule update --init
There are two pins,
FRSTthat bootloader will check upon reset/power:
Double ResetReset twice within 500 ms will enter DFU with UF2 and CDC support (only works with nRF52840)
DFU = LOWand
FRST = HIGH: Enter bootloader with UF2 and CDC support
DFU = LOWand
FRST = LOW: Enter bootloader with OTA, to upgrade with a mobile application such as Nordic nrfConnect/Toolbox
DFU = HIGHand
FRST = LOW: Factory Reset mode: erase firmware application and its data
DFU = HIGHand
FRST = HIGH: Go to application code if it is present, otherwise enter DFU with UF2
GPREGRETregister can also be set to force the bootloader can enter any of above modes (plus a CDC-only mode for Arduino).
GPREGRETis set by the application before performing a soft reset.
On the Nordic PCA10056 DK board,
DFUis connected to Button1, and
FRSTis connected to Button2. So holding down Button1 while clicking RESET will put the board into USB bootloader mode, with UF2 and CDC support. Holding down Button2 while clicking RESET will put the board into OTA (over-the-air) bootloader mode.
On the Nordic PCA10059 Dongle board,
DFUis connected to the white button.
FRSTis connected to pin 1.10. Ground it to pull
FRSTlow, as if you had pushed an
FRSTbutton. There is an adjacent ground pad.
For other boards, please check the board definition for details.
To create your own UF2 DFU update image, simply use the Python conversion script on a .bin file or .hex file, specifying the family as 0xADA52840. If using a .bin file with the conversion script you must specify application address with the -b switch, this address depend on the SoftDevice size/version e.g S140 v6 is 0x26000
To create a UF2 image from a .bin file:
uf2conv.py firmware.bin -c -b 0x26000 -f 0xADA52840
To create a UF2 image from a .hex file:
uf2conv.py firmware.hex -c -f 0xADA52840
To create a UF2 image for bootloader from a .hex file using separated family of 0xd663823c
uf2conv.py bootloader.hex -c -f 0xd663823c
You can burn and/or upgrade the bootloader with either a J-link or DFU (serial) to a specific pre-built binary version without the hassle of installing a toolchain and compiling the code. This is preferred if you are not developing/customizing the bootloader. Pre-builtin binaries are available on GitHub releases
Note: The bootloader can be downgraded. Since the binary release is a merged version of both bootloader and the Nordic SoftDevice, you can freely upgrade/downgrade to any version you like.
You should only continue if you are looking to develop bootloader for your own. You must have have a J-Link available to "unbrick" your device.
make BOARD=feather_nrf52840_express all
To flash the bootloader with JLink:
make BOARD=feather_nrf52840_express flash
To upgrade the bootloader using DFU Serial via port /dev/ttyACM0
make BOARD=feather_nrf52840_express SERIAL=/dev/ttyACM0 dfu-flash
To flash SoftDevice (and chip erase):
make BOARD=feather_nrf52840_express sd
For the list of supported boards, run
$ make You must provide a BOARD parameter with 'BOARD=' Supported boards are: feather_nrf52840_express feather_nrf52840_express pca10056 Makefile:90: *** BOARD not defined. Stop
arm-none-eabi-gcc: No such file or directory
If you get the following error ...
$ make BOARD=feather_nrf52840_express all Compiling file: main.c /bin/sh: /usr/bin/arm-none-eabi-gcc: No such file or directory make: *** [_build/main.o] Error 127
... you may need to pass the location of the GCC ARM toolchain binaries to
makeusing the variable
$ make CROSS_COMPILE=/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi- BOARD=feather_nrf52832 all
ModuleNotFoundError: No module named 'intelhex'
Install python-intelhex with
pip install intelhex
make: nrfjprog: No such file or directory
Make sure that
nrfjprogis available from the command-line. This binary is part of Nordic's nRF5x Command Line Tools.