From c0454408a846c1bd6c5b03625185917b677abe11 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Thu, 12 Jul 2018 03:21:48 +0800 Subject: [PATCH] [nrf52840] reinitialize all peripherals except uart for pseudo reset (#2878) There are some problems if radio is not reinitialized during pseudo reset: * It may trigger unexpected otPlatRadioTxDone(), and cause the device to hang; * The uncleared radio timer queue is invalid, it may block the new added timer which has a larger targer time. Note: The clock init/deinit is disabled during radio init/deinit. --- examples/platforms/nrf52840/platform-nrf5.h | 6 ----- examples/platforms/nrf52840/platform.c | 26 ++++++++++--------- examples/platforms/nrf52840/radio.c | 6 +---- .../platform/clock/nrf_802154_clock_sdk.c | 4 +-- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/examples/platforms/nrf52840/platform-nrf5.h b/examples/platforms/nrf52840/platform-nrf5.h index 2820fe272..024eb7677 100644 --- a/examples/platforms/nrf52840/platform-nrf5.h +++ b/examples/platforms/nrf52840/platform-nrf5.h @@ -148,12 +148,6 @@ void nrf5RadioInit(void); */ void nrf5RadioDeinit(void); -/** - * Pseudo reset Radio driver. - * - */ -void nrf5RadioPseudoReset(void); - /** * Function for processing Radio. * diff --git a/examples/platforms/nrf52840/platform.c b/examples/platforms/nrf52840/platform.c index e1d5ec9da..6c7296099 100644 --- a/examples/platforms/nrf52840/platform.c +++ b/examples/platforms/nrf52840/platform.c @@ -38,11 +38,14 @@ #include #include "platform-nrf5.h" +#include "platform.h" #include #include #include +extern bool gPlatformPseudoResetWasRequested; + void __cxa_pure_virtual(void) { while (1) @@ -51,17 +54,9 @@ void __cxa_pure_virtual(void) void PlatformInit(int argc, char *argv[]) { - extern bool gPlatformPseudoResetWasRequested; - if (gPlatformPseudoResetWasRequested) { - nrf5RadioPseudoReset(); - nrf5AlarmDeinit(); - nrf5AlarmInit(); - - gPlatformPseudoResetWasRequested = false; - - return; + PlatformDeinit(); } (void)argc; @@ -80,7 +75,10 @@ void PlatformInit(int argc, char *argv[]) #endif nrf5AlarmInit(); nrf5RandomInit(); - nrf5UartInit(); + if (!gPlatformPseudoResetWasRequested) + { + nrf5UartInit(); + } #ifndef SPIS_TRANSPORT_DISABLE nrf5SpiSlaveInit(); #endif @@ -88,6 +86,8 @@ void PlatformInit(int argc, char *argv[]) nrf5CryptoInit(); nrf5RadioInit(); nrf5TempInit(); + + gPlatformPseudoResetWasRequested = false; } void PlatformDeinit(void) @@ -99,7 +99,10 @@ void PlatformDeinit(void) #ifndef SPIS_TRANSPORT_DISABLE nrf5SpiSlaveDeinit(); #endif - nrf5UartDeinit(); + if (!gPlatformPseudoResetWasRequested) + { + nrf5UartDeinit(); + } nrf5RandomDeinit(); nrf5AlarmDeinit(); #if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED) || \ @@ -110,7 +113,6 @@ void PlatformDeinit(void) bool PlatformPseudoResetWasRequested(void) { - extern bool gPlatformPseudoResetWasRequested; return gPlatformPseudoResetWasRequested; } diff --git a/examples/platforms/nrf52840/radio.c b/examples/platforms/nrf52840/radio.c index f1c6f4410..584fda618 100644 --- a/examples/platforms/nrf52840/radio.c +++ b/examples/platforms/nrf52840/radio.c @@ -223,13 +223,9 @@ void nrf5RadioInit(void) } void nrf5RadioDeinit(void) -{ - nrf_802154_deinit(); -} - -void nrf5RadioPseudoReset(void) { nrf_802154_sleep(); + nrf_802154_deinit(); sPendingEvents = 0; } diff --git a/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c b/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c index de1173fe2..ee357d177 100644 --- a/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c +++ b/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c @@ -65,12 +65,12 @@ static void clock_handler(nrf_drv_clock_evt_type_t event) void nrf_802154_clock_init(void) { - nrf_drv_clock_init(); + // Intentionally empty. } void nrf_802154_clock_deinit(void) { - nrf_drv_clock_uninit(); + // Intentionally empty. } void nrf_802154_clock_hfclk_start(void)