You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by we...@apache.org on 2019/10/02 18:41:44 UTC

[mynewt-core] branch master updated: hw/mcu/dialog: Add helper to enable/disable AMBA clocks (#2024)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 1714997  hw/mcu/dialog: Add helper to enable/disable AMBA clocks (#2024)
1714997 is described below

commit 17149970d5cfa7ff763cf58e6a54db5f5cef3d11
Author: wes3 <wi...@runtime.io>
AuthorDate: Wed Oct 2 11:41:39 2019 -0700

    hw/mcu/dialog: Add helper to enable/disable AMBA clocks (#2024)
    
    * hw/mcu/dialog: Add helper to enable/disable AMBA clocks
    
    Add a helper to enable/disable AMBA clocks in CRG_TOP->CLK_AMBA_REG.
    The code was doing an un-protected read-modify-write and if the
    clock is modified inside ISR's this could cause unpredictable
    behavior.
    
    * hw/mcu/dialog: Add helper to enable/disable AMBA clocks
    
    Fix function header.
    
    * hw/mcu/dialog: Add helper to enable/disable AMBA clocks
    
    Replace include of cmsis_nvic.h in da1469x_hal.h with mcu.h as
    this header file needs to definitions for __get_PRIMASK.
---
 hw/drivers/trng/trng_da1469x/src/trng_da1469x.c   |  9 ++++---
 hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h | 31 +++++++++++++++++++++++
 hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h   |  1 +
 hw/mcu/dialog/da1469x/src/system_da1469x.c        |  6 +++--
 4 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/hw/drivers/trng/trng_da1469x/src/trng_da1469x.c b/hw/drivers/trng/trng_da1469x/src/trng_da1469x.c
index de970b9..8ffa150 100644
--- a/hw/drivers/trng/trng_da1469x/src/trng_da1469x.c
+++ b/hw/drivers/trng/trng_da1469x/src/trng_da1469x.c
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <trng/trng.h>
 #include <mcu/mcu.h>
+#include "mcu/da1469x_clock.h"
 
 #define DA1469X_TRNG_FIFO_SIZE  (32 * sizeof(uint32_t))
 #define DA1469X_TRNG_FIFO_ADDR  (0x30050000UL)
@@ -41,7 +42,7 @@ da1469x_trng_read(struct trng_dev *trng, void *ptr, size_t size)
     words_to_generate = size / sizeof(uint32_t);
     remaining_octets = size % sizeof(uint32_t);
 
-    CRG_TOP->CLK_AMBA_REG |= (1U << CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Pos);
+    da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Msk);
     TRNG->TRNG_CTRL_REG = TRNG_TRNG_CTRL_REG_TRNG_ENABLE_Msk;
 
     if (remaining_octets) {
@@ -64,7 +65,7 @@ da1469x_trng_read(struct trng_dev *trng, void *ptr, size_t size)
     }
 
     TRNG->TRNG_CTRL_REG = 0;
-    CRG_TOP->CLK_AMBA_REG &= ~(1U << CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Pos);
+    da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Msk);
 
     return size;
 }
@@ -74,14 +75,14 @@ da1469x_trng_get_u32(struct trng_dev *trng)
 {
     uint32_t ret;
 
-    CRG_TOP->CLK_AMBA_REG |= (1U << CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Pos);
+    da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Msk);
     TRNG->TRNG_CTRL_REG = TRNG_TRNG_CTRL_REG_TRNG_ENABLE_Msk;
     while (TRNG->TRNG_FIFOLVL_REG < 1);
 
     ret = *(uint32_t *)DA1469X_TRNG_FIFO_ADDR;
 
     TRNG->TRNG_CTRL_REG = 0;
-    CRG_TOP->CLK_AMBA_REG &= ~(1U << CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Pos);
+    da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Msk);
 
     return ret;
 }
diff --git a/hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h b/hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h
index 66bbcab..c76c7a0 100644
--- a/hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h
+++ b/hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h
@@ -21,6 +21,7 @@
 #define __MCU_DA1469X_CLOCK_H_
 
 #include <stdint.h>
+#include "mcu/da1469x_hal.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -94,6 +95,36 @@ uint32_t da1469x_clock_lp_rcx_freq_get(void);
  */
 void da1469x_clock_lp_rcx_disable(void);
 
+/**
+ * Enable AMBA clock(s)
+ *
+ * @param mask
+ */
+static inline void
+da1469x_clock_amba_enable(uint32_t mask)
+{
+    uint32_t primask;
+
+    __HAL_DISABLE_INTERRUPTS(primask);
+    CRG_TOP->CLK_AMBA_REG |= mask;
+    __HAL_ENABLE_INTERRUPTS(primask);
+}
+
+/**
+ * Disable AMBA clock(s)
+ *
+ * @param uint32_t mask
+ */
+static inline void
+da1469x_clock_amba_disable(uint32_t mask)
+{
+    uint32_t primask;
+
+    __HAL_DISABLE_INTERRUPTS(primask);
+    CRG_TOP->CLK_AMBA_REG &= ~mask;
+    __HAL_ENABLE_INTERRUPTS(primask);
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h b/hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h
index 74f5cd7..9c99f8e 100755
--- a/hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h
+++ b/hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h
@@ -21,6 +21,7 @@
 #define __MCU_DA1469X_HAL_H_
 
 #include <assert.h>
+#include "mcu/mcu.h"
 #include "hal/hal_flash.h"
 
 #ifdef __cplusplus
diff --git a/hw/mcu/dialog/da1469x/src/system_da1469x.c b/hw/mcu/dialog/da1469x/src/system_da1469x.c
index 1117228..e75c660 100644
--- a/hw/mcu/dialog/da1469x/src/system_da1469x.c
+++ b/hw/mcu/dialog/da1469x/src/system_da1469x.c
@@ -21,6 +21,7 @@
 #include "mcu/da1469x_pd.h"
 #include "mcu/da1469x_pdc.h"
 #include "mcu/da1469x_prail.h"
+#include "mcu/da1469x_clock.h"
 #include "mcu/mcu.h"
 #include "da1469x_priv.h"
 
@@ -101,13 +102,14 @@ void SystemInit(void)
     CRG_TOP->PMU_CTRL_REG |= CRG_TOP_PMU_CTRL_REG_RETAIN_CACHE_Msk;
 #endif
 
+
     /* Switch OTPC to deep standby (DSTBY) mode */
-    CRG_TOP->CLK_AMBA_REG |= CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk;
+    da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);
     OTPC->OTPC_MODE_REG = (OTPC->OTPC_MODE_REG &
                            ~OTPC_OTPC_MODE_REG_OTPC_MODE_MODE_Msk) |
                           (1 << OTPC_OTPC_MODE_REG_OTPC_MODE_MODE_Pos);
     while (!(OTPC->OTPC_STAT_REG & OTPC_OTPC_STAT_REG_OTPC_STAT_MRDY_Msk));
-    CRG_TOP->CLK_AMBA_REG &= ~CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk;
+    da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);
 
     /* Initialize and configure power rails */
     da1469x_prail_initialize();