diff --git a/src/configuration.h b/src/configuration.h index d23a42f84..4b1addbb3 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -158,12 +158,26 @@ along with this program. If not, see . #define BUTTON_PIN 38 // The middle button GPIO on the T-Beam #define BUTTON_PIN_ALT 13 // Alternate GPIO for an external button if needed -#ifndef USE_JTAG -#define RF95_RESET 14 +// TTGO uses a common pinout for their SX1262 vs RF95 modules - both can be enabled and we will probe at runtime for RF95 and if +// not found then probe for SX1262 +#define USE_RF95 +#define USE_SX1262 + +#define LORA_DIO0 26 // a No connect on the SX1262 module +#define LORA_RESET 23 +#define LORA_DIO1 33 // SX1262 IRQ +#define LORA_DIO2 32 // SX1262 BUSY +#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled + +#ifdef USE_SX1262 +#define SX1262_CS RF95_NSS // FIXME - we really should define LORA_CS instead +#define SX1262_DIO1 LORA_DIO1 +#define SX1262_BUSY LORA_DIO2 +#define SX1262_RESET LORA_RESET +#define SX1262_E22 // Not really an E22 but TTGO seems to be trying to clone that +// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface +// code) #endif -#define RF95_IRQ 26 -#define RF95_DIO1 33 // Note: not really used on this board -#define RF95_DIO2 32 // Note: not really used on this board // Leave undefined to disable our PMU IRQ handler #define PMU_IRQ 35 @@ -181,12 +195,13 @@ along with this program. If not, see . #define BUTTON_PIN 39 #define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage -#ifndef USE_JTAG -#define RF95_RESET 23 -#endif -#define RF95_IRQ 26 -#define RF95_DIO1 33 // Note: not really used on this board -#define RF95_DIO2 32 // Note: not really used on this board +#define USE_RF95 + +#define USE_RF95 +#define LORA_DIO0 26 // a No connect on the SX1262 module +#define LORA_RESET 23 +#define LORA_DIO1 33 // Not really used +#define LORA_DIO2 32 // Not really used // This board has different GPS pins than all other boards #undef GPS_RX_PIN @@ -216,12 +231,14 @@ along with this program. If not, see . #define LED_PIN 25 // If defined we will blink this LED #define BUTTON_PIN 0 // If defined, this will be used for user button presses +#define USE_RF95 +#define LORA_DIO0 26 // a No connect on the SX1262 module #ifndef USE_JTAG -#define RF95_RESET 14 // If defined, this pin will be used to reset the LORA radio +#define LORA_RESET 14 #endif -#define RF95_IRQ 26 -#define RF95_DIO1 35 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number -#define RF95_DIO2 34 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number +#define LORA_DIO1 35 // Not really used +#define LORA_DIO2 34 // Not really used + #elif defined(TLORA_V1) // This string must exactly match the case used in release file names or the android updater won't work #define HW_VENDOR "tlora-v1" @@ -239,10 +256,11 @@ along with this program. If not, see . #define LED_PIN 2 // If defined we will blink this LED #define BUTTON_PIN 0 // If defined, this will be used for user button presses -#define RF95_RESET 14 // If defined, this pin will be used to reset the LORA radio -#define RF95_IRQ 26 // IRQ line for the LORA radio -#define RF95_DIO1 35 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number -#define RF95_DIO2 34 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number +#define USE_RF95 +#define LORA_DIO0 26 // a No connect on the SX1262 module +#define LORA_RESET 14 +#define LORA_DIO1 35 // Not really used +#define LORA_DIO2 34 // Not really used #elif defined(TLORA_V2) // This string must exactly match the case used in release file names or the android updater won't work @@ -264,10 +282,11 @@ along with this program. If not, see . 0 // If defined, this will be used for user button presses, if your board doesn't have a physical switch, you can wire one // between this pin and ground -#define RESET_GPIO 14 // If defined, this pin will be used to reset the LORA radio -#define RF95_IRQ_GPIO 26 // IRQ line for the LORA radio -#define DIO1_GPIO 35 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number -#define DIO2_GPIO 34 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number +#define USE_RF95 +#define LORA_DIO0 26 // a No connect on the SX1262 module +#define LORA_RESET 14 +#define LORA_DIO1 35 // Not really used +#define LORA_DIO2 34 // Not really used #elif defined(TLORA_V2_1_16) // This string must exactly match the case used in release file names or the android updater won't work @@ -291,10 +310,12 @@ along with this program. If not, see . 12 // If defined, this will be used for user button presses, if your board doesn't have a physical switch, you can wire one // between this pin and ground -#define RF95_RESET 14 // If defined, this pin will be used to reset the LORA radio -#define RF95_IRQ 26 // IRQ line for the LORA radio -#define RF95_DIO1 35 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number -#define RF95_DIO2 34 // DIO1 & DIO2 are not currently used, but they must be assigned to a pin number +#define USE_RF95 +#define LORA_DIO0 26 // a No connect on the SX1262 module +#define LORA_RESET 14 +#define LORA_DIO1 35 // Not really used +#define LORA_DIO2 34 // Not really used + #endif #ifdef ARDUINO_NRF52840_PCA10056 @@ -316,6 +337,13 @@ along with this program. If not, see . #endif +#ifdef USE_RF95 +#define RF95_RESET LORA_RESET +#define RF95_IRQ LORA_DIO0 // on SX1262 version this is a no connect DIO0 +#define RF95_DIO1 LORA_DIO1 // Note: not really used for RF95 +#define RF95_DIO2 LORA_DIO2 // Note: not really used for RF95 +#endif + // ----------------------------------------------------------------------------- // DEBUG // ----------------------------------------------------------------------------- diff --git a/src/main.cpp b/src/main.cpp index 3cc4097d6..0a75798b4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -271,17 +271,42 @@ void setup() #endif // MUST BE AFTER service.init, so we have our radio config settings (from nodedb init) - RadioInterface *rIf = + RadioInterface *rIf = NULL; + #if defined(RF95_IRQ) - // new CustomRF95(); old Radiohead based driver - new RF95Interface(RF95_NSS, RF95_IRQ, RF95_RESET, SPI); -#elif defined(SX1262_CS) - new SX1262Interface(SX1262_CS, SX1262_DIO1, SX1262_RESET, SX1262_BUSY, SPI); -#else - new SimRadio(); + if (!rIf) { + rIf = new RF95Interface(RF95_NSS, RF95_IRQ, RF95_RESET, SPI); + if (!rIf->init()) { + DEBUG_MSG("Warning: Failed to find RF95 radio\n"); + delete rIf; + rIf = NULL; + } + } #endif - if (!rIf || !rIf->init()) +#if defined(SX1262_CS) + if (!rIf) { + rIf = new SX1262Interface(SX1262_CS, SX1262_DIO1, SX1262_RESET, SX1262_BUSY, SPI); + if (!rIf->init()) { + DEBUG_MSG("Warning: Failed to find SX1262 radio\n"); + delete rIf; + rIf = NULL; + } + } +#endif + +#ifdef USE_SIM_RADIO + if (!rIf) { + rIf = new SimRadio; + if (!rIf->init()) { + DEBUG_MSG("Warning: Failed to find simulated radio\n"); + delete rIf; + rIf = NULL; + } + } +#endif + + if (!rIf) recordCriticalError(ErrNoRadio); else router.addInterface(rIf); diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index bfaefb1f2..ae94231d2 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -13,7 +13,6 @@ RadioLibInterface::RadioLibInterface(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq SPIClass &spi, PhysicalLayer *_iface) : concurrency::PeriodicTask(0), module(cs, irq, rst, busy, spi, spiSettings), iface(_iface) { - assert(!instance); // We assume only one for now instance = this; }