Performing Device Firmware Upgrade in the nRF Connect SDK examples

The following examples for the development kits from Nordic Semiconductor support over-the-air Device Firmware Upgrade:

Currently, the Bluetooth LE is the only available transport for performing the DFU operation and it uses Simple Management Protocol. The upgrade can be done either using a smartphone application or a PC command line tool.

Device Firmware Upgrade using smartphone

To upgrade your device firmware over Bluetooth LE using smartphone, complete the following steps:

  1. Install one of the following applications on your smartphone:

  2. Push Button 1 on the device to enable the software update functionality.

  3. Push Button 4 on the device to start the Bluetooth LE advertising.

  4. Follow the instructions about downloading the new image to a device on the FOTA upgrades page in the nRF Connect documentation.

Device Firmware Upgrade using PC command line tool

To upgrade your device firmware over Bluetooth LE, you can use the PC command line tool provided by the mcumgr project.

WARNING: mcumgr tool using Bluetooth LE is available only for Linux and macOS systems. On Windows, there is no support for Device Firmware Upgrade over Bluetooth LE yet.

Complete the following steps to perform DFU using mcumgr:

  1. Install the tool by following the mcumgr command line tool installation instructions.
  2. Push Button 1 on the device to enable software update functionality.
  3. Push Button 4 on the device to start the Bluetooth LE advertising.

NOTE: In all of the commands listed in the following steps, replace ble-hci-number with the Bluetooth hci integer value (for example, 0) and ble-device-name with the CHIP device name advertised over Bluetooth LE (for example, MatterLock).

  1. Upload the firmware image to the device by running the following command in your example directory:

    $ sudo mcumgr --conntype ble --hci ble-hci-number --connstring peer_name='ble-device-name' image upload build/zephyr/app_update.bin
    

    The operation can take few minutes. Wait until the progress bar reaches 100%.

  2. Obtain the list of images present in the device memory by running following command:

    $ sudo mcumgr --conntype ble --hci ble-hci-number --connstring peer_name='ble-device-name' image list
    

    The displayed output contains the old image in slot 0 that is currently active and the new image in slot 1, which is not active yet (flags field empty):

    Images:
    image=0 slot=0
        version: 0.0.0
        bootable: true
        flags: active confirmed
        hash: 7bb0e909a846e833465cbb44c581cf045413a5446c6953a30a3dcc2c3ad51764
    image=0 slot=1
        version: 0.0.0
        bootable: true
        flags:
        hash: cbd58fc3821e749d3abfb00b3069f98c078824735f1b2a333e8a1579971e7de1
    Split status: N/A (0)
    
  3. Swap the firmware images by calling the following method with image-hash replaced by the image present in the slot 1 hash (for example, cbd58fc3821e749d3abfb00b3069f98c078824735f1b2a333e8a1579971e7de1):

    $ sudo mcumgr --conntype ble --hci ble-hci-number --connstring peer_name='ble-device-name' image test image-hash
    

    You can observe that the flags: field in the image for slot 1 changes value to pending:

    Images:
    image=0 slot=0
        version: 0.0.0
        bootable: true
        flags: active confirmed
        hash: 7bb0e909a846e833465cbb44c581cf045413a5446c6953a30a3dcc2c3ad51764
    image=0 slot=1
        version: 0.0.0
        bootable: true
        flags: pending
        hash: cbd58fc3821e749d3abfb00b3069f98c078824735f1b2a333e8a1579971e7de1
    Split status: N/A (0)
    
  4. Reset the device with the following command to let the bootloader swap images:

    $ sudo mcumgr --conntype ble --hci ble-hci-number --connstring peer_name='ble-device-name' reset
    

    The device is reset and the following notifications appear in its console:

    *** Booting Zephyr OS build zephyr-v2.5.0-1101-ga9d3aef65424  ***
    I: Starting bootloader
    I: Primary image: magic=good, swap_type=0x2, copy_done=0x1, image_ok=0x1
    I: Secondary image: magic=good, swap_type=0x2, copy_done=0x3, image_ok=0x3
    I: Boot source: none
    I: Swap type: test
    

    Swapping operation can take some time, and after it completes, the new firmware is booted.

Visit the mcumgr image management section to get familiar with all image management commands supported by the tool.