diff --git a/src/configuration.h b/src/configuration.h
index d319ddb0a..5f6930646 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -80,10 +80,10 @@ along with this program. If not, see .
// Override user saved region, for producing region-locked builds
// #define REGULATORY_LORA_REGIONCODE meshtastic_Config_LoRaConfig_RegionCode_SG_923
-// Total system gain in dBm to subtract from Tx power to remain within regulatory ERP limit for non-licensed operators
-// This value should be set in variant.h and is PA gain + antenna gain (if system ships with an antenna)
-#ifndef REGULATORY_GAIN_LORA
-#define REGULATORY_GAIN_LORA 0
+// Total system gain in dBm to subtract from Tx power to remain within regulatory and Tx PA limits
+// This value should be set in variant.h and is PA gain + antenna gain (if variant has a non-removable antenna)
+#ifndef TX_GAIN_LORA
+#define TX_GAIN_LORA 0
#endif
// -----------------------------------------------------------------------------
diff --git a/src/mesh/LR11x0Interface.cpp b/src/mesh/LR11x0Interface.cpp
index aecc8f722..8cc05994c 100644
--- a/src/mesh/LR11x0Interface.cpp
+++ b/src/mesh/LR11x0Interface.cpp
@@ -71,6 +71,8 @@ template bool LR11x0Interface::init()
RadioLibInterface::init();
+ limitPower();
+
if (power > LR1110_MAX_POWER) // Clamp power to maximum defined level
power = LR1110_MAX_POWER;
@@ -80,8 +82,6 @@ template bool LR11x0Interface::init()
preambleLength = 12; // 12 is the default for operation above 2GHz
}
- limitPower();
-
#ifdef LR11X0_RF_SWITCH_SUBGHZ
pinMode(LR11X0_RF_SWITCH_SUBGHZ, OUTPUT);
digitalWrite(LR11X0_RF_SWITCH_SUBGHZ, getFreq() < 1e9 ? HIGH : LOW);
diff --git a/src/mesh/RF95Interface.cpp b/src/mesh/RF95Interface.cpp
index 1dfc72708..943a79a5f 100644
--- a/src/mesh/RF95Interface.cpp
+++ b/src/mesh/RF95Interface.cpp
@@ -122,11 +122,11 @@ bool RF95Interface::init()
power = dacDbValues.db;
#endif
+ limitPower();
+
if (power > RF95_MAX_POWER) // This chip has lower power limits than some
power = RF95_MAX_POWER;
- limitPower();
-
iface = lora = new RadioLibRF95(&module);
#ifdef RF95_TCXO
diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp
index 86903153b..06398e6c3 100644
--- a/src/mesh/RadioInterface.cpp
+++ b/src/mesh/RadioInterface.cpp
@@ -528,8 +528,8 @@ void RadioInterface::applyModemConfig()
power = loraConfig.tx_power;
- if ((power == 0) || ((power + REGULATORY_GAIN_LORA > myRegion->powerLimit) && !devicestate.owner.is_licensed))
- power = myRegion->powerLimit - REGULATORY_GAIN_LORA;
+ if ((power == 0) || ((power > myRegion->powerLimit) && !devicestate.owner.is_licensed))
+ power = myRegion->powerLimit;
if (power == 0)
power = 17; // Default to this power level if we don't have a valid regional power limit (powerLimit of myRegion defaults
@@ -616,7 +616,12 @@ void RadioInterface::limitPower()
power = maxPower;
}
- LOG_INFO("Set radio: final power level=%d", power);
+ if (TX_GAIN_LORA > 0) {
+ LOG_INFO("Requested Tx power: %d dBm; Device LoRa Tx gain: %d dB", power, TX_GAIN_LORA);
+ power -= TX_GAIN_LORA;
+ }
+
+ LOG_INFO("Final Tx power: %d dBm", power);
}
void RadioInterface::deliverToReceiver(meshtastic_MeshPacket *p)
diff --git a/src/mesh/STM32WLE5JCInterface.cpp b/src/mesh/STM32WLE5JCInterface.cpp
index 6a340dd28..3c8bf89c3 100644
--- a/src/mesh/STM32WLE5JCInterface.cpp
+++ b/src/mesh/STM32WLE5JCInterface.cpp
@@ -25,11 +25,11 @@ bool STM32WLE5JCInterface::init()
lora.setRfSwitchTable(rfswitch_pins, rfswitch_table);
+ limitPower();
+
if (power > STM32WLx_MAX_POWER) // This chip has lower power limits than some
power = STM32WLx_MAX_POWER;
- limitPower();
-
int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage);
LOG_INFO("STM32WLx init result %d", res);
diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp
index c867466b7..e5ecd9302 100644
--- a/src/mesh/SX126xInterface.cpp
+++ b/src/mesh/SX126xInterface.cpp
@@ -69,11 +69,11 @@ template bool SX126xInterface::init()
RadioLibInterface::init();
+ limitPower();
+
if (power > SX126X_MAX_POWER) // Clamp power to maximum defined level
power = SX126X_MAX_POWER;
- limitPower();
-
int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage, useRegulatorLDO);
// \todo Display actual typename of the adapter, not just `SX126x`
LOG_INFO("SX126x init result %d", res);
diff --git a/src/mesh/SX128xInterface.cpp b/src/mesh/SX128xInterface.cpp
index 23a023d3f..2b17543fc 100644
--- a/src/mesh/SX128xInterface.cpp
+++ b/src/mesh/SX128xInterface.cpp
@@ -62,11 +62,11 @@ template bool SX128xInterface::init()
RadioLibInterface::init();
+ limitPower();
+
if (power > SX128X_MAX_POWER) // This chip has lower power limits than some
power = SX128X_MAX_POWER;
- limitPower();
-
preambleLength = 12; // 12 is the default for this chip, 32 does not RX at all
int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength);
diff --git a/variants/xiao_ble/variant.h b/variants/xiao_ble/variant.h
index d00f8be89..b46aa96ae 100644
--- a/variants/xiao_ble/variant.h
+++ b/variants/xiao_ble/variant.h
@@ -145,12 +145,12 @@ static const uint8_t SCK = PIN_SPI_SCK;
#ifdef EBYTE_E22_900M30S
// 10dB PA gain and 30dB rated output; based on measurements from
// https://github.com/S5NC/EBYTE_ESP32-S3/blob/main/E22-900M30S%20power%20output%20testing.txt
-#define REGULATORY_GAIN_LORA 7
+#define TX_GAIN_LORA 7
#define SX126X_MAX_POWER 22
#endif
#ifdef EBYTE_E22_900M33S
// 25dB PA gain and 33dB rated output; based on TX Power Curve from E22-900M33S_UserManual_EN_v1.0.pdf
-#define REGULATORY_GAIN_LORA 25
+#define TX_GAIN_LORA 25
#define SX126X_MAX_POWER 8
#endif
#endif