From 4d919d13c1c96ed4574431219c452e25aaaa53c0 Mon Sep 17 00:00:00 2001 From: kevin Date: Sun, 19 Jul 2026 17:46:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=88=B0v6=E5=BC=95=E5=AF=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diy/moonshine_NRF52_mini/platformio.ini | 3 +- .../diy/moonshine_NRF52_mini/readme.md | 93 +++++++++++-------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/variants/nrf52840/diy/moonshine_NRF52_mini/platformio.ini b/variants/nrf52840/diy/moonshine_NRF52_mini/platformio.ini index 9c34e4bf4..837ed2998 100644 --- a/variants/nrf52840/diy/moonshine_NRF52_mini/platformio.ini +++ b/variants/nrf52840/diy/moonshine_NRF52_mini/platformio.ini @@ -1,8 +1,9 @@ ; Moonshine NRF52 mini - minimal DIY variant (nRF52840 + RA-01S-P SX1262) +; Uses S140 v6 SoftDevice (matches nice!nano / Adafruit Feather factory bootloader). +; Inherits the default v6 ldscript from [nrf52840_base] (app start at 0x26000). [env:moonshine_NRF52_node_mini] extends = nrf52840_base board = adafruit_feather_nrf52840 -board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/diy/moonshine_NRF52_mini -D PRIVATE_HW diff --git a/variants/nrf52840/diy/moonshine_NRF52_mini/readme.md b/variants/nrf52840/diy/moonshine_NRF52_mini/readme.md index 98fc1c4bb..0a2fc56a0 100644 --- a/variants/nrf52840/diy/moonshine_NRF52_mini/readme.md +++ b/variants/nrf52840/diy/moonshine_NRF52_mini/readme.md @@ -4,6 +4,11 @@ Minimal DIY Meshtastic node variant: nRF52840 + RA-01S-P (SX1262) LoRa module with a single status LED on P0.15. No display, GPS, button, or battery ADC - LoRa-only minimal system. +Tested on a **nice!nano** board (nRF52840, S140 SoftDevice v6.1.1, Adafruit UF2 +bootloader 0.9.2). Also compatible with any nRF52840 board that has the Adafruit +UF2 bootloader with S140 v6.x SoftDevice (e.g. Adafruit Feather nRF52840 Express +factory bootloader). + ## Hardware - **MCU**: nRF52840 (512 KB flash / 128 KB RAM) @@ -29,7 +34,8 @@ LoRa-only minimal system. | SPI_MOSI | P1.15 | LORA_MOSI | Only the status LED on P0.15 is wired (no button, battery ADC, GPS, or display). -The board has no user button, so DFU entry is via the 1200 bps touch or SWD. +The board has no user button, so DFU entry is via double-tap reset or the +1200 bps touch. ## Build & Flash @@ -42,59 +48,72 @@ pio run -e moonshine_NRF52_node_mini Uses `PRIVATE_HW` (HardwareModel 255) - no protobuf or `architecture.h` changes required. -The build links against `nrf52840_s140_v7.ld`, so the application is linked to -start at `0x27000` and requires the S140 SoftDevice v7.x to be present on the -chip at `0x0`-`0x26FFF` (or the Adafruit nRF52 UF2 "bright-future" bootloader, -which bundles its own SoftDevice). The build output (`firmware-*.hex` / `.uf2`) -contains **only the application**, not the SoftDevice. +The build inherits the default v6 ldscript from `[nrf52840_base]` +(`src/platform/nrf52/nrf52840_s140_v6.ld`), so the application is linked to +start at `0x26000` and requires the S140 SoftDevice v6.x to be present on the +chip at `0x0`-`0x25FFF`. The Adafruit nRF52 UF2 bootloader bundles its own +SoftDevice (v6.1.1 on the nice!nano), so if UF2 mode works the SoftDevice is +already present. The build output (`firmware-*.hex` / `.uf2`) contains **only +the application**, not the SoftDevice. -### Flash (first time on a bare nRF52840) +### Flash via UF2 (recommended - no SWD required) + +Prerequisite: the board has the Adafruit UF2 bootloader installed (factory +default on nice!nano and Adafruit Feather nRF52840 Express). Confirm by entering +UF2 mode and reading `INFO_UF2.TXT` on the bootloader USB volume - it should +show `SoftDevice: S140 6.1.1` (or similar v6.x). + +**First-time install (clean flash):** + +1. Double-tap the Reset button to enter UF2 bootloader mode. A USB mass storage + volume appears (e.g. `NICENANO` or `FTHR840BOOT`). +2. Drag-and-drop `bin/Meshtastic_nRF52_factory_erase_v3_S140_6.1.0.uf2` onto the + volume. This erases any stale LittleFS/NodeDB/config from a prior firmware. + The board reboots when the copy completes. +3. Double-tap Reset again to re-enter UF2 mode. +4. Drag-and-drop + `.pio/build/moonshine_NRF52_node_mini/firmware-moonshine_NRF52_node_mini-*.uf2` + onto the volume. The board reboots into Meshtastic. + +**App-only update (SoftDevice already present, config already clean):** + +Skip steps 2-3 above - just double-tap Reset and drag-and-drop the application +`.uf2`. + +### Flash via SWD (for a bare nRF52840 without bootloader) A factory-fresh nRF52840 has **no SoftDevice and no bootloader**. The SoftDevice must be flashed once via SWD before the application; otherwise `Bluefruit.begin()` fails, `sd_flash_*` calls (LittleFS, NodeDB, config persistence) return errors, and the node appears dead. -The S140 v7.3.0 SoftDevice hex is shipped in this repo at -`bin/s140_nrf52_7.3.0_softdevice.hex`. Flash via SWD with OpenOCD (CMSIS-DAP / -J-Link / ST-Link). The `nrf52_recover` command does a chip-wide ERASEALL through -the nRF52 CTRL-AP and clears APPROTECT, so it is the recommended first step on a -fresh module (ebyte/Raytac modules ship with APPROTECT engaged). +For a v6 SoftDevice layout, use the combined bootloader+SoftDevice hex at +`bin/generic/Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex` (this installs +both the UF2 bootloader and the SoftDevice in one SWD pass, enabling UF2 +updates thereafter). Flash via SWD with OpenOCD (CMSIS-DAP / J-Link / ST-Link). +The `nrf52_recover` command does a chip-wide ERASEALL through the nRF52 CTRL-AP +and clears APPROTECT, so it is the recommended first step on a fresh module +(ebyte/Raytac modules ship with APPROTECT engaged). ```sh -# Full flow: recover (erase all + unlock) -> SoftDevice -> app -> reset +# Full flow: recover (erase all + unlock) -> bootloader+SoftDevice -> app -> reset C:/openocd/bin/openocd.exe -s C:/openocd/share/openocd/scripts \ -f interface/cmsis-dap.cfg -f target/nrf52.cfg \ -c "init; nrf52_recover; \ - program bin/s140_nrf52_7.3.0_softdevice.hex verify; \ - program .pio/build/moonshine_NRF52_node_mini/firmware-moonshine_NRF52_node_mini-*.hex verify; \ - reset run; exit" -``` - -### Flash (app only, SoftDevice already present) - -When the SoftDevice is already on the chip and only the application changed -(e.g. after editing the variant and rebuilding), skip `nrf52_recover` and the -SoftDevice line: - -```sh -C:/openocd/bin/openocd.exe -s C:/openocd/share/openocd/scripts \ - -f interface/cmsis-dap.cfg -f target/nrf52.cfg \ - -c "init; \ + program bin/generic/Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex verify; \ program .pio/build/moonshine_NRF52_node_mini/firmware-moonshine_NRF52_node_mini-*.hex verify; \ reset run; exit" ``` ### Notes -- The firmware hex filename contains a commit hash (e.g. `2.8.0.421838f`); use - the actual file produced by `pio run` or a shell glob. -- The SoftDevice hex occupies `0x0`-`0x26498` (~156 KB) and does **not** write - UICR, so `nrf52_recover` is safe (UICR resets to defaults). +- The firmware hex/uf2 filename contains a commit hash (e.g. `2.8.0.fbbfcf0`); + use the actual file produced by `pio run` or a shell glob. +- The combined bootloader+SoftDevice hex occupies `0x0`-`0x26000` and does + **not** write UICR, so `nrf52_recover` is safe (UICR resets to defaults). - Swap `interface/cmsis-dap.cfg` for `interface/jlink.cfg` or `interface/stlink.cfg` if using a different SWD probe. -- No UF2 bootloader is installed in this flow, so subsequent updates must go - through BLE DFU (secure DFU service) or SWD again. To enable UF2 drag-and-drop - updates, flash an Adafruit nRF52 UF2 bootloader - (https://github.com/adafruit/Adafruit_nRF52_Bootloader) at `0x0` in place of - the bare SoftDevice - the bootloader bundles its own SoftDevice. +- To switch to the S140 v7 SoftDevice (app start at `0x27000`, slightly larger + app region), add `board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld` + to `platformio.ini` and flash `bin/generic/Meshtastic_7.3.0_bootloader-0.9.2_s140_7.3.0.hex` + via SWD. The v6 SoftDevice cannot be upgraded via UF2 - SWD is required.