Browse Source

Added support for LilyGo T-Echo

Rastislav Vysoky 1 year ago
parent
commit
2dd2571154

+ 62 - 0
boards/t-echo.json

@@ -0,0 +1,62 @@
+{
+	"build": {
+	  "arduino": {
+		"ldscript": "nrf52840_s140_v6.ld"
+	  },
+	  "core": "nRF5",
+	  "cpu": "cortex-m4",
+	  "extra_flags": "-DARDUINO_NRF52840_PCA10056 -DNRF52840_XXAA",
+	  "f_cpu": "64000000L",
+	  "hwids": [
+		[
+		  "0x239A",
+		  "0x8029"
+		]
+	  ],
+	  "usb_product": "NRF52 DK",
+	  "mcu": "nrf52840",
+	  "variant": "pca10056",
+	  "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-ECHO",
+	"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://os.mbed.com/platforms/Nordic-nRF52840-DK/",
+	"vendor": "Nordic"
+  }

+ 4 - 0
examples/companion_radio/main.cpp

@@ -88,6 +88,10 @@
   #include <helpers/nrf52/T114Board.h>
   #include <helpers/CustomSX1262Wrapper.h>
   static T114Board board;
+#elif defined(LILYGO_TECHO)
+  #include <helpers/nrf52/TechoBoard.h>
+  #include <helpers/CustomSX1262Wrapper.h>
+  static TechoBoard board;
 #else
   #error "need to provide a 'board' object"
 #endif

+ 46 - 0
platformio.ini

@@ -715,3 +715,49 @@ build_src_filter = ${Heltec_t114.build_src_filter} +<helpers/nrf52/*.cpp> +<../e
 lib_deps =
   ${Heltec_t114.lib_deps}
   densaugeo/base64 @ ~1.4.0
+
+[nrf52840_techo]
+extends = nrf52_base
+platform_packages = framework-arduinoadafruitnrf52
+build_flags = ${nrf52_base.build_flags}
+  -I src/helpers/nrf52
+  -I src/helpers/nrf52/s140_nrf52_6.1.1_API/include
+  -I src/helpers/nrf52/s140_nrf52_6.1.1_API/include/nrf52
+lib_deps =
+  ${nrf52_base.lib_deps}
+  rweather/Crypto @ ^0.4.0
+
+[LilyGo_Techo]
+extends = nrf52840_techo
+board = t-echo
+board_build.ldscript = boards/nrf52840_s140_v6.ld
+build_flags = ${nrf52840_techo.build_flags}
+  -Ivariants/techo
+  -DLILYGO_TECHO
+  -D RADIO_CLASS=CustomSX1262
+  -D WRAPPER_CLASS=CustomSX1262Wrapper
+  -D LORA_TX_POWER=22
+  -D SX126X_CURRENT_LIMIT=130
+build_src_filter = ${nrf52840_techo.build_src_filter}
+  +<helpers/*.cpp>
+  +<helpers/nrf52/TechoBoard.cpp>
+  +<../variants/techo>
+debug_tool = jlink
+upload_protocol = nrfutil
+
+[env:LilyGo_T-Echo_companion_radio_ble]
+extends = LilyGo_Techo
+build_flags =
+  ${LilyGo_Techo.build_flags}
+  -D MAX_CONTACTS=100
+  -D MAX_GROUP_CHANNELS=1
+  -D BLE_PIN_CODE=123456
+  -D BLE_DEBUG_LOGGING=1
+;  -D ENABLE_PRIVATE_KEY_IMPORT=1
+;  -D ENABLE_PRIVATE_KEY_EXPORT=1
+;  -D MESH_PACKET_LOGGING=1
+;  -D MESH_DEBUG=1
+build_src_filter = ${LilyGo_Techo.build_src_filter} +<helpers/nrf52/*.cpp> +<../examples/companion_radio/main.cpp>
+lib_deps =
+  ${LilyGo_Techo.lib_deps}
+  densaugeo/base64 @ ~1.4.0

+ 80 - 0
src/helpers/nrf52/TechoBoard.cpp

@@ -0,0 +1,80 @@
+#include <Arduino.h>
+#include "TechoBoard.h"
+
+#include <bluefruit.h>
+#include <Wire.h>
+
+static BLEDfu bledfu;
+
+static void connect_callback(uint16_t conn_handle)
+{
+  (void)conn_handle;
+  MESH_DEBUG_PRINTLN("BLE client connected");
+}
+
+static void disconnect_callback(uint16_t conn_handle, uint8_t reason)
+{
+  (void)conn_handle;
+  (void)reason;
+
+  MESH_DEBUG_PRINTLN("BLE client disconnected");
+}
+
+void TechoBoard::begin() {
+  // for future use, sub-classes SHOULD call this from their begin()
+  startup_reason = BD_STARTUP_NORMAL;
+
+  pinMode(PIN_VBAT_READ, INPUT);
+
+#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
+  Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL);
+#else
+  Wire.begin();
+#endif
+
+  pinMode(SX126X_POWER_EN, OUTPUT);
+  digitalWrite(SX126X_POWER_EN, HIGH);
+  delay(10);   // give sx1262 some time to power up
+}
+
+bool TechoBoard::startOTAUpdate() {
+  // Config the peripheral connection with maximum bandwidth
+  // more SRAM required by SoftDevice
+  // Note: All config***() function must be called before begin()
+  Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
+  Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
+
+  Bluefruit.begin(1, 0);
+  // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
+  Bluefruit.setTxPower(4);
+  // Set the BLE device name
+  Bluefruit.setName("TECHO_OTA");
+
+  Bluefruit.Periph.setConnectCallback(connect_callback);
+  Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
+
+  // To be consistent OTA DFU should be added first if it exists
+  bledfu.begin();
+
+  // Set up and start advertising
+  // Advertising packet
+  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
+  Bluefruit.Advertising.addTxPower();
+  Bluefruit.Advertising.addName();
+
+  /* Start Advertising
+    - Enable auto advertising if disconnected
+    - Interval:  fast mode = 20 ms, slow mode = 152.5 ms
+    - Timeout for fast mode is 30 seconds
+    - Start(timeout) with timeout = 0 will advertise forever (until connected)
+
+    For recommended advertising interval
+    https://developer.apple.com/library/content/qa/qa1931/_index.html
+  */
+  Bluefruit.Advertising.restartOnDisconnect(true);
+  Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
+  Bluefruit.Advertising.setFastTimeout(30);   // number of seconds in fast mode
+  Bluefruit.Advertising.start(0);             // 0 = Don't stop advertising after n seconds
+
+  return true;
+}

+ 53 - 0
src/helpers/nrf52/TechoBoard.h

@@ -0,0 +1,53 @@
+#pragma once
+
+#include <MeshCore.h>
+#include <Arduino.h>
+
+// LoRa radio module pins for LilyGo T-Echo
+#define  P_LORA_DIO_1     20
+#define  P_LORA_NSS       24
+#define  P_LORA_RESET     25
+#define  P_LORA_BUSY      17
+#define  P_LORA_SCLK      19
+#define  P_LORA_MISO      23
+#define  P_LORA_MOSI      22
+#define  SX126X_POWER_EN  37
+
+#define SX126X_DIO2_AS_RF_SWITCH  true
+#define SX126X_DIO3_TCXO_VOLTAGE   1.8
+
+// built-ins
+#define  PIN_VBAT_READ    4
+#define  ADC_MULTIPLIER   (2.0)
+
+class TechoBoard : public mesh::MainBoard {
+protected:
+  uint8_t startup_reason;
+
+public:
+  void begin();
+  uint8_t getStartupReason() const override { return startup_reason; }
+
+  #define BATTERY_SAMPLES 8
+
+  uint16_t getBattMilliVolts() override {
+    analogReadResolution(12);
+    uint32_t raw = 0;
+    for (int i = 0; i < BATTERY_SAMPLES; i++) {
+      raw += analogRead(PIN_VBAT_READ);
+    }
+    raw = raw / BATTERY_SAMPLES;
+
+    return (ADC_MULTIPLIER * raw) / 4096;
+  }
+
+  const char* getManufacturerName() const override {
+    return "LilyGo T-Echo";
+  }
+
+  void reboot() override {
+    NVIC_SystemReset();
+  }
+
+  bool startOTAUpdate() override;
+};

+ 22 - 0
variants/techo/variant.cpp

@@ -0,0 +1,22 @@
+#include "variant.h"
+#include "wiring_constants.h"
+#include "wiring_digital.h"
+
+const uint32_t g_ADigitalPinMap[] = {
+  0xff, 0xff, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+  14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+  27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+  40, 41, 42, 43, 44, 45, 46, 47
+};
+
+void initVariant()
+{
+  pinMode(LED_RED, OUTPUT);
+  ledOff(LED_RED);
+
+  pinMode(LED_GREEN, OUTPUT);
+  ledOff(LED_GREEN);
+
+  pinMode(LED_BLUE, OUTPUT);
+  ledOff(LED_BLUE);
+}

+ 102 - 0
variants/techo/variant.h

@@ -0,0 +1,102 @@
+/*
+ * variant.h
+ * Copyright (C) 2023 Seeed K.K.
+ * MIT License
+ */
+
+#pragma once
+
+#include "WVariant.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Low frequency clock source
+
+#define USE_LFXO    // 32.768 kHz crystal oscillator
+#define VARIANT_MCK (64000000ul)
+
+#define WIRE_INTERFACES_COUNT 	(1)
+
+////////////////////////////////////////////////////////////////////////////////
+// Power
+
+#define PIN_PWR_EN              (6)
+
+#define BATTERY_PIN             (4)
+#define ADC_MULTIPLIER          (4.90F)
+
+#define ADC_RESOLUTION          (14)
+#define BATTERY_SENSE_RES       (12)
+
+#define AREF_VOLTAGE            (3.0)
+
+////////////////////////////////////////////////////////////////////////////////
+// Number of pins
+
+#define PINS_COUNT              (48)
+#define NUM_DIGITAL_PINS        (48)
+#define NUM_ANALOG_INPUTS       (1)
+#define NUM_ANALOG_OUTPUTS      (0)
+
+////////////////////////////////////////////////////////////////////////////////
+// UART pin definition
+
+#define PIN_SERIAL1_RX          (41) // GPS TX
+#define PIN_SERIAL1_TX          (40) // GPS RX
+
+////////////////////////////////////////////////////////////////////////////////
+// I2C pin definition
+
+#define PIN_WIRE_SDA            (26)             // P0.26
+#define PIN_WIRE_SCL            (27)             // P0.27
+
+////////////////////////////////////////////////////////////////////////////////
+// SPI pin definition
+
+#define SPI_INTERFACES_COUNT    (2)
+
+#define PIN_SPI_MISO            (23)
+#define PIN_SPI_MOSI            (22)
+#define PIN_SPI_SCK             (19)
+#define PIN_SPI_NSS             (24)
+
+////////////////////////////////////////////////////////////////////////////////
+// Builtin LEDs
+
+#define LED_RED                 (13)
+#define LED_BLUE                (14)
+#define LED_GREEN               (15)
+
+#define LED_BUILTIN             (15)
+#define PIN_LED                 LED_BUILTIN
+#define LED_PIN                 LED_BUILTIN
+#define LED_STATE_ON            LOW
+
+#define PIN_NEOPIXEL            (14)
+#define NEOPIXEL_NUM            (2)
+
+////////////////////////////////////////////////////////////////////////////////
+// Builtin buttons
+
+#define PIN_BUTTON1             (42)
+#define BUTTON_PIN              PIN_BUTTON1
+
+#define PIN_BUTTON2             (18)
+#define BUTTON_PIN2             PIN_BUTTON2
+
+#define EXTERNAL_FLASH_DEVICES MX25R1635F
+#define EXTERNAL_FLASH_USE_QSPI
+
+////////////////////////////////////////////////////////////////////////////////
+// Lora
+
+#define USE_SX1262
+#define LORA_CS                 (24)
+#define SX126X_DIO1             (20)
+#define SX126X_BUSY             (17)
+#define SX126X_RESET            (25)
+#define SX126X_DIO2_AS_RF_SWITCH
+#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+
+#define PIN_SPI1_MISO           (39)
+#define PIN_SPI1_MOSI           (29)
+#define PIN_SPI1_SCK            (31)