Skip to main content

SWDIO using a Raspberry Pi

Most Meshtastic devices can be flashed simply using USB. However, some (eg Seeed WM1110 Dev Kit) require the use of an external device that can connect via "SWDIO". There are dedicated devices such as the RAKDAP1 that can do this work. However, for many people a Raspberry Pi is more convenient.

This article provides instructions on how use a Raspberry Pi as a SWDIO Flash Tool.

Set up Wiring

The first step is to connect two wires between your Raspberry Pi and the SWDIO ports on your NRF52-based device.

Connect GPIO pin 11 on your Raspbery Pi to the CLK pin on the Meshtastic Device. Connect GPIO pin 8 on your Raspbery Pi to the DIO pin on the Meshtastic Device.

Ensure you get the GPIO numbers correct.

Plug in your Raspberry Pi to USB power. Plug in the Meshtastic Device to power.

Install OpenOCD

You can use OpenOCD to manage the SWDIO connection with the Meshtastic Device. Install it on your Raspberry Pi.

$ sudo apt update
$ sudo apt install libtool autoconf automake texinfo telnet gdb-multiarch git
$ git clone git://repo.or.cz/openocd.git
$ cd openocd/
$ ./bootstrap
$ ./configure --enable-bcm2835gpio
$ make -j4
$ sudo make install

Check connection

Let's try connecting to the NRF52-based device with SWDIO before we do anything with firmware. All the configuration you need is in the openocd repository.

$ openocd -f ./openocd/tcl/interface/raspberrypi-native.cfg -c "transport select swd" -f openocd/tcl/target/nrf52.cfg -s tcl

The first flag selects the Raspberry Pi as your host machine, the transport is SWDIO, and the last flag says you are connecting to a nRF52-based chip. You should see something like this:

Open On-Chip Debugger 0.12.0+dev-00633-gad87fbd1c
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_gates_jtag srst_push_pull connect_deassert_srst
swd
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : BCM2835 GPIO JTAG/SWD bitbang driver
Info : clock speed 100 kHz
Info : SWD DPIDR 0x2ba01477
Info : [nrf52.cpu] Cortex-M4 r0p1 processor detected
Info : [nrf52.cpu] target has 6 breakpoints, 4 watchpoints
Info : [nrf52.cpu] Examination succeed
Info : [nrf52.cpu] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
Info : accepting 'telnet' connection on tcp/4444

If you see “Error connecting DP: cannot read IDR”, then you've probably connected the wires to the wrong place.

Obtaining Firmware

Check the instructions for your hardware to find the correct firmware for your device. For most devices following this guide, a .hex file is required. Then, copy the firmware file to your Raspberry Pi.

Flashing Firmware

Once you have openocd running, you can connect to your Meshtastic device using telnet. Flashing is as simple as running a few commands inside the telnet session:

$ telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Open On-Chip Debugger
> init
> reset init
> halt
> nrf5 mass_erase
> program firmware.hex verify
> reset
> exit 0

Unplug the power and plug it back in after flashing.

Connecting

Congratulations, you should now be able to connect to your device through Bluetooth in the Meshtastic app.