From 5adc4f82e2eb5e40b1cdc2ac549b20affec7119f Mon Sep 17 00:00:00 2001 From: Szymon Sakowicz Date: Sun, 1 Mar 2026 13:18:40 +0100 Subject: [PATCH 1/4] Add silabs Raspberry Pi flashing instructions --- docs/.images/raspberry_pi_gpio_pinout.png | Bin 0 -> 52967 bytes docs/flashing/silabs_raspberry_pi.md | 206 ++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 docs/.images/raspberry_pi_gpio_pinout.png create mode 100644 docs/flashing/silabs_raspberry_pi.md diff --git a/docs/.images/raspberry_pi_gpio_pinout.png b/docs/.images/raspberry_pi_gpio_pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..4796a8f41efcdc71a441c0003c493e4bb6571228 GIT binary patch literal 52967 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

Vio;{Sv8UVdoW-|r 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 z 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 >uE9kl48^(BBo1J&(a)5 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 CVMqP| literal 0 HcmV?d00001 diff --git a/docs/flashing/silabs_raspberry_pi.md b/docs/flashing/silabs_raspberry_pi.md new file mode 100644 index 0000000000..07d96e5dd9 --- /dev/null +++ b/docs/flashing/silabs_raspberry_pi.md @@ -0,0 +1,206 @@ +# Flashing Tuya ZS3L (EFR32MG21) via Raspberry Pi + +This guide covers flashing custom Zigbee firmware onto Tuya ZS3L using Raspberry Pi GPIO as SWD programmer. + +### What You'll Need + +- Raspberry Pi (or similar with GPIO) (tested on Raspberry Pi 3B+) +- Jumper wires +- Soldering iron + +### ZS3L Chip Pinout + +If you have a ZS3L module, you can use the following [Tuya docs](https://developer.tuya.com/en/docs/iot/zs3l?id=K97r37j19f496) for reference. Or just follow this schema: + +![PCB connections](/docs/.images/meos_4_gang_pcb.jpg) + +ℹ **Note:** Sometimes there is no need to solder 3.3V/GND. You can find them on the board and use connector. +ℹ **Note:** No need to solder nRST pin. It causes connection issues. + +## Step 1: Hardware Wiring + +![Raspberry Pi GPIO diagram](/docs/.images/raspberry_pi_gpio_pinout.png) + +Connect ZS3L to Raspberry Pi (BCM numbering): + +| ZS3L Pin | Raspberry Pi | Physical Pin | +|----------|--------------|--------------| +| SWDIO | GPIO 24 | Pin 18 | +| SWCLK | GPIO 25 | Pin 22 | +| GND | GND | Pin 14 | +| VCC | 3.3V | Pin 1 or 17 | + +⚠️ **NEVER use 5V - it will destroy the chip!** + +ℹ **Note:** No need of nRST pin. It causes connection issues. + +## Step 2: Compile Custom OpenOCD + +Standard OpenOCD doesn't support EFM32 Series 2. Configure the [knieriem's fork](https://github.com/knieriem/openocd-efm32-series2): + +```bash +sudo apt-get update +sudo apt-get install git autoconf libtool make pkg-config + +git clone https://github.com/knieriem/openocd-efm32-series2.git +cd openocd-efm32-series2 + +./setup-openocd-src.sh +``` + +You will be asked to run `./build.sh`, but don't. This is not needed while using GPIO. +If you use some USB programmer, you may need to run `./build.sh` to compile the driver. + +Compile the driver: + +```bash +cd openocd +./configure --enable-bcm2835gpio +make +make install +``` + +## Step 3: OpenOCD Configuration + +Create `openocd.cfg`: + +```tcl +transport select swd + +adapter gpio swdio 24 +adapter gpio swclk 25 + +set CHIPNAME efr32 +source [find target/efm32s2.cfg] + +reset_config srst_only srst_nogate +adapter speed 1000 + +init +targets +halt +``` + +## Step 4: Start Connection + +**Terminal 1** - Start OpenOCD daemon: + +```bash +openocd +``` + +You should see something like this: +``` +$ openocd +Open On-Chip Debugger 0.12.0+dev-01294-g2e60e2eca-dirty (2026-03-01-09:48) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +Warn : TMS/SWDIO moved to GPIO 8 (pin 24). Check the wiring please! +Info : BCM2835 GPIO JTAG/SWD bitbang driver +Info : clock speed 1000 kHz +Info : SWD DPIDR 0x6ba02477 +Info : [efr32.cpu] Cortex-M33 r0p3 processor detected +Info : [efr32.cpu] target has 8 breakpoints, 4 watchpoints +Info : starting gdb server for efr32.cpu on 3333 +Info : Listening on port 3333 for gdb connections +Warn : [efr32.cpu] target was in unknown state when halt was requested +Info : Listening on port 6666 for tcl connections +Info : Listening on port 4444 for telnet connections +Info : accepting 'telnet' connection on tcp/4444 +Info : detected part: MG21A020, rev 51 +Info : flash size = 768 KiB +Info : flash page size = 8192 B +Warn : Don't know EFR/EFM Gx family number, can't set MSC register. Defaulting to EF{M,R}xG22 values.. +``` + +**Terminal 2** - Connect via Telnet: + +```bash +telnet localhost 4444 +``` + +## Step 5: Verify, Backup, Erase, and Flash + +Execute in Telnet console (`>` prompt). ZS3L has 768 KiB flash (`0x000c0000`). + +### Verify Connection + +```shell +> halt +> targets +> flash info 0 +> flash probe 0 +> flash banks +> flash list +``` + +

+Example output + +```shell +> halt +> targets +TargetName Type Endian TapName State +-- ------------------ ---------- ------ ------------------ ------------ +0* efr32.cpu cortex_m little efr32.cpu halted +> flash info 0 +detected part: MG21A020, rev 51 +flash size = 768 KiB +flash page size = 8192 B +Don't know EFR/EFM Gx family number, can't set MSC register. Defaulting to EF{M,R}xG22 values.. +#0 : efm32s2 at 0x00000000, size 0x000c0000, buswidth 0, chipwidth 0 +# 0: 0x00000000 (0x2000 8kB) protected +# +# 94: 0x000bc000 (0x2000 8kB) protected +# 95: 0x000be000 (0x2000 8kB) protected +MG21A020, rev 51 +> flash probe 0 +detected part: MG21A020, rev 51 +flash size = 768 KiB +flash page size = 8192 B +Don't know EFR/EFM Gx family number, can't set MSC register. Defaulting to EF{M,R}xG22 values.. +flash 'efm32s2' found at 0x00000000 +> flash banks +#0 : efr32.flash (efm32s2) at 0x00000000, size 0x000c0000, buswidth 0, chipwidth 0 +#1 : userdata.flash (efm32s2) at 0x0fe00000, size 0x00000000, buswidth 0, chipwidth 0 +> flash list +{ +name efr32.flash +driver efm32s2 +base 0x00000000 +size 0xc0000 +bus_width 0 +chip_width 0 +target efr32.cpu +} +{ +name userdata.flash +driver efm32s2 +base 0x0fe00000 +size 0x0 +bus_width 0 +chip_width 0 +target efr32.cpu +} +``` + +
+ +### Backup + +```shell +> dump_image flash_dump.bin 0x0 0xc0000 +> dump_image userdata_dump.bin 0x0fe00000 0x400 +``` + +### Erase and Flash +```shell +> flash erase_address 0x0 0xc0000 +> flash write_image erase efr32mg21_bootloader_generic.s37 +> flash write_image erase tlc_switch-1.1.2-9a4eb422.s37 +> reset run +``` + +Device will enter pairing mode automatically. Disconnect wires and reassemble. + From bd7c446f05425e3eaa2d618de7bf96622f0948c1 Mon Sep 17 00:00:00 2001 From: Szymon Sakowicz Date: Sun, 1 Mar 2026 13:19:45 +0100 Subject: [PATCH 2/4] Better structure of docs --- docs/flashing/README.md | 29 ++++++++++ docs/flashing/silabs.md | 98 ++++---------------------------- docs/flashing/silabs_jlink_v9.md | 93 ++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 87 deletions(-) create mode 100644 docs/flashing/README.md create mode 100644 docs/flashing/silabs_jlink_v9.md diff --git a/docs/flashing/README.md b/docs/flashing/README.md new file mode 100644 index 0000000000..c82042f37e --- /dev/null +++ b/docs/flashing/README.md @@ -0,0 +1,29 @@ +# Flashing Guides + +Instructions for flashing custom firmware onto Zigbee modules. + +## By Chip Type + +| Chip Family | Guide | +|-------------|-------| +| Silicon Labs (EFR32MG21) | [SiLabs Flashing](silabs.md) | +| Telink (TLSR8258) | [Telink Flashing](telink.md) | +| ZBMINIL2 | [ZBMINIL2 Flashing](zbminil2.md) | + +## Quick Reference + +### Silicon Labs (ZS3L / EFR32MG21) + +Most Tuya Zigbee switches use this chip. Two flashing methods available: + +- **[J-Link v9](silabs_jlink_v9.md)** - Recommended, easier setup +- **[Raspberry Pi GPIO](silabs_raspberry_pi.md)** - No programmer needed + +### Telink (TLSR8258) + +Used in some older devices. Requires Telink-specific tools. + +### ZBMINIL2 + +Sonoff mini relay module with custom flashing procedure. + diff --git a/docs/flashing/silabs.md b/docs/flashing/silabs.md index 60ce0e9db4..eb569b5ed6 100644 --- a/docs/flashing/silabs.md +++ b/docs/flashing/silabs.md @@ -1,93 +1,17 @@ -# How to Flash via Wire +# Silicon Labs (EFR32MG21) Flashing -### What You'll Need +Guides for flashing custom firmware onto Silicon Labs EFR32MG21 chips (Tuya ZS3L module). -- A J-Link programmer (JLink v9 confirmed to work) -- A soldering iron -- Some spare jumper wires +## Flashing Methods -### Step 1: Disassemble the Device +| Method | Hardware Required | +|--------|-------------------| +| [J-Link v9](silabs_jlink_v9.md) | J-Link programmer | +| [Raspberry Pi GPIO](silabs_raspberry_pi.md) | Raspberry Pi 3B+ | -Unplug the device from the mains. **Never attempt to disassemble it while it is plugged in!** +## ZS3L Module -In general, you need to disassemble devices until you have access to the ZS3L module or MCU itself. Here is a detailed example guide for the Moes 4 Gang switch. +- Chip: EFR32MG21A020 +- Flash: 768 KiB +- Pinout: [Tuya ZS3L Documentation](https://developer.tuya.com/en/docs/iot/zs3l?id=K97r37j19f496) -First, pop the front glass panel: - -![Front glass disassembly](/docs/.images/moes_4_gang_disassemble_front.jpg) - -Then gently detach the PCB from the device. Alternate the sides you use for leverage to avoid damage to the connector. - -![PCB disassembly](/docs/.images/moes_4_gang_disassemble_pcb.jpg) - -### Step 2: Solder the Wires - -You'll need to solder five wires as shown in the photos: GND, 3.3V, SWDIO, SWCLK, RST. - -If you have a ZS3L module, you can use the following [Tuya docs](https://developer.tuya.com/en/docs/iot/zs3l?id=K97r37j19f496) for reference. Or just follow this schema: - -![PCB connections](/docs/.images/meos_4_gang_pcb.jpg) - -For Moes 4 gang, we can re-use the connector to plug in power: - -![PCB power](/docs/.images/moes_4_gang_pcb_power.jpg) - -But you have to solder to the other pins. There is no need for a long-term connection, but be sure not to bridge the pins together. - -![PCB power](/docs/.images/moes_4_gang_pcb_wires.jpg) - -Finally, attach the wires to your J-Link programmer (for JLINK V9, the connection should look like this, following the color schema used above): - -![PCB power](/docs/.images/jlink_wires.jpg) - -### Step 3: Flash the Firmware - -Download both the bootloader and firmware for your device from [bin/](https://github.com/romasku/tuya-zigbee-switch/raw/refs/heads/main/bin). You'll need the generic `efr32mg21_bootloader.s37` and the `.s37` file specific for your device. - -#### Using Commander Software - -There are different software options that you can use for flashing, but one of the easiest options is to use Simplicity Commander from Silicon Labs. Download Commander from [this page](https://www.silabs.com/software-and-tools/simplicity-studio/simplicity-commander?tab=getting-started). - -Plug the J-Link into your PC, then open Commander and select your flasher. It may be named as some random set of numbers, that's ok. - -![commander select device](/docs/.images/commander_select_kit.png) - -**Check the connection:** - -Open the device info page to verify that the connection is good: - -![commander device info](/docs/.images/commander_device_info.png) - -If this doesn't work, you can try constantly tapping on the device touch button. This is because the device can be in deep sleep and the flasher cannot communicate with it. If this is your case, keep tapping until you erase the chip. - -**Erase the chip:** - -Open the flash tab and erase the chip. **THIS WILL DELETE STOCK FIRMWARE!** If you want to keep it, press "Open shell" below and use this command to backup the stock firmware: - -``` -commander readmem --device EFR32MG21 --region @mainflash --outfile stock_dump.bin -``` - -![commander erase](/docs/.images/commander_erase.png) - -**Flash the bootloader and firmware:** - -Now you'll need to flash both the bootloader and firmware separately. - -1. Press "Browse": - - ![commander ](/docs/.images/commander_browse.png) - -2. Select the bootloader file (`efr32mg21_bootloader.s37`): - - ![commander ](/docs/.images/commander_select_bootloader.png) - -3. Press "Flash" and wait until the process finishes: - - ![commander ](/docs/.images/commander_flash.png) - -4. Now select your device-specific firmware file and press "Flash" again. Wait until the process finishes: - - ![commander ](/docs/.images/commander_select_firmware.png) - -If done correctly, the onboard LED will start flashing automatically. You can try joining the device to a Zigbee network to verify that it connects properly. Once confirmed, disconnect everything, unsolder the wires, and reassemble the case. diff --git a/docs/flashing/silabs_jlink_v9.md b/docs/flashing/silabs_jlink_v9.md new file mode 100644 index 0000000000..60ce0e9db4 --- /dev/null +++ b/docs/flashing/silabs_jlink_v9.md @@ -0,0 +1,93 @@ +# How to Flash via Wire + +### What You'll Need + +- A J-Link programmer (JLink v9 confirmed to work) +- A soldering iron +- Some spare jumper wires + +### Step 1: Disassemble the Device + +Unplug the device from the mains. **Never attempt to disassemble it while it is plugged in!** + +In general, you need to disassemble devices until you have access to the ZS3L module or MCU itself. Here is a detailed example guide for the Moes 4 Gang switch. + +First, pop the front glass panel: + +![Front glass disassembly](/docs/.images/moes_4_gang_disassemble_front.jpg) + +Then gently detach the PCB from the device. Alternate the sides you use for leverage to avoid damage to the connector. + +![PCB disassembly](/docs/.images/moes_4_gang_disassemble_pcb.jpg) + +### Step 2: Solder the Wires + +You'll need to solder five wires as shown in the photos: GND, 3.3V, SWDIO, SWCLK, RST. + +If you have a ZS3L module, you can use the following [Tuya docs](https://developer.tuya.com/en/docs/iot/zs3l?id=K97r37j19f496) for reference. Or just follow this schema: + +![PCB connections](/docs/.images/meos_4_gang_pcb.jpg) + +For Moes 4 gang, we can re-use the connector to plug in power: + +![PCB power](/docs/.images/moes_4_gang_pcb_power.jpg) + +But you have to solder to the other pins. There is no need for a long-term connection, but be sure not to bridge the pins together. + +![PCB power](/docs/.images/moes_4_gang_pcb_wires.jpg) + +Finally, attach the wires to your J-Link programmer (for JLINK V9, the connection should look like this, following the color schema used above): + +![PCB power](/docs/.images/jlink_wires.jpg) + +### Step 3: Flash the Firmware + +Download both the bootloader and firmware for your device from [bin/](https://github.com/romasku/tuya-zigbee-switch/raw/refs/heads/main/bin). You'll need the generic `efr32mg21_bootloader.s37` and the `.s37` file specific for your device. + +#### Using Commander Software + +There are different software options that you can use for flashing, but one of the easiest options is to use Simplicity Commander from Silicon Labs. Download Commander from [this page](https://www.silabs.com/software-and-tools/simplicity-studio/simplicity-commander?tab=getting-started). + +Plug the J-Link into your PC, then open Commander and select your flasher. It may be named as some random set of numbers, that's ok. + +![commander select device](/docs/.images/commander_select_kit.png) + +**Check the connection:** + +Open the device info page to verify that the connection is good: + +![commander device info](/docs/.images/commander_device_info.png) + +If this doesn't work, you can try constantly tapping on the device touch button. This is because the device can be in deep sleep and the flasher cannot communicate with it. If this is your case, keep tapping until you erase the chip. + +**Erase the chip:** + +Open the flash tab and erase the chip. **THIS WILL DELETE STOCK FIRMWARE!** If you want to keep it, press "Open shell" below and use this command to backup the stock firmware: + +``` +commander readmem --device EFR32MG21 --region @mainflash --outfile stock_dump.bin +``` + +![commander erase](/docs/.images/commander_erase.png) + +**Flash the bootloader and firmware:** + +Now you'll need to flash both the bootloader and firmware separately. + +1. Press "Browse": + + ![commander ](/docs/.images/commander_browse.png) + +2. Select the bootloader file (`efr32mg21_bootloader.s37`): + + ![commander ](/docs/.images/commander_select_bootloader.png) + +3. Press "Flash" and wait until the process finishes: + + ![commander ](/docs/.images/commander_flash.png) + +4. Now select your device-specific firmware file and press "Flash" again. Wait until the process finishes: + + ![commander ](/docs/.images/commander_select_firmware.png) + +If done correctly, the onboard LED will start flashing automatically. You can try joining the device to a Zigbee network to verify that it connects properly. Once confirmed, disconnect everything, unsolder the wires, and reassemble the case. From f67dce0386026677848c9d532ab4acab9847d992 Mon Sep 17 00:00:00 2001 From: Szymon Sakowicz Date: Sun, 1 Mar 2026 13:21:21 +0100 Subject: [PATCH 3/4] typos --- docs/flashing/silabs_raspberry_pi.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/flashing/silabs_raspberry_pi.md b/docs/flashing/silabs_raspberry_pi.md index 07d96e5dd9..f02744f458 100644 --- a/docs/flashing/silabs_raspberry_pi.md +++ b/docs/flashing/silabs_raspberry_pi.md @@ -14,7 +14,8 @@ If you have a ZS3L module, you can use the following [Tuya docs](https://develop ![PCB connections](/docs/.images/meos_4_gang_pcb.jpg) -ℹ **Note:** Sometimes there is no need to solder 3.3V/GND. You can find them on the board and use connector. +ℹ **Note:** Sometimes there is no need to solder 3.3V/GND. You can find them on the board and use a connector. + ℹ **Note:** No need to solder nRST pin. It causes connection issues. ## Step 1: Hardware Wiring @@ -32,11 +33,11 @@ Connect ZS3L to Raspberry Pi (BCM numbering): ⚠️ **NEVER use 5V - it will destroy the chip!** -ℹ **Note:** No need of nRST pin. It causes connection issues. +ℹ **Note:** No need for nRST pin. It causes connection issues. ## Step 2: Compile Custom OpenOCD -Standard OpenOCD doesn't support EFM32 Series 2. Configure the [knieriem's fork](https://github.com/knieriem/openocd-efm32-series2): +Standard OpenOCD doesn't support EFM32 Series 2. Use [knieriem's fork](https://github.com/knieriem/openocd-efm32-series2): ```bash sudo apt-get update @@ -48,8 +49,8 @@ cd openocd-efm32-series2 ./setup-openocd-src.sh ``` -You will be asked to run `./build.sh`, but don't. This is not needed while using GPIO. -If you use some USB programmer, you may need to run `./build.sh` to compile the driver. +You will be asked to run `./build.sh`, but skip this step — it's not needed when using GPIO. +If you use a USB programmer, you may need to run `./build.sh` to compile the driver. Compile the driver: From 3be02233e35f9381a5483dcc8d21abbf3a88fab9 Mon Sep 17 00:00:00 2001 From: Szymon Sakowicz Date: Sun, 5 Apr 2026 18:33:05 +0200 Subject: [PATCH 4/4] simpify readme --- docs/flashing/README.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/docs/flashing/README.md b/docs/flashing/README.md index c82042f37e..64d41ce0e3 100644 --- a/docs/flashing/README.md +++ b/docs/flashing/README.md @@ -9,21 +9,3 @@ Instructions for flashing custom firmware onto Zigbee modules. | Silicon Labs (EFR32MG21) | [SiLabs Flashing](silabs.md) | | Telink (TLSR8258) | [Telink Flashing](telink.md) | | ZBMINIL2 | [ZBMINIL2 Flashing](zbminil2.md) | - -## Quick Reference - -### Silicon Labs (ZS3L / EFR32MG21) - -Most Tuya Zigbee switches use this chip. Two flashing methods available: - -- **[J-Link v9](silabs_jlink_v9.md)** - Recommended, easier setup -- **[Raspberry Pi GPIO](silabs_raspberry_pi.md)** - No programmer needed - -### Telink (TLSR8258) - -Used in some older devices. Requires Telink-specific tools. - -### ZBMINIL2 - -Sonoff mini relay module with custom flashing procedure. -