Product description

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.

Z-Wave.Me Programmer is able to flash Z-Wave and Zigbee chips by Silicon Labs such as:

Package

The Z-Wave.Me Programmer package inclides:

Connecting

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.

Programming port pinout

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, SWO, RESET and GND. If power is not provided to the chip, VCC is also needed.

COM-ports

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)

Status LED

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

Programming button

The programming button can be used to start flashing in autonomous mode.

Software installation

Usage

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 all commands:

Option

Description

Values

Default

-d

Device file (Unix) or COM-port (Windows)

/dev/ttyUSB2
COM3

-b

Baud rate

9600-921600

230400

-chip

Chip connected to the programmer

ZGM130S037HGN1
ZGM230SA27HGN
ZGM230SB27HGN
EFR32MG21A020F1024IM32
MGM210PA32JIA

ZGM130S037HGN1

Show info

Show programmer device information:
zme_prog7 info -d DEVICE [-b BAUDRATE]

Listing keys

Prints firmware encryptioin keys in the programmer:
zme_prog7 keys -d DEVICE [-b BAUDRATE]

Load key

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

Clear key

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

Listing slots

List occupied slots and free memory of the programmer:
zme_prog7 slots -d DEVICE [-b BAUDRATE]

Update the programmer

Update the programmer firmware using a file in .pkzme format:
zme_prog7 update -d DEVICE [-b BAUDRATE] filename

Update the programmer secure engine

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

Update the programmer bootloader using a file in .pkzme format:
zme_prog7 update_bootloader -d DEVICE [-b BAUDRATE] filename

Load license

Load a license string in the programmer:
zme_prog7 lic -d DEVICE [-b BAUDRATE] license

Change count

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 image

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

New slot

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 ...

Factory reset

Erase all slots and factory reset the programmer:
zme_prog7 reset -d DEVICE [-b BAUDRATE]

Production flash firmware

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)

OTA Key load

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 binary

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 ...

Flash read

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

Flash write

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

Page erase

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 ...

Mass erase

Full flash erase in the connected device:
zme_prog7 masserase -d DEVICE [-b BAUDRATE] [-chip CHIP]

Checks if locked

Checks if the connected device is locked:
zme_prog7 isLocked -d DEVICE [-b BAUDRATE] [-chip CHIP]

Lock

Lock the connected device :
zme_prog7 lock -d DEVICE [-b BAUDRATE] [-chip CHIP]

Unlock

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)

UART Serial API speed

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

SWD speed

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

UART SWD speed

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 RTC

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.

Use cases

This programmer is a very powerful tool. Below you can find the typical use cases.

Flash a binary file

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.

Prepare to production

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.

Production flash

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

Load a licence

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 the programmer firmware

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

Technical specifications

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

Troubleshooting

ProblemProgramming fails immediately of a while after starting
CauseThe programming cable is too long
SolutionReduce the cable length or slow down the programming speed using swd_set -new
 
ProblemThe software tool can't communicate with the programmer
CauseBad cable or wrong port selected
SolutionCheck the USB cable. Use the 3rd port out of 4 ports (/dev/ttyUSB2 on Linux)
 
ProblemThe clock is not correct in the programmer after power cycle
CauseThe battery is not installed in the programmer
SolutionInsert the coin-cell CR2032 battery
 
ProblemNo RF emission in radio test mode
CauseWrong channel is selected
SolutionMake sure to select the correct Z-Wave, Zigbee or BLE channel
 
Problem
Cause
Solution

Requirements

Software requirements: TBD

Document revision

Date

Author

Changes

2023.06.20

Poltorak Serguei

Initial version