diff --git a/.gitignore b/.gitignore index c585a06..b879ff5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ Release/*.zip Release/*.json Console/build build/* +.vscode \ No newline at end of file diff --git a/Boards.h b/Boards.h index 1c4d20a..c9193fe 100644 --- a/Boards.h +++ b/Boards.h @@ -39,6 +39,7 @@ #define BOARD_RNODE_NG_20 0x40 #define BOARD_RNODE_NG_21 0x41 #define BOARD_T3S3 0x42 + #define BOARD_TECHO 0x43 #define BOARD_GENERIC_NRF52 0x50 #define BOARD_FREENODE 0x52 @@ -50,7 +51,7 @@ #if defined(ESP32) #define PLATFORM PLATFORM_ESP32 #define MCU_VARIANT MCU_ESP32 - #elif defined(NRF52840_XXAA) + #elif defined(NRF52840_XXAA) || defined(_VARIANT_PCA10056_) #include #define PLATFORM PLATFORM_NRF52 #define MCU_VARIANT MCU_NRF52 @@ -629,7 +630,66 @@ #endif #elif MCU_VARIANT == MCU_NRF52 - #if BOARD_MODEL == BOARD_FREENODE + #if BOARD_MODEL == BOARD_TECHO + #define VALIDATE_FIRMWARE false + //#define GPS_BAUD_RATE 115200 + //#define PIN_GPS_TX 41 + //#define PIN_GPS_RX 40 + #define EEPROM_SIZE 296 + #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED + //#define HAS_EEPROM true + //#define HAS_SD true + //#define HAS_DISPLAY true + //#define HAS_CONSOLE true + //#define HAS_TXCO true + //#define DISPLAY EINK_BW + //#define HAS_BLE true + //#define HAS_PMU true + #define CONFIG_UART_BUFFER_SIZE 40000 + #define CONFIG_QUEUE_0_SIZE 6144 + #define CONFIG_QUEUE_MAX_LENGTH 200 + #define BLE_MANUFACTURER "LilyGO" + #define BLE_MODEL "T-Echo" + #define INTERFACE_COUNT 1 + //#define I2C_SDA 26 + //#define I2C_SCL 27 + #define CONFIG_QUEUE_1_SIZE 40000 + // first interface in list is the primary + const uint8_t interfaces[INTERFACE_COUNT] = {SX126X}; + const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + false, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + } + }; + + const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 24, // pin_ss + 19, // pin_sclk + 22, // pin_mosi + 23, // pin_miso + 17, // pin_busy + 20, // pin_dio + 25, // pin_reset + -1, // pin_txen + -1, // pin_rxen + 21 // pin_tcxo_enable + } + }; + + const int pin_disp_cs = 30; + const int pin_disp_dc = 28; + const int pin_disp_reset = 2; + const int pin_disp_busy = 3; + const int pin_disp_en = 43; + + const int pin_led_rx = LED_BLUE; + const int pin_led_tx = LED_RED; + #elif BOARD_MODEL == BOARD_FREENODE #define HAS_EEPROM false #define HAS_DISPLAY true #define DISPLAY EINK_BW diff --git a/Config.h b/Config.h index 8d5b4c9..fb6290d 100644 --- a/Config.h +++ b/Config.h @@ -78,9 +78,11 @@ bool pmu_ready = false; bool promisc = false; bool implicit = false; - volatile bool packet_ready = false; uint8_t implicit_l = 0; + volatile bool packet_ready = false; + volatile uint8_t packet_interface = 0xFF; + uint8_t op_mode = MODE_HOST; uint8_t model = 0x00; uint8_t hwrev = 0x00; diff --git a/Console/Makefile b/Console/Makefile index d3158ae..6fdfc65 100644 --- a/Console/Makefile +++ b/Console/Makefile @@ -14,10 +14,10 @@ dirs: @mkdir -p ./build/images pages: - python ./build.py + python3 ./build.py pages-debug: - python ./build.py --no-gz --no-remap + python3 ./build.py --no-gz --no-remap sourcepack: @echo Packing firmware sources... @@ -44,4 +44,4 @@ site: clean external dirs data sourcepack pages local: clean external dirs data sourcepack pages-debug serve: - python -m http.server 7777 --bind 127.0.0.1 --directory ./build + python3 -m http.server 7777 --bind 127.0.0.1 --directory ./build diff --git a/Device.h b/Device.h index 88ddce5..760ff40 100644 --- a/Device.h +++ b/Device.h @@ -231,14 +231,12 @@ void device_validate_partitions() { // todo, add bootloader, partition table, or softdevice? calculate_region_hash(APPLICATION_START, APPLICATION_START+get_fw_length(), dev_firmware_hash); #endif - #if VALIDATE_FIRMWARE for (uint8_t i = 0; i < DEV_HASH_LEN; i++) { if (dev_firmware_hash_target[i] != dev_firmware_hash[i]) { fw_signature_validated = false; break; } } - #endif } bool device_firmware_ok() { @@ -247,6 +245,7 @@ bool device_firmware_ok() { #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 bool device_init() { + #if VALIDATE_FIRMWARE if (bt_ready) { #if MCU_VARIANT == MCU_ESP32 for (uint8_t i=0; i ./Release/release.json + python3 ./release_hashes.py > ./Release/release.json release-tbeam: arduino-cli compile --fqbn esp32:esp32:t-beam -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x33\"" diff --git a/ROM.h b/ROM.h index 323449d..4ecd02a 100644 --- a/ROM.h +++ b/ROM.h @@ -32,6 +32,9 @@ #define MODEL_12 0x12 #define MODEL_13 0x13 // RAK4631 LF with WisBlock SX1280 module (LIBSYS002) #define MODEL_14 0x14 // RAK4631 HF with WisBlock SX1280 module (LIBSYS002) + #define PRODUCT_TECHO 0x15 + #define MODEL_16 0x16 // T-Echo 433 + #define MODEL_17 0x17 // T-Echo 915 #define MODEL_21 0x21 // European band, 868MHz #define MODEL_A1 0xA1 #define MODEL_A5 0xA5 // T3S3 SX1280 PA diff --git a/Radio.cpp b/Radio.cpp index 5cb776f..58035b3 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -744,6 +744,8 @@ void sx126x::enableTCXO() { 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}; + #elif BOARD_MODEL == BOARD_TECHO + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #elif BOARD_MODEL == BOARD_T3S3 uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #else @@ -2559,9 +2561,12 @@ void sx128x::disableCrc() setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); } -byte sx128x::random() +uint8_t sx128x::random() { // todo: implement + return 0x4; //chosen by fair die roll + //guarenteed to be random + //https://xkcd.com/221/ } void sx128x::setSPIFrequency(uint32_t frequency) diff --git a/Release/esptool/esptool.py b/Release/esptool/esptool.py index d1d62b4..e2ec3a0 100755 --- a/Release/esptool/esptool.py +++ b/Release/esptool/esptool.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # SPDX-FileCopyrightText: 2014-2022 Fredrik Ahlberg, Angus Gratton, Espressif Systems (Shanghai) CO LTD, other contributors as noted. # diff --git a/Release/esptool/gen_esp32part.py b/Release/esptool/gen_esp32part.py index 273f4e3..3168aa6 100644 --- a/Release/esptool/gen_esp32part.py +++ b/Release/esptool/gen_esp32part.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # ESP32 partition table generation tool # diff --git a/Release/esptool/spiffsgen.py b/Release/esptool/spiffsgen.py index 45f8449..75ebd61 100644 --- a/Release/esptool/spiffsgen.py +++ b/Release/esptool/spiffsgen.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # spiffsgen is a tool used to generate a spiffs image from a directory # diff --git a/Utilities.h b/Utilities.h index b1b923c..2f78928 100644 --- a/Utilities.h +++ b/Utilities.h @@ -217,6 +217,18 @@ uint8_t boot_vector = 0x00; void led_tx_on() { analogWrite(pin_led_tx, 1); } void led_tx_off() { analogWrite(pin_led_tx, 0); } #endif + #if BOARD_MODEL == BOARD_RAK4631 + void led_rx_on() { digitalWrite(pin_led_rx, HIGH); } + void led_rx_off() { digitalWrite(pin_led_rx, LOW); } + void led_tx_on() { digitalWrite(pin_led_tx, HIGH); } + void led_tx_off() { digitalWrite(pin_led_tx, LOW); } + #elif BOARD_MODEL == BOARD_TECHO + void led_rx_on() { digitalWrite(pin_led_rx, HIGH); } + void led_rx_off() { digitalWrite(pin_led_rx, LOW); } + void led_tx_on() { digitalWrite(pin_led_tx, HIGH); } + void led_tx_off() { digitalWrite(pin_led_tx, LOW); } + #endif +>>>>>>> upstream/master #endif void hard_reset(void) { @@ -585,6 +597,7 @@ void serial_write(uint8_t byte) { } else { SerialBT.write(byte); + #if MCU_VARIANT == MCU_NRF52 && HAS_BLE // This ensures that the TX buffer is flushed after a frame is queued in serial. // serial_in_frame is used to ensure that the flush only happens at the end of the frame if (serial_in_frame && byte == FEND) { @@ -594,6 +607,7 @@ void serial_write(uint8_t byte) { else if (!serial_in_frame && byte == FEND) { serial_in_frame = true; } + #endif } #else Serial.write(byte); @@ -1164,6 +1178,8 @@ uint16_t getQueueSize(uint8_t index) { case 11: return CONFIG_QUEUE_11_SIZE; #endif + default: + return CONFIG_QUEUE_0_SIZE; } } @@ -1338,7 +1354,7 @@ bool eeprom_product_valid() { #if 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) { #elif PLATFORM == PLATFORM_NRF52 - if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HMBRW || rval == PRODUCT_FREENODE) { + if (rval == PRODUCT_TECHO || rval == PRODUCT_RAK4631 || rval == PRODUCT_HMBRW || rval == PRODUCT_FREENODE) { #else if (false) { #endif @@ -1366,6 +1382,8 @@ bool eeprom_model_valid() { if (model == MODEL_FF || model == MODEL_FE) { #elif BOARD_MODEL == BOARD_TBEAM if (model == MODEL_E4 || model == MODEL_E9 || model == MODEL_E3 || model == MODEL_E8) { + #elif BOARD_MODEL == BOARD_TECHO + if (model == MODEL_16 || model == MODEL_17) { #elif BOARD_MODEL == BOARD_LORA32_V1_0 if (model == MODEL_BA || model == MODEL_BB) { #elif BOARD_MODEL == BOARD_LORA32_V2_0 diff --git a/arduino-cli.yaml b/arduino-cli.yaml index a8ad233..2f836f0 100644 --- a/arduino-cli.yaml +++ b/arduino-cli.yaml @@ -1,5 +1,6 @@ board_manager: additional_urls: + - https://adafruit.github.io/arduino-board-index/package_adafruit_index.json - https://liberatedsystems.co.uk/rnode-firmware-ce/esp-custom-package.json - https://raw.githubusercontent.com/RAKwireless/RAKwireless-Arduino-BSP-Index/main/package_rakwireless_index.json - http://unsigned.io/arduino/package_unsignedio_UnsignedBoards_index.json diff --git a/opencom_xl_firmware.ino b/opencom_xl_firmware.ino index 47fc5a1..6c31193 100644 --- a/opencom_xl_firmware.ino +++ b/opencom_xl_firmware.ino @@ -17,8 +17,9 @@ #include #include "Utilities.h" -#if MCU_VARIANT == MCU_NRF52 - #define INTERFACE_SPI +#if MCU_VARIANT == MCU_NRF52 + #define INTERFACE_SPI + #if BOARD_MODEL == BOARD_RAK4631 // Required because on RAK4631, non-default SPI pins must be initialised when class is declared. SPIClass interface_spi[1] = { // SX1262 @@ -29,6 +30,17 @@ interface_pins[0][2] ) }; + #elif BOARD_MODEL == BOARD_TECHO + SPIClass interface_spi[1] = { + // SX1262 + SPIClass( + NRF_SPIM3, + interface_pins[0][3], + interface_pins[0][1], + interface_pins[0][2] + ) + }; + #endif #endif #ifndef INTERFACE_SPI @@ -363,6 +375,7 @@ void receive_callback(uint8_t index, int packet_size) { getPacketData(selected_radio, packet_size); seq = SEQ_UNSET; + packet_interface = index; packet_ready = true; } else if (isSplitPacket(header) && seq != sequence) { @@ -388,6 +401,8 @@ void receive_callback(uint8_t index, int packet_size) { } getPacketData(selected_radio, packet_size); + + packet_interface = index; packet_ready = true; } } else { @@ -396,6 +411,8 @@ void receive_callback(uint8_t index, int packet_size) { read_len = 0; getPacketData(selected_radio, packet_size); + + packet_interface = index; packet_ready = true; } @@ -1118,11 +1135,11 @@ void validate_status() { if (eeprom_checksum_valid()) { eeprom_ok = true; if (modems_installed) { - if (device_init()) { - hw_ready = true; - } else { - hw_ready = false; - } + if (device_init()) { + hw_ready = true; + } else { + hw_ready = false; + } } else { hw_ready = false; Serial.write("No valid radio module found\r\n"); @@ -1189,7 +1206,7 @@ void loop() { #endif kiss_indicate_stat_rssi(); kiss_indicate_stat_snr(); - kiss_write_packet(1); + kiss_write_packet(packet_interface); } bool ready = false; diff --git a/partition_hashes b/partition_hashes index b520250..d6b81fe 100755 --- a/partition_hashes +++ b/partition_hashes @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (C) 2023, Mark Qvist diff --git a/release_hashes.py b/release_hashes.py index ce28a0c..c54a9d1 100644 --- a/release_hashes.py +++ b/release_hashes.py @@ -1,4 +1,4 @@ -#!/bin/python +#!/bin/python3 # Copyright (C) 2023, Mark Qvist @@ -47,4 +47,4 @@ for filename in files: "version": target_version } -print(json.dumps(release_hashes)) \ No newline at end of file +print(json.dumps(release_hashes))