Skip to the content
PCBKitNew board
4 layers65 × 56.5 mmEscape, the printed circuit board in 3D

Home project for Halow+openMANET on Pi4 & & Seeed WM1302 HAT & Wio-WM6108

Size
65 × 56.5 mm
Copper layers
4
Thickness
1.6 mm
Parts
175
Nets
97
Pads
634
Tracks, vias
903, 222
Pours
45
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
9 Aug 2026
Updated
8 Nov 2026

Overview

Escape is an open-source printed circuit board by winson3QQ, from the winson3QQ/Batman repository on GitHub. It is a 4-layer board of 65 × 56.5 mm with 175 parts on 97 nets, routed with 903 tracks and 222 vias.

It is built around the INA226AIDGSR, ATECC608C-TFLXTLSU and LM74700QDBVRQ1, with the BSS138, M2.5 and CSD17578Q3A among its other parts. Its parts include 51 capacitors, 50 resistors, 7 transistors, 4 ICs and 3 inductors.

Main components

7

README

README.md

Batman — Wi-Fi HaLow mesh on Raspberry Pi 4

Field notes from getting a Morse Micro MM6108 Wi-Fi HaLow (802.11ah) radio working over SPI on a Raspberry Pi 4, and building it into a batman-adv mesh node.

Hardware: Raspberry Pi 4 Model B + Seeed WM1302 Pi HAT + Seeed Wio-WM6108 mPCIe card (Quectel FGH100M-H / Morse Micro MM6108A1).


TL;DR — the finding

The Morse Micro morse_spi driver fails to probe on a stock Raspberry Pi OS kernel:

text
morse_spi spi0.0: failed to init SPI with CMD63 (ret:-71)

The driver's SPI init sequence must send 144 training clocks with chip-select deasserted. It does that by temporarily setting SPI_CS_HIGH to invert CS polarity.

On kernels ≥ 6.1 with GPIO-descriptor chip-selects (cs-gpios, which the Pi 4 base device tree always uses), the SPI core sets SPI_CS_HIGH itself and handles polarity through the GPIO descriptor flags. The driver's |= SPI_CS_HIGH therefore becomes a no-op, and the training clocks go out with CS asserted. The chip counts them as real bus traffic and its bit counter ends up exactly 2 bits out of phase for the rest of the session.

Fix: use SPI_NO_CS instead, so the core skips CS toggling entirely and the pin stays high during training. → patches/0001-spi-use-SPI_NO_CS-for-training-sequence.patch

This is only needed because stock Raspberry Pi OS does not carry Morse Micro's kernel patch (the one that defines SPI_CONTROLLER_ENABLE_CS_GPIOD). Their own OpenWrt / MorseMicro/rpi-linux builds do.

Three things were required, all necessary:

  1. Driver from the MM6108 product line — tag mm6108-2.0.1, not mm8108-*
  2. The SPI_NO_CS patch above
  3. Module parameters enable_ext_xtal_init=1 bcf=bcf_fgh100mhaamd.bin

Result:

text
morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 468304, crc32 0xbe7b5c8f
morse_spi spi0.0: Loaded BCF from morse/bcf_fgh100mhaamd.bin, size 1251, crc32 0x941b2a82

Then: the shortcut we should have found first

After all of the above, the driver worked — but a HaLow link still could not be established, because Debian's stock wpa_supplicant (v2.10) contains zero S1G / 802.11ah support, and hostapd / morse_cli were not present at all.

It turns out OpenMANET publishes a prebuilt OpenWrt image for exactly this hardware combination — it lists "Seeed WM1302 + Wio-WM6108" as a supported SPI setup, and the image ships wpa_supplicant_s1g, hostapd_s1g, morse-bcf-info and batctl alongside the driver, with 802.11s + BATMAN-V already wired up.

Its mm610x-spi.dtbo uses the identical GPIO mapping we had arrived at by hand.

Lesson: search for prebuilt firmware before rebuilding a vendor driver. The SPI_NO_CS finding still stands for anyone running the Morse driver on a stock, unpatched kernel — but if you just want a working mesh node, flash OpenMANET.

See docs/openmanet.md.


Contents

PathWhat
docs/hardware.mdHardware stack, GPIO map, device tree
docs/root-cause.mdSymptom → diagnosis → root cause, in full
docs/building-the-driver.mdBuild instructions and the gotchas
docs/openmanet.mdThe OpenMANET route
docs/flashing-and-recovery.mdWhy dd-flashing an OpenWrt image leaves the old config intact, and how to tell
docs/led-indicator.mdTwo-LED field status indicator — what each pattern means and why
docs/cloning-a-node.mdBuilding the second node by copying the first, and the seven values that must not be copied
docs/pi5-rp1-bringup.mdPi 5 / Pi 500 (RP1) only — the two RP1-specific root causes and the Pi 5 overlays
patches/The SPI_NO_CS patch
scripts/flash-card.sh (write + actually clear a card), meshled (LED daemon), meshtest (mesh health report), the uci cloning tools
tools/Python SPI diagnostic scripts (via spidev)

Also worth reading

If you flash OpenWrt to SD cards with dd, docs/flashing-and-recovery.md is the most generally useful thing here. The image covers only the boot partition and the squashfs — the rootfs_data overlay after it is never written, so the device boots with its entire previous configuration restored while every verification you would normally run comes back green.

Status

  • ✅ Driver probes, firmware + BCF load, netdev appears
  • ✅ Root cause understood and patched
  • ✅ OpenMANET 1.7.0 rpi4-mm6108-spi flashed, overlay wiped, booted and verified
  • ✅ HaLow radio up under OpenMANET: RPI RPI4-MM6108 (SPI), wlan0, 923 MHz @ 2 MHz BW, 27 dBm
  • ✅ Node 1 configured: 802.11s mesh + SAE, BATMAN_V, hostname manet01, 2.4 GHz off
  • ✅ Two-LED field status indicator installed and verified — docs/led-indicator.md
  • ✅ Node 2 built by cloning node 1's uci config, no wizard — docs/cloning-a-node.md
  • ✅ Second MM6108 set probes and loads firmware, radio up at 923 MHz / 2 MHz
  • ⏳ Two nodes not yet powered simultaneously, so the mesh has not been formed
  • ⏳ TX still not proven to radiate — the first batctl n neighbour will settle it
  • ⏳ meshtest written but not yet run against a real peer

License

Repository content is MIT (see LICENSE). The patch in patches/ applies to Morse Micro's driver, which is GPL-2.0-or-later; the patch is offered under the same terms as the code it modifies.

Parts

175
QtyValueFootprintReferences
15100n 16VC_0402_1005MetricC5, C12, C24, C25, C30, C63, C64, C70, C71, C72, C74, C75, C77, C81, C84
80RR_0402_1005MetricR40, R41, R42, R43, R44, R45, R46, R47
810kR_0402_1005MetricR12, R33, R35, R53, R60, R61, R62, R63
822u 10V X5RC_0805_2012MetricC14, C15, C16, C19, C22, C23, C27, C28
6100kR_0402_1005MetricR17, R23, R34, R64, R83, R84
5BSS138SOT-23Q2, Q6, Q7, Q10, Q12
4100k 1%R_0402_1005MetricR2, R4, R7, R32
410u 50V X7RC_1210_3225MetricC6, C8, C10, C33
3100n 50V X7RC_0402_1005MetricC2, C9, C40
31MR_0402_1005MetricR10, R11, R30
31u 10VC_0402_1005MetricC13, C41, C73
3M2.5MountingHole_2.7mm_M2.5_Pad_ViaH2, H3, H4
21kR_0402_1005MetricR48, R85
21u 50V X7RC_0805_2012MetricC1, C4
22.2n 16VC_0402_1005MetricC32, C34
2383k 1%R_0402_1005MetricR1, R6
247u 6.3V X5RC_1206_3216MetricC60, C61
2DNP 22pC_0402_1005MetricC17, C29
2INA226AIDGSRVSSOP-10_3x3mm_P0.5mmU2, U8
2M2 SMT standoff ~3.1mmbatman:Wurth_WA-SMSI_M2_OD4.35H5, H6
10.47RR_0805_2012MetricR19
11.50M 1%R_0402_1005MetricR3
110.0k 1%R_0402_1005MetricR21
1100k 0.5%R_0402_1005MetricR13
1102k 1%R_0402_1005MetricR15
110RR_1206_3216MetricR81
110m 1% 0.5WR_1206_3216MetricR9
110n 16V X7RC_0402_1005MetricC82
110u 10VC_0603_1608MetricC80
110u 10V X5RC_0603_1608MetricC31
12.2kR_0402_1005MetricR18
12.2uH Isat>=5.8AL_Coilcraft_XxL4030L2
120m 1% 0.5WR_1206_3216MetricR22
1220n 25V X7RC_0603_1608MetricC18
1220n 50V X7RC_0603_1608MetricC11
1220u 6.3V polymerCP_EIA-7343-20_Kemet-VC62
122n 16VC_0402_1005MetricC26
122n 16V X7RC_0402_1005MetricC3
124.0k 0.5%R_0402_1005MetricR14
124.3k 1%R_0402_1005MetricR16
127nHL_0402_1005MetricL80
13.3uH Isat>=5.5AL_Coilcraft_XxL4030L1
13.57k 1%R_0402_1005MetricR5
131.6k 1%R_0402_1005MetricR20
13V3 HaLow 3.2-3.4TestPoint_Keystone_5015_Micro-MinatureTP3
13V3_BUCK 3.25-3.40TestPoint_Pad_D1.5mmTP7
13V3_GNSS 3.2-3.4TestPoint_Pad_D1.5mmTP10
13V3_PI 3.2-3.4TestPoint_Pad_D1.5mmTP8
13V3_SEC 3.2-3.4TestPoint_Pad_D1.5mmTP9
14.7kR_0603_1608MetricR8
147p C0GC_0402_1005MetricC83
1560RR_0402_1005MetricR82
15V 5.10-5.25TestPoint_Keystone_5015_Micro-MinatureTP2
15V_PI 5.0-5.2TestPoint_Pad_D1.5mmTP6
1600R@100MHz >=4AL_1206_3216MetricFB1
1787k 1%R_0402_1005MetricR31
1ATECC608C-TFLXTLSSOIC-8_3.9x4.9mm_P1.27mmU12
1AUTO-ON (open)SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP3
1BATT padsBattPads_2x_3x5mm_StrainReliefJ1
1CPH3225A 11mFSeiko_CPH3225AC76
1CSD17578Q3AVSON-8_3.3x3.3mm_P0.65mm_NexFETQ3
1CSD19537Q3VSON-8_3.3x3.3mm_P0.65mm_NexFETQ1
1DNP 0RR_0402_1005MetricR80
1EF_FLT_NTestPoint_Pad_D1.0mmTP23
1EF_SHDNTestPoint_Pad_D1.0mmTP24
1EN_3V3TestPoint_Pad_D1.0mmTP21
1EN_5VTestPoint_Pad_D1.0mmTP20
1GNDTestPoint_Pad_D1.5mmTP12
1GNDTestPoint_Keystone_5015_Micro-MinatureTP4
1GNSS (closed)SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mmJP6
1GNSS_ANT_DETTestPoint_Pad_D1.0mmTP15
1GNSS_ANT_SHORT_NTestPoint_Pad_D1.0mmTP16
1GNSS_RST_NTestPoint_Pad_D1.0mmTP13
1GNSS_SAFEBOOT_NTestPoint_Pad_D1.0mmTP14
1GREENLED_0402_1005MetricD3
1K1+ (R9)TestPoint_Pad_D1.0mmTP27
1K1- (R9)TestPoint_Pad_D1.0mmTP28
1K2+ (R22)TestPoint_Pad_D1.0mmTP29
1K2- (R22)TestPoint_Pad_D1.0mmTP30
1LM74700QDBVRQ1SOT-23-6U4

The 146 most common of 175 parts.

Questions

How big is the Escape PCB?

It measures 65 × 56.5 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Escape use?

175 parts, built around the INA226AIDGSR, ATECC608C-TFLXTLSU, LM74700QDBVRQ1 and BSS138. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Escape KiCad files?

From the winson3QQ/Batman repository on GitHub, at the commit this page was made from: the board is hardware/hat-v1/layout-v2/escape.kicad_pcb and its schematic hardware/hat-v1/batman-hat.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Escape design in my own project?

Its repository states no licence, so its author keeps all rights: ask winson3QQ before reusing the design.

Similar boards

  • 4 layers101 × 51.5 mmQuack core, the printed circuit board in 3D

    Quack core

    HeyPCB/quack-core

    Brain board for the Open Duck Mini: Pi Zero 2W carrier, 14-servo STS bus, fused 2S power path in stitched copper zones (15-18 A battery side), USB-C charging with balancing, IMU.

    138 parts1CERN-OHL-S-2.0
  • 8 layers227 × 185 mmDucktop2-center, the printed circuit board in 3D

    Ducktop2-center

    EwoudVV/ducktop2

    An open-source 16-inch laptop designed from scratch.

    870 parts26MIT
  • 2 layers47.2 × 45.8 mmHeater controller rev a, the printed circuit board in 3D

    Heater controller rev a

    manhoosbilli1/heater-controller-rev-a

    Rev A of hierarchical heater controller (multi-sheet)

    75 parts
  • 4 layers143.6 × 215.8 mmMcu and pi board, the printed circuit board in 3D

    Mcu and pi board

    purduerov/X18-ROV-Test-Bench

    This will be the place to push all test bench changes.

    118 parts
  • 6 layers177 × 85 mmSolar BQ25798, the printed circuit board in 3D

    Solar BQ25798

    TheCacophonyProject/solar-battery

    362 partsCERN-OHL-W-2.0
  • 2 layers5V REG 20A, the printed circuit board in 3D

    5V REG 20A

    AdrianWest/Bakery

    If Bakery has helped you in any way please consider buying me a coffee

    27 parts15GPL-3.0
  • 4 layers106 × 63.5 mmBrineomatic, the printed circuit board in 3D

    Brineomatic

    hoeken/brineomatic

    Open Source Watermaker Controller.

    323 parts47LGPL-2.1
  • 4 layers90 × 100 mmPCB Cuarto, the printed circuit board in 3D

    PCB Cuarto

    Jose-WaitNRest/PCB-Cuarto

    79 parts