RAK4631 - enable display support

This commit is contained in:
liquidraver
2026-04-14 08:55:11 +02:00
parent 5c3df69621
commit 076becb70f
3 changed files with 156 additions and 133 deletions
+1
Submodule _meshcore_arduino added at 9f680d1744
+28 -24
View File
@@ -1,24 +1,28 @@
# RAK4631 (nRF52840 + SX1262)
# Board-specific configuration - pins and unique features only
#
# SoftDevice: s140 v6.1.1 (app@0x26000, bootloader@0xF4000)
# Arduino linker: nrf52840_s140_v6.ld
#
# Hardware:
# - SX1262 LoRa on SPI0 (built into RAK4631 module)
# - RAK1910 GPS on UART0 (Slot A) - u-blox MAX-7Q at 9600 baud
# - Battery ADC on AIN3 (P0.05)
# - I2C0 for WisBlock sensors (auto-detected):
# - RAK1901 (SHTC3) at 0x70
# - RAK1902 (LPS22HB) at 0x5C
# - RAK1906 (BME680) at 0x76
# Board identification (matches Arduino variant name)
CONFIG_ZEPHCORE_BOARD_NAME="RAK 4631"
# Device Information Service model name
CONFIG_BT_DIS_MODEL_NUMBER_STR="RAK4631"
# SoftDevice firmware ID (s140 v6.1.1)
CONFIG_ZEPHCORE_SD_FWID=0x00B6
# RAK4631 (nRF52840 + SX1262)
# Board-specific configuration - pins and unique features only
#
# SoftDevice: s140 v6.1.1 (app@0x26000, bootloader@0xF4000)
# Arduino linker: nrf52840_s140_v6.ld
#
# Hardware:
# - SX1262 LoRa on SPI0 (built into RAK4631 module)
# - RAK1910 GPS on UART0 (Slot A) - u-blox MAX-7Q at 9600 baud
# - Battery ADC on AIN3 (P0.05)
# - I2C0 for WisBlock sensors (auto-detected):
# - RAK1901 (SHTC3) at 0x70
# - RAK1902 (LPS22HB) at 0x5C
# - RAK1906 (BME680) at 0x76
# - Optional SSD1306 128x64 OLED @ 0x3C (P0.13 SDA, P0.14 SCL), same as MeshCore Arduino
# Board identification (matches Arduino variant name)
CONFIG_ZEPHCORE_BOARD_NAME="RAK 4631"
# Device Information Service model name
CONFIG_BT_DIS_MODEL_NUMBER_STR="RAK4631"
# SoftDevice firmware ID (s140 v6.1.1)
CONFIG_ZEPHCORE_SD_FWID=0x00B6
# Display: compile in UI display stack; panel is optional at runtime (probe/init).
CONFIG_ZEPHCORE_UI_DISPLAY=y
+127 -109
View File
@@ -1,109 +1,127 @@
/*
* RAK4631 overlay for SoftDevice + UF2 bootloader.
* App at 0x26000, storage at 0xD4000, bootloader at 0xF4000.
* Uses SoftDevice s140 v6.1.1 (ends at 0x26000).
* Console: USB CDC ACM.
* Battery: AIN3 = P0.05 (Arduino pin 5), voltage divider per RAK4631 schematic.
*
* QSPI Flash: Optional external flash on WisBlock Base boards.
* Supports: P25Q16H, MX25R1635F, W25Q16, GD25Q16, IS25LP080, ZD25WQ16
* If no QSPI flash present, falls back to internal flash only.
*
* GPS: RAK1910 (u-blox MAX-7Q) on UART0 at 9600 baud (Slot A)
* Sensors: Auto-detected on I2C0 - supports:
* - RAK1901 (SHTC3) at 0x70
* - RAK1902 (LPS22HB) at 0x5C
* - RAK1906 (BME680) at 0x76
*/
#include <zephyr/dt-bindings/adc/nrf-saadc.h>
/delete-node/ &boot_partition;
/delete-node/ &slot0_partition;
/delete-node/ &slot1_partition;
/delete-node/ &storage_partition;
/ {
aliases {
led1 = &green_led;
};
chosen {
zephyr,code-partition = &code_partition;
zephyr,console = &cdc_acm_uart;
zephyr,shell-uart = &cdc_acm_uart;
};
};
/* Battery ADC - AIN3 on P0.05 with voltage divider */
/ {
zephyr,user {
io-channels = <&adc 3>;
vbat-mv-multiplier = <6161>; /* Arduino: (3 * 1.73 * 1.187 * 1000) ≈ 6161, GAIN_1_6 + 0.6V ref */
};
};
&adc {
#address-cells = <1>;
#size-cells = <0>;
channel@3 {
reg = <3>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 10)>;
zephyr,input-positive = <NRF_SAADC_AIN3>;
zephyr,resolution = <12>;
};
};
&zephyr_udc0 {
cdc_acm_uart: cdc_acm_uart {
compatible = "zephyr,cdc-acm-uart";
};
};
&lora {
dio1-gpios = <&gpio1 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>;
rx-boosted;
};
/*
* GPS on UART0 - RAK1910 (u-blox MAX-7Q) at 9600 baud
* Connect to Slot A (UART pins P0.19 RX, P0.20 TX)
*/
&uart0 {
current-speed = <9600>;
gnss: gnss-nmea-generic {
compatible = "gnss-nmea-generic";
};
};
/*
* Environment & power sensors on I2C0
* All supported sensors pre-defined — auto-detected at runtime.
* WisBlock modules: RAK1901 (SHTC3), RAK1902 (LPS22HB), RAK1906 (BME680)
*/
&i2c0 {
#include "../../common/sensors-i2c.dtsi"
};
/* RAK4631 has BME680, not BME280 — override the common DTSI default */
/delete-node/ &bme280;
&i2c0 {
bme680: bme680@76 {
compatible = "bosch,bme680";
reg = <0x76>;
};
};
/*
* QSPI Flash — disabled.
* RAK19003 Mini Base Board has no QSPI flash. The upstream DTS enables &qspi,
* which hangs at boot if no chip is present. Disable it explicitly.
* For base boards with QSPI (RAK19007, RAK5005-O), create a separate variant.
*/
&qspi {
status = "disabled";
};
/* Arduino MeshCore compatible partition layout (SoftDevice v6) */
#include "../../common/nrf52_partitions_sdv6.dtsi"
/*
* RAK4631 overlay for SoftDevice + UF2 bootloader.
* App at 0x26000, storage at 0xD4000, bootloader at 0xF4000.
* Uses SoftDevice s140 v6.1.1 (ends at 0x26000).
* Console: USB CDC ACM.
* Battery: AIN3 = P0.05 (Arduino pin 5), voltage divider per RAK4631 schematic.
*
* QSPI Flash: Optional external flash on WisBlock Base boards.
* Supports: P25Q16H, MX25R1635F, W25Q16, GD25Q16, IS25LP080, ZD25WQ16
* If no QSPI flash present, falls back to internal flash only.
*
* GPS: RAK1910 (u-blox MAX-7Q) on UART0 at 9600 baud (Slot A)
* Sensors: Auto-detected on I2C0 - supports:
* - RAK1901 (SHTC3) at 0x70
* - RAK1902 (LPS22HB) at 0x5C
* - RAK1906 (BME680) at 0x76
*
* Optional WisBlock OLED (MeshCore Arduino: SSD1306 128x64 @ 0x3C on I2C0
* P0.13/P0.14, no reset GPIO). If the panel is absent, display init may fail
* at runtime; UI continues without OLED.
*/
#include <zephyr/dt-bindings/adc/nrf-saadc.h>
/delete-node/ &boot_partition;
/delete-node/ &slot0_partition;
/delete-node/ &slot1_partition;
/delete-node/ &storage_partition;
/ {
aliases {
led1 = &green_led;
};
chosen {
zephyr,code-partition = &code_partition;
zephyr,console = &cdc_acm_uart;
zephyr,shell-uart = &cdc_acm_uart;
zephyr,display = &ssd1306;
};
};
/* Battery ADC - AIN3 on P0.05 with voltage divider */
/ {
zephyr,user {
io-channels = <&adc 3>;
vbat-mv-multiplier = <6161>; /* Arduino: (3 * 1.73 * 1.187 * 1000) ≈ 6161, GAIN_1_6 + 0.6V ref */
};
};
&adc {
#address-cells = <1>;
#size-cells = <0>;
channel@3 {
reg = <3>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 10)>;
zephyr,input-positive = <NRF_SAADC_AIN3>;
zephyr,resolution = <12>;
};
};
&zephyr_udc0 {
cdc_acm_uart: cdc_acm_uart {
compatible = "zephyr,cdc-acm-uart";
};
};
&lora {
dio1-gpios = <&gpio1 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>;
rx-boosted;
};
/*
* GPS on UART0 - RAK1910 (u-blox MAX-7Q) at 9600 baud
* Connect to Slot A (UART pins P0.19 RX, P0.20 TX)
*/
&uart0 {
current-speed = <9600>;
gnss: gnss-nmea-generic {
compatible = "gnss-nmea-generic";
};
};
/*
* I2C0: optional SSD1306 OLED + environment sensors (same bus as MeshCore RAK4631).
*/
&i2c0 {
ssd1306: ssd1306@3c {
compatible = "solomon,ssd1306";
reg = <0x3c>;
width = <128>;
height = <64>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <63>;
segment-remap;
com-invdir;
inversion-on;
prechargep = <0x22>;
};
#include "../../common/sensors-i2c.dtsi"
};
/* RAK4631 has BME680, not BME280 — override the common DTSI default */
/delete-node/ &bme280;
&i2c0 {
bme680: bme680@76 {
compatible = "bosch,bme680";
reg = <0x76>;
};
};
/*
* QSPI Flash — disabled.
* RAK19003 Mini Base Board has no QSPI flash. The upstream DTS enables &qspi,
* which hangs at boot if no chip is present. Disable it explicitly.
* For base boards with QSPI (RAK19007, RAK5005-O), create a separate variant.
*/
&qspi {
status = "disabled";
};
/* Arduino MeshCore compatible partition layout (SoftDevice v6) */
#include "../../common/nrf52_partitions_sdv6.dtsi"