From d4b4b992725360a95ca1ffa357286be0b16615e5 Mon Sep 17 00:00:00 2001 From: "Peter A. Bigot" Date: Fri, 23 Nov 2018 10:40:29 -0600 Subject: [PATCH] soc: arm: nordic: provide custom busy_wait implementations Implementation taken from Nordic nrfx version 1.3.1 soc/nrfx_coredep.h, modified to remove material from other series and to conform to Zephyr coding standards. Note that unlike standard k_busy_wait this is susceptible to longer-than-intended delays due to the impact of interrupt handling. Fixes #11626 Signed-off-by: Peter A. Bigot --- soc/arm/nordic_nrf/nrf51/Kconfig.defconfig.series | 3 +++ soc/arm/nordic_nrf/nrf51/soc.c | 14 ++++++++++++++ soc/arm/nordic_nrf/nrf52/Kconfig.defconfig.series | 3 +++ soc/arm/nordic_nrf/nrf52/soc.c | 7 +++++++ 4 files changed, 27 insertions(+) diff --git a/soc/arm/nordic_nrf/nrf51/Kconfig.defconfig.series b/soc/arm/nordic_nrf/nrf51/Kconfig.defconfig.series index 48a67407e70..ee4873c2c49 100644 --- a/soc/arm/nordic_nrf/nrf51/Kconfig.defconfig.series +++ b/soc/arm/nordic_nrf/nrf51/Kconfig.defconfig.series @@ -20,6 +20,9 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC config SYS_POWER_MANAGEMENT default y +config ARCH_HAS_CUSTOM_BUSY_WAIT + default y + config NUM_IRQS int default 26 diff --git a/soc/arm/nordic_nrf/nrf51/soc.c b/soc/arm/nordic_nrf/nrf51/soc.c index d37d22cc050..a5310328d75 100644 --- a/soc/arm/nordic_nrf/nrf51/soc.c +++ b/soc/arm/nordic_nrf/nrf51/soc.c @@ -15,6 +15,8 @@ #include #include +#include +#include #ifdef CONFIG_RUNTIME_NMI extern void _NmiInit(void); @@ -48,4 +50,16 @@ static int nordicsemi_nrf51_init(struct device *arg) return 0; } +#define DELAY_CALL_OVERHEAD_US 2 + +void z_arch_busy_wait(u32_t time_us) +{ + if (time_us <= DELAY_CALL_OVERHEAD_US) { + return; + } + + time_us -= DELAY_CALL_OVERHEAD_US; + nrfx_coredep_delay_us(time_us); +} + SYS_INIT(nordicsemi_nrf51_init, PRE_KERNEL_1, 0); diff --git a/soc/arm/nordic_nrf/nrf52/Kconfig.defconfig.series b/soc/arm/nordic_nrf/nrf52/Kconfig.defconfig.series index 39349577163..380387c1666 100644 --- a/soc/arm/nordic_nrf/nrf52/Kconfig.defconfig.series +++ b/soc/arm/nordic_nrf/nrf52/Kconfig.defconfig.series @@ -16,6 +16,9 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC int default 32768 +config ARCH_HAS_CUSTOM_BUSY_WAIT + default y + config SYS_POWER_MANAGEMENT default y diff --git a/soc/arm/nordic_nrf/nrf52/soc.c b/soc/arm/nordic_nrf/nrf52/soc.c index ffffd1fc5a6..4c46dd28a23 100644 --- a/soc/arm/nordic_nrf/nrf52/soc.c +++ b/soc/arm/nordic_nrf/nrf52/soc.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #ifdef CONFIG_RUNTIME_NMI extern void _NmiInit(void); @@ -71,4 +73,9 @@ static int nordicsemi_nrf52_init(struct device *arg) return 0; } +void z_arch_busy_wait(u32_t time_us) +{ + nrfx_coredep_delay_us(time_us); +} + SYS_INIT(nordicsemi_nrf52_init, PRE_KERNEL_1, 0);