You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2023/06/26 09:37:39 UTC

[mynewt-nimble] branch master updated: nimble/phy/nrf5340: Add support for high voltage on RADIO

This is an automated email from the ASF dual-hosted git repository.

janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new eead9c1f nimble/phy/nrf5340: Add support for high voltage on RADIO
eead9c1f is described below

commit eead9c1fe4deafad14108a9ba1858c81a4b3d384
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Thu Jun 22 16:14:09 2023 +0200

    nimble/phy/nrf5340: Add support for high voltage on RADIO
    
    This allows to set few more power levels on PHY (up to +3dBm).
---
 nimble/drivers/nrf5x/src/ble_phy.c   |  2 +-
 nimble/drivers/nrf5x/src/nrf52/phy.c |  6 +++
 nimble/drivers/nrf5x/src/nrf53/phy.c | 77 +++++++++++++++++++++++++++++++++++-
 nimble/drivers/nrf5x/src/phy_priv.h  |  1 +
 nimble/drivers/nrf5x/syscfg.yml      |  8 ++++
 5 files changed, 91 insertions(+), 3 deletions(-)

diff --git a/nimble/drivers/nrf5x/src/ble_phy.c b/nimble/drivers/nrf5x/src/ble_phy.c
index 223afbff..84d2ff5e 100644
--- a/nimble/drivers/nrf5x/src/ble_phy.c
+++ b/nimble/drivers/nrf5x/src/ble_phy.c
@@ -2019,7 +2019,7 @@ ble_phy_tx_power_set(int dbm)
     /* Get actual TX power supported by radio */
     dbm = phy_txpower_round(dbm);
 
-    NRF_RADIO->TXPOWER = dbm;
+    phy_txpower_set(dbm);
     g_ble_phy_data.phy_txpwr_dbm = dbm;
 
     return 0;
diff --git a/nimble/drivers/nrf5x/src/nrf52/phy.c b/nimble/drivers/nrf5x/src/nrf52/phy.c
index 6a6eeb88..30a19966 100644
--- a/nimble/drivers/nrf5x/src/nrf52/phy.c
+++ b/nimble/drivers/nrf5x/src/nrf52/phy.c
@@ -179,6 +179,12 @@ phy_ppi_init(void)
                                    (uint32_t)&(NRF_RADIO->TASKS_DISABLE));
 }
 
+void
+phy_txpower_set(int8_t dbm)
+{
+    NRF_RADIO->TXPOWER = dbm;
+}
+
 int8_t
 phy_txpower_round(int8_t dbm)
 {
diff --git a/nimble/drivers/nrf5x/src/nrf53/phy.c b/nimble/drivers/nrf5x/src/nrf53/phy.c
index 83104065..ceda769b 100644
--- a/nimble/drivers/nrf5x/src/nrf53/phy.c
+++ b/nimble/drivers/nrf5x/src/nrf53/phy.c
@@ -22,6 +22,14 @@
 #include <controller/ble_fem.h>
 #include "../phy_priv.h"
 
+/*
+ * When the radio is operated on high voltage (see VREQCTRL - Voltage request
+ * control on page 62 for how to control voltage), the output power is increased
+ * by 3 dB. I.e. if the TXPOWER value is set to 0 dBm and high voltage is
+ * requested using VREQCTRL, the output power will be +3
+ * */
+#define NRF_TXPOWER_VREQH 3
+
 #if PHY_USE_DEBUG
 void
 phy_debug_init(void)
@@ -180,9 +188,50 @@ phy_ppi_init(void)
     NRF_TIMER0->SUBSCRIBE_CAPTURE[2] = DPPI_CH_SUB(RADIO_EVENTS_END);
 }
 
+void
+phy_txpower_set(int8_t dbm)
+{
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    switch (dbm) {
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_0dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) + NRF_TXPOWER_VREQH:
+    case ((int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm) + NRF_TXPOWER_VREQH:
+        NRF_VREQCTRL->VREGRADIO.VREQH = 1;
+        dbm -= NRF_TXPOWER_VREQH;
+        break;
+    default:
+        NRF_VREQCTRL->VREGRADIO.VREQH = 0;
+        break;
+    }
+#endif
+
+    NRF_RADIO->TXPOWER = dbm;
+}
+
 int8_t
 phy_txpower_round(int8_t dbm)
 {
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    /* +3 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_0dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_0dBm) + NRF_TXPOWER_VREQH;
+    }
+
+    /* +2 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) + NRF_TXPOWER_VREQH;
+    }
+
+    /* +1 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) + NRF_TXPOWER_VREQH;
+    }
+#endif
+
     if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
         return (int8_t)RADIO_TXPOWER_TXPOWER_0dBm;
     }
@@ -219,21 +268,45 @@ phy_txpower_round(int8_t dbm)
         return (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm;
     }
 
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    /* -9 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) + NRF_TXPOWER_VREQH;
+    }
+#endif
+
     if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
         return (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm;
     }
 
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    /* -13 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) + NRF_TXPOWER_VREQH;
+    }
+#endif
+
     if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
         return (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm;
     }
 
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    /* -17 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) + NRF_TXPOWER_VREQH;
+    }
+#endif
+
     if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
         return (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm;
     }
 
-    if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm) {
-        return (int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm;
+#if MYNEWT_VAL(BLE_PHY_NRF5340_VDDH)
+    /* -37 dBm */
+    if (dbm >= ((int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm) + NRF_TXPOWER_VREQH) {
+        return ((int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm) + NRF_TXPOWER_VREQH;
     }
+#endif
 
     return (int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm;
 }
diff --git a/nimble/drivers/nrf5x/src/phy_priv.h b/nimble/drivers/nrf5x/src/phy_priv.h
index c7323520..db0664da 100644
--- a/nimble/drivers/nrf5x/src/phy_priv.h
+++ b/nimble/drivers/nrf5x/src/phy_priv.h
@@ -83,6 +83,7 @@ void phy_ppi_init(void);
 #include "nrf52/phy_ppi.h"
 #endif
 
+void phy_txpower_set(int8_t dbm);
 int8_t phy_txpower_round(int8_t dbm);
 
 #ifdef NRF52_SERIES
diff --git a/nimble/drivers/nrf5x/syscfg.yml b/nimble/drivers/nrf5x/syscfg.yml
index e483e844..07c9042f 100644
--- a/nimble/drivers/nrf5x/syscfg.yml
+++ b/nimble/drivers/nrf5x/syscfg.yml
@@ -64,6 +64,14 @@ syscfg.defs:
                    works for TX (i.e. ISO Broadcaster).
         value: 0
 
+    BLE_PHY_NRF5340_VDDH:
+       description: >
+            This indicates if VDDH pin of nRF5340 is connected to external
+            power source. If connected PHY driver will make use of high voltage
+            operation mode for additional TX power levels (+3, +2, +1, -9, -13,
+            -17, -37).
+       value: 0
+
     BLE_PHY_UBLOX_BMD345_PUBLIC_ADDR:
         description: >
             Ublox BMD-345 modules come with public address preprogrammed