You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/09/14 10:52:36 UTC

[mynewt-nimble] 03/09: nimble/phy/nrf5x: Rework nRF52 erratas

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

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

commit e4b98645145927e84de5442850e6e90aa79deffd
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Sep 8 10:12:28 2022 +0200

    nimble/phy/nrf5x: Rework nRF52 erratas
---
 nimble/drivers/nrf5x/src/ble_phy.c | 84 +++++++++++++++-----------------------
 nimble/drivers/nrf5x/syscfg.yml    | 18 --------
 2 files changed, 32 insertions(+), 70 deletions(-)

diff --git a/nimble/drivers/nrf5x/src/ble_phy.c b/nimble/drivers/nrf5x/src/ble_phy.c
index 93881948..d5113434 100644
--- a/nimble/drivers/nrf5x/src/ble_phy.c
+++ b/nimble/drivers/nrf5x/src/ble_phy.c
@@ -45,6 +45,7 @@
 #else
 #include "core_cm4.h"
 #endif
+#include <nrf_erratas.h>
 #include "phy_priv.h"
 
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
@@ -319,19 +320,6 @@ struct nrf_ccm_data
 struct nrf_ccm_data g_nrf_ccm_data;
 #endif
 
-#ifndef BABBLESIM
-static void
-ble_phy_apply_errata_102_106_107(void)
-{
-    /* [102] RADIO: PAYLOAD/END events delayed or not triggered after ADDRESS
-     * [106] RADIO: Higher CRC error rates for some access addresses
-     * [107] RADIO: Immediate address match for access addresses containing MSBs 0x00
-     */
-    *(volatile uint32_t *)0x40001774 = ((*(volatile uint32_t *)0x40001774) &
-                         0xfffffffe) | 0x01000000;
-}
-#endif
-
 #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
 
 /* Packet start offset (in usecs). This is the preamble plus access address.
@@ -342,8 +330,8 @@ ble_phy_mode_pdu_start_off(int phy_mode)
     return g_ble_phy_mode_pkt_start_off[phy_mode];
 }
 
-#if NRF52840_XXAA
-static inline bool
+#if NRF52_ERRATA_191_ENABLE_WORKAROUND
+static bool
 ble_phy_mode_is_coded(uint8_t phy_mode)
 {
     return (phy_mode == BLE_PHY_MODE_CODED_125KBPS) ||
@@ -351,48 +339,26 @@ ble_phy_mode_is_coded(uint8_t phy_mode)
 }
 
 static void
-ble_phy_apply_nrf52840_errata(uint8_t new_phy_mode)
+phy_nrf52_errata_191(uint8_t new_phy_mode)
 {
-    bool new_coded = ble_phy_mode_is_coded(new_phy_mode);
-    bool cur_coded = ble_phy_mode_is_coded(g_ble_phy_data.phy_cur_phy_mode);
+    bool from_coded = ble_phy_mode_is_coded(g_ble_phy_data.phy_cur_phy_mode);
+    bool to_coded = ble_phy_mode_is_coded(new_phy_mode);
 
-    /*
-     * Workarounds should be applied only when switching to/from LE Coded PHY
-     * so no need to apply them every time.
-     *
-     * nRF52840 Engineering A Errata v1.2
-     * [164] RADIO: Low sensitivity in long range mode
-     *
-     * nRF52840 Rev 1 Errata
-     * [191] RADIO: High packet error rate in BLE Long Range mode
+    /* [191] RADIO: High packet error rate in BLE Long Range mode
+     * Should be applied only if switching to/from LE Coded, no need to apply
+     * on each mode change.
      */
-    if (new_coded == cur_coded) {
+    if (from_coded == to_coded) {
         return;
     }
 
-    if (new_coded) {
-#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_164)
-        /* [164] */
-        *(volatile uint32_t *)0x4000173C |= 0x80000000;
-        *(volatile uint32_t *)0x4000173C =
-                        ((*(volatile uint32_t *)0x4000173C & 0xFFFFFF00) | 0x5C);
-#endif
-#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_191)
-        /* [191] */
-        *(volatile uint32_t *) 0x40001740 =
-                        ((*((volatile uint32_t *) 0x40001740)) & 0x7FFF00FF) |
-                        0x80000000 | (((uint32_t)(196)) << 8);
-#endif
+    if (to_coded) {
+        *(volatile uint32_t *)0x40001740 =
+            ((*((volatile uint32_t *)0x40001740)) & 0x7fff00ff) |
+            0x80000000 | (((uint32_t)(196)) << 8);
     } else {
-#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_164)
-        /* [164] */
-        *(volatile uint32_t *)0x4000173C &= ~0x80000000;
-#endif
-#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_191)
-        /* [191] */
         *(volatile uint32_t *) 0x40001740 =
-                        ((*((volatile uint32_t *) 0x40001740)) & 0x7FFFFFFF);
-#endif
+            ((*((volatile uint32_t *) 0x40001740)) & 0x7fffffff);
     }
 }
 #endif
@@ -404,8 +370,10 @@ ble_phy_mode_apply(uint8_t phy_mode)
         return;
     }
 
-#if NRF52840_XXAA
-    ble_phy_apply_nrf52840_errata(phy_mode);
+#if NRF52_ERRATA_191_ENABLE_WORKAROUND
+    if (nrf52_errata_191()) {
+        phy_nrf52_errata_191(phy_mode);
+    }
 #endif
 
     switch (phy_mode) {
@@ -1906,9 +1874,21 @@ ble_phy_set_access_addr(uint32_t access_addr)
 
     g_ble_phy_data.phy_access_address = access_addr;
 
+#if NRF52_ERRATA_102_ENABLE_WORKAROUND || \
+    NRF52_ERRATA_106_ENABLE_WORKAROUND || \
+    NRF52_ERRATA_107_ENABLE_WORKAROUND
 #ifndef BABBLESIM
-    ble_phy_apply_errata_102_106_107();
+    if (nrf52_errata_102() || nrf52_errata_106() || nrf52_errata_107()) {
+        /* [102] RADIO: PAYLOAD/END events delayed or not triggered after ADDRESS
+         * [106] RADIO: Higher CRC error rates for some access addresses
+         * [107] RADIO: Immediate address match for access addresses containing MSBs 0x00
+         */
+        *(volatile uint32_t *)0x40001774 =
+            ((*(volatile uint32_t *)0x40001774) & 0xfffffffe) | 0x01000000;
+    }
 #endif
+#endif
+
     return 0;
 }
 
diff --git a/nimble/drivers/nrf5x/syscfg.yml b/nimble/drivers/nrf5x/syscfg.yml
index 3bd49708..f24517ef 100644
--- a/nimble/drivers/nrf5x/syscfg.yml
+++ b/nimble/drivers/nrf5x/syscfg.yml
@@ -46,24 +46,6 @@ syscfg.defs:
             This can be used to check if wfr is calculated properly.
         value: -1
 
-    BLE_PHY_NRF52840_ERRATA_164:
-        description: >
-            Enable workaround for anomaly 164 found in nRF52840.
-            "[164] RADIO: Low selectivity in long range mode"
-            This shall be only enabled for:
-            - nRF52840 Engineering A
-        value: 0
-
-    BLE_PHY_NRF52840_ERRATA_191:
-        description: >
-            Enable workaround for anomaly 191 found in nRF52840.
-            "[191] RADIO: High packet error rate in BLE Long Range mode"
-            This shall be only enabled for:
-            - nRF52840 Engineering B
-            - nRF52840 Engineering C
-            - nRF52840 Rev 1 (final silicon)
-        value: 1
-
     BLE_PHY_UBLOX_BMD345_PUBLIC_ADDR:
         description: >
             Ublox BMD-345 modules come with public address preprogrammed