ship heltec v4-r8: build.sh, mesh america catalog (folds into heltec v4 tile), trim board docs, display.rotate list

This commit is contained in:
liquidraver
2026-09-19 21:07:39 +02:00
parent c5ab279c32
commit fb6a303678
6 changed files with 18 additions and 24 deletions
+1
View File
@@ -71,6 +71,7 @@ ESP32_boards=(
heltec_wifi_lora32_v3/esp32s3/procpu
heltec_wifi_lora32_v4/esp32s3/procpu
heltec_wifi_lora32_v43/esp32s3/procpu
heltec_wifi_lora32_v4_r8/esp32s3/procpu
heltec_wireless_tracker/esp32s3/procpu
heltec_wireless_tracker_v2/esp32s3/procpu
meshnology_w12/esp32s3/procpu
+1
View File
@@ -1012,6 +1012,7 @@ Build strings and flash methods: `boards/supported_boards.md` and `boards/exampl
| Station G2 | ESP32-S3 | SX1262+PA | UART GNSS | OLED (SH1106) | 16MB flash, 8MB PSRAM |
| Heltec V3 | ESP32-S3 | SX1262 | - | OLED (SSD1306) | Console on `uart0` |
| Heltec V4.2 / V4.3 | ESP32-S3 | SX1262+PA (GC1109 / KCT8103L) | - | OLED (SSD1306) | 16MB flash, 2MB PSRAM |
| Heltec V4-R8 | ESP32-S3R8 | SX1262+PA (KCT8103L) | L76K (optional) | OLED (SSD1306) | 16MB flash, 8MB octal PSRAM |
| Heltec Wireless Tracker | ESP32-S3 | SX1262 | UC6580 | TFT 160x80 (ST7735R) | - |
| LilyGo T-Beam v1.2 | ESP32 (PICO-D4) | SX1262 | Yes | - | AXP2101 PMU; contacts capped at 160 |
| TTGO LoRa32 | ESP32 (PICO-D4) | **SX1276** (loramac-node) | - | - | SX127x reference board |
+1 -1
View File
@@ -348,7 +348,7 @@ four radio parameters together, since they are one interop-critical set.
| `set radio.rxgain <0\|1\|on\|off>` | | RX gain boost, applied live. Replies `Error: unsupported` on radios without RX boost (SX127x); the pref is still saved. |
| `set radio.fem.rxgain <0\|1\|on\|off>` | default **1** | Routes receive through the external FEM's LNA (`1`) or around it via the FEM's bypass path (`0`), applied live. Sensitivity for battery life — `0` costs roughly 17 dB and saves the LNA's supply current. Transmit, and the driver's idle/sleep gating of the FEM, are unaffected either way. Supported only where the FEM's receive path is software-selectable and that select line is wired to the radio node as `lna-bypass-gpios` — today the KCT8103L boards, `heltec_t096`, `heltec_wireless_tracker_v2`, `heltec_wifi_lora32_v43` and `heltec_wifi_lora32_v4_r8`. Every other board reports `Error: unsupported`: `heltec_wifi_lora32_v4`'s GC1109 has no receive-path select (its CPS is don't-care in RX, same as MeshCore); `station_g2`, `gat562_30s`, `ikoka_nano_30dbm` and `promicro_sx1262` have only the DIO2/TXEN/RXEN transmit-receive switch; `rak3401_1watt`'s SKY66122 is enabled by a standalone always-on regulator outside the radio node; and non-SX126x radios (LR1110, LR2021, SX127x) never implement it. The pref is still saved when unsupported. **Do not expect the FEM's chip-enable to be the knob** — deasserting `antenna-enable-gpios` in RX shuts the part down and takes the through path with it (~69 dB measured on a V4.3), which is what 1.17.2 did before this moved to `lna-bypass-gpios`. |
| `set rxduty <0\|1\|on\|off>` | | RX duty cycle mode *(reboot required)*. Window timing auto-sized per SF/BW/preamble from the SX126x datasheet constraints (boot log line `rxduty:` shows the result). Zero-loss guarantee assumes senders on preamble-32 firmware (current MeshCore at SF≤8); legacy preamble-16 senders are only caught ~50% worst-phase — keep off until the local mesh has converted. Presets with 16-symbol preambles (SF≥9) fall back to continuous RX automatically. |
| `set display.rotate <0\|1\|on\|off>` | default **0** | Rotate the display 180 degrees, for cases and upgrade kits that mount the screen upside down (e.g. the Meshnology N37E for the Wio Tracker L1). Applied live — the driver flips the panel's `SEGMENT_MAP` and `COM_OUTPUT_SCAN`, two bytes on the wire, and the next frame comes out rotated with no redraw and no per-frame cost. **Only full-height SSD1306 and SH1106 panels support this** (`rak4631`, `gat562_30s`, `heltec_wifi_lora32_v4`/`v43`, `lilygo_t3s3`, `station_g2`, `wio_tracker_l1`); every other panel replies `Error: this panel cannot rotate` and the pref is **not** saved, so a stored value can never disagree with what the screen shows. `lilygo_timpulse_plus` is excluded despite being an SSD1306: its 64x32 glass is windowed into a 128x64 controller at `page-offset 4`, and the COM-scan reversal flips the controller's whole range, which would move the image off the bonded region. E-paper (SSD16xx) is excluded on purpose: its driver accepts a 180-degree orientation but implements it by flipping the RAM entry mode only, which reverses byte order without reversing bit order inside each byte — it would report success and render wrong. |
| `set display.rotate <0\|1\|on\|off>` | default **0** | Rotate the display 180 degrees, for cases and upgrade kits that mount the screen upside down (e.g. the Meshnology N37E for the Wio Tracker L1). Applied live — the driver flips the panel's `SEGMENT_MAP` and `COM_OUTPUT_SCAN`, two bytes on the wire, and the next frame comes out rotated with no redraw and no per-frame cost. **Only full-height SSD1306 and SH1106 panels support this** (`rak4631`, `gat562_30s`, `heltec_wifi_lora32_v4`/`v43`/`v4_r8`, `lilygo_t3s3`, `station_g2`, `wio_tracker_l1`); every other panel replies `Error: this panel cannot rotate` and the pref is **not** saved, so a stored value can never disagree with what the screen shows. `lilygo_timpulse_plus` is excluded despite being an SSD1306: its 64x32 glass is windowed into a 128x64 controller at `page-offset 4`, and the COM-scan reversal flips the controller's whole range, which would move the image off the bonded region. E-paper (SSD16xx) is excluded on purpose: its driver accepts a 180-degree orientation but implements it by flipping the RAM entry mode only, which reverses byte order without reversing bit order inside each byte — it would report success and render wrong. |
| `set input.rotate <0\|1\|on\|off>` | default **0** | Swap the joystick/D-pad axes — up/down and left/right — to match an upside-down mount. Applied live. Deliberately **separate** from `display.rotate`: a case can flip the screen without moving the stick, and boards whose panel cannot rotate can still need the axis swap. Works on every board with directional input, in both the joystick UI and the button UI (where it swaps page-prev/page-next). Non-directional keys, tap codes and long-press gestures are unaffected. |
| `set tz.offset <-12..14>` | default **0** (UTC) | Whole-hour offset from UTC applied when formatting the **on-device clock display** — the top bar, the status page and the joystick System -> Time screen, which show e.g. `UTC+2` instead of `UTC`. Accepts `default`. **Display only, by design.** The RTC itself, `clock`, `clock sync` and `time <epoch>` all stay UTC: they round-trip with each other, apps parse them, and an offset that reached the clock would read as a jump to every timestamp consumer on the node (advert timestamps, the ACL's monotonic `sender_timestamp` gate, MeshTimeSync) — a backward clock silently mutes a node on the mesh. Whole hours only, matching upstream MeshCore's command of the same name, so half-hour zones (+5:30, -3:30) cannot be expressed. Accepted on headless nodes, where it is simply inert. |
| `set adc.multiplier <mult>` | `0` (use board default) or 100–30000 | Battery voltage ADC calibration multiplier, set directly. Rejects non-numeric input, NaN/inf and negatives. |
+9 -23
View File
@@ -55,7 +55,7 @@ station_g2/esp32s3/procpu
heltec_wifi_lora32_v3/esp32s3/procpu
heltec_wifi_lora32_v4/esp32s3/procpu
heltec_wifi_lora32_v43/esp32s3/procpu
heltec_wifi_lora32_v4_r8/esp32s3/procpu # source-only, no published firmware
heltec_wifi_lora32_v4_r8/esp32s3/procpu
heltec_wireless_tracker/esp32s3/procpu
heltec_wireless_tracker_v2/esp32s3/procpu
thinknode_m9/esp32s3/procpu
@@ -67,38 +67,24 @@ ttgo_lora32/esp32/procpu # source-only, no published firmware
>
> Heltec V3 console/shell use `uart0` (UART serial) in ZephCore.
>
> **Heltec WiFi LoRa 32 V4-R8** (`heltec_wifi_lora32_v4_r8/esp32s3/procpu`): a third board in the
> V4 family, distinct from both `heltec_wifi_lora32_v4` (the V4.2) and `heltec_wifi_lora32_v43`
> (the V4.3). The "R8" is the SoC part — **ESP32-S3R8 with 8 MB octal PSRAM**, where V4 and V4.3
> are both S3R2 with 2 MB quad.
>
> Octal PSRAM consumes GPIO33–37, and that one fact explains every pin move on the revision:
> **Heltec WiFi LoRa 32 V4-R8** (`heltec_wifi_lora32_v4_r8/esp32s3/procpu`): ESP32-S3R8 with
> **8 MB octal PSRAM** (V4 and V4.3 are S3R2, 2 MB quad) and the V4.3's KCT8103L FEM. Octal PSRAM
> takes GPIO33-37, which moves every control pin that lived there:
>
> | Function | V4 (V4.2) | V4.3 | **V4-R8** |
> |---|---|---|---|
> | PSRAM | 2 MB quad | 2 MB quad | **8 MB octal** |
> | FEM | GC1109 | KCT8103L | KCT8103L |
> | PA control | TX_EN GPIO46 | CTX GPIO5 | **CTX GPIO5** |
> | FEM / PA control | GC1109, TX_EN GPIO46 | KCT8103L, CTX GPIO5 | **KCT8103L, CTX GPIO5** |
> | Vext_Ctrl | GPIO36 | GPIO36 | **GPIO40** |
> | VGNSS_Ctrl | GPIO34 | GPIO34 | **GPIO42** |
> | LED | GPIO35 | GPIO35 | **GPIO46** |
> | GNSS_RST | GPIO42 | GPIO42 | **removed** |
> | ADC_Ctrl | GPIO37 | GPIO37 | **removed** |
>
> `PA_CTX` on GPIO5 is new relative to **V4**, which has no CTX at all — its GC1109 is driven by
> TX_EN on GPIO46 — and identical to **V4.3**. Note GPIO46 changes meaning across the family: FEM
> TX_EN on V4, the LED on V4-R8. CTX is bound as `lna-bypass-gpios`, not `tx-enable-gpios`,
> because it selects the receive path rather than enabling anything.
>
> Verified against the vendor pinmap at <https://heltec.org/project/wifi-lora-32-v4/>.
>
> **Do not flash `heltec_wifi_lora32_v4` or `heltec_wifi_lora32_v43` to a V4-R8.** Those boards
> declare `&psram0 { size = <DT_SIZE_M(2)>; }`, so PSRAM comes up as 2 MB quad on an 8 MB octal
> part, and
> they drive GPIO35/36/37 as ordinary outputs — GPIO33-37 are the octal-PSRAM pads on an S3R8.
> PSRAM is therefore both misconfigured and pin-contended. On top of that Vext is driven on GPIO36
> instead of GPIO40, so the rail feeding the OLED and sensors never switches, and GPIO37 is driven
> as an ADC enable this revision does not have.
> **Do not flash `heltec_wifi_lora32_v4` or `heltec_wifi_lora32_v43` firmware to a V4-R8**: it
> configures the PSRAM as 2 MB quad and drives GPIO35-37, which are PSRAM pads on this part, and
> the OLED/sensor rail never switches on. The Mesh America catalog lists it under the Heltec v4
> tile as the "R8" rows.
>
> **Heltec Wireless Tracker** (`heltec_wireless_tracker/esp32s3/procpu`): V1.1
> ESP32-S3-FN8 companion with SX1262, ST7735R 160x80 TFT, and UC6580 GPS.
+5
View File
@@ -194,6 +194,11 @@ BOARDS = [
dict(stem="station_g2-esp32s3-procpu", kind="esp32", device="UnitEng Station G2"),
dict(stem="heltec_wifi_lora32_v3-esp32s3-procpu", kind="esp32", device="Heltec v3"),
dict(stem="heltec_wifi_lora32_v4-esp32s3-procpu", kind="esp32", device="Heltec v4"),
# MeshCore folds the R8 (ESP32-S3R8, 8 MB octal PSRAM) into its "Heltec v4"
# tile as "[R8] ..." role rows rather than giving it a device of its own, so
# it folds here too, told apart by the subTitle.
dict(stem="heltec_wifi_lora32_v4_r8-esp32s3-procpu", kind="esp32", device="Heltec v4",
subtitle="R8"),
dict(stem="heltec_wireless_tracker-esp32s3-procpu", kind="esp32", device="Heltec Wireless Tracker"),
dict(stem="heltec_wireless_tracker_v2-esp32s3-procpu", kind="esp32", device="Heltec Wireless Tracker v2"),
# MeshCore splits this board by radio -- "(SX126x)" and "(SX127x)" are two
+1
View File
@@ -49,6 +49,7 @@ SWD flash: `west flash` (requires J-Link, pyocd, or nrfjprog connected).
| Heltec V3 | `west build -b heltec_wifi_lora32_v3/esp32s3/procpu zephcore` | `west flash` |
| Heltec V4.2 (GC1109 PA) | `west build -b heltec_wifi_lora32_v4/esp32s3/procpu zephcore` | `west flash` |
| Heltec V4.3 (KCT8103L PA) | `west build -b heltec_wifi_lora32_v43/esp32s3/procpu zephcore` | `west flash` |
| Heltec V4-R8 (KCT8103L PA, 8MB octal PSRAM) | `west build -b heltec_wifi_lora32_v4_r8/esp32s3/procpu zephcore` | `west flash` |
| Heltec Wireless Tracker V1.1 | `west build -b heltec_wireless_tracker/esp32s3/procpu zephcore` | `west flash` |
| Heltec Wireless Tracker V2 | `west build -b heltec_wireless_tracker_v2/esp32s3/procpu zephcore` | `west flash` |
| LilyGo T-Beam v1.2 | `west build -b ttgo_tbeam/esp32/procpu zephcore` | `west flash` |