diff --git a/boards/eink.json b/boards/eink.json index d9f40e80..e2414b23 100644 --- a/boards/eink.json +++ b/boards/eink.json @@ -5,7 +5,7 @@ }, "core": "nRF5", "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_LORA_RELAY_V1 -DNRF52840_XXAA", + "extra_flags": "-DARDUINO_NRF52840_TTGO_EINK -DNRF52840_XXAA", "f_cpu": "64000000L", "hwids": [ [ diff --git a/boards/lora-relay-v2.json b/boards/lora-relay-v2.json new file mode 100644 index 00000000..2cca8ae9 --- /dev/null +++ b/boards/lora-relay-v2.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_LORA_RELAY_V2 -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [["0x239A", "0x4406"]], + "usb_product": "LORA_RELAY", + "mcu": "nrf52840", + "variant": "lora_relay_v2", + "variants_dir": "variants", + "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": "Meshtastic Lora Relay V1 (Adafruit BSP)", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "require_upload_port": true, + "speed": 115200, + "protocol": "jlink", + "protocols": ["jlink", "nrfjprog", "stlink"] + }, + "url": "https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay", + "vendor": "BigCorvus" +} diff --git a/platformio.ini b/platformio.ini index 8109bf0e..5397f693 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = tbeam # lora-relay-v1 # nrf52840dk-geeksville # linux # or if you'd like to change the default to something like lora-relay-v1 put that here +default_envs = lora-relay-v2 # lora-relay-v1 # nrf52840dk-geeksville # linux # or if you'd like to change the default to something like lora-relay-v1 put that here ;default_envs = heltec # lora-relay-v1 # nrf52840dk-geeksville # linux # or if you'd like to change the default to something like lora-relay-v1 put that here [common] @@ -269,7 +269,30 @@ lib_deps = ${arduino_base.lib_deps} SparkFun BQ27441 LiPo Fuel Gauge Arduino Library TFT_eSPI - # Adafruit ST7735 and ST7789 Library + +; The https://github.com/BigCorvus/LoRa-BLE-Relay-v2 board by @BigCorvus +[env:lora-relay-v2] +extends = nrf52_base +board = lora-relay-v2 +# add our variants files to the include and src paths +# define build flags for the TFT_eSPI library +build_flags = ${nrf52_base.build_flags} -Ivariants/lora_relay_v2 + -DUSER_SETUP_LOADED + -DTFT_WIDTH=80 + -DTFT_HEIGHT=160 + -DST7735_GREENTAB160x80 + -DST7735_DRIVER + -DTFT_CS=ST7735_CS + -DTFT_DC=ST7735_RS + -DTFT_RST=ST7735_RESET + -DSPI_FREQUENCY=27000000 + -DTFT_WR=ST7735_SDA + -DTFT_SCLK=ST7735_SCK +src_filter = ${nrf52_base.src_filter} +<../variants/lora_relay_v2> +lib_deps = + ${arduino_base.lib_deps} + SparkFun BQ27441 LiPo Fuel Gauge Arduino Library + TFT_eSPI ; The Portduino based sim environment on top of linux [env:linux] diff --git a/src/gps/Air530GPS.cpp b/src/gps/Air530GPS.cpp index db0ddd44..85711896 100644 --- a/src/gps/Air530GPS.cpp +++ b/src/gps/Air530GPS.cpp @@ -65,9 +65,8 @@ void Air530GPS::sendCommand(const char *cmd) { } void Air530GPS::sleep() { + NMEAGPS::sleep(); #ifdef PIN_GPS_WAKE - digitalWrite(PIN_GPS_WAKE, 0); - pinMode(PIN_GPS_WAKE, OUTPUT); sendCommand("$PGKC105,4"); #endif } @@ -76,10 +75,7 @@ void Air530GPS::sleep() { void Air530GPS::wake() { #if 1 -#ifdef PIN_GPS_WAKE - digitalWrite(PIN_GPS_WAKE, 1); - pinMode(PIN_GPS_WAKE, OUTPUT); -#endif + NMEAGPS::wake(); #else // For power testing - keep GPS sleeping forever sleep(); diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index f5bd9f3f..fccce06d 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -36,6 +36,22 @@ bool GPS::setup() return ok; } +void GPS::wake() +{ +#ifdef PIN_GPS_WAKE + digitalWrite(PIN_GPS_WAKE, 1); + pinMode(PIN_GPS_WAKE, OUTPUT); +#endif +} + + +void GPS::sleep() { +#ifdef PIN_GPS_WAKE + digitalWrite(PIN_GPS_WAKE, 0); + pinMode(PIN_GPS_WAKE, OUTPUT); +#endif +} + /// Record that we have a GPS void GPS::setConnected() { diff --git a/src/gps/GPS.h b/src/gps/GPS.h index 7e752f50..36859c9d 100644 --- a/src/gps/GPS.h +++ b/src/gps/GPS.h @@ -75,10 +75,10 @@ class GPS : private concurrency::OSThread virtual bool setupGPS() = 0; /// If possible force the GPS into sleep/low power mode - virtual void sleep() {} + virtual void sleep(); /// wake the GPS into normal operation mode - virtual void wake() {} + virtual void wake(); /** Subclasses should look for serial rx characters here and feed it to their GPS parser * diff --git a/variants/lora_relay_v2/variant.cpp b/variants/lora_relay_v2/variant.cpp new file mode 100644 index 00000000..147f535c --- /dev/null +++ b/variants/lora_relay_v2/variant.cpp @@ -0,0 +1,105 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // D0 .. D13 + 25, // D0 is P0.25 (UART TX) + 24, // D1 is P0.24 (UART RX + 10, // D2 is P0.10 (NFC2) + 47, // D3 is P1.15 (LED1) + (32 + 10), // D4 is P1.10 (LED2) + 40, // D5 is P1.08 + 7, // D6 is P0.07 + 34, // D7 is P1.02 (Switch) + 16, // D8 is P0.16 (NeoPixel) + 26, // D9 is P0.26 D_RS (IPS data/command control) + 27, // D10 is P0.27 + 6, // D11 is P0.06 D_RES (IPS display reset) + 8, // D12 is P0.08 D_CS (IPS display chip select) + 41, // D13 is P0.23 BLT (IPS display backlight) + 4, // D14 is P0.04 SX1262 RXEN + 5, // D15 is P0.05 BOOST_EN (5V buck converter enable for the the radio power) + + // D14 .. D21 (aka A0 .. A7) + 30, // D16 is P0.30 (A0) + 28, // D17 is P0.28 (A1) + 2, // D18 is P0.02 (A2) + 3, // D19 is P0.03 (A3) + 29, // D20 is P0.29 (A4, Battery) + 31, // D21 is P0.31 (A5, ARef) + + // D22 .. D23 (aka I2C pins) + 12, // D22 is P0.12 (SDA) + 11, // D23 is P0.11 (SCL) + + // D24 .. D26 (aka SPI pins) + 15, // D24 is P0.15 (SPI MISO) + 13, // D25 is P0.13 (SPI MOSI) + 14, // D26 is P0.14 (SPI SCK ) + + // QSPI pins (not exposed via any header / test point) + // 19, // P0.19 (QSPI CLK) + // 20, // P0.20 (QSPI CS) + // 17, // P0.17 (QSPI Data 0) + // 22, // P0.22 (QSPI Data 1) + // 23, // P0.23 (QSPI Data 2) + // 21, // P0.21 (QSPI Data 3) + + // The remaining NFC pin + 9, // D27 P0.09 (NFC1, exposed only via test point on bottom of board) + + // The following pins were never listed as they were considered unusable + // 0, // P0.00 is XL1 (attached to 32.768kHz crystal) Never expose as GPIOs + // 1, // P0.01 is XL2 (attached to 32.768kHz crystal) + 18, // D28 P0.18 is RESET (attached to switch) + // 32, // P1.00 is SWO (attached to debug header) + + // D29-D43 + 32 + 12, // D29 P0.27 E22-SX1262 DIO1 + 28, // D30 P0.28 E22-SX1262 DIO2 + 30, // D31 P0.30 E22-SX1262 TXEN + 35, // D32 P1.03 E22-SX1262 NSS + 32 + 8, // D33 P1.08 E22-SX1262 BUSY + 27, // D34 P0.27 E22-SX1262 RESET + 32 + 1, // D35 P1.01 BTN_UP + 32, // D36 P1.0 GPS power + 21, // D37 P0.21 disp_clk + 36, // P1.04 BTN_OK + 37, // D39 P0.19 disp_SDA + 38, // D40 P1.06 BUZZER + 39, // P1.07 is not connected per schematic + 43, // P1.11 is not connected per schematic + 45, // P1.13 is not connected per schematic +}; + +void initVariant() +{ + // LED1 & LED2 + pinMode(PIN_LED1, OUTPUT); + ledOff(PIN_LED1); + + pinMode(PIN_LED2, OUTPUT); + ledOff(PIN_LED2); +} diff --git a/variants/lora_relay_v2/variant.h b/variants/lora_relay_v2/variant.h new file mode 100644 index 00000000..54e9586d --- /dev/null +++ b/variants/lora_relay_v2/variant.h @@ -0,0 +1,176 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_LORA_RELAY_V1_ +#define _VARIANT_LORA_RELAY_V1_ + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF +// define USE_LFRC // Board uses RC for LF + +/* +kevinh todo + +ok leds +ok buttons +ok gps power +ok gps signal +ok? lcd +ok buzzer +serial flash +ok lora (inc boost en) + +mention dat1 and dat2 on sd card + +*/ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (43) +#define NUM_DIGITAL_PINS (43) +#define NUM_ANALOG_INPUTS (6) // A6 is used for battery, A7 is analog reference +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED1 (3) +#define PIN_LED2 (4) +#define PIN_NEOPIXEL (8) +#define PIN_BUZZER (40) + +#define LED_BUILTIN PIN_LED1 +#define LED_CONN PIN_LED2 + +#define LED_RED PIN_LED1 +#define LED_BLUE PIN_LED2 + +#define LED_STATE_ON 1 // State when LED is litted + +/* + * Buttons + */ +#define PIN_BUTTON1 (7) +#define PIN_BUTTON2 (35) +#define PIN_BUTTON3 (37) + +/* + * Analog pins + */ +#define PIN_A0 (16) +#define PIN_A1 (17) +#define PIN_A2 (18) +#define PIN_A3 (19) +#define PIN_A4 (20) +#define PIN_A5 (21) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +#define ADC_RESOLUTION 14 + +// Other pins +#define PIN_AREF PIN_A5 +#define PIN_VBAT PIN_A4 +#define PIN_NFC1 (33) +#define PIN_NFC2 (2) +#define PIN_PIEZO (37) +static const uint8_t AREF = PIN_AREF; + +/* + * Serial interfaces + */ +#define PIN_SERIAL1_RX (1) +#define PIN_SERIAL1_TX (0) + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define PIN_SPI_MISO (24) +#define PIN_SPI_MOSI (25) +#define PIN_SPI_SCK (26) + +static const uint8_t SS = (5); +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (22) +#define PIN_WIRE_SCL (23) + +// I2C device addresses +#define I2C_ADDR_BQ27441 0x55 // Battery gauge + +// CUSTOM GPIOs the SX1262 +#define SX1262_CS (32) + +// If you would prefer to get console debug output over the JTAG ICE connection rather than the CDC-ACM USB serial device, just +// define this. #define USE_SEGGER + +#define SX1262_DIO1 (29) +#define SX1262_DIO2 (30) +#define SX1262_BUSY (33) // Supposed to be P0.18 but because of reworks, now on P0.31 (18) +#define SX1262_RESET (34) +// #define SX1262_ANT_SW (32 + 10) +#define SX1262_RXEN (14) +#define SX1262_TXEN (31) +#define SX1262_POWER_EN \ + (15) // FIXME, see warning hre https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay/blob/master/LORA_RELAY_NRF52840.ino +#define SX1262_E22 // Indicates this SX1262 is inside of an ebyte E22 module and special config should be done for that + +// ST7565 SPI +#define ST7735_RESET (11) // Output +#define ST7735_CS (12) +#define ST7735_BACKLIGHT_EN (13) +#define ST7735_RS (9) +#define ST7735_SDA (39) // actually spi MOSI +#define ST7735_SCK (37) // actually spi clk + +#define PIN_GPS_WAKE 36 // Just kill GPS power when we want it to sleep? FIXME + +// #define LORA_DISABLE_SENDING // The board can brownout during lora TX if you don't have a battery connected. Disable sending +// to allow USB power only based debugging + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif