From bc97e513e8192eb00ba5d7577adf3d20a3a653e6 Mon Sep 17 00:00:00 2001 From: Kevin Brosius Date: Sun, 23 Feb 2025 06:52:27 -0500 Subject: [PATCH 1/3] Initial support for Seeed ESP32S3 with Wio-SX1262 Work in progress Status: Boots, display works on Xiao espansion base, radio is recognized Todo: PMU Firmware hash fails even if generated and then written Radio testing Buttons / LEDs other? --- Boards.h | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++- Utilities.h | 13 ++++++++++- sx126x.cpp | 10 +++++++-- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/Boards.h b/Boards.h index adae722..8ba926c 100644 --- a/Boards.h +++ b/Boards.h @@ -65,6 +65,10 @@ #define MODEL_DB 0xDB // LilyGO T-Beam Supreme, 433 MHz #define MODEL_DC 0xDC // LilyGO T-Beam Supreme, 868 MHz + #define PRODUCT_SEEED_XIAO_ESP32S3 0xEB + #define BOARD_SEEED_XIAO_ESP32S3 0x3E + #define MODEL_DD 0xDD + #define PRODUCT_T32_10 0xB2 #define BOARD_LORA32_V1_0 0x39 #define MODEL_BA 0xBA // LilyGO T3 v1.0, 433 MHz @@ -140,6 +144,9 @@ #endif #endif +// test build - KJB +#define BOARD_MODEL BOARD_SEEED_XIAO_ESP32S3 + #define HAS_DISPLAY false #define HAS_BLUETOOTH false #define HAS_BLE false @@ -150,7 +157,8 @@ #define HAS_INPUT false #define HAS_SLEEP false #define PIN_DISP_SLEEP -1 - #define VALIDATE_FIRMWARE true + //#define VALIDATE_FIRMWARE true + #define VALIDATE_FIRMWARE false #if defined(ENABLE_TCXO) #define HAS_TCXO true @@ -593,6 +601,59 @@ #endif #endif + #elif BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 + #define IS_ESP32S3 true + #define MODEM SX1262 + #define DIO2_AS_RF_SWITCH true + #define HAS_BUSY true + #define HAS_TCXO true +// #define OCP_TUNED 0x38 + + #define HAS_DISPLAY true +// #define HAS_CONSOLE true + #define HAS_BLUETOOTH false + #define HAS_BLE true +// #define HAS_PMU true + #define HAS_NP false + #define HAS_SD false + #define HAS_EEPROM true + + #define HAS_INPUT false + #define HAS_SLEEP false + +// #define PMU_IRQ 40 +// #define I2C_SCL 41 +// #define I2C_SDA 42 + + const int pin_btn_usr1 = 0; + + const int pin_cs = 41; //16; + const int pin_reset = 42; //14; + const int pin_sclk = 7; //11; + const int pin_mosi = 9; //15; + const int pin_miso = 8; //13; + const int pin_tcxo_enable = -1; + const int pin_dio = 39; //21; + const int pin_busy = 40; //18; + +// const int SD_MISO = 37; +// const int SD_MOSI = 35; +// const int SD_CLK = 36; +// const int SD_CS = 47; + +// const int IMU_CS = 34; + + // HAS LED/tx on board - 47 + #if HAS_NP == false + #if defined(EXTERNAL_LEDS) + const int pin_led_rx = -1; + const int pin_led_tx = 48; //47; + #else + const int pin_led_rx = -1; + const int pin_led_tx = 48; //47; + #endif + #endif + #else #error An unsupported ESP32 board was selected. Cannot compile RNode firmware. #endif diff --git a/Utilities.h b/Utilities.h index e08461f..a9154e4 100644 --- a/Utilities.h +++ b/Utilities.h @@ -285,6 +285,13 @@ uint8_t boot_vector = 0x00; void led_tx_off() { digitalWrite(pin_led_tx, LOW); } void led_id_on() { } void led_id_off() { } + #elif BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 + void led_rx_on() { digitalWrite(pin_led_rx, LED_ON); } + void led_rx_off() { digitalWrite(pin_led_rx, LED_OFF); } + void led_tx_on() { } + void led_tx_off() { } + void led_id_on() { } + void led_id_off() { } #elif BOARD_MODEL == BOARD_HUZZAH32 void led_rx_on() { digitalWrite(pin_led_rx, HIGH); } void led_rx_off() { digitalWrite(pin_led_rx, LOW); } @@ -1264,6 +1271,8 @@ void setTXPower() { if (model == MODEL_DB) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_DC) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); + if (model == MODEL_DD) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); + if (model == MODEL_E4) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_E9) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_E3) LoRa->setTxPower(lora_txp, PA_OUTPUT_PA_BOOST_PIN); @@ -1467,7 +1476,7 @@ bool eeprom_product_valid() { #if PLATFORM == PLATFORM_AVR if (rval == PRODUCT_RNODE || rval == PRODUCT_HMBRW) { #elif PLATFORM == PLATFORM_ESP32 - if (rval == PRODUCT_RNODE || rval == BOARD_RNODE_NG_20 || rval == BOARD_RNODE_NG_21 || rval == PRODUCT_HMBRW || rval == PRODUCT_TBEAM || rval == PRODUCT_T32_10 || rval == PRODUCT_T32_20 || rval == PRODUCT_T32_21 || rval == PRODUCT_H32_V2 || rval == PRODUCT_H32_V3 || rval == PRODUCT_TDECK_V1 || rval == PRODUCT_TBEAM_S_V1) { + if (rval == PRODUCT_RNODE || rval == BOARD_RNODE_NG_20 || rval == BOARD_RNODE_NG_21 || rval == PRODUCT_HMBRW || rval == PRODUCT_TBEAM || rval == PRODUCT_T32_10 || rval == PRODUCT_T32_20 || rval == PRODUCT_T32_21 || rval == PRODUCT_H32_V2 || rval == PRODUCT_H32_V3 || rval == PRODUCT_TDECK_V1 || rval == PRODUCT_TBEAM_S_V1 || rval == PRODUCT_SEEED_XIAO_ESP32S3) { #elif PLATFORM == PLATFORM_NRF52 if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_TECHO || rval == PRODUCT_HMBRW) { #else @@ -1503,6 +1512,8 @@ bool eeprom_model_valid() { if (model == MODEL_16 || model == MODEL_17) { #elif BOARD_MODEL == BOARD_TBEAM_S_V1 if (model == MODEL_DB || model == MODEL_DC) { + #elif BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 + if (model == MODEL_DD) { #elif BOARD_MODEL == BOARD_LORA32_V1_0 if (model == MODEL_BA || model == MODEL_BB) { #elif BOARD_MODEL == BOARD_LORA32_V2_0 diff --git a/sx126x.cpp b/sx126x.cpp index 4c06862..ebbde43 100644 --- a/sx126x.cpp +++ b/sx126x.cpp @@ -122,12 +122,17 @@ sx126x::sx126x() : { setTimeout(0); } bool sx126x::preInit() { +// delay(300); + //LoRa->reset(); +// reset(); +// delay(100); + pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); - #elif BOARD_MODEL == BOARD_TECHO + #elif BOARD_MODEL == BOARD_TECHO // || BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 SPI.setPins(pin_miso, pin_sclk, pin_mosi); SPI.begin(); #else @@ -146,6 +151,7 @@ bool sx126x::preInit() { break; } delay(100); + Serial.println( uint16_t(syncmsb << 8 | synclsb) ); } if ( uint16_t(syncmsb << 8 | synclsb) != 0x1424 && uint16_t(syncmsb << 8 | synclsb) != 0x4434) { return false; @@ -570,7 +576,7 @@ void sx126x::sleep() { uint8_t byte = 0x00; executeOpcode(OP_SLEEP_6X, &byte, 1) void sx126x::enableTCXO() { #if HAS_TCXO - #if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_HELTEC32_V3 + #if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 uint8_t buf[4] = {MODE_TCXO_3_3V_6X, 0x00, 0x00, 0xFF}; #elif BOARD_MODEL == BOARD_TBEAM uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; From c3fe3713b00e3647bf0693329aedacb52108823d Mon Sep 17 00:00:00 2001 From: Kevin Brosius Date: Sun, 23 Feb 2025 16:57:36 -0500 Subject: [PATCH 2/3] Seeed ESP32S3 - Enable user button, tied to yellow LED on ESP32S3 board. Can be shared, but configure as button input only for now. Top LED for TX indication. --- Boards.h | 12 +++++++++--- Utilities.h | 12 ++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Boards.h b/Boards.h index 8ba926c..112d2c9 100644 --- a/Boards.h +++ b/Boards.h @@ -146,6 +146,7 @@ // test build - KJB #define BOARD_MODEL BOARD_SEEED_XIAO_ESP32S3 +//#define BOARD_MODEL BOARD_HELTEC32_V3 #define HAS_DISPLAY false #define HAS_BLUETOOTH false @@ -618,14 +619,17 @@ #define HAS_SD false #define HAS_EEPROM true - #define HAS_INPUT false + #define HAS_INPUT true #define HAS_SLEEP false // #define PMU_IRQ 40 // #define I2C_SCL 41 // #define I2C_SDA 42 - const int pin_btn_usr1 = 0; + // Wio-SX1262 button pulls down GPIO21 + // THis is shared with the Yellow LED + // on the ESP32S3 (also active Low) + const int pin_btn_usr1 = 21; const int pin_cs = 41; //16; const int pin_reset = 42; //14; @@ -643,7 +647,9 @@ // const int IMU_CS = 34; - // HAS LED/tx on board - 47 + // HAS LED/tx on Wio board - 48 Hi/ON + // LED 21 on ESP board - Lo/ON/Yellow + // shared with button input. #if HAS_NP == false #if defined(EXTERNAL_LEDS) const int pin_led_rx = -1; diff --git a/Utilities.h b/Utilities.h index a9154e4..7ec1941 100644 --- a/Utilities.h +++ b/Utilities.h @@ -286,10 +286,14 @@ uint8_t boot_vector = 0x00; void led_id_on() { } void led_id_off() { } #elif BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 - void led_rx_on() { digitalWrite(pin_led_rx, LED_ON); } - void led_rx_off() { digitalWrite(pin_led_rx, LED_OFF); } - void led_tx_on() { } - void led_tx_off() { } + // tx pin is active high, rx pin is active low.... + // but shared with LED, choose button for now +// void led_rx_on() { pinMode(pin_led_rx, OUTPUT); digitalWrite(pin_led_rx, LOW); } +// void led_rx_off() { digitalWrite(pin_led_rx, HIGH); pinMode(pin_led_rx, INPUT); } + void led_rx_on() { } + void led_rx_off() { } + void led_tx_on() { digitalWrite(pin_led_tx, LED_ON); } + void led_tx_off() { digitalWrite(pin_led_tx, LED_OFF); } void led_id_on() { } void led_id_off() { } #elif BOARD_MODEL == BOARD_HUZZAH32 From cbedd72993dc2e7b32e32a9c8243a8dffa9016aa Mon Sep 17 00:00:00 2001 From: Kevin Brosius Date: Sun, 23 Feb 2025 18:52:17 -0500 Subject: [PATCH 3/3] Seeed ESP32S3 - enable button sleep, stopRadio at sleep to sleep sx1262 also. --- Boards.h | 6 ++++-- RNode_Firmware.ino | 3 ++- sx126x.cpp | 12 +++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Boards.h b/Boards.h index 112d2c9..f93790f 100644 --- a/Boards.h +++ b/Boards.h @@ -620,8 +620,10 @@ #define HAS_EEPROM true #define HAS_INPUT true - #define HAS_SLEEP false - + #define HAS_SLEEP true + #define PIN_WAKEUP GPIO_NUM_21 + #define WAKEUP_LEVEL 0 + // #define PMU_IRQ 40 // #define I2C_SCL 41 // #define I2C_SDA 42 diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index c2b9886..79bff2f 100644 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -1612,7 +1612,7 @@ void loop() { void sleep_now() { #if HAS_SLEEP == true #if PLATFORM == PLATFORM_ESP32 - #if BOARD_MODEL == BOARD_T3S3 + #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 display_intensity = 0; update_display(true); #endif @@ -1626,6 +1626,7 @@ void sleep_now() { delay(100); } #endif + stopRadio(); esp_sleep_enable_ext0_wakeup(PIN_WAKEUP, WAKEUP_LEVEL); esp_deep_sleep_start(); #elif PLATFORM == PLATFORM_NRF52 diff --git a/sx126x.cpp b/sx126x.cpp index ebbde43..68bf7b1 100644 --- a/sx126x.cpp +++ b/sx126x.cpp @@ -122,17 +122,19 @@ sx126x::sx126x() : { setTimeout(0); } bool sx126x::preInit() { -// delay(300); - //LoRa->reset(); -// reset(); -// delay(100); + #if BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 + // Improve wakeup from sleep + delay(300); + reset(); + delay(100); + #endif pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); - #elif BOARD_MODEL == BOARD_TECHO // || BOARD_MODEL == BOARD_SEEED_XIAO_ESP32S3 + #elif BOARD_MODEL == BOARD_TECHO SPI.setPins(pin_miso, pin_sclk, pin_mosi); SPI.begin(); #else