Firmware modules and sticks on Silicon Labs chips

Hint

If the bootloader is already present (the module has been pre-flashed), you can proceed to Write the main firmware.

Flashing the bootloader

The bootloader is flashed through the JTAG interface.

Unpack the archive and run the utility. If the flashing procedure is performed with a Silicon Labs debug board, then the Kit window should display information about it, for example:

Kit:                EFR32xG21 2.4 GHz Mesh Network Kit
                                     WSTK6006 Rev. B04
Firmware version:                           1v3p4b1088
JLink serial number:                               ...
VCOM port:                                     ttyACM1

To flash the bootloader, open the Flash tab, select the desired file for flashing with the Browse… button and flash the bootloader with the Flash button.

Writing the main firmware

If the bootloader is already written to the microcontroller, you can update the firmware with the utility Elelabs EZSP Firmware Update Utility.

Installing the utility:

git clone https://github.com/Elelabs/elelabs-zigbee-ezsp-utility.git
cd elelabs-zigbee-ezsp-utility

Create a Python virtual environment:

python3 -m venv .venv
source .venv/bin/activate

Hint

You may need to install the python3-venv package with the command apt install python3-venv.

Installing dependencies:

pip3 install -r requirements.txt

Set the device to be flashed in bootloader mode.

Hint

To switch to bootloader mode, see the device documentation: Zigbee USB sticks and Zigbee modules PCBA.

Check the connection to the board using the command:

python3 Elelabs_EzspFwUtility.py probe -p <PORT>

where PORT is the name of the serial port to which the board is connected, for example /dev/ttyUSB0.

Example output of the program in loader mode:

2021/12/01 01:01:01 Elelabs_EzspFwUtility:   EZSP adapter in bootloader mode detected:
2021/12/01 01:01:01 Elelabs_EzspFwUtility:   Gecko Bootloader v1.12.00

To update the firmware, use the command:

python3 Elelabs_EzspFwUtility.py flash -f <FW_FILE> -p <PORT>

where

  • FW_FILE - firmware file, for example ncp-uart-sw.gbl.

  • PORT - the name of the serial port to which the board is connected, for example /dev/ttyUSB0.

Approximate program output:

2021/12/01 01:01:01 Elelabs_EzspFwUtility:   EZSP adapter in bootloader mode detected:
2021/12/01 01:01:01 Elelabs_EzspFwUtility:   Gecko Bootloader v1.12.00
2021/12/01 01:01:01 Elelabs_EzspFwUtility:   Allready in bootloader mode. No need to restart
2021/12/01 01:01:02 Elelabs_EzspFwUtility:   Successfully restarted into X-MODEM mode! Starting upload of the new firmware... DO NOT INTERRUPT(!)
.....
2021/12/01 01:01:52 Elelabs_EzspFwUtility:   Firmware upload complete
2021/12/01 01:01:52 Elelabs_EzspFwUtility:   Rebooting NCP...
2021/12/01 01:01:57 Elelabs_EzspFwUtility:   Generic EZSP adapter detected:
2021/12/01 01:01:57 Elelabs_EzspFwUtility:   Firmware: 6.9.2-0
2021/12/01 01:01:57 Elelabs_EzspFwUtility:   EZSP v8

After successful flashing if you check the board status:

python3 Elelabs_EzspFwUtility.py probe -p /dev/ttyUSB0

It will be taken out:

2021/12/01 01:01:57 Elelabs_EzspFwUtility:   Generic EZSP adapter detected:
2021/12/01 01:01:57 Elelabs_EzspFwUtility:   Firmware: 6.9.2-0
2021/12/01 01:01:57 Elelabs_EzspFwUtility:   EZSP v8