
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.

Home project for Halow+openMANET on Pi4 & & Seeed WM1302 HAT & Wio-WM6108
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.
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).
The Morse Micro morse_spi driver fails to probe on a stock Raspberry Pi OS kernel:
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:
mm6108-2.0.1, not mm8108-*SPI_NO_CS patch aboveenable_ext_xtal_init=1 bcf=bcf_fgh100mhaamd.binResult:
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 0x941b2a82After 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.
| Path | What |
|---|---|
docs/hardware.md | Hardware stack, GPIO map, device tree |
docs/root-cause.md | Symptom → diagnosis → root cause, in full |
docs/building-the-driver.md | Build instructions and the gotchas |
docs/openmanet.md | The OpenMANET route |
docs/flashing-and-recovery.md | Why dd-flashing an OpenWrt image leaves the old config intact, and how to tell |
docs/led-indicator.md | Two-LED field status indicator — what each pattern means and why |
docs/cloning-a-node.md | Building the second node by copying the first, and the seven values that must not be copied |
docs/pi5-rp1-bringup.md | Pi 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) |
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.
rpi4-mm6108-spi flashed, overlay wiped, booted and verifiedRPI RPI4-MM6108 (SPI), wlan0, 923 MHz @ 2 MHz BW, 27 dBmmanet01, 2.4 GHz offdocs/led-indicator.mddocs/cloning-a-node.mdbatctl n neighbour will settle itmeshtest written but not yet run against a real peerRepository 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.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 15 | 100n 16V | C_0402_1005Metric | C5, C12, C24, C25, C30, C63, C64, C70, C71, C72, C74, C75, C77, C81, C84 |
| 8 | 0R | R_0402_1005Metric | R40, R41, R42, R43, R44, R45, R46, R47 |
| 8 | 10k | R_0402_1005Metric | R12, R33, R35, R53, R60, R61, R62, R63 |
| 8 | 22u 10V X5R | C_0805_2012Metric | C14, C15, C16, C19, C22, C23, C27, C28 |
| 6 | 100k | R_0402_1005Metric | R17, R23, R34, R64, R83, R84 |
| 5 | BSS138 | SOT-23 | Q2, Q6, Q7, Q10, Q12 |
| 4 | 100k 1% | R_0402_1005Metric | R2, R4, R7, R32 |
| 4 | 10u 50V X7R | C_1210_3225Metric | C6, C8, C10, C33 |
| 3 | 100n 50V X7R | C_0402_1005Metric | C2, C9, C40 |
| 3 | 1M | R_0402_1005Metric | R10, R11, R30 |
| 3 | 1u 10V | C_0402_1005Metric | C13, C41, C73 |
| 3 | M2.5 | MountingHole_2.7mm_M2.5_Pad_Via | H2, H3, H4 |
| 2 | 1k | R_0402_1005Metric | R48, R85 |
| 2 | 1u 50V X7R | C_0805_2012Metric | C1, C4 |
| 2 | 2.2n 16V | C_0402_1005Metric | C32, C34 |
| 2 | 383k 1% | R_0402_1005Metric | R1, R6 |
| 2 | 47u 6.3V X5R | C_1206_3216Metric | C60, C61 |
| 2 | DNP 22p | C_0402_1005Metric | C17, C29 |
| 2 | INA226AIDGSR | VSSOP-10_3x3mm_P0.5mm | U2, U8 |
| 2 | M2 SMT standoff ~3.1mm | batman:Wurth_WA-SMSI_M2_OD4.35 | H5, H6 |
| 1 | 0.47R | R_0805_2012Metric | R19 |
| 1 | 1.50M 1% | R_0402_1005Metric | R3 |
| 1 | 10.0k 1% | R_0402_1005Metric | R21 |
| 1 | 100k 0.5% | R_0402_1005Metric | R13 |
| 1 | 102k 1% | R_0402_1005Metric | R15 |
| 1 | 10R | R_1206_3216Metric | R81 |
| 1 | 10m 1% 0.5W | R_1206_3216Metric | R9 |
| 1 | 10n 16V X7R | C_0402_1005Metric | C82 |
| 1 | 10u 10V | C_0603_1608Metric | C80 |
| 1 | 10u 10V X5R | C_0603_1608Metric | C31 |
| 1 | 2.2k | R_0402_1005Metric | R18 |
| 1 | 2.2uH Isat>=5.8A | L_Coilcraft_XxL4030 | L2 |
| 1 | 20m 1% 0.5W | R_1206_3216Metric | R22 |
| 1 | 220n 25V X7R | C_0603_1608Metric | C18 |
| 1 | 220n 50V X7R | C_0603_1608Metric | C11 |
| 1 | 220u 6.3V polymer | CP_EIA-7343-20_Kemet-V | C62 |
| 1 | 22n 16V | C_0402_1005Metric | C26 |
| 1 | 22n 16V X7R | C_0402_1005Metric | C3 |
| 1 | 24.0k 0.5% | R_0402_1005Metric | R14 |
| 1 | 24.3k 1% | R_0402_1005Metric | R16 |
| 1 | 27nH | L_0402_1005Metric | L80 |
| 1 | 3.3uH Isat>=5.5A | L_Coilcraft_XxL4030 | L1 |
| 1 | 3.57k 1% | R_0402_1005Metric | R5 |
| 1 | 31.6k 1% | R_0402_1005Metric | R20 |
| 1 | 3V3 HaLow 3.2-3.4 | TestPoint_Keystone_5015_Micro-Minature | TP3 |
| 1 | 3V3_BUCK 3.25-3.40 | TestPoint_Pad_D1.5mm | TP7 |
| 1 | 3V3_GNSS 3.2-3.4 | TestPoint_Pad_D1.5mm | TP10 |
| 1 | 3V3_PI 3.2-3.4 | TestPoint_Pad_D1.5mm | TP8 |
| 1 | 3V3_SEC 3.2-3.4 | TestPoint_Pad_D1.5mm | TP9 |
| 1 | 4.7k | R_0603_1608Metric | R8 |
| 1 | 47p C0G | C_0402_1005Metric | C83 |
| 1 | 560R | R_0402_1005Metric | R82 |
| 1 | 5V 5.10-5.25 | TestPoint_Keystone_5015_Micro-Minature | TP2 |
| 1 | 5V_PI 5.0-5.2 | TestPoint_Pad_D1.5mm | TP6 |
| 1 | 600R@100MHz >=4A | L_1206_3216Metric | FB1 |
| 1 | 787k 1% | R_0402_1005Metric | R31 |
| 1 | ATECC608C-TFLXTLS | SOIC-8_3.9x4.9mm_P1.27mm | U12 |
| 1 | AUTO-ON (open) | SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP3 |
| 1 | BATT pads | BattPads_2x_3x5mm_StrainRelief | J1 |
| 1 | CPH3225A 11mF | Seiko_CPH3225A | C76 |
| 1 | CSD17578Q3A | VSON-8_3.3x3.3mm_P0.65mm_NexFET | Q3 |
| 1 | CSD19537Q3 | VSON-8_3.3x3.3mm_P0.65mm_NexFET | Q1 |
| 1 | DNP 0R | R_0402_1005Metric | R80 |
| 1 | EF_FLT_N | TestPoint_Pad_D1.0mm | TP23 |
| 1 | EF_SHDN | TestPoint_Pad_D1.0mm | TP24 |
| 1 | EN_3V3 | TestPoint_Pad_D1.0mm | TP21 |
| 1 | EN_5V | TestPoint_Pad_D1.0mm | TP20 |
| 1 | GND | TestPoint_Pad_D1.5mm | TP12 |
| 1 | GND | TestPoint_Keystone_5015_Micro-Minature | TP4 |
| 1 | GNSS (closed) | SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP6 |
| 1 | GNSS_ANT_DET | TestPoint_Pad_D1.0mm | TP15 |
| 1 | GNSS_ANT_SHORT_N | TestPoint_Pad_D1.0mm | TP16 |
| 1 | GNSS_RST_N | TestPoint_Pad_D1.0mm | TP13 |
| 1 | GNSS_SAFEBOOT_N | TestPoint_Pad_D1.0mm | TP14 |
| 1 | GREEN | LED_0402_1005Metric | D3 |
| 1 | K1+ (R9) | TestPoint_Pad_D1.0mm | TP27 |
| 1 | K1- (R9) | TestPoint_Pad_D1.0mm | TP28 |
| 1 | K2+ (R22) | TestPoint_Pad_D1.0mm | TP29 |
| 1 | K2- (R22) | TestPoint_Pad_D1.0mm | TP30 |
| 1 | LM74700QDBVRQ1 | SOT-23-6 | U4 |
The 146 most common of 175 parts.
It measures 65 × 56.5 mm and has 4 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask winson3QQ before reusing the design.

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.


manhoosbilli1/heater-controller-rev-a
Rev A of hierarchical heater controller (multi-sheet)

purduerov/X18-ROV-Test-Bench
This will be the place to push all test bench changes.


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

