ESP32-S3 + SX1262 + 1.3" SH1106 OLED + CP2102 UART bridge +
1000 mAh Li-Po. Pin map verified against Meshtastic's
variants/esp32s3/ELECROW-ThinkNode-M2. DIO3 TCXO at 3.3 V (vs 1.8 V
on Heltec), VEXT_ENABLE active HIGH (opposite polarity), dedicated
LORA_POWER_EN on GPIO48 sequenced before SPI init. Reuses the
existing async SH1106 driver at I2C address 0x3C.
Refactors hal::esp32s3::{init_spi,init_i2c} and board::esp32s3::init_radio
to accept generic GPIO bounds so ESP32-S3 boards with different pin
assignments can share the helpers. init_radio now takes a
TcxoCtrlVoltage parameter instead of hardcoding Ctrl1V8.
Incidental cleanups needed to make `just check-all` green:
- Replace the core::mem::forget(output) pattern with let _foo = ...;
current esp-hal makes Output non-Drop, so forget is a no-op that
trips clippy's forget_non_drop lint.
- Switch justfile xtensa builds from `cargo +nightly` with a RUSTC
override to `cargo +esp` so the compiler and rust-src versions stay
aligned. Public nightly's rust-src had drifted two months ahead of
the esp fork and broke -Zbuild-std on core.
64 lines
2.3 KiB
Markdown
64 lines
2.3 KiB
Markdown
# DongLoRa Firmware
|
|
|
|
Embedded Rust firmware for DongLoRa boards. Exposes the LoRa radio over
|
|
USB CDC-ACM using a COBS-framed binary protocol.
|
|
|
|
## Building
|
|
|
|
```sh
|
|
just setup # one-time toolchain install
|
|
just build heltec_v4 # build for a specific board
|
|
just flash heltec_v4 # build + flash
|
|
just check-all # compile-check all boards
|
|
just clippy heltec_v4 # lint
|
|
just test # host-side protocol unit tests
|
|
```
|
|
|
|
All commands are run from the `firmware/` directory.
|
|
|
|
## Supported Boards
|
|
|
|
| Board | Feature | MCU | Radio | USB | Target |
|
|
|-------|---------|-----|-------|-----|--------|
|
|
| Heltec V3 | `heltec_v3` | ESP32-S3 | SX1262 | Native CDC-ACM | xtensa-esp32s3-none-elf |
|
|
| Heltec V3 (UART) | `heltec_v3_uart` | ESP32-S3 | SX1262 | CP2102 bridge | xtensa-esp32s3-none-elf |
|
|
| Heltec V4 | `heltec_v4` | ESP32-S3 | SX1262 | Native CDC-ACM | xtensa-esp32s3-none-elf |
|
|
| ELECROW ThinkNode-M2 | `elecrow_thinknode_m2` | ESP32-S3 | SX1262 | CP2102 bridge | xtensa-esp32s3-none-elf |
|
|
| RAK WisBlock 4631 | `rak_wisblock_4631` | nRF52840 | SX1262 | Native CDC-ACM | thumbv7em-none-eabihf |
|
|
| Waveshare RP2040-LoRa | `waveshare_rp2040_lora` | RP2040 | SX1262 | Native CDC-ACM | thumbv6m-none-eabi |
|
|
| Wio Tracker L1 | `wio_tracker_l1` | nRF52840 | SX1262 | Native CDC-ACM | thumbv7em-none-eabihf |
|
|
|
|
### Heltec V3 USB Note
|
|
|
|
The default `heltec_v3` build uses **native USB CDC-ACM**, which requires a
|
|
hardware modification to your board. Stock Heltec V3 boards route USB through a
|
|
CP2102 bridge chip to UART — the ESP32-S3's native USB pins (GPIO19/GPIO20) are
|
|
routed to header pins but not connected to the USB connector.
|
|
|
|
**To enable native USB on a Heltec V3:**
|
|
|
|
1. Solder 0-ohm (or 22-ohm) resistors at pads **R29** (D+) and **R3** (D-)
|
|
2. Disconnect the CP2102 from the USB connector's D+/D- lines (cut traces or
|
|
remove the CP2102 bridge resistors)
|
|
|
|
After this mod, the board appears as `/dev/ttyACM0` with the DongLoRa VID:PID
|
|
(1209:5741), just like the V4 and nRF boards.
|
|
|
|
**If you have a stock (unmodified) V3**, use `heltec_v3_uart` instead:
|
|
|
|
```sh
|
|
just build heltec_v3_uart
|
|
just flash heltec_v3_uart
|
|
```
|
|
|
|
This builds firmware that communicates via the CP2102 bridge (appears as
|
|
`/dev/ttyUSB0`).
|
|
|
|
## Adding a Board
|
|
|
|
See [src/board/PORTING.md](src/board/PORTING.md).
|
|
|
|
## Protocol
|
|
|
|
See [PROTOCOL.md](PROTOCOL.md) for the complete wire format specification.
|