Building OpenWrt for the Seeed Studio WM6108 802.11ah HaLow Radio

The Seeed Studio Wio-WM6108 mini-PCIe module is a popular choice for creating a 802.11ah HaLow router. The mini-PCIe card can be inserted into the WM1302 Raspberry Pi Hat and attached to a Raspberry Pi.

Seeed Studio have a pre-built OpenWRT Image on their Wiki page, but it is a bit outdated and based on Morse Micro’s 2.7-dev release. They also don’t provide any guidance to how to build your own updated version.

This article shows how to build an OpenWRT image (based on Morse Micro’s 2.11-dev release) and what changes are necessary for the WM6108. It is aimed to be a bit technical, showing the manual steps or changes required, rather than patching OpenWRT or creating board files for an automated WM6108 build and providing the binaries. It is assumed if you are building your own router, you want to know what is going on under the hood. If you want a ready made product instead, try the HalowLink 2.

The Wio-WM6108 contains a FGH100M-H module from Quectel and is based on the Morse Micro MM6108 first generation integrated circuit. The FGH100M-H supports the 902-928 MHz frequency band, hence check if this is supported in your country. For example, Europe uses the 863-868 MHz band making the FGH100M-H unsuitable there.

Building OpenWRT

These instructions were used on Ubuntu 24.04.2 LTS. (Please note on Ubuntu 26.04 LTS, you may experience some issues building elfutils-0.189)

Morse Micro maintain a fork of OpenWRT patched with support for their HaLow drivers. Their HalowLink routers are based on this fork. Likewise, some of their evaluation kits (e.g mm6108-ekh01) are using a Raspberry Pi 4 and with their own hats (e.g. MMECH06) . We are essentially leveraging of their good work.

We choose to build an image for the Morse Micro mm6108-ekh01-spi which is close to what we intend to use – a mm6108 based radio connected via an SPI interface.

Morse Micro provide build instructions in their repository. First we need to install any build tools and dependencies:

sudo apt update
sudo apt install build-essential clang flex g++ gawk gcc-multilib \
    git gettext libncurses5-dev libssl-dev python3-distutils-extra rsync \
    unzip zlib1g-dev swig

And then we can clone and build OpenWRT using the commands below:

git clone https://github.com/MorseMicro/openwrt.git
cd openwrt
./scripts/morse_setup.sh -i -b mm6108-ekh01-spi
make -j8

Once built, the image files should be found in the openwrt/bin/targets/bcm27xx/bcm27xx/ folder and can be written to SDCard using your favorite tool. The file you are looking for is openwrt-morse-[ver]-mm6108-ekh01-spi-squashfs-sysupgrade.img.gz where [ver] is the version number.

If you want to skip this step, you can download a prebuilt copy here.

Device Tree

While the Morse Micro OpenWRT repository has support for Development kits such as the MM6108-EKH01, the Seeed Studio hat uses a different set of GPIO pins. In Linux, we specify these changes via a compiled device tree. It is easier to modify one, rather than start from scratch.

The relevant device tree source files starts out as patches in OpenWRT, located at https://github.com/MorseMicro/openwrt/tree/2.11-dev/target/linux/bcm27xx/patches-5.15

The two we are interested in are:

Once OpenWrt is built, both the source files and compiled binaries are located on your build machine in openwrt/build_dir/target-aarch64_cortex-a72_musl/linux-bcm27xx_bcm2711/linux-5.15.189/arch/arm/boot/dts/overlays/

The task is simple – we just need to replace the pin numbers in MM6108-EKH01 (old) with what the Seeed Studio (new) hat uses.

Namemm610x
(old)
WM6108
(new)
Pin Number
(40-pin RPI Header)
Pin Number (mPCIe)
SPI_MISOGPIO9GPIO92147
SPI_MOSIGPIO10GPIO101949
SPI_CLKGPIO11GPIO112345
SPI_CSGPIO8GPIO82451
SPI_INTGPIO25GPIO52910
ResetGPIO5GPIO171122
WakeupGPIO3GPIO231633
BusyGPIO7GPIO241831

Once modified, they can be recompiled using the device tree compiler. This can be installed on your Ubuntu build machine using:

sudo apt-get install device-tree-compiler

And then compiled into binaries using the following commands:

dtc -I dts -O dtb morse-ps-overlay.dts -o morse-ps.dtbo
dtc -I dts -O dtb mm610x-spi-overlay.dts -o mm610x-spi.dtbo

Once compiled, they need to be loaded to your OpenWrt filesystem /boot/overlays

If you want to skip this step, you can download modified source files and a prebuilt binaries here.

Probably the easiest way to install these files is by copying them to your SDCard using the same machine you used to write the OpenWRT image above. The SDCard containing your OpenWRT image has two partitions – a FAT32 boot partition and a SquashFS. The FAT32 partition should automatically mount on both Windows and Linux as “boot”. You can simply copy the compiled device tree binaries to /boot/overlays.

Alternatively, if your OpenWRT router is already the internet, they can be downloaded directly using wget. ssh into OpenWRT and run:

cd /boot/overlays
rm mm610x-spi.dtbo
wget https://www.beyondlogic.org/halow/mm610x-spi.dtbo
rm morse-ps.dtbo
wget https://www.beyondlogic.org/halow/morse-ps.dtbo

The individual overlays are loaded by a file located in /boot/distroconfig.txt. However, as we are using the same file names, there is no need to change anything here.

Notes:

  • While mm610x-spi contains all the GPIO mapping necessary, it appears if you only modify this file, you may receive a message along the lines of morse_spi spi0.0: morse_spi_probe: failed to init SPI with CMD63 (ret:-61). Initially, you are led to believe it is a problem with the GPIO specified in the device tree, but this error can occur if the radio is not reset at boot. In the OpenWrt implementation, it appears this is performed using the morse-ps overlay.

At this stage, you should have an updated image and patched device tree binaries. You will want to boot OpenWRT and configure your networking. See Seeed Studio’s wiki on Accessing the Gateway Interface.

OpenWRT has a DHCP server running by default and will issue an IP address in the 10.42.0.x range. You will want to open a browser and navigate to http://10.42.0.1/. The default username is ‘root’ and there is no initial password.

BCF (Board Configuration Files)

Once OpenWRT is started for the first time, you are likely to get the following message:

BCF may not be appropriate!
The BCF file on this device must be specified via UCI as the board type isn’t set in the OTP bits. Currently, your HaLow device is using the non-functional failsafe BCF.

A BCF file is used by the Morse Micro MMx108 firmware to configure, among other things, the Front-End RF Module (in our case designed by Quectel, the module manufacturer). It provides the correct GPIO mappings for Low Noise Amplifiers (LNA), output power optimisation and importantly compliance with regulatory standards. More information can be found in the Morse Micro Application Note 26, “BCF Overview and Impact on System Performance”.

The BCF will need to be set for your specific radio module. My Wio-WM6108 mini-PCIe is fitted with a Quectel FGH100M-H-AAMD. Firmware and common board configuration files can be found in the OpenWRT’s /lib/firmware/morse folder. It should include a copy of the bcf_fgh100mhaamd.bin required for the WM6108.

To specify the BCF, ssh into the OpenWRT and enter the following:

uci set wireless.radio0.bcf=bcf_fgh100mhaamd.bin
uci commit
reload_config

Where wireless.radio[X] should correspond to the radio instance of the Morse Micro 802.11ah radio. In my case, the Raspberry Pi’s Cypress CYW43455 802.11ac/b/g/n has taken radio0, and I need to use radio1 instead.

The UCI commands should also append bcf=bcf_fgh100mhaamd.bin to the /etc/modules.d/morse configuration file for modprobe. i.e. once the BCF is configured above, /etc.modules.d/morse should look something like:

morse reattach_hw=0 bcf=bcf_fgh100mhaamd.bin country=AU macaddr_suffix=4d:72:59

Frequency Channel

For users in Australia, the new OpenWRT firmware (as opposed to the version provided by Seeed Studio) will allow the Channel List to be changed to support newer bands resulting from ACMA changes. These bands have a center frequency offset by half a MHz and is often the cause of why 802.11ah stations (STA) cannot see access points (AP).

Debugging

If all doesn’t go to plan and you need to debug why your HaLow radio is not starting, you can open a shell (ssh into OpenWRT) and use dmesg:

dmesg | grep "morse"

If the driver is loaded successfully, an output similar to below is shown:

[    6.820582] Morse Micro Dot11ah driver registration. Version 0-rel_1_17_8_2026_Mar_24
[    6.828444] channelization_scheme = 1 (IEEE802.11-2020)
[    6.861585] morse micro driver registration. Version 0-rel_1_17_8_2026_Mar_24
[    6.869064] morse_spi spi0.0: morse_of_probe: Reading gpio pins configuration from device tree
[    6.877760] uaccess char driver major number is 245
[    6.882702] morse_io: Device node '/dev/morse_io' created successfully
[    6.934974] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 480664, crc32 0x9edcc720
[    6.944139] morse_spi spi0.0: Loaded BCF from morse/bcf_fgh100mhaamd.bin, size 1251, crc32 0x941b2a82
[    7.688877] morse_spi spi0.0: Driver loaded with kernel module parameters
[    7.695681] morse_spi spi0.0:     enable_pre_assoc_ps                     : N
[    7.702849] morse_spi spi0.0:     slow_clock_mode                         : 0
[    7.710014] morse_spi spi0.0:     enable_1mhz_probes                      : Y

Summary

In summary, to prepare an OpenWRT image for the WM6108:

  1. Build Morse Micro’s OpenWRT Fork, or download a prebuilt image:
    openwrt-morse-1deac4adfb-2026-05-22-mm6108-ekh01-spi-squashfs-sysupgrade.img.gz
  2. Write the image to your SDCard.
  3. Modify the Device Tree files to suit the WM1302 GPIO assignment, or download prebuilt binaries:
    morse-ps-overlay.dts
    mm610x-spi-overlay.dts
  4. Copy the above two files to the /boot/overlays folder of your SDCard’s boot partition.
  5. Insert the SDCard into your Raspberry Pi, boot and setup OpenWRT.
  6. SSH into OpenWRT and set your BCF file to bcf_fgh100mhaamd.bin



Be the first to comment

Leave a Reply

Your email address will not be published.


*