Z-Wave.Me Programmer is a full featured programming tool for development, testing, production and production testing of IoT devices based on Z-Wave, Zigbee, Thread and BLE protocols.
The Z-Wave.Me programmer can flash the following families of chips from Silicon Labs. For more detailed and accurate information, use Chip support:
The Z-Wave.Me Programmer package inclides:
The front panel of the programmer has one programming port an with IDC-10 male 10-pins (2x5) connector with pitch 2.54 mm.
On the top panel there is a status LED and a programming button
The back panel has the USB-C port. This port is used to power the programmer (in autonomous mode) and to flash and upload fimwares in the programmer when connected to a PC.
In addition the programmer has two RP-SMA female connectors for 868/916 MHz (for Z-Wave) and 2.4 GHz antennas (for Zigbee, Thread and BLE). Those antennas are used for production test and as an RF sniffer.
The programming cable connector has IDC-10 female connector on one side. On the other side it should be adjusted to your device depending on the programming pads on the PCB. The programmer port is also compatible with the Tag Connect TC2050-IDC cable.
❗ It is important to keep the programming cable length as short as possible. The SWD and SWD/UART protocols used to program chips run on a very high speed.
Programming port pinout:
Chip programming requires only SWDIO, SWCLK, RESET and GND. If power is not provided to the chip, VCC is also needed.
When connected thru USB the programmer provides 4 COM-ports (appears as ttyUSB0-4 on Linux). Ports of the programmer:
Port |
Description |
---|---|
ttyUSB0 |
Z-Wave controller |
ttyUSB1 |
Z-Wave sniffer (PTI) |
ttyUSB2 |
Programming interface and Zigbee controller |
ttyUSB3 |
Zigbee sniffer (PTI) |
The status LED shows the programmer current status and operation progress
LED status |
Visualized |
Description |
---|---|---|
Stady green |
●●●● |
Ready |
Blinking red |
●○●○ |
Error flashing |
Yellow blinking |
●○●○ |
Flahing in progress |
Off |
○○○○ |
Programmer is not powered |
The programming button can be used to start flashing in autonomous mode.
The programmer software has multiple functions.
Get the list of available commands:zme_prog7 -h
Get specific parameters for each command:zme_prog7 <command> -h
Common options for most commands:
Option |
Description |
Values |
---|---|---|
-d |
Device file (Unix) or COM-port (Windows) |
/dev/ttyUSB2 |
-b |
Baud rate - it is not necessary to indicate there is an auto search for the required speed |
230400, 460800, 921600 |
Show programmer device information:zme_prog7 info -d DEVICE [-b BAUDRATE]
Shows information about the chip connected via 'swd' to the programmer:zme_prog7 chipInfo -d DEVICE [-b BAUDRATE]
Displays a list of chips that you can work with. If you do not specify [-d DEVICE]
it will display chips supported by zme_prog7
:zme_prog7 chipSupport [-d DEVICE] [-b BAUDRATE]
Prints firmware encryptioin keys in the programmer:zme_prog7 keys -d DEVICE [-b BAUDRATE]
Loads firmware encryptioin keys in the programmer:zme_prog7 loadKey -d DEVICE [-b BAUDRATE] [-i SLOT_INDEX] package
Option |
Description |
Values |
Default |
---|---|---|---|
-i |
Slot index |
0 ... |
0 |
Remove firmware encryption key from the programmer:zme_prog7 clearKey -d DEVICE [-b BAUDRATE] [-i SLOT_INDEX]
Option |
Description |
Values |
Default |
---|---|---|---|
-i |
Slot index |
0 ... |
0 |
List occupied slots and free memory of the programmer:zme_prog7 slots -d DEVICE [-b BAUDRATE]
Update the programmer firmware using a file in .pkzme format:zme_prog7 update -d DEVICE [-b BAUDRATE] filename
Update the programmer secure engine firmware using a file in .pkzme format:zme_prog7 update_se -d DEVICE [-b BAUDRATE] filename
Update the programmer bootloader using a file in .pkzme format:zme_prog7 update_bootloader -d DEVICE [-b BAUDRATE] filename
Load a license string in the programmer:zme_prog7 lic -d DEVICE [-b BAUDRATE] license
Set max programming count for custom (non Z-Wave.Me) firmwares:zme_prog7 count_custom -d DEVICE [-b BAUDRATE] [-c count_current] [-cm count_max] key
Option |
Description |
Values |
Default |
---|---|---|---|
-c |
Current programming counter |
0 ... 16777215 |
0 |
-cm |
Max programming counter |
0 ... 16777215 |
Load a file in .pkzme format in a specific slot:zme_prog7 loadImage -d DEVICE [-b BAUDRATE] [-i SLOT_INDEX] filename
Option |
Description |
Values |
Default |
---|---|---|---|
-i |
Slot index |
0 ... |
New slot is created |
Create a new slot of a specific size:zme_prog7 push -d DEVICE [-b BAUDRATE] -s SIZE
In most cases this is not needed as loadImage
command will create a new slot with the required size. Use this command if you develop and want to allocate a slot to reload the re-compiles image keeping the same slot index.
Option |
Description |
Values |
Default |
---|---|---|---|
-s |
Slot size in bytes |
0 ... |
Erase all slots and factory reset the programmer:zme_prog7 reset -d DEVICE [-b BAUDRATE]
Flash the connected device using slots:zme_prog7 app -d DEVICE [-b BAUDRATE] [-fi FIRMWARE_INDEX] [-bi BOOTLOADER_INDEX] [-ki KEY_INDEX] [-bri BOOTLOADER_RAM_INDEX] [-chip CHIP] [-sei SEI_INDEX] [-o {DSK}] [-u USER_DATA]
Option |
Description |
Values |
Default |
---|---|---|---|
-fi |
Firmware slot index |
0 ... |
|
-bi |
Bootloader slot index |
0 ... |
|
-bri |
Bootloader RAM slot index |
0 ... |
|
-sei |
Secure Engine slot index |
0 ... |
|
-ki |
Key slot index |
0 ... |
|
-o DSK |
Let the programmer to generate the Z-Wave DSK for the device (requires support in the firmware flashed) |
||
-o NO_LOCK |
Don't lock the chip after flashing. Works only if the firmare was loaded in the programmer unencrypted |
||
-u |
Defines special user data as a hex-encoded string (requires support in the firmware flashed). This date is written and can be accessed from inside the firmware in flash address 0x0FE00000 (size is 0x800 bytes for ZGM130/EFR32ZG13 and 0x400 bytes for ZGM230/EFR32ZG23/EFR32MG21/MGM21) |
Load the OTA upgrade key in the connected device:zme_prog7 loadOTAKey [-token_encrypt TOKEN_ENCRYPT] [-token_sign TOKEN_SIGN] -d DEVICE [-b BAUDRATE] [-chip CHIP]
OTA keys are generated using the Silicon Labs Simplicity Studio:
commander.exe gbl keygen --type keygen --type aes-ccm -o encrypt.key
commander.exe gbl keygen --type ecc-p256 --outfile sign.key
Option |
Description |
Values |
Default |
---|---|---|---|
-token_encrypt |
Path to the encrypt.key file |
||
-token_sign |
Path to the sign.key file |
Flash a binary file in .bin or .hex format into the connected device:zme_prog7 flash [-addr ADDRESS] -d DEVICE [-b BAUDRATE] [-chip CHIP] filename
Option |
Description |
Values |
Default |
---|---|---|---|
-addr |
Address to write to in bytes |
0 ... |
Read the flash memory of the connected device:zme_prog7 flash_read [-addr ADDRESS] [-len LENGHT] [-o OUT_FILE] -d DEVICE [-b BAUDRATE] [-chip CHIP]
Option |
Description |
Values |
Default |
---|---|---|---|
-addr |
Address to read from in bytes |
0 ... |
|
-len |
Length of the data to be read in bytes |
1 ... |
|
-o |
Out file |
Valid file name |
Write to the flash memory of the connected device:zme_prog7 flash_write [-addr ADDRESS] [-data DATA] -d DEVICE [-b BAUDRATE] [-chip CHIP]
Option |
Description |
Values |
Default |
---|---|---|---|
-addr |
Address to write to in bytes |
0 ... |
|
-data |
Data to be written as a hex string |
Hex string |
Erase the flash memory page in the connected device:zme_prog7 pageerase [-addr ADDRESS] [-len LENGHT] -d DEVICE [-b BAUDRATE] [-chip CHIP]
Option |
Description |
Values |
Default |
---|---|---|---|
-addr |
Address of the area to be erased |
0 ... |
|
-len |
Length of the area to be erased |
1 ... |
Full flash erase in the connected device:zme_prog7 masserase -d DEVICE [-b BAUDRATE] [-chip CHIP]
Checks if the connected device is locked:zme_prog7 isLocked -d DEVICE [-b BAUDRATE] [-chip CHIP]
Lock the connected device :zme_prog7 lock -d DEVICE [-b BAUDRATE] [-chip CHIP]
Unlocks the connected device:zme_prog7 unlock -d DEVICE [-b BAUDRATE] [-chip CHIP]
The flash content is fully erased during this operation (in some chips bootloader and Secure Engine content is not erased)
Set the UART Serial API speed:zme_prog7 uart_sapi [-new NEW] [-b BAUDRATE] -d DEVICE
Set the speed of communications with the programmer. Higher speed requires good USB cable.
Option |
Description |
Values |
Default |
---|---|---|---|
-n |
New port speed in bits/s |
9600..921600 |
230400 |
Set the SWD speed:zme_prog7 swd_set [-new NEW] [-b BAUDRATE] -d DEVICE
This speed is used to flash via SWD the special UART boot firmware (provided by the programmer). Once flashed, the programmer will switch to this UART to load the target firmware to the device. Higher speed requires short cable.
Option |
Description |
Values |
Default |
---|---|---|---|
-n |
New port speed in bits/s |
1024000..19000000 |
1024000 |
Set the UART SWD speed:zme_prog7 uart_swd_set [-new NEW] [-b BAUDRATE] -d DEVICE
This speed is used to flash via UART the target firmware special. This step comes after flashing the special UART firmware (provided by the programmer). Higher speed requires short cable.
Option |
Description |
Values |
Default |
---|---|---|---|
-n |
New port speed in bits/s |
960000..2500000 |
960000 |
Set time in the programmer to system time:zme_prog7 rtc_set -d DEVICE [-b BAUDRATE]
This command should be used on each power on if the programmer have no battery inserted. To preserve the time without power, the battery should be inserted.
This programmer is a very powerful tool. Below you can find the typical use cases.
When developing, one typically want to flash the Secure Engine firmware (should be done once), the bootloader and the firmware. Here is an example:
zme_prog7 flash s2c1_se_firmware.hex -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
zme_prog7 masserase -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
zme_prog7 loadOTAKey -token_encrypt ota_encrypt.key -token_sign ota_sign.key -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
zme_prog7 flash bootloader.hex -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
zme_prog7 flash firmware.hex -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
Secure Engine bootloader is typically taked from SiLabs git. If the connected device is based on a chip that does not have a Secure Engine, skip the step with loading Secure Engine firmware.
The bootloader and the firmware are compiled using the Simplicity Studio.
You can load files in the programmer, set the flash counter with the license and send it to the factory for production.
.pkzme files are encrypted and can be safely sent over the internet.
Data in slots can not be extracted back from the programmer. This ensures your intellectual property safety keeping things simple for the factory.
zme_prog7 reset -d /dev/ttyUSB2
zme_prog7 loadImage BootloaderRam.pkzme -d /dev/ttyUSB2
zme_prog7 loadImage Bootloader.pkzme -d /dev/ttyUSB2
zme_prog7 loadImage Firmware.zwaveme.pkzme -d /dev/ttyUSB2
zme_prog7 loadImage s2c1_se_firmware.zwaveme.pkzme -d /dev/ttyUSB2
zme_prog7 loadImage ota_key.pkzme -d /dev/ttyUSB2
On the factory use app command to flash each device.
The factory will use the following command to flash each device.
zme_prog7 app -bri 0 -bi 1 -fi 2 -sei 3 -ki 4 -c EFR32MG21A020F1024IM32 -d /dev/ttyUSB2
The license sets the number of allowed flash operations (flash counter). This ensures the factory can't produce more devices you ordered. Always have 10% extra count for rework on the factory side.
Data in slots is encrypted and can not be extracted from the programmer. This ensures your intellectual property safety keeping things simple for the factory.
zme_prog7 lic EB6BEEAC1A07D48BA24FF0AC6...C7 -d /dev/ttyUSB2
Upgrade to the latest programmer firmware:
zme_prog7 update -d /dev/ttyUSB2 Programmer_EFR32MG21.programmer.pkzme
Sometimes you might need to update the Secure Engine and the bootloader too:
zme_prog7 update_bootloader -d /dev/ttyUSB2 Programmer_EFR32MG21_bootloader.programmer.pkzme
zme_prog7 update_se -d /dev/ttyUSB2 Programmer_EFR32MG21_SE.programmer.pkzme
zme_prog7 update -d /dev/ttyUSB2 Programmer_EFR32MG21.programmer.pkzme
Voltage | 5 V USB-C |
Max current | TBD |
Operating temperature | 5°C … +50°C |
Dimensions | 90 x 50 x 25 mm |
Weight | 50 g |
Communication interfaces |
USB (4 virtual serial ports) Z-Wave (wireless) Zigbee/Thread/802.15.4/BLE (wireless) SWD |
Z-Wave frequency |
865...869 MHz: Europe (EU), India (IN), Russia (RU), China (CN), South Africa (EU), Middle East (EU) 908...920 MHz: America, excluding Brazil and Peru (US), Israel (IL) 919...921 MHz: Australia / New Zealand / Brazil / Peru (ANZ), Hong Kong (HK), Japan (JP), Taiwan (TW), Korea (KR) |
Zigbee/Thread frequency | 2405...2480 MHz |
BLE frequency | 2402...2480 MHz |
Problem | Programming fails immediately of a while after starting |
Cause | The programming cable is too long |
Solution | Reduce the cable length or slow down the programming speed using swd_set -new |
Problem | The software tool can't communicate with the programmer |
Cause | Bad cable or wrong port selected |
Solution | Check the USB cable. Use the 3rd port out of 4 ports (/dev/ttyUSB2 on Linux) |
Problem | The clock is not correct in the programmer after power cycle |
Cause | The battery is not installed in the programmer |
Solution | Insert the coin-cell CR2032 battery |
Problem | No RF emission in radio test mode |
Cause | Wrong channel is selected |
Solution | Make sure to select the correct Z-Wave, Zigbee or BLE channel |
Problem | |
Cause | |
Solution |
Software requirements: TBD
Date |
Author |
Changes |
---|---|---|
2023.06.20 |
Poltorak Serguei |
Initial version |