diff --git a/Boards.h b/Boards.h index 45650e3..a3512fb 100644 --- a/Boards.h +++ b/Boards.h @@ -14,6 +14,7 @@ // along with this program. If not, see . #include "Interfaces.h" +#include "ROM.h" #ifndef BOARDS_H #define BOARDS_H @@ -41,11 +42,6 @@ #define BOARD_GENERIC_NRF52 0x50 #define BOARD_RAK4631 0x51 - // Variants - #define BOARD_T3S3_SX1262 0x01 - #define BOARD_T3S3_SX1280 0x02 - #define BOARD_T3S3_SX1280_PA 0x03 - // Displays #define OLED 0x01 #define EINK_BW 0x02 @@ -592,7 +588,7 @@ #endif #endif - #if BOARD_VARIANT == BOARD_T3S3_SX1262 + #if BOARD_VARIANT == MODEL_A1 const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; const bool interface_cfg[INTERFACE_COUNT][3] = { // SX1262 @@ -602,10 +598,10 @@ true // DIO2_AS_RF_SWITCH }, }; - #elif BOARD_VARIANT == BOARD_T3S3_SX1280_PA + #elif BOARD_VARIANT == MODEL_A5 // SX1280 with PA const uint8_t interfaces[INTERFACE_COUNT] = {SX1280}; const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 + // SX1280 { false, // DEFAULT_SPI false, // HAS_TCXO diff --git a/Makefile b/Makefile index 5cd0180..f4712e0 100644 --- a/Makefile +++ b/Makefile @@ -72,10 +72,10 @@ firmware-tbeam_sx126x: 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\" \"-DMODEM=0x03\"" firmware-t3s3_sx1262: - arduino-cli compile --fqbn "esp32:esp32:esp32s3:CDCOnBoot=cdc" -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x42\" \"-DBOARD_VARIANT=0x01\"" + arduino-cli compile --fqbn "esp32:esp32:esp32s3:CDCOnBoot=cdc" -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x42\" \"-DBOARD_VARIANT=0xA1\"" firmware-t3s3_sx1280_pa: - arduino-cli compile --fqbn "esp32:esp32:esp32s3:CDCOnBoot=cdc" -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x42\" \"-DBOARD_VARIANT=0x03\"" + arduino-cli compile --fqbn "esp32:esp32:esp32s3:CDCOnBoot=cdc" -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x42\" \"-DBOARD_VARIANT=0xA5\"" firmware-lora32_v10: arduino-cli compile --fqbn esp32:esp32:ttgo-lora32 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x39\"" diff --git a/ROM.h b/ROM.h index 7a343c0..c7bcc31 100644 --- a/ROM.h +++ b/ROM.h @@ -29,7 +29,9 @@ #define PRODUCT_RAK4631 0x10 #define MODEL_11 0x11 #define MODEL_12 0x12 + #define MODEL_13 0x13 // RAK4631 with WisBlock SX1280 module (LIBSYS002) #define MODEL_A1 0xA1 + #define MODEL_A5 0xA5 // T3S3 SX1280 PA #define MODEL_A6 0xA6 #define MODEL_A4 0xA4 #define MODEL_A9 0xA9 diff --git a/Radio.cpp b/Radio.cpp index f1edfad..57ae164 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -2192,11 +2192,118 @@ void sx128x::disableTCXO() { } void sx128x::setTxPower(int level, int outputPin) { - // PA calculation currently only works for the LoRa1280F27. Support for - // other assemblies would be appreciated in a PR. - if (outputPin == PA_OUTPUT_PA_BOOST_PIN) { - if (level > 27) { - level = 27; + uint8_t tx_buf[2]; + #if BOARD_VARIANT == MODEL_13 + // RAK4631 with WisBlock SX1280 module (LIBSYS002) + if (level > 27) { + level = 27; + } else if (level < 0) { + level = 0; + } + + _txp = level; + + int reg_value; + + switch (level) { + case 0: + reg_value = -18; + break; + case 1: + reg_value = -17; + break; + case 2: + reg_value = -16; + break; + case 3: + reg_value = -15; + break; + case 4: + reg_value = -14; + break; + case 5: + reg_value = -13; + break; + case 6: + reg_value = -12; + break; + case 7: + reg_value = -10; + break; + case 8: + reg_value = -9; + break; + case 9: + reg_value = -8; + break; + case 10: + reg_value = -7; + break; + case 11: + reg_value = -6; + break; + case 12: + reg_value = -5; + break; + case 13: + reg_value = -4; + break; + case 14: + reg_value = -3; + break; + case 15: + reg_value = -2; + break; + case 16: + reg_value = -1; + break; + case 17: + reg_value = 0; + break; + case 18: + reg_value = 1; + break; + case 19: + reg_value = 2; + break; + case 20: + reg_value = 3; + break; + case 21: + reg_value = 4; + break; + case 22: + reg_value = 5; + break; + case 23: + reg_value = 6; + break; + case 24: + reg_value = 8; + break; + case 25: + reg_value = 9; + break; + case 26: + reg_value = 12; + break; + case 27: + reg_value = 13; + break; + default: + reg_value = 0; + break; + } + + tx_buf[0] = reg_value; + tx_buf[1] = 0xE0; // ramping time - 20 microseconds + + executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); + + #elif BOARD_VARIANT == MODEL_A5 + // T3S3 SX1280 PA + if (level > 20) { + level = 20; } else if (level < 0) { level = 0; } @@ -2206,7 +2313,7 @@ void sx128x::setTxPower(int level, int outputPin) { int reg_value; switch (level) { - case 0: + /*case 0: reg_value = -18; break; case 1: @@ -2265,57 +2372,31 @@ void sx128x::setTxPower(int level, int outputPin) { break; case 19: reg_value = 2; - break; + break;*/ case 20: reg_value = 3; break; - case 21: - reg_value = 4; - break; - case 22: - reg_value = 5; - break; - case 23: - reg_value = 6; - break; - case 24: - reg_value = 8; - break; - case 25: - reg_value = 9; - break; - case 26: - reg_value = 12; - break; - case 27: - reg_value = 13; + default: + reg_value = 0; break; } - - uint8_t tx_buf[2]; - - tx_buf[0] = reg_value; + tx_buf[0] = level; tx_buf[1] = 0xE0; // ramping time - 20 microseconds - - executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); - } else { + #else + // For SX1280 boards with no specific PA requirements if (level > 13) { level = 13; } else if (level < -18) { level = -18; } + _txp = level; - level = level + 18; - - uint8_t tx_buf[2]; - tx_buf[0] = level; tx_buf[1] = 0xE0; // ramping time - 20 microseconds - - executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); - } + #endif + executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); } uint8_t sx128x::getTxPower() { diff --git a/Utilities.h b/Utilities.h index 407fb18..8125203 100644 --- a/Utilities.h +++ b/Utilities.h @@ -984,6 +984,7 @@ void setTXPower(RadioInterface* radio, int txp) { if (model == MODEL_A2) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_A3) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); if (model == MODEL_A4) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); + if (model == MODEL_A5) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); if (model == MODEL_A6) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_A7) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_A8) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); @@ -1333,7 +1334,7 @@ bool eeprom_model_valid() { #elif BOARD_MODEL == BOARD_RNODE_NG_21 if (model == MODEL_A2 || model == MODEL_A7) { #elif BOARD_MODEL == BOARD_T3S3 - if (model == MODEL_A1 || model == MODEL_A6) { + if (model == MODEL_A1 || model == MODEL_A5 || model == MODEL_A6) { #elif BOARD_MODEL == BOARD_HMBRW if (model == MODEL_FF || model == MODEL_FE) { #elif BOARD_MODEL == BOARD_TBEAM