From 0bd5bdc8963d6a8b5110aa34da897053f3d6c311 Mon Sep 17 00:00:00 2001
From: jgromes <jan.gromes@gmail.com>
Date: Sun, 24 Nov 2024 09:29:58 +0100
Subject: [PATCH] [SX126x] Allow 15 dBm on SX1261 (#1329)

---
 src/modules/SX126x/SX1261.cpp | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/modules/SX126x/SX1261.cpp b/src/modules/SX126x/SX1261.cpp
index d6a90c34..89af5c83 100644
--- a/src/modules/SX126x/SX1261.cpp
+++ b/src/modules/SX126x/SX1261.cpp
@@ -16,11 +16,19 @@ int16_t SX1261::setOutputPower(int8_t power) {
   RADIOLIB_ASSERT(state);
 
   // set PA config
-  state = SX126x::setPaConfig(0x04, RADIOLIB_SX126X_PA_CONFIG_SX1261, 0x00);
+  uint8_t paDutyCycle = 0x04;
+  int8_t txPwr = power;
+  if(power == 15) {
+    // for 15 dBm, increase the duty cycle and lowe the power to set
+    // SX1261/2 datasheet, DS.SX1261-2.W.APP Rev. 2.1 page 78
+    paDutyCycle = 0x06;
+    txPwr--;
+  }
+  state = SX126x::setPaConfig(paDutyCycle, RADIOLIB_SX126X_PA_CONFIG_SX1261, 0x00);
   RADIOLIB_ASSERT(state);
 
   // set output power with default 200us ramp
-  state = SX126x::setTxParams(power, RADIOLIB_SX126X_PA_RAMP_200U);
+  state = SX126x::setTxParams(txPwr, RADIOLIB_SX126X_PA_RAMP_200U);
   RADIOLIB_ASSERT(state);
 
   // restore OCP configuration
@@ -29,9 +37,9 @@ int16_t SX1261::setOutputPower(int8_t power) {
 
 int16_t SX1261::checkOutputPower(int8_t power, int8_t* clipped) {
   if(clipped) {
-    *clipped = RADIOLIB_MAX(-17, RADIOLIB_MIN(14, power));
+    *clipped = RADIOLIB_MAX(-17, RADIOLIB_MIN(15, power));
   }
-  RADIOLIB_CHECK_RANGE(power, -17, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
+  RADIOLIB_CHECK_RANGE(power, -17, 15, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
   return(RADIOLIB_ERR_NONE);
 }