切换到v6引导
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
; Moonshine NRF52 mini - minimal DIY variant (nRF52840 + RA-01S-P SX1262)
|
; 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]
|
[env:moonshine_NRF52_node_mini]
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = adafruit_feather_nrf52840
|
board = adafruit_feather_nrf52840
|
||||||
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
|
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-I variants/nrf52840/diy/moonshine_NRF52_mini
|
-I variants/nrf52840/diy/moonshine_NRF52_mini
|
||||||
-D PRIVATE_HW
|
-D PRIVATE_HW
|
||||||
|
|||||||
@@ -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 -
|
with a single status LED on P0.15. No display, GPS, button, or battery ADC -
|
||||||
LoRa-only minimal system.
|
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
|
## Hardware
|
||||||
|
|
||||||
- **MCU**: nRF52840 (512 KB flash / 128 KB RAM)
|
- **MCU**: nRF52840 (512 KB flash / 128 KB RAM)
|
||||||
@@ -29,7 +34,8 @@ LoRa-only minimal system.
|
|||||||
| SPI_MOSI | P1.15 | LORA_MOSI |
|
| SPI_MOSI | P1.15 | LORA_MOSI |
|
||||||
|
|
||||||
Only the status LED on P0.15 is wired (no button, battery ADC, GPS, or display).
|
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
|
## Build & Flash
|
||||||
|
|
||||||
@@ -42,59 +48,72 @@ pio run -e moonshine_NRF52_node_mini
|
|||||||
Uses `PRIVATE_HW` (HardwareModel 255) - no protobuf or `architecture.h` changes
|
Uses `PRIVATE_HW` (HardwareModel 255) - no protobuf or `architecture.h` changes
|
||||||
required.
|
required.
|
||||||
|
|
||||||
The build links against `nrf52840_s140_v7.ld`, so the application is linked to
|
The build inherits the default v6 ldscript from `[nrf52840_base]`
|
||||||
start at `0x27000` and requires the S140 SoftDevice v7.x to be present on the
|
(`src/platform/nrf52/nrf52840_s140_v6.ld`), so the application is linked to
|
||||||
chip at `0x0`-`0x26FFF` (or the Adafruit nRF52 UF2 "bright-future" bootloader,
|
start at `0x26000` and requires the S140 SoftDevice v6.x to be present on the
|
||||||
which bundles its own SoftDevice). The build output (`firmware-*.hex` / `.uf2`)
|
chip at `0x0`-`0x25FFF`. The Adafruit nRF52 UF2 bootloader bundles its own
|
||||||
contains **only the application**, not the SoftDevice.
|
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
|
A factory-fresh nRF52840 has **no SoftDevice and no bootloader**. The SoftDevice
|
||||||
must be flashed once via SWD before the application; otherwise `Bluefruit.begin()`
|
must be flashed once via SWD before the application; otherwise `Bluefruit.begin()`
|
||||||
fails, `sd_flash_*` calls (LittleFS, NodeDB, config persistence) return errors,
|
fails, `sd_flash_*` calls (LittleFS, NodeDB, config persistence) return errors,
|
||||||
and the node appears dead.
|
and the node appears dead.
|
||||||
|
|
||||||
The S140 v7.3.0 SoftDevice hex is shipped in this repo at
|
For a v6 SoftDevice layout, use the combined bootloader+SoftDevice hex at
|
||||||
`bin/s140_nrf52_7.3.0_softdevice.hex`. Flash via SWD with OpenOCD (CMSIS-DAP /
|
`bin/generic/Meshtastic_6.1.0_bootloader-0.9.2_s140_6.1.1.hex` (this installs
|
||||||
J-Link / ST-Link). The `nrf52_recover` command does a chip-wide ERASEALL through
|
both the UF2 bootloader and the SoftDevice in one SWD pass, enabling UF2
|
||||||
the nRF52 CTRL-AP and clears APPROTECT, so it is the recommended first step on a
|
updates thereafter). Flash via SWD with OpenOCD (CMSIS-DAP / J-Link / ST-Link).
|
||||||
fresh module (ebyte/Raytac modules ship with APPROTECT engaged).
|
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
|
```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 \
|
C:/openocd/bin/openocd.exe -s C:/openocd/share/openocd/scripts \
|
||||||
-f interface/cmsis-dap.cfg -f target/nrf52.cfg \
|
-f interface/cmsis-dap.cfg -f target/nrf52.cfg \
|
||||||
-c "init; nrf52_recover; \
|
-c "init; nrf52_recover; \
|
||||||
program bin/s140_nrf52_7.3.0_softdevice.hex verify; \
|
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"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 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 .pio/build/moonshine_NRF52_node_mini/firmware-moonshine_NRF52_node_mini-*.hex verify; \
|
program .pio/build/moonshine_NRF52_node_mini/firmware-moonshine_NRF52_node_mini-*.hex verify; \
|
||||||
reset run; exit"
|
reset run; exit"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
- The firmware hex filename contains a commit hash (e.g. `2.8.0.421838f`); use
|
- The firmware hex/uf2 filename contains a commit hash (e.g. `2.8.0.fbbfcf0`);
|
||||||
the actual file produced by `pio run` or a shell glob.
|
use the actual file produced by `pio run` or a shell glob.
|
||||||
- The SoftDevice hex occupies `0x0`-`0x26498` (~156 KB) and does **not** write
|
- The combined bootloader+SoftDevice hex occupies `0x0`-`0x26000` and does
|
||||||
UICR, so `nrf52_recover` is safe (UICR resets to defaults).
|
**not** write UICR, so `nrf52_recover` is safe (UICR resets to defaults).
|
||||||
- Swap `interface/cmsis-dap.cfg` for `interface/jlink.cfg` or
|
- Swap `interface/cmsis-dap.cfg` for `interface/jlink.cfg` or
|
||||||
`interface/stlink.cfg` if using a different SWD probe.
|
`interface/stlink.cfg` if using a different SWD probe.
|
||||||
- No UF2 bootloader is installed in this flow, so subsequent updates must go
|
- To switch to the S140 v7 SoftDevice (app start at `0x27000`, slightly larger
|
||||||
through BLE DFU (secure DFU service) or SWD again. To enable UF2 drag-and-drop
|
app region), add `board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld`
|
||||||
updates, flash an Adafruit nRF52 UF2 bootloader
|
to `platformio.ini` and flash `bin/generic/Meshtastic_7.3.0_bootloader-0.9.2_s140_7.3.0.hex`
|
||||||
(https://github.com/adafruit/Adafruit_nRF52_Bootloader) at `0x0` in place of
|
via SWD. The v6 SoftDevice cannot be upgraded via UF2 - SWD is required.
|
||||||
the bare SoftDevice - the bootloader bundles its own SoftDevice.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user