From da34334bb23521bc5e2a866b0f3f82e2e781c5d2 Mon Sep 17 00:00:00 2001 From: vidplace7 Date: Mon, 18 May 2026 12:54:09 -0400 Subject: [PATCH] Add Lilygo T-Impulse-Plus --- boards/t-impulse-plus.json | 62 +++++++ src/platform/nrf52/architecture.h | 3 + .../nrf52840/t-impulse-plus/platformio.ini | 9 + variants/nrf52840/t-impulse-plus/variant.cpp | 91 +++++++++ variants/nrf52840/t-impulse-plus/variant.h | 173 ++++++++++++++++++ 5 files changed, 338 insertions(+) create mode 100644 boards/t-impulse-plus.json create mode 100644 variants/nrf52840/t-impulse-plus/platformio.ini create mode 100644 variants/nrf52840/t-impulse-plus/variant.cpp create mode 100644 variants/nrf52840/t-impulse-plus/variant.h diff --git a/boards/t-impulse-plus.json b/boards/t-impulse-plus.json new file mode 100644 index 000000000..b43d85d6b --- /dev/null +++ b/boards/t-impulse-plus.json @@ -0,0 +1,62 @@ +{ + "build": { + "arduino":{ + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_T_IMPULSE_PLUS -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + [ + "0x239A", + "0x8029" + ] + ], + "usb_product": "T-Impulse-Plus-nRF52840", + "mcu": "nrf52840", + "variant": "t_impulse_plus_nrf52840", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": [ + "bluetooth" + ], + "debug": { + "jlink_device": "nRF52840_xxAA", + "onboard_tools": [ + "jlink" + ], + "svd_path": "nrf52840.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "Lilygo T-Impulse-Plus-nRF52840", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "require_upload_port": true, + "speed": 115200, + "protocol": "jlink", + "protocols": [ + "jlink", + "nrfjprog", + "stlink", + "cmsis-dap", + "blackmagic" + ] + }, + "url": "https://www.lilygo.cc/", + "vendor": "Lilygo" +} diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index eafd799fc..9f565fd39 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -87,6 +87,9 @@ #define HW_VENDOR meshtastic_HardwareModel_T_ECHO_LITE #elif defined(TTGO_T_ECHO_PLUS) #define HW_VENDOR meshtastic_HardwareModel_T_ECHO_PLUS +#elif defined(T_IMPULSE_PLUS) +// #define HW_VENDOR meshtastic_HardwareModel_T_IMPULSE_PLUS +#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW #elif defined(ELECROW_ThinkNode_M1) #define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M1 #elif defined(ELECROW_ThinkNode_M3) diff --git a/variants/nrf52840/t-impulse-plus/platformio.ini b/variants/nrf52840/t-impulse-plus/platformio.ini new file mode 100644 index 000000000..fd0b66c8d --- /dev/null +++ b/variants/nrf52840/t-impulse-plus/platformio.ini @@ -0,0 +1,9 @@ +[env:t-impulse-plus] +extends = nrf52840_base +board = t-impulse-plus + +build_flags = ${nrf52840_base.build_flags} + -I variants/nrf52840/t-impulse-plus + -D T_IMPULSE_PLUS + +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-impulse-plus> diff --git a/variants/nrf52840/t-impulse-plus/variant.cpp b/variants/nrf52840/t-impulse-plus/variant.cpp new file mode 100644 index 000000000..c50a2527d --- /dev/null +++ b/variants/nrf52840/t-impulse-plus/variant.cpp @@ -0,0 +1,91 @@ +/* + * variant.cpp - Digital pin mapping for LilyGo T-Impulse Plus + * + * Board: T-Impulse Plus V1.0 (nRF52840) + * Hardware: + * - SSD1315 OLED + * - SX1262 (S62F) + * - MIA-M10Q GPS + * - ICM20948 IMU + * - ZD25WQ32C Flash + * - TTP223 Touch Button + * - Vibration Motor + */ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +extern "C" { +const uint32_t g_ADigitalPinMap[] = { + // D0-D6: LoRa SX1262 (S62F module) SPI + control + 2, // D0 P0.02 SX1262_RST + 29, // D1 P0.29 SX1262_DIO1 + 31, // D2 P0.31 SX1262_BUSY + 46, // D3 P1.14 SX1262_CS + 3, // D4 P0.03 SPI_SCK + 30, // D5 P0.30 SPI_MISO + 28, // D6 P0.28 SPI_MOSI + + // D7-D8: RF switch control + 45, // D7 P1.13 SX1262_RF_VC1 (TXEN) + 39, // D8 P1.07 SX1262_RF_VC2 (RXEN) + + // D9-D11: GPS (u-blox MIA-M10Q) + 44, // D9 P1.12 GPS_TX (MCU TX -> GPS RX) + 43, // D10 P1.11 GPS_RX (MCU RX <- GPS TX) + 42, // D11 P1.10 GPS_EN + + // D12-D13: Display I2C (SSD1315) + 20, // D12 P0.20 SCREEN_SDA + 15, // D13 P0.15 SCREEN_SCL + + // D14-D15: Sensor I2C (ICM20948, SGM41562) + 40, // D14 P1.08 IMU_SDA + 11, // D15 P0.11 IMU_SCL + + // D16-D17: Battery management + 5, // D16 P0.05 BATTERY_ADC + 25, // D17 P0.25 BATTERY_MEASUREMENT_CONTROL + + // D18: Touch button (TTP223) + 36, // D18 P1.04 TTP223_KEY + + // D19: Vibration motor + 22, // D19 P0.22 VIBRATION_MOTOR + + // D20: LDO enable + 14, // D20 P0.14 RT9080_EN + + // D21-D26: Flash QSPI (ZD25WQ32C) + 12, // D21 P0.12 FLASH_CS + 4, // D22 P0.04 FLASH_SCLK + 6, // D23 P0.06 FLASH_IO0 + 41, // D24 P1.09 FLASH_IO1 + 8, // D25 P0.08 FLASH_IO2 + 26, // D26 P0.26 FLASH_IO3 + + // D27-D28: Interrupt lines + 7, // D27 P0.07 ICM20948_INT + 16, // D28 P0.16 SGM41562_INT + + // D29: Boot button + 24, // D29 P0.24 BOOT +}; +} + +void initVariant() +{ + // Flash CS high (deselect) + pinMode(PIN_QSPI_CS, OUTPUT); + digitalWrite(PIN_QSPI_CS, HIGH); + + // Enable battery voltage measurement + pinMode(BAT_READ, OUTPUT); + digitalWrite(BAT_READ, HIGH); + + // Enable RT9080 LDO + pinMode(D20, OUTPUT); + digitalWrite(D20, HIGH); +} \ No newline at end of file diff --git a/variants/nrf52840/t-impulse-plus/variant.h b/variants/nrf52840/t-impulse-plus/variant.h new file mode 100644 index 000000000..db6e4d221 --- /dev/null +++ b/variants/nrf52840/t-impulse-plus/variant.h @@ -0,0 +1,173 @@ +#ifndef _T_IMPULSE_PLUS_H_ +#define _T_IMPULSE_PLUS_H_ +#include "WVariant.h" + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Clock Configuration +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define VARIANT_MCK (64000000ul) +#define USE_LFXO + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Pin Capacity Definitions +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define PINS_COUNT (30u) +#define NUM_DIGITAL_PINS (30u) +#define NUM_ANALOG_INPUTS (1u) +#define NUM_ANALOG_OUTPUTS (0u) + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Digital Pin Mapping +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define D0 0 // P0.02 SX1262_RST +#define D1 1 // P0.29 SX1262_DIO1 +#define D2 2 // P0.31 SX1262_BUSY +#define D3 3 // P1.14 SX1262_CS +#define D4 4 // P0.03 SPI_SCK +#define D5 5 // P0.30 SPI_MISO +#define D6 6 // P0.28 SPI_MOSI +#define D7 7 // P1.13 RF_VC1 (TXEN) +#define D8 8 // P1.07 RF_VC2 (RXEN) +#define D9 9 // P1.12 GPS_TX +#define D10 10 // P1.11 GPS_RX +#define D11 11 // P1.10 GPS_EN +#define D12 12 // P0.20 SCREEN_SDA +#define D13 13 // P0.15 SCREEN_SCL +#define D14 14 // P1.08 IMU_SDA +#define D15 15 // P0.11 IMU_SCL +#define D16 16 // P0.05 BATTERY_ADC +#define D17 17 // P0.25 BATTERY_CTL +#define D18 18 // P1.04 TTP223_KEY +#define D19 19 // P0.22 VIBRATION_MOTOR +#define D20 20 // P0.14 RT9080_EN +#define D21 21 // P0.12 FLASH_CS +#define D22 22 // P0.04 FLASH_SCLK +#define D23 23 // P0.06 FLASH_IO0 +#define D24 24 // P1.09 FLASH_IO1 +#define D25 25 // P0.08 FLASH_IO2 +#define D26 26 // P0.26 FLASH_IO3 +#define D27 27 // P0.07 ICM20948_INT +#define D28 28 // P0.16 SGM41562_INT +#define D29 29 // P0.24 BOOT + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// LED Configuration (no physical LED) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define LED_STATE_ON 1 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Button Configuration (TTP223 capacitive touch) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define PIN_BUTTON_TOUCH D18 +#define BUTTON_TOUCH_ACTIVE_LOW true +#define BUTTON_TOUCH_ACTIVE_PULLUP false + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Analog Pin Definitions +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define PIN_VBAT D16 // P0.05 Battery voltage sense + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// I2C Configuration +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Primary I2C: Display (SSD1315) +#define PIN_WIRE_SDA D12 // P0.20 +#define PIN_WIRE_SCL D13 // P0.15 + +// Secondary I2C: IMU (ICM20948) + PMU (SGM41562) +#define WIRE_INTERFACES_COUNT 2 +#define PIN_WIRE1_SDA D14 // P1.08 +#define PIN_WIRE1_SCL D15 // P0.11 +#define I2C_NO_RESCAN + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Display (SSD1315, compatible with SSD1306 driver) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define HAS_SCREEN 1 +#define USE_SSD1306 1 +#define DISPLAY_FORCE_SMALL_FONTS + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// SPI Configuration (SX1262 LoRa) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define SPI_INTERFACES_COUNT 1 +#define PIN_SPI_SCK D4 // P0.03 +#define PIN_SPI_MISO D5 // P0.30 +#define PIN_SPI_MOSI D6 // P0.28 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// SX1262 LoRa (S62F module) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define USE_SX1262 +#define SX126X_CS D3 +#define SX126X_DIO1 D1 +#define SX126X_BUSY D2 +#define SX126X_RESET D0 +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 +#define SX126X_TXEN D7 // RF_VC1 +#define SX126X_RXEN D8 // RF_VC2 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Power Management +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define BAT_READ D17 // P0.25 Battery measurement control (HIGH = enable) +#define BATTERY_PIN PIN_VBAT +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define ADC_MULTIPLIER 2.0 +#define AREF_VOLTAGE 3.6 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// GPS (u-blox MIA-M10Q) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define GPS_UBLOX +#define HAS_GPS 1 +#define GPS_TX_PIN D9 // P1.12 MCU TX -> GPS RX +#define GPS_RX_PIN D10 // P1.11 MCU RX <- GPS TX +#define PIN_GPS_EN D11 // P1.10 GPS enable (active HIGH) +#define GPS_EN_ACTIVE HIGH +#define GPS_BAUDRATE 9600 +#define GPS_THREAD_INTERVAL 50 +#define PIN_SERIAL1_TX GPS_TX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// On-board QSPI Flash (ZD25WQ32CEIGR) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define PIN_QSPI_SCK D22 // P0.04 +#define PIN_QSPI_CS D21 // P0.12 +#define PIN_QSPI_IO0 D23 // P0.06 +#define PIN_QSPI_IO1 D24 // P1.09 +#define PIN_QSPI_IO2 D25 // P0.08 +#define PIN_QSPI_IO3 D26 // P0.26 + +#define EXTERNAL_FLASH_DEVICES W25Q32JV_IQ +#define EXTERNAL_FLASH_USE_QSPI + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Vibration Motor (active-low, used as notification output) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define LED_NOTIFICATION D19 // P0.22 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// IMU (ICM20948 on Wire1) +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define HAS_ICM20948 + +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Compatibility Definitions +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#ifdef __cplusplus +extern "C" { +#endif + +#define PIN_SERIAL2_RX (-1) +#define PIN_SERIAL2_TX (-1) + +#ifdef __cplusplus +} +#endif + +#endif // _T_IMPULSE_PLUS_H_ \ No newline at end of file