update thinknode + example

This commit is contained in:
liquidraver
2026-03-02 08:31:38 +01:00
parent 7081e19b3d
commit 99784d5856
7 changed files with 93 additions and 10 deletions
+2 -1
View File
@@ -187,7 +187,8 @@ CONFIG_USBD_LOG_LEVEL_WRN=y
CONFIG_POWEROFF=y
# ========== LoRa Power Saving ==========
# RX duty cycle OFF by default — causes marginal packet loss on repeaters.
# RX duty cycle OFF by default — LR1110 cannot lock on mid-preamble,
# causing packet loss with duty-cycled RX. SX1262/LLCC68 handle it fine.
# Enable per-board via board.conf, or at runtime via CLI "set rxduty on".
CONFIG_ZEPHCORE_LORA_RX_DUTY_CYCLE=n
+4 -3
View File
@@ -41,10 +41,11 @@ PATTERN 2: Fully Custom Board (new DTS)
Use this when your board does NOT exist in Zephyr's tree.
You need a full board definition: .dts, pinctrl, Kconfig, etc.
Examples: Ikoka Nano 30dBm (custom nRF52840 design)
Examples: Ikoka Nano 30dBm, ThinkNode M1 (custom nRF52840 designs)
Look at an existing custom board as a template:
zephcore/boards/nrf52840/ikoka_nano_30dbm/
Look at existing custom boards as templates:
zephcore/boards/nrf52840/ikoka_nano_30dbm/ — minimal (LoRa only)
zephcore/boards/nrf52840/thinknode_m1/ — full-featured (EPD, GPS, QSPI, buzzer)
A full custom board includes:
board.conf — Kconfig (name, radio, overrides)
+14 -4
View File
@@ -56,6 +56,15 @@ CONFIG_BT_DIS_MODEL_NUMBER_STR="My Board v1"
# 2. Set zephyr,display = &your_display; in the "chosen" block
# 3. That's it — driver, CFB, and UI all auto-enable
#
# HEAP WARNING: The CFB framebuffer is allocated via k_malloc at boot.
# The default heap (2048 in zephcore_common.conf) fits 128x64 OLEDs.
# Displays larger than 128x64 WILL fail silently (-ENOMEM, blank screen).
# Override the heap for your display resolution:
# 200x200 (SSD1681): CONFIG_HEAP_MEM_POOL_SIZE=6144
# 296x128 (SSD1680): CONFIG_HEAP_MEM_POOL_SIZE=6144
# On RAM-constrained MCUs (nRF52840), you may also need to shrink the
# RTT buffer: CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=1024 (saves 3KB).
#
# To DISABLE display on a board WITHOUT a screen (enables LED heartbeat):
# CONFIG_ZEPHCORE_UI_DISPLAY=n
# The heartbeat LED (led0 alias) only blinks when display is disabled
@@ -124,7 +133,8 @@ CONFIG_BT_DIS_MODEL_NUMBER_STR="My Board v1"
# ESP32-C3: 300 (limited DRAM)
# CONFIG_ZEPHCORE_MAX_CONTACTS=450
# ========== OPTIONAL: Disable RX Duty Cycle ==========
# Inherited from platform common config as enabled (power savings).
# Override here if your board is wall-powered.
# CONFIG_ZEPHCORE_LORA_RX_DUTY_CYCLE=n
# ========== OPTIONAL: RX Duty Cycle ==========
# Disabled by default in zephcore_common.conf because the LR1110 cannot lock
# on mid-preamble, causing packet loss with duty-cycled RX.
# SX1262/LLCC68 boards handle duty cycle fine — enable for battery savings:
# CONFIG_ZEPHCORE_LORA_RX_DUTY_CYCLE=y
+47 -2
View File
@@ -81,8 +81,9 @@
* MG24: skip (usart0 already set)
*/
/* --- Display (uncomment if board has OLED/LCD) ---
* zephyr,display = &oled;
/* --- Display (uncomment if board has OLED/LCD/e-paper) ---
* zephyr,display = &oled; I2C OLED (SH1106, SSD1306)
* zephyr,display = &epd; SPI e-paper (SSD1681, etc.)
*/
};
};
@@ -774,6 +775,50 @@
* };
*/
/* --- E-Paper Display on SPI (any platform with SPI) ---
*
* Supported: "solomon,ssd1681" (1.54" 200x200 mono)
* Remember to set zephyr,display = &epd; in chosen block.
*
* IMPORTANT — HEAP: The CFB framebuffer is allocated via k_malloc at boot.
* The default heap (2048) is sized for 128x64 OLEDs (1024 bytes).
* Larger displays need more heap in board.conf:
*
* Display Resolution Framebuffer Heap needed
* SSD1306/SH1106 128x64 1024 bytes 2048 (default)
* SSD1681 200x200 5000 bytes 6144+
* SSD1680 296x128 4736 bytes 6144+
*
* If the heap is too small, cfb_framebuffer_init() silently fails
* with -ENOMEM and the display stays blank (white for e-paper).
*
* The MIPI DBI node wraps SPI with DC and RST GPIOs.
* The display node is a child of the MIPI DBI node.
*
* If your EPD has a separate power/boost-converter enable GPIO,
* add a regulator-fixed node with regulator-boot-on (see ThinkNode M1).
*
* / {
* mipi_dbi {
* compatible = "zephyr,mipi-dbi-spi";
* spi-dev = <&spi3>;
* dc-gpios = <&gpio0 28 GPIO_ACTIVE_HIGH>;
* reset-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
* #address-cells = <1>;
* #size-cells = <0>;
*
* epd: ssd16xxfb@0 {
* compatible = "solomon,ssd1681";
* mipi-max-frequency = <4000000>;
* reg = <0>;
* width = <200>;
* height = <200>;
* busy-gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>;
* };
* };
* };
*/
/* --- I2C Environment Sensors (any platform with I2C) ---
*
* Auto-detected at runtime. Just include the common dtsi.
@@ -4,3 +4,10 @@
config BOARD_THINKNODE_M1
select SOC_NRF52840_QIAA
# Board power enable (P0.12) must be HIGH before QSPI flash can respond.
# QSPI NOR init priority is 41 — regulator must run first.
if REGULATOR_FIXED
config REGULATOR_FIXED_INIT_PRIORITY
default 30
endif
@@ -26,3 +26,12 @@ CONFIG_ZEPHCORE_MAX_CONTACTS=510
# PWM for buzzer
CONFIG_PWM=y
# ========== RAM budget ==========
# SSD1681 200x200 CFB framebuffer needs 5000 bytes from k_malloc.
# Default heap (2048) is sized for SSD1306 128x64 (1024 bytes).
CONFIG_HEAP_MEM_POOL_SIZE=6144
# Shrink RTT buffer to free RAM (4096 → 1024, saves 3KB).
# Only used during J-Link debugging, 1KB is Zephyr's default.
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=1024
@@ -172,6 +172,16 @@
};
};
/* Display power enable (P1.11) — drives the EPD's boost converter /
* frontlight. Without this HIGH, SPI works but the charge pump
* cannot flip e-ink particles (display appears dead). */
disp_pwr_enable: disp-pwr-enable {
compatible = "regulator-fixed";
regulator-name = "disp-pwr-enable";
enable-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
regulator-boot-on;
};
/* ---- E-Paper display (MIPI DBI SPI) ----
* SSD1681 1.54" 200x200 monochrome EPD on SPI3.
* The MIPI DBI node wraps the SPI bus with DC and RST GPIOs.