diff --git a/Boards.h b/Boards.h index c059cd6..9b09bde 100644 --- a/Boards.h +++ b/Boards.h @@ -122,6 +122,10 @@ #define MODEL_FE 0xFE // Homebrew board, max 17dBm output power #define MODEL_FF 0xFF // Homebrew board, max 14dBm output power + #define BOARD_AETHERNODE 0xF3 // Aethernode + #define BOARD_MESHADVENTURER 0xF4 // Meshadventurer + #define BOARD_PROMICRO 0xF5 // FakeTec (Promicro) + #if defined(__AVR_ATmega1284P__) #define PLATFORM PLATFORM_AVR #define MCU_VARIANT MCU_1284P @@ -223,14 +227,89 @@ #define PIN_GPS_RX 34 #if BOARD_MODEL == BOARD_GENERIC_ESP32 + #define HAS_DISPLAY true #define HAS_BLUETOOTH true + #define HAS_WIFI true #define HAS_CONSOLE true #define HAS_EEPROM true - const int pin_cs = 4; - const int pin_reset = 33; - const int pin_dio = 39; - const int pin_led_rx = 14; - const int pin_led_tx = 32; + #define HAS_BUSY true + #define HAS_INPUT true + #define HAS_TCXO true + #define MODEM SX1262 + #define DIO2_AS_RF_SWITCH true + #define HAS_RF_SWITCH_RX_TX false + const int pin_cs = 5; + const int pin_sclk = 18; + const int pin_miso = 19; + const int pin_mosi = 23; + const int pin_busy = 32; + const int pin_reset = 34; + const int pin_dio = 33; + const int pin_txen = -1; + const int pin_rxen = -1; + const int pin_tcxo_enable = -1; + + const int pin_btn_usr1 = 39; + const int pin_led_rx = 2; + const int pin_led_tx = 4; + + #elif BOARD_MODEL == BOARD_MESHADVENTURER + #define HAS_DISPLAY true + #define HAS_BLUETOOTH true + #define HAS_WIFI true + #define HAS_CONSOLE true + #define HAS_EEPROM true + #define HAS_BUSY true + #define HAS_INPUT true + #define HAS_TCXO true + #define MODEM SX1262 + #define DIO2_AS_RF_SWITCH false + #define HAS_RF_SWITCH_RX_TX true + #define HAS_LORA_LNA true + #define LORA_LNA_GAIN 17 + #define LORA_LNA_GVT 12 + + const int pin_cs = 18; + const int pin_sclk = 5; + const int pin_miso = 19; + const int pin_mosi = 27; + const int pin_busy = 32; + const int pin_reset = 23; + const int pin_dio = 33; + const int pin_txen = 13; + const int pin_rxen = 14; + const int pin_tcxo_enable = -1; + + const int pin_btn_usr1 = 39; + const int pin_led_rx = 2; + const int pin_led_tx = 4; + + #elif BOARD_MODEL == BOARD_AETHERNODE + #define HAS_DISPLAY true + #define HAS_BLUETOOTH true + #define HAS_WIFI true + #define HAS_CONSOLE true + #define HAS_EEPROM true + #define HAS_BUSY true + #define HAS_INPUT true + #define HAS_TCXO true + #define MODEM SX1262 + #define DIO2_AS_RF_SWITCH true + #define HAS_RF_SWITCH_RX_TX false + const int pin_cs = 5; + const int pin_sclk = 18; + const int pin_miso = 19; + const int pin_mosi = 23; + const int pin_busy = 32; + const int pin_reset = 34; + const int pin_dio = 33; + const int pin_txen = -1; + const int pin_rxen = -1; + const int pin_tcxo_enable = -1; + + const int pin_btn_usr1 = 39; + const int pin_led_rx = 2; + const int pin_led_tx = 4; #elif BOARD_MODEL == BOARD_TBEAM #define HAS_DISPLAY true @@ -895,6 +974,64 @@ const int DISPLAY_BL_PIN = PIN_T114_TFT_BLGT; const int DISPLAY_RST = PIN_T114_TFT_RST; + #elif BOARD_MODEL == BOARD_PROMICRO + //TODO: + // - Fix low output power + // - Make compatible with non-TCXO radios + // - Add PMU + #define MODEM SX1262 + #define HAS_EEPROM false + #define HAS_BLUETOOTH false + #define HAS_BLE true + #define HAS_CONSOLE false + #define HAS_PMU false + #define HAS_NP false + #define HAS_SD false + #define HAS_TCXO true + #define HAS_BUSY true + #define HAS_RF_SWITCH_RX_TX true + #define DIO2_AS_RF_SWITCH true + #define OCP_TUNED 0x38 + #define HAS_SLEEP false + #define BLE_MANUFACTURER "DIY" + #define BLE_MODEL "ProMicro" + + #define HAS_INPUT true + #define EEPROM_SIZE 296 + #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED + + #define CONFIG_UART_BUFFER_SIZE 6144 + #define CONFIG_QUEUE_SIZE 6144 + #define CONFIG_QUEUE_MAX_LENGTH 200 + + //Confused with the pin numbers?? + //https://github.com/pdcook/nRFMicro-Arduino-Core/blob/a83161e619da8668f726b52578a3dd89c1ef5956/variants/nice_nano/variant.h#L59 + + #define HAS_DISPLAY true + #define I2C_SDA 8 //P1.04 + #define I2C_SCL 7 //P0.11 + + #define LED_ON LOW + #define LED_OFF HIGH + #define PIN_LED_RED 22 //P0.15 + const int pin_led_rx = PIN_LED_RED; + const int pin_led_tx = PIN_LED_RED; + + #define PIN_VEXT_EN 21 //P0.13 + + const int pin_btn_usr1 = 6; //P1.00 + + const int pin_reset = 10; //P0.09 + const int pin_cs = 13; //P1.13 + const int pin_sclk = 12; //P1.11 + const int pin_mosi = 14; //P1.15 + const int pin_miso = 15; //P0.02 + const int pin_busy = 16; //P0.29 + const int pin_dio = 11; //P0.10 + const int pin_tcxo_enable = -1; + const int pin_rxen = 2; //P0.17 + const int pin_txen = -1; + #else #error An unsupported nRF board was selected. Cannot compile RNode firmware. #endif diff --git a/Display.h b/Display.h index aabdf60..5cc45a8 100644 --- a/Display.h +++ b/Display.h @@ -65,6 +65,26 @@ #define DISP_ADDR 0x3C #define SCL_OLED 18 #define SDA_OLED 17 +#elif BOARD_MODEL == BOARD_GENERIC_ESP32 + #define DISP_RST -1 + #define DISP_ADDR 0x3C + #define SCL_OLED 22 + #define SDA_OLED 11 +#elif BOARD_MODEL == BOARD_MESHADVENTURER + #define DISP_RST -1 + #define DISP_ADDR 0x3C + #define SCL_OLED 22 + #define SDA_OLED 21 +#elif BOARD_MODEL == BOARD_AETHERNODE + #define DISP_RST -1 + #define DISP_ADDR 0x3C + #define SCL_OLED 22 + #define SDA_OLED 21 +#elif BOARD_MODEL == BOARD_PROMICRO + #define DISP_RST -1 + #define DISP_ADDR 0x3C + #define SCL_OLED 7 + #define SDA_OLED 8 #elif BOARD_MODEL == BOARD_RAK4631 // RAK1921/SSD1306 #define DISP_RST -1 @@ -311,6 +331,9 @@ bool display_init() { #elif BOARD_MODEL == BOARD_HELTEC_T114 pinMode(PIN_T114_TFT_EN, OUTPUT); digitalWrite(PIN_T114_TFT_EN, LOW); + #elif BOARD_MODEL == BOARD_PROMICRO + Wire.setPins(SDA_OLED, SCL_OLED); + Wire.begin(); #elif BOARD_MODEL == BOARD_TECHO display.init(0, true, 10, false, displaySPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); display.setPartialWindow(0, 0, DISP_W, DISP_H); @@ -434,6 +457,15 @@ bool display_init() { #elif BOARD_MODEL == BOARD_TECHO disp_mode = DISP_MODE_PORTRAIT; display.setRotation(3); + #elif BOARD_MODEL == BOARD_MESHADVENTURER + disp_mode = DISP_MODE_LANDSCAPE; + display.setRotation(0); + #elif BOARD_MODEL == BOARD_AETHERNODE + disp_mode = DISP_MODE_LANDSCAPE; + display.setRotation(0); + #elif BOARD_MODEL == BOARD_PROMICRO + disp_mode = DISP_MODE_LANDSCAPE; + display.setRotation(0); #else disp_mode = DISP_MODE_PORTRAIT; display.setRotation(3); @@ -1130,6 +1162,9 @@ void update_display(bool blank = false) { void display_unblank() { last_unblank_event = millis(); + #if BOARD_MODEL == BOARD_HELTEC_T114 + digitalWrite(PIN_T114_TFT_BLGT, LOW); + #endif } void ext_fb_enable() { diff --git a/Makefile b/Makefile index 4e5e89c..c07d876 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ ARDUINO_ESP_CORE_VER = 2.0.17 # Version 3.2.0 of the Arduino ESP core is based on ESP-IDF v5.4.1 -# ARDUINO_ESP_CORE_VER = 3.2.0 +#ARDUINO_ESP_CORE_VER = 3.3.7 all: release @@ -50,10 +50,12 @@ prep-nrf: arduino-cli core install rakwireless:nrf52 --config-file arduino-cli.yaml arduino-cli core install Heltec_nRF52:Heltec_nRF52 --config-file arduino-cli.yaml arduino-cli core install adafruit:nrf52 --config-file arduino-cli.yaml + arduino-cli core install "promicro:nrf52" --config-file arduino-cli.yaml + sed -i.bak 's/nicenanov2\.build\.ldscript=nrf52840_s140_v7\.ld/nicenanov2.build.ldscript=nrf52840_s140_v6.ld/' ~/.arduino15/packages/promicro/hardware/nrf52/1.0.2/boards.txt arduino-cli lib install "GxEPD2" arduino-cli config set library.enable_unsafe_install true arduino-cli lib install --git-url https://github.com/liamcottle/esp8266-oled-ssd1306#e16cee124fe26490cb14880c679321ad8ac89c95 - pip install adafruit-nrfutil --upgrade + pip install adafruit-nrfutil --upgrade --break-system-packages console-site: make -C Console clean site @@ -139,12 +141,21 @@ firmware-featheresp32: check_bt_buffers firmware-genericesp32: check_bt_buffers arduino-cli compile --log --fqbn esp32:esp32:esp32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x35\"" +firmware-meshadventurer: check_bt_buffers + arduino-cli compile --log --fqbn esp32:esp32:esp32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0xF4\"" + +firmware-aethernode: check_bt_buffers + arduino-cli compile --log --fqbn esp32:esp32:esp32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x35\"" + firmware-rak4631: arduino-cli compile --log --fqbn rakwireless:nrf52:WisCoreRAK4631Board -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x51\"" firmware-heltec_t114: arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\"" +firmware-promicro: + arduino-cli compile --log --fqbn promicro:nrf52:nicenanov2:softdevice=s140v6 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0xF5\"" + firmware-techo: arduino-cli compile --log --fqbn adafruit:nrf52:pca10056 -e --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x44\"" @@ -154,6 +165,27 @@ firmware-xiao_s3: upload: arduino-cli upload -p /dev/ttyUSB0 --fqbn unsignedio:avr:rnode +upload-genericesp32: + arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:esp32 + @sleep 1 + rnodeconf /dev/ttyUSB0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.esp32/RNode_Firmware.ino.bin) + @sleep 3 + python ./Release/esptool/esptool.py --chip esp32 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin + +upload-meshadventurer: + arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:esp32 + @sleep 1 + rnodeconf /dev/ttyUSB0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.esp32/RNode_Firmware.ino.bin) + @sleep 3 + python ./Release/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin + +upload-aethernode: + arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:esp32 + @sleep 1 + rnodeconf /dev/ttyUSB0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.esp32/RNode_Firmware.ino.bin) + @sleep 3 + python ./Release/esptool/esptool.py --chip esp32 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin + upload-mega2560: arduino-cli upload -p /dev/ttyACM0 --fqbn arduino:avr:mega @@ -197,7 +229,7 @@ upload-heltec32_v2: @sleep 1 rnodeconf /dev/ttyUSB0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.heltec_wifi_lora_32_V2/RNode_Firmware.ino.bin) @sleep 3 - python ./Release/esptool/esptool.py --chip esp32 --port /dev/ttyUSB1 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin + python ./Release/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin upload-heltec32_v3: arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:heltec_wifi_lora_32_V3 @@ -265,6 +297,11 @@ upload-heltec_t114: @sleep 1 rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0) +upload-promicro: + arduino-cli upload -p /dev/ttyACM0 --fqbn promicro:nrf52:nicenanov2:softdevice=s140v6 + @sleep 6 + rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0) + upload-techo: arduino-cli upload -p /dev/ttyACM0 --fqbn adafruit:nrf52:pca10056 @sleep 6 @@ -487,6 +524,24 @@ release-genericesp32: check_bt_buffers zip --junk-paths ./Release/rnode_firmware_esp32_generic.zip ./Release/esptool/esptool.py ./Release/console_image.bin build/rnode_firmware_esp32_generic.boot_app0 build/rnode_firmware_esp32_generic.bin build/rnode_firmware_esp32_generic.bootloader build/rnode_firmware_esp32_generic.partitions rm -r build +release-meshadventurer: check_bt_buffers + arduino-cli compile --fqbn esp32:esp32:esp32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0xF4\"" + cp ~/.arduino15/packages/esp32/hardware/esp32/$(ARDUINO_ESP_CORE_VER)/tools/partitions/boot_app0.bin build/rnode_firmware_meshadventurer.boot_app0 + cp build/esp32.esp32.esp32/RNode_Firmware.ino.bin build/rnode_firmware_meshadventurer.bin + cp build/esp32.esp32.esp32/RNode_Firmware.ino.bootloader.bin build/rnode_firmware_meshadventurer.bootloader + cp build/esp32.esp32.esp32/RNode_Firmware.ino.partitions.bin build/rnode_firmware_meshadventurer.partitions + zip --junk-paths ./Release/rnode_firmware_meshadventurer.zip ./Release/esptool/esptool.py ./Release/console_image.bin build/rnode_firmware_meshadventurer.boot_app0 build/rnode_firmware_meshadventurer.bin build/rnode_firmware_meshadventurer.bootloader build/rnode_firmware_meshadventurer.partitions + rm -r build + +release-aethernode: check_bt_buffers + arduino-cli compile --fqbn esp32:esp32:esp32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x35\"" + cp ~/.arduino15/packages/esp32/hardware/esp32/$(ARDUINO_ESP_CORE_VER)/tools/partitions/boot_app0.bin build/rnode_firmware_aethernode.boot_app0 + cp build/esp32.esp32.esp32/RNode_Firmware.ino.bin build/rnode_firmware_aethernode.bin + cp build/esp32.esp32.esp32/RNode_Firmware.ino.bootloader.bin build/rnode_firmware_aethernode.bootloader + cp build/esp32.esp32.esp32/RNode_Firmware.ino.partitions.bin build/rnode_firmware_aethernode.partitions + zip --junk-paths ./Release/rnode_firmware_aethernode.zip ./Release/esptool/esptool.py ./Release/console_image.bin build/rnode_firmware_aethernode.boot_app0 build/rnode_firmware_aethernode.bin build/rnode_firmware_aethernode.bootloader build/rnode_firmware_aethernode.partitions + rm -r build + release-mega2560: arduino-cli compile --fqbn arduino:avr:mega -e --build-property "compiler.cpp.extra_flags=\"-DMODEM=0x01\"" cp build/arduino.avr.mega/RNode_Firmware.ino.hex Release/rnode_firmware_m2560.hex @@ -502,6 +557,11 @@ release-heltec_t114: cp build/Heltec_nRF52.Heltec_nRF52.HT-n5262/RNode_Firmware.ino.hex build/rnode_firmware_heltec_t114.hex adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application build/rnode_firmware_heltec_t114.hex Release/rnode_firmware_heltec_t114.zip +release-promicro: + arduino-cli compile --log --fqbn promicro:nrf52:nicenanov2:softdevice=s140v6 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0xF5\"" + cp build/promicro.nrf52.nicenanov2/RNode_Firmware.ino.hex build/rnode_firmware_promicro.hex + adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application build/rnode_firmware_promicro.hex Release/rnode_firmware_promicro.zip + release-techo: arduino-cli compile --log --fqbn adafruit:nrf52:pca10056 -e --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x44\"" cp build/adafruit.nrf52.pca10056/RNode_Firmware.ino.hex build/rnode_firmware_techo.hex diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index 5649206..f2e071f 100644 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -89,6 +89,12 @@ void setup() { pinMode(PIN_LED_BLUE, OUTPUT); delay(200); #endif + #if BOARD_MODEL == BOARD_PROMICRO + delay(200); + pinMode(PIN_VEXT_EN, OUTPUT); + digitalWrite(PIN_VEXT_EN, HIGH); + delay(200); + #endif if (!eeprom_begin()) { Serial.write("EEPROM initialisation failed.\r\n"); } #endif @@ -129,7 +135,7 @@ void setup() { boot_seq(); #endif - #if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 && BOARD_MODEL != BOARD_HELTEC32_V4 + #if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_PROMICRO && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 && BOARD_MODEL != BOARD_HELTEC32_V4 // Some boards need to wait until the hardware UART is set up before booting // the full firmware. In the case of the RAK4631 and Heltec T114, the line below will wait // until a serial connection is actually established with a master. Thus, it @@ -535,7 +541,9 @@ bool startRadio() { // Flash an info pattern to indicate // that the radio is now on kiss_indicate_radiostate(); - led_indicate_info(3); + if (!display_blanked) { + led_indicate_info(3); + } return true; } @@ -575,7 +583,7 @@ volatile bool queue_flushing = false; void flush_queue(void) { if (!queue_flushing) { queue_flushing = true; - led_tx_on(); + if (!display_blanked) { led_tx_on(); } #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 while (!fifo16_isempty(&packet_starts)) { @@ -596,7 +604,7 @@ void flush_queue(void) { } } - lora_receive(); led_tx_off(); + lora_receive(); if (!display_blanked) { led_tx_off(); } } queue_height = 0; @@ -615,7 +623,8 @@ void flush_queue(void) { void pop_queue() { if (!queue_flushing) { - queue_flushing = true; led_tx_on(); + queue_flushing = true; + if (!display_blanked) { led_tx_on(); } #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 if (!fifo16_isempty(&packet_starts)) { @@ -637,7 +646,8 @@ void pop_queue() { queued_bytes -= length; } - lora_receive(); led_tx_off(); + lora_receive(); + if (!display_blanked) { led_tx_off(); } } #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 @@ -751,7 +761,7 @@ void transmit(uint16_t size) { add_airtime(written); } else { - led_tx_on(); uint16_t written = 0; + if (!display_blanked) { led_tx_on(); } uint16_t written = 0; if (size > SINGLE_MTU) { size = SINGLE_MTU; } if (!implicit) { LoRa->beginPacket(); } else { LoRa->beginPacket(size); } @@ -984,7 +994,7 @@ void serial_callback(uint8_t sbyte) { } else if (command == CMD_RADIO_LOCK) { update_radio_lock(); kiss_indicate_radio_lock(); - } else if (command == CMD_BLINK) { + } else if (command == CMD_BLINK && !display_blanked) { led_indicate_info(sbyte); } else if (command == CMD_RANDOM) { kiss_indicate_random(getRandom()); @@ -1431,13 +1441,15 @@ void update_modem_status() { if (carrier_detected) { dcd = true; } else { dcd = false; } dcd_led = dcd; - if (dcd_led) { led_rx_on(); } + if (!display_blanked && dcd_led) { led_rx_on(); } else { if (interference_detected) { - if (led_id_filter >= LED_ID_TRIG && noise_floor_sampled) { led_id_on(); } + if (led_id_filter >= LED_ID_TRIG && noise_floor_sampled && !display_blanked) { led_id_on(); } } else { - if (airtime_lock) { led_indicate_airtime_lock(); } - else { led_rx_off(); led_id_off(); } + if (airtime_lock && !display_blanked) { led_indicate_airtime_lock(); } + else { + if (!display_blanked) { led_rx_off(); led_id_off(); } + } } } } @@ -1707,7 +1719,9 @@ void loop() { console_loop(); #endif } else { - led_indicate_standby(); + if (!display_blanked) { + led_indicate_standby(); + } } } else { diff --git a/Utilities.h b/Utilities.h index f6fbac2..068f6a6 100644 --- a/Utilities.h +++ b/Utilities.h @@ -135,7 +135,7 @@ uint8_t boot_vector = 0x00; #define NUMPIXELS 1 Adafruit_NeoPixel pixels(NUMPIXELS, pin_np, NEO_GRB + NEO_KHZ800); - uint8_t npr = 0; + uint8_t npr = 0; uint8_t npg = 0; uint8_t npb = 0; float npi = NP_M; @@ -340,6 +340,20 @@ 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_AETHERNODE + 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); } + void led_id_on() { } + void led_id_off() { } + #elif BOARD_MODEL == BOARD_MESHADVENTURER + 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); } + void led_id_on() { } + void led_id_off() { } #endif #elif MCU_VARIANT == MCU_NRF52 #if HAS_NP == true @@ -356,7 +370,14 @@ 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_HELTEC_T114 + #elif BOARD_MODEL == BOARD_PROMICRO + void led_rx_on() { digitalWrite(pin_led_rx, LED_ON); } + void led_rx_off() { digitalWrite(pin_led_rx, LED_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_HELTEC_T114 // Heltec T114 pulls pins LOW to turn on void led_rx_on() { digitalWrite(pin_led_rx, LOW); } void led_rx_off() { digitalWrite(pin_led_rx, HIGH); } @@ -1362,7 +1383,7 @@ void setTXPower() { if (model == MODEL_12) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_RFO_PIN); if (model == MODEL_C6) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_RFO_PIN); - if (model == MODEL_C7) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_RFO_PIN); + if (model == MODEL_C7) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_RFO_PIN); if (model == MODEL_A1) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_A2) LoRa->setTxPower(mapped_lora_txp, PA_OUTPUT_PA_BOOST_PIN); @@ -1675,6 +1696,12 @@ bool eeprom_model_valid() { if (model == MODEL_FF) { #elif BOARD_MODEL == BOARD_GENERIC_ESP32 if (model == MODEL_FF || model == MODEL_FE) { + #elif BOARD_MODEL == BOARD_AETHERNODE + if (model == MODEL_FF || model == MODEL_FE) { + #elif BOARD_MODEL == BOARD_MESHADVENTURER + if (model == MODEL_FF || model == MODEL_FE) { + #elif BOARD_MODEL == BOARD_PROMICRO + if (model == MODEL_FF || model == MODEL_FE) { #else if (false) { #endif diff --git a/energysave.patch b/energysave.patch new file mode 100644 index 0000000..249d38c --- /dev/null +++ b/energysave.patch @@ -0,0 +1,133 @@ +diff --git a/Display.h b/Display.h +index 7d903b9..882af8d 100644 +--- a/Display.h ++++ b/Display.h +@@ -1071,6 +1071,7 @@ void update_display(bool blank = false) { + #if BOARD_MODEL == BOARD_HELTEC_T114 + display.clear(); + display.display(); ++ digitalWrite(PIN_T114_TFT_BLGT, HIGH); + #elif BOARD_MODEL != BOARD_TDECK && BOARD_MODEL != BOARD_TECHO + display.clearDisplay(); + display.display(); +@@ -1128,6 +1129,9 @@ void update_display(bool blank = false) { + + void display_unblank() { + last_unblank_event = millis(); ++ #if BOARD_MODEL == BOARD_HELTEC_T114 ++ digitalWrite(PIN_T114_TFT_BLGT, LOW); ++ #endif + } + + void ext_fb_enable() { +diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino +index 5649206..ba157e6 100644 +--- a/RNode_Firmware.ino ++++ b/RNode_Firmware.ino +@@ -535,7 +535,9 @@ bool startRadio() { + // Flash an info pattern to indicate + // that the radio is now on + kiss_indicate_radiostate(); +- led_indicate_info(3); ++ if (!display_blanked) { ++ led_indicate_info(3); ++ } + return true; + } + +@@ -575,7 +577,7 @@ volatile bool queue_flushing = false; + void flush_queue(void) { + if (!queue_flushing) { + queue_flushing = true; +- led_tx_on(); ++ if (!display_blanked) { led_tx_on(); } + + #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 + while (!fifo16_isempty(&packet_starts)) { +@@ -596,7 +598,7 @@ void flush_queue(void) { + } + } + +- lora_receive(); led_tx_off(); ++ lora_receive(); if (!display_blanked) { led_tx_off(); } + } + + queue_height = 0; +@@ -615,7 +617,8 @@ void flush_queue(void) { + + void pop_queue() { + if (!queue_flushing) { +- queue_flushing = true; led_tx_on(); ++ queue_flushing = true; ++ if (!display_blanked) { led_tx_on(); } + + #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 + if (!fifo16_isempty(&packet_starts)) { +@@ -637,7 +640,8 @@ void pop_queue() { + queued_bytes -= length; + } + +- lora_receive(); led_tx_off(); ++ lora_receive(); ++ if (!display_blanked) { led_tx_off(); } + } + + #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 +@@ -751,7 +755,7 @@ void transmit(uint16_t size) { + add_airtime(written); + + } else { +- led_tx_on(); uint16_t written = 0; ++ if (!display_blanked) { led_tx_on(); } uint16_t written = 0; + if (size > SINGLE_MTU) { size = SINGLE_MTU; } + if (!implicit) { LoRa->beginPacket(); } + else { LoRa->beginPacket(size); } +@@ -984,7 +988,7 @@ void serial_callback(uint8_t sbyte) { + } else if (command == CMD_RADIO_LOCK) { + update_radio_lock(); + kiss_indicate_radio_lock(); +- } else if (command == CMD_BLINK) { ++ } else if (command == CMD_BLINK && !display_blanked) { + led_indicate_info(sbyte); + } else if (command == CMD_RANDOM) { + kiss_indicate_random(getRandom()); +@@ -1431,13 +1435,15 @@ void update_modem_status() { + if (carrier_detected) { dcd = true; } else { dcd = false; } + + dcd_led = dcd; +- if (dcd_led) { led_rx_on(); } ++ if (!display_blanked && dcd_led) { led_rx_on(); } + else { + if (interference_detected) { +- if (led_id_filter >= LED_ID_TRIG && noise_floor_sampled) { led_id_on(); } ++ if (led_id_filter >= LED_ID_TRIG && noise_floor_sampled && !display_blanked) { led_id_on(); } + } else { +- if (airtime_lock) { led_indicate_airtime_lock(); } +- else { led_rx_off(); led_id_off(); } ++ if (airtime_lock && !display_blanked) { led_indicate_airtime_lock(); } ++ else { ++ if (!display_blanked) { led_rx_off(); led_id_off(); } ++ } + } + } + } +@@ -1707,7 +1713,9 @@ void loop() { + console_loop(); + #endif + } else { +- led_indicate_standby(); ++ if (!display_blanked) { ++ led_indicate_standby(); ++ } + } + } else { + +diff --git a/arduino-cli.yaml b/arduino-cli.yaml +index 6dd5f8d..d358070 100644 +--- a/arduino-cli.yaml ++++ b/arduino-cli.yaml +@@ -4,4 +4,3 @@ board_manager: + - https://raw.githubusercontent.com/RAKwireless/RAKwireless-Arduino-BSP-Index/main/package_rakwireless_index.json + - https://github.com/HelTecAutomation/Heltec_nRF52/releases/download/1.7.0/package_heltec_nrf_index.json + - https://adafruit.github.io/arduino-board-index/package_adafruit_index.json +- - http://unsigned.io/arduino/package_unsignedio_UnsignedBoards_index.json diff --git a/sx126x.cpp b/sx126x.cpp index 97ca045..a7a5e38 100644 --- a/sx126x.cpp +++ b/sx126x.cpp @@ -87,7 +87,7 @@ #define FREQ_DIV_6X (double)pow(2.0, 25.0) #define FREQ_STEP_6X (double)(XTAL_FREQ_6X / FREQ_DIV_6X) -#if BOARD_MODEL == BOARD_TECHO +#if BOARD_MODEL == BOARD_TECHO || BOARD_MODEL == BOARD_PROMICRO SPIClass spim3 = SPIClass(NRF_SPIM3, pin_miso, pin_sclk, pin_mosi) ; #define SPI spim3 @@ -133,7 +133,7 @@ bool sx126x::preInit() { pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); - #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3 + #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3 || BOARD_MODEL == BOARD_GENERIC_ESP32 || BOARD_MODEL == BOARD_MESHADVENTURER || BOARD_MODEL == BOARD_AETHERNODE SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); #elif BOARD_MODEL == BOARD_TECHO SPI.setPins(pin_miso, pin_sclk, pin_mosi); @@ -308,6 +308,22 @@ void sx126x::reset(void) { } } +void sx126x::setDCDCRegulator(void) { + // Documentation + // 5. Power Distribution -> 5.1 Selecting DC-DC Converter or LDO Regulation + // 13.1.11 SetRegulatorMode + + uint8_t mode_byte = MODE_STDBY_RC_6X; + executeOpcode(OP_STANDBY_6X, &mode_byte, 1); + + // Enable DC-DC regulator for high power operation + uint8_t reg_mode = 0x01; // 0x00 = LDO, 0x01 = DC-DC + executeOpcode(OP_REGULATOR_MODE_6X, ®_mode, 1); + + delay(5); + waitOnBusy(); +} + void sx126x::calibrate(void) { // Put in STDBY_RC mode before calibration uint8_t mode_byte = MODE_STDBY_RC_6X; @@ -339,9 +355,19 @@ int sx126x::begin(long frequency) { if (!_preinit_done) { if (!preInit()) { return false; } } if (_rxen != -1) { pinMode(_rxen, OUTPUT); } + //TODO: if it works, make it optional + //#ifdef SX1262_USE_DCDC_REGULATOR + setDCDCRegulator(); + //#endif + calibrate(); calibrate_image(frequency); - enableTCXO(); + #if HAS_TCXO + enableTCXO(); + //13.1.15 SetRxTxFallbackMode to STDBY_XOSC + uint8_t fallback_mode = 0x30; // STDBY_XOSC after TX/RX + executeOpcode(OP_RX_TX_FALLBACK_MODE_6X, &fallback_mode, 1); + #endif loraMode(); standby(); @@ -459,6 +485,9 @@ int sx126x::beginPacket(int implicitHeader) { int sx126x::endPacket() { setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); + + if (_rxen != -1) { digitalWrite(_rxen, LOW); } //Set RXen low when transmitting + uint8_t timeout[3] = {0}; // Put in single TX mode executeOpcode(OP_TX_6X, timeout, 3); @@ -703,6 +732,14 @@ void sx126x::enableTCXO() { uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #elif BOARD_MODEL == BOARD_HELTEC32_V4 uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; + #elif BOARD_MODEL == BOARD_GENERIC_ESP32 + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; + #elif BOARD_MODEL == BOARD_MESHADVENTURER + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; + #elif BOARD_MODEL == BOARD_AETHERNODE + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; + #elif BOARD_MODEL == BOARD_PROMICRO + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #endif executeOpcode(OP_DIO3_TCXO_CTRL_6X, buf, 4); #endif diff --git a/sx126x.h b/sx126x.h index 068a1bb..52b3ed8 100644 --- a/sx126x.h +++ b/sx126x.h @@ -74,6 +74,7 @@ public: void disableCrc(); void enableTCXO(); void disableTCXO(); + void setDCDCRegulator(); void rxAntEnable(); void loraMode();