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();