From 726437a6d74ac07bda8ed3e58b9b3055e00aee30 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Wed, 6 Sep 2023 14:13:50 +0200 Subject: [PATCH 1/4] bsp/clock: refactor clock implementation handling between app and net cores --- bsp/bsp.emProject | 2 +- bsp/clock.h | 6 +++++- bsp/nrf/clock.c | 12 ++++++++++-- bsp/nrf/clock_nrf5340_net.c | 35 ----------------------------------- dotbot-v1.emProject | 2 +- dotbot-v2.emProject | 2 +- nrf52833dk.emProject | 2 +- nrf52840dk.emProject | 2 +- nrf5340dk-app.emProject | 2 +- nrf5340dk-net.emProject | 2 +- sailbot-v1.emProject | 2 +- 11 files changed, 23 insertions(+), 46 deletions(-) delete mode 100644 bsp/nrf/clock_nrf5340_net.c diff --git a/bsp/bsp.emProject b/bsp/bsp.emProject index c4525adfb..f7cd32a48 100644 --- a/bsp/bsp.emProject +++ b/bsp/bsp.emProject @@ -10,7 +10,7 @@ Name="Common" project_directory="." project_type="Library" /> - + diff --git a/bsp/clock.h b/bsp/clock.h index 16b575c07..4ebe1248d 100644 --- a/bsp/clock.h +++ b/bsp/clock.h @@ -12,8 +12,12 @@ * @copyright Inria, 2022 */ -#if defined(NRF5340_XXAA) && defined(NRF_APPLICATION) +#if defined(NRF5340_XXAA) +#if defined(NRF_APPLICATION) #define NRF_CLOCK NRF_CLOCK_S +#else +#define NRF_CLOCK NRF_CLOCK_NS +#endif #endif /** diff --git a/bsp/nrf/clock.c b/bsp/nrf/clock.c index 62a1f4d7f..53dddc95a 100644 --- a/bsp/nrf/clock.c +++ b/bsp/nrf/clock.c @@ -46,12 +46,14 @@ void db_hfclk_init(void) { while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 1) {} #if defined(NRF5340_XXAA) +#if defined(NRF_APPLICATION) // Configure the 32MHz internal capacitance value (taken from crystal specs) const uint32_t slope_sign = ((FICR_XOSC32MTRIM_SLOPE_Msk >> FICR_XOSC32MTRIM_SLOPE_Pos) - ((FICR_XOSC32MTRIM_SLOPE_Msk >> FICR_XOSC32MTRIM_SLOPE_Pos) >> 1)); const int32_t slope = (int32_t)(((NRF_FICR_S->XOSC32MTRIM & FICR_XOSC32MTRIM_SLOPE_Msk) >> FICR_XOSC32MTRIM_SLOPE_Pos) ^ slope_sign) - (int32_t)slope_sign; const uint32_t offset = (uint32_t)(NRF_FICR_S->XOSC32MTRIM & FICR_XOSC32MTRIM_OFFSET_Msk) >> FICR_XOSC32MTRIM_OFFSET_Pos; const uint32_t cap_value = ((((slope + 56) * (NRF53_XOSC32_CAPACITANCE_X2 - 14)) + ((offset - 8) << 4) + 32) >> 6); NRF_OSCILLATORS_S->XOSC32MCAPS = (OSCILLATORS_XOSC32MCAPS_ENABLE_Enabled << OSCILLATORS_XOSC32MCAPS_ENABLE_Pos) | cap_value; +#endif NRF_CLOCK->HFCLKSRC = CLOCK_HFCLKSRC_SRC_HFXO << CLOCK_HFCLKSRC_SRC_Pos; // Enable 128MHZ core clock, only possible with application core NRF_CLOCK->HFCLKCTRL = CLOCK_HFCLKCTRL_HCLK_Div1 << CLOCK_HFCLKCTRL_HCLK_Pos; @@ -69,7 +71,9 @@ void db_lfclk_init(void) { } NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + #if defined(NRF5340_XXAA) +#if defined(NRF_APPLICATION) // To use LFXO, P0.0 and P0.1 must use value Peripheral in MCUSEL bitfield NRF_P0_S->PIN_CNF[0] = GPIO_PIN_CNF_MCUSEL_Peripheral << GPIO_PIN_CNF_MCUSEL_Pos; NRF_P0_S->PIN_CNF[1] = GPIO_PIN_CNF_MCUSEL_Peripheral << GPIO_PIN_CNF_MCUSEL_Pos; @@ -82,9 +86,13 @@ void db_lfclk_init(void) { #endif NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_LFXO << CLOCK_LFCLKSRC_SRC_Pos); -#else +#else // NRF_NETWORK use internal RC oscillator + NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_LFRC << CLOCK_LFCLKSRC_SRC_Pos); +#endif // defined(NRF_APPLICATION) +#else // nrf52 NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); -#endif +#endif // defined(NRF5340_XXAA) + NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {} _clock_state.lf_enabled = true; diff --git a/bsp/nrf/clock_nrf5340_net.c b/bsp/nrf/clock_nrf5340_net.c deleted file mode 100644 index 34296d99a..000000000 --- a/bsp/nrf/clock_nrf5340_net.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @file clock_nrf5340_net.c - * @addtogroup BSP - * - * @brief nrf5340-net-specific definition of the "clock" bsp module. - * - * @author Alexandre Abadie - * - * @copyright Inria, 2022 - */ -#include -#include -#include "clock.h" - -static bool _hf_enabled = false; - -//=========================== public =========================================== - -void db_hfclk_init(void) { - if (_hf_enabled) { - // Do nothing if already running - return; - } - - NRF_CLOCK_NS->EVENTS_HFCLKSTARTED = 0; - while (NRF_CLOCK_NS->EVENTS_HFCLKSTARTED == 1) {} - - NRF_CLOCK_NS->HFCLKSRC = CLOCK_HFCLKSRC_SRC_HFXO << CLOCK_HFCLKSRC_SRC_Pos; - NRF_CLOCK_NS->TASKS_HFCLKSTART = 1; - while (NRF_CLOCK_NS->EVENTS_HFCLKSTARTED == 0) {} - _hf_enabled = true; -} - -void db_lfclk_init(void) { -} diff --git a/dotbot-v1.emProject b/dotbot-v1.emProject index 26c6fd761..34d9f86fa 100644 --- a/dotbot-v1.emProject +++ b/dotbot-v1.emProject @@ -38,7 +38,7 @@ link_time_optimization="No" linker_memory_map_file="$(PackagesDir)/nRF/XML/nRF52833_xxAA_MemoryMap.xml" linker_output_format="hex" - macros="BuildTarget=dotbot-v1;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" + macros="BuildTarget=dotbot-v1;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/dotbot-v2.emProject b/dotbot-v2.emProject index 95965452c..7e719ab72 100644 --- a/dotbot-v2.emProject +++ b/dotbot-v2.emProject @@ -38,7 +38,7 @@ linker_printf_fmt_level="int" linker_printf_fp_enabled="Float" linker_printf_width_precision_supported="Yes" - macros="BuildTarget=dotbot-v2;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio_nrf5340_app.c;RngImplementationFile=rng_nrf5340_app.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_application.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_application.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_application_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant2.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Application_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Application" + macros="BuildTarget=dotbot-v2;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio_nrf5340_app.c;RngImplementationFile=rng_nrf5340_app.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_application.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_application.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_application_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant2.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Application_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Application" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/nrf52833dk.emProject b/nrf52833dk.emProject index 009201dde..c251e203b 100644 --- a/nrf52833dk.emProject +++ b/nrf52833dk.emProject @@ -38,7 +38,7 @@ link_time_optimization="No" linker_memory_map_file="$(PackagesDir)/nRF/XML/nRF52833_xxAA_MemoryMap.xml" linker_output_format="hex" - macros="BuildTarget=nrf52833dk;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" + macros="BuildTarget=nrf52833dk;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/nrf52840dk.emProject b/nrf52840dk.emProject index 517cb0ce3..ad7d1ccfc 100644 --- a/nrf52840dk.emProject +++ b/nrf52840dk.emProject @@ -38,7 +38,7 @@ link_time_optimization="No" linker_memory_map_file="$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml" linker_output_format="hex" - macros="BuildTarget=nrf52840dk;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52840.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52840_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant4.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52840_xxAA;Placement=Flash" + macros="BuildTarget=nrf52840dk;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52840.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52840_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant4.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52840_xxAA;Placement=Flash" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/nrf5340dk-app.emProject b/nrf5340dk-app.emProject index 4769f4f0d..c809114e4 100644 --- a/nrf5340dk-app.emProject +++ b/nrf5340dk-app.emProject @@ -38,7 +38,7 @@ linker_printf_fmt_level="int" linker_printf_fp_enabled="Float" linker_printf_width_precision_supported="Yes" - macros="BuildTarget=nrf5340dk-app;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio_nrf5340_app.c;RngImplementationFile=rng_nrf5340_app.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_application.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_application.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_application_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant2.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Application_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Application" + macros="BuildTarget=nrf5340dk-app;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio_nrf5340_app.c;RngImplementationFile=rng_nrf5340_app.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_application.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_application.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_application_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant2.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Application_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Application" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/nrf5340dk-net.emProject b/nrf5340dk-net.emProject index b3baa040a..58456513d 100644 --- a/nrf5340dk-net.emProject +++ b/nrf5340dk-net.emProject @@ -37,7 +37,7 @@ linker_output_format="hex" linker_printf_fmt_level="int" linker_printf_width_precision_supported="Yes" - macros="BuildTarget=nrf5340dk-net;ClockImplementationFile=clock_nrf5340_net.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm_nrf5340_net.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_network.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_network.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_network_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant3.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Network_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Network" + macros="BuildTarget=nrf5340dk-net;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm_nrf5340_net.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf5340_network.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf5340_network.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf5340_network_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant3.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF5340_xxAA_Network_MemoryMap.xml;DeviceFamily=nRF;Target=nRF5340_xxAA_Network" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> diff --git a/sailbot-v1.emProject b/sailbot-v1.emProject index d0e324cea..286744dcc 100644 --- a/sailbot-v1.emProject +++ b/sailbot-v1.emProject @@ -38,7 +38,7 @@ link_time_optimization="No" linker_memory_map_file="$(PackagesDir)/nRF/XML/nRF52833_xxAA_MemoryMap.xml" linker_output_format="hex" - macros="BuildTarget=sailbot-v1;ClockImplementationFile=clock.c;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" + macros="BuildTarget=sailbot-v1;Lh2ImplementationFile=lh2.c;PwmImplementationFile=pwm.c;RadioImplementationFile=radio.c;RngImplementationFile=rng.c;DeviceHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf52833.h;DeviceCommonHeaderFile=$(PackagesDir)/nRF/Device/Include/nrf.h;DeviceSystemFile=$(PackagesDir)/nRF/Device/Source/system_nrf52.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/nrf52833_Vectors.s;DeviceCommonVectorsFile=$(PackagesDir)/nRF/Source/nRF_Startup.s;SeggerThumbStartup=$(ProjectDir)/../../../nRF/SEGGER_THUMB_Startup.s;DeviceLinkerScript=$(ProjectDir)/../../../nRF/nrf5340/nRF_Flash_Variant1.icf;DeviceMemoryMap=$(PackagesDir)/nRF/XML/nRF52840_xxAA_MemoryMap.xml;DeviceLibraryIdentifier=M4lf;DeviceFamily=nRF;Target=nRF52833_xxAA;Placement=Flash" project_type="Executable" target_reset_script="Reset();" target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" /> From 6db5ec99bd32cc55e9e165e88d7e0349bf6d32a2 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Wed, 6 Sep 2023 15:56:45 +0200 Subject: [PATCH 2/4] bsp: rework network core release sequence --- bsp/ipc.h | 29 ++++++++++++++++------------- bsp/nrf/radio_nrf5340_app.c | 6 +----- bsp/nrf/rng_nrf5340_app.c | 6 +----- projects/03app_nrf5340_app/main.c | 3 ++- projects/03app_nrf5340_net/main.c | 5 +---- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/bsp/ipc.h b/bsp/ipc.h index 2e7733028..663e51d0e 100644 --- a/bsp/ipc.h +++ b/bsp/ipc.h @@ -28,7 +28,6 @@ typedef enum { DB_IPC_NONE, ///< Sorry, but nothing - DB_IPC_NET_READY_ACK, ///< Network core is ready DB_IPC_RADIO_INIT_REQ, ///< Request for radio initialization DB_IPC_RADIO_INIT_ACK, ///< Acknowledment for radio initialization DB_IPC_RADIO_FREQ_REQ, ///< Request for radio set frequency @@ -77,11 +76,17 @@ typedef struct { } ipc_rng_data_t; typedef struct __attribute__((packed)) { - ipc_event_type_t event; ///< IPC event - ipc_radio_data_t radio; ///< Radio shared data - ipc_rng_data_t rng; ///< Rng share data + bool net_ready; ///< Network core is ready + ipc_event_type_t event; ///< IPC event + ipc_radio_data_t radio; ///< Radio shared data + ipc_rng_data_t rng; ///< Rng share data } ipc_shared_data_t; +/** + * @brief Variable in RAM containing the shared data structure + */ +volatile __attribute__((section(".ARM.__at_0x20004000"))) ipc_shared_data_t ipc_shared_data; + /** * @brief Lock the mutex, blocks until the mutex is locked */ @@ -97,7 +102,12 @@ static inline void mutex_unlock(void) { } #if defined(NRF_APPLICATION) -static inline void power_on_network_core(void) { +static inline void release_network_core(void) { + // Do nothing if network core is already started and ready + if (ipc_shared_data.net_ready) { + return; + } + NRF_POWER_S->TASKS_CONSTLAT = 1; *(volatile uint32_t *)0x50005618ul = 1ul; NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); @@ -106,16 +116,9 @@ static inline void power_on_network_core(void) { db_timer_hf_delay_us(1); // Wait for at least one microsecond NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); *(volatile uint32_t *)0x50005618ul = 0ul; -} -static inline bool is_network_core_powered_on(void) { - return NRF_RESET_S->NETWORK.FORCEOFF == (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); + while (!ipc_shared_data.net_ready) {} } #endif -/** - * @brief Variable in RAM containing the shared data structure - */ -volatile __attribute__((section(".ARM.__at_0x20004000"))) ipc_shared_data_t ipc_shared_data; - #endif diff --git a/bsp/nrf/radio_nrf5340_app.c b/bsp/nrf/radio_nrf5340_app.c index 73858b0d5..49ee6e62b 100644 --- a/bsp/nrf/radio_nrf5340_app.c +++ b/bsp/nrf/radio_nrf5340_app.c @@ -25,7 +25,6 @@ static radio_cb_t _radio_callback = NULL; static bool _ack_received[] = { - [DB_IPC_NET_READY_ACK] = false, [DB_IPC_RADIO_INIT_ACK] = false, [DB_IPC_RADIO_FREQ_ACK] = false, [DB_IPC_RADIO_CHAN_ACK] = false, @@ -95,10 +94,7 @@ void db_radio_init(radio_cb_t callback, db_radio_ble_mode_t mode) { NVIC_SetPriority(IPC_IRQn, IPC_IRQ_PRIORITY); // Start the network core - if (!is_network_core_powered_on()) { - power_on_network_core(); - _network_call(DB_IPC_NONE, DB_IPC_NET_READY_ACK); - } + release_network_core(); if (callback) { _radio_callback = callback; diff --git a/bsp/nrf/rng_nrf5340_app.c b/bsp/nrf/rng_nrf5340_app.c index 2cd0c9c91..064d68a38 100644 --- a/bsp/nrf/rng_nrf5340_app.c +++ b/bsp/nrf/rng_nrf5340_app.c @@ -18,7 +18,6 @@ //========================== variables ========================================= static bool _ack_received[] = { - [DB_IPC_NET_READY_ACK] = false, [DB_IPC_RNG_INIT_ACK] = false, [DB_IPC_RNG_READ_ACK] = false, }; @@ -65,10 +64,7 @@ void db_rng_init(void) { NVIC_SetPriority(IPC_IRQn, IPC_IRQ_PRIORITY); // Start the network core - if (!is_network_core_powered_on()) { - power_on_network_core(); - _network_call(DB_IPC_NONE, DB_IPC_NET_READY_ACK); - } + release_network_core(); mutex_lock(); _network_call(DB_IPC_RNG_INIT_REQ, DB_IPC_RNG_INIT_ACK); diff --git a/projects/03app_nrf5340_app/main.c b/projects/03app_nrf5340_app/main.c index 57989e93e..4559d75ec 100644 --- a/projects/03app_nrf5340_app/main.c +++ b/projects/03app_nrf5340_app/main.c @@ -9,6 +9,7 @@ #include #include "clock.h" +#include "ipc.h" int main(void) { @@ -91,7 +92,7 @@ int main(void) { NRF_P1_S->PIN_CNF[pin] = GPIO_PIN_CNF_MCUSEL_NetworkMCU << GPIO_PIN_CNF_MCUSEL_Pos; } - // Start the network core + // Release the network core NRF_RESET_S->NETWORK.FORCEOFF = 0; while (1) { diff --git a/projects/03app_nrf5340_net/main.c b/projects/03app_nrf5340_net/main.c index 4c6a3e169..6bde15f65 100644 --- a/projects/03app_nrf5340_net/main.c +++ b/projects/03app_nrf5340_net/main.c @@ -46,10 +46,7 @@ int main(void) { NVIC_ClearPendingIRQ(IPC_IRQn); NVIC_SetPriority(IPC_IRQn, 1); - mutex_lock(); - ipc_shared_data.event = DB_IPC_NET_READY_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); + ipc_shared_data.net_ready = true; while (1) { __WFE(); From 32dc99f0f6c754e193cfd998051d8bfb134df233 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Thu, 7 Sep 2023 15:17:47 +0200 Subject: [PATCH 3/4] bsp/ipc: rework communication with the network core --- bsp/ipc.h | 43 +++++------ bsp/nrf/clock.c | 10 +-- bsp/nrf/radio_nrf5340_app.c | 61 +++------------ bsp/nrf/rng_nrf5340_app.c | 41 +--------- projects/03app_nrf5340_net/main.c | 121 +++++++++++------------------- 5 files changed, 78 insertions(+), 198 deletions(-) diff --git a/bsp/ipc.h b/bsp/ipc.h index 663e51d0e..1520296d3 100644 --- a/bsp/ipc.h +++ b/bsp/ipc.h @@ -27,33 +27,22 @@ #define IPC_IRQ_PRIORITY (1) typedef enum { - DB_IPC_NONE, ///< Sorry, but nothing + DB_IPC_REQ_NONE, ///< Sorry, but nothing DB_IPC_RADIO_INIT_REQ, ///< Request for radio initialization - DB_IPC_RADIO_INIT_ACK, ///< Acknowledment for radio initialization DB_IPC_RADIO_FREQ_REQ, ///< Request for radio set frequency - DB_IPC_RADIO_FREQ_ACK, ///< Acknowledment for radio set frequency DB_IPC_RADIO_CHAN_REQ, ///< Request for radio set channel - DB_IPC_RADIO_CHAN_ACK, ///< Acknowledment for radio set channel DB_IPC_RADIO_ADDR_REQ, ///< Request for radio set network address - DB_IPC_RADIO_ADDR_ACK, ///< Acknowledment for radio set network address DB_IPC_RADIO_RX_REQ, ///< Request for radio rx - DB_IPC_RADIO_RX_ACK, ///< Acknowledment for radio rx DB_IPC_RADIO_DIS_REQ, ///< Request for radio disable - DB_IPC_RADIO_DIS_ACK, ///< Acknowledment for radio disable DB_IPC_RADIO_TX_REQ, ///< Request for radio tx - DB_IPC_RADIO_TX_ACK, ///< Acknowledment for radio tx DB_IPC_RADIO_RSSI_REQ, ///< Request for RSSI - DB_IPC_RADIO_RSSI_ACK, ///< Acknowledment for RSSI DB_IPC_RNG_INIT_REQ, ///< Request for rng init - DB_IPC_RNG_INIT_ACK, ///< Acknowledment for rng init DB_IPC_RNG_READ_REQ, ///< Request for rng read - DB_IPC_RNG_READ_ACK, ///< Acknowledment for rng read -} ipc_event_type_t; +} ipc_req_t; typedef enum { DB_IPC_CHAN_REQ = 0, ///< Channel used for request events - DB_IPC_CHAN_ACK = 1, ///< Channel used for acknownlegment events - DB_IPC_CHAN_RADIO_RX = 2, ///< Channel used for radio RX events + DB_IPC_CHAN_RADIO_RX = 1, ///< Channel used for radio RX events } ipc_channels_t; typedef struct __attribute__((packed)) { @@ -77,7 +66,8 @@ typedef struct { typedef struct __attribute__((packed)) { bool net_ready; ///< Network core is ready - ipc_event_type_t event; ///< IPC event + bool net_ack; ///< Network core acked the latest request + ipc_req_t req; ///< IPC network request ipc_radio_data_t radio; ///< Radio shared data ipc_rng_data_t rng; ///< Rng share data } ipc_shared_data_t; @@ -102,20 +92,25 @@ static inline void mutex_unlock(void) { } #if defined(NRF_APPLICATION) +static inline void db_ipc_network_call(ipc_req_t req) { + if (req != DB_IPC_REQ_NONE) { + ipc_shared_data.req = req; + NRF_IPC_S->TASKS_SEND[DB_IPC_CHAN_REQ] = 1; + } + while (!ipc_shared_data.net_ack) {} + ipc_shared_data.net_ack = false; +}; + static inline void release_network_core(void) { // Do nothing if network core is already started and ready - if (ipc_shared_data.net_ready) { + if (!NRF_RESET_S->NETWORK.FORCEOFF && ipc_shared_data.net_ready) { return; + } else if (!NRF_RESET_S->NETWORK.FORCEOFF) { + ipc_shared_data.net_ready = false; } - NRF_POWER_S->TASKS_CONSTLAT = 1; - *(volatile uint32_t *)0x50005618ul = 1ul; - NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); - db_timer_hf_delay_us(5); // Wait for at least five microseconds - NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Hold << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); - db_timer_hf_delay_us(1); // Wait for at least one microsecond - NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); - *(volatile uint32_t *)0x50005618ul = 0ul; + NRF_POWER_S->TASKS_CONSTLAT = 1; + NRF_RESET_S->NETWORK.FORCEOFF = (RESET_NETWORK_FORCEOFF_FORCEOFF_Release << RESET_NETWORK_FORCEOFF_FORCEOFF_Pos); while (!ipc_shared_data.net_ready) {} } diff --git a/bsp/nrf/clock.c b/bsp/nrf/clock.c index 53dddc95a..99a5ac37d 100644 --- a/bsp/nrf/clock.c +++ b/bsp/nrf/clock.c @@ -54,7 +54,7 @@ void db_hfclk_init(void) { const uint32_t cap_value = ((((slope + 56) * (NRF53_XOSC32_CAPACITANCE_X2 - 14)) + ((offset - 8) << 4) + 32) >> 6); NRF_OSCILLATORS_S->XOSC32MCAPS = (OSCILLATORS_XOSC32MCAPS_ENABLE_Enabled << OSCILLATORS_XOSC32MCAPS_ENABLE_Pos) | cap_value; #endif - NRF_CLOCK->HFCLKSRC = CLOCK_HFCLKSRC_SRC_HFXO << CLOCK_HFCLKSRC_SRC_Pos; + NRF_CLOCK->HFCLKSRC = CLOCK_HFCLKSRC_SRC_HFXO << CLOCK_HFCLKSRC_SRC_Pos; // Enable 128MHZ core clock, only possible with application core NRF_CLOCK->HFCLKCTRL = CLOCK_HFCLKCTRL_HCLK_Div1 << CLOCK_HFCLKCTRL_HCLK_Pos; #endif @@ -86,12 +86,12 @@ void db_lfclk_init(void) { #endif NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_LFXO << CLOCK_LFCLKSRC_SRC_Pos); -#else // NRF_NETWORK use internal RC oscillator +#else // NRF_NETWORK use internal RC oscillator NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_LFRC << CLOCK_LFCLKSRC_SRC_Pos); -#endif // defined(NRF_APPLICATION) -#else // nrf52 +#endif // defined(NRF_APPLICATION) +#else // nrf52 NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); -#endif // defined(NRF5340_XXAA) +#endif // defined(NRF5340_XXAA) NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {} diff --git a/bsp/nrf/radio_nrf5340_app.c b/bsp/nrf/radio_nrf5340_app.c index 49ee6e62b..52679151e 100644 --- a/bsp/nrf/radio_nrf5340_app.c +++ b/bsp/nrf/radio_nrf5340_app.c @@ -24,37 +24,9 @@ static radio_cb_t _radio_callback = NULL; -static bool _ack_received[] = { - [DB_IPC_RADIO_INIT_ACK] = false, - [DB_IPC_RADIO_FREQ_ACK] = false, - [DB_IPC_RADIO_CHAN_ACK] = false, - [DB_IPC_RADIO_ADDR_ACK] = false, - [DB_IPC_RADIO_RX_ACK] = false, - [DB_IPC_RADIO_DIS_ACK] = false, - [DB_IPC_RADIO_TX_ACK] = false, - [DB_IPC_RADIO_RSSI_ACK] = false, - [DB_IPC_RNG_INIT_ACK] = false, - [DB_IPC_RNG_READ_ACK] = false, -}; - -//========================== functions ========================================= - -static inline void _network_call(ipc_event_type_t req, ipc_event_type_t ack) { - if (req != DB_IPC_NONE) { - ipc_shared_data.event = req; - NRF_IPC_S->TASKS_SEND[DB_IPC_CHAN_REQ] = 1; - mutex_unlock(); - } - while (!_ack_received[ack]) {} - _ack_received[ack] = false; -} - //=========================== public =========================================== void db_radio_init(radio_cb_t callback, db_radio_ble_mode_t mode) { - // On nrf53 configure constant latency mode for better performances - NRF_POWER_S->TASKS_CONSTLAT = 1; - db_hfclk_init(); // Disable all DCDC regulators (use LDO) @@ -84,9 +56,8 @@ void db_radio_init(radio_cb_t callback, db_radio_ble_mode_t mode) { SPU_RAMREGION_PERM_WRITE_Enable << SPU_RAMREGION_PERM_WRITE_Pos | SPU_RAMREGION_PERM_SECATTR_Non_Secure << SPU_RAMREGION_PERM_SECATTR_Pos); - NRF_IPC_S->INTENSET = (1 << DB_IPC_CHAN_ACK | 1 << DB_IPC_CHAN_RADIO_RX); + NRF_IPC_S->INTENSET = 1 << DB_IPC_CHAN_RADIO_RX; NRF_IPC_S->SEND_CNF[DB_IPC_CHAN_REQ] = 1 << DB_IPC_CHAN_REQ; - NRF_IPC_S->RECEIVE_CNF[DB_IPC_CHAN_ACK] = 1 << DB_IPC_CHAN_ACK; NRF_IPC_S->RECEIVE_CNF[DB_IPC_CHAN_RADIO_RX] = 1 << DB_IPC_CHAN_RADIO_RX; NVIC_EnableIRQ(IPC_IRQn); @@ -100,61 +71,47 @@ void db_radio_init(radio_cb_t callback, db_radio_ble_mode_t mode) { _radio_callback = callback; } - mutex_lock(); ipc_shared_data.radio.mode = mode; - _network_call(DB_IPC_RADIO_INIT_REQ, DB_IPC_RADIO_INIT_ACK); + db_ipc_network_call(DB_IPC_RADIO_INIT_REQ); } void db_radio_set_frequency(uint8_t freq) { - mutex_lock(); ipc_shared_data.radio.frequency = freq; - _network_call(DB_IPC_RADIO_FREQ_REQ, DB_IPC_RADIO_FREQ_ACK); + db_ipc_network_call(DB_IPC_RADIO_FREQ_REQ); } void db_radio_set_channel(uint8_t channel) { - mutex_lock(); ipc_shared_data.radio.channel = channel; - _network_call(DB_IPC_RADIO_CHAN_REQ, DB_IPC_RADIO_CHAN_ACK); + db_ipc_network_call(DB_IPC_RADIO_CHAN_REQ); } void db_radio_set_network_address(uint32_t addr) { - mutex_lock(); ipc_shared_data.radio.addr = addr; - _network_call(DB_IPC_RADIO_ADDR_REQ, DB_IPC_RADIO_ADDR_ACK); + db_ipc_network_call(DB_IPC_RADIO_ADDR_REQ); } void db_radio_tx(uint8_t *tx_buffer, uint8_t length) { - mutex_lock(); ipc_shared_data.radio.tx_pdu.length = length; memcpy((void *)ipc_shared_data.radio.tx_pdu.buffer, tx_buffer, length); - _network_call(DB_IPC_RADIO_TX_REQ, DB_IPC_RADIO_TX_ACK); + db_ipc_network_call(DB_IPC_RADIO_TX_REQ); } void db_radio_rx(void) { - mutex_lock(); - _network_call(DB_IPC_RADIO_RX_REQ, DB_IPC_RADIO_RX_ACK); + db_ipc_network_call(DB_IPC_RADIO_RX_REQ); } int8_t db_radio_rssi(void) { - mutex_lock(); - _network_call(DB_IPC_RADIO_RSSI_REQ, DB_IPC_RADIO_RSSI_ACK); + db_ipc_network_call(DB_IPC_RADIO_RSSI_REQ); return ipc_shared_data.radio.rssi; } void db_radio_disable(void) { - mutex_lock(); - _network_call(DB_IPC_RADIO_DIS_REQ, DB_IPC_RADIO_DIS_ACK); + db_ipc_network_call(DB_IPC_RADIO_DIS_REQ); } //=========================== interrupt handlers =============================== void IPC_IRQHandler(void) { - if (NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_ACK]) { - NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_ACK] = 0; - mutex_lock(); - _ack_received[ipc_shared_data.event] = true; - mutex_unlock(); - } if (NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_RADIO_RX]) { NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_RADIO_RX] = 0; if (_radio_callback) { diff --git a/bsp/nrf/rng_nrf5340_app.c b/bsp/nrf/rng_nrf5340_app.c index 064d68a38..bff2e9268 100644 --- a/bsp/nrf/rng_nrf5340_app.c +++ b/bsp/nrf/rng_nrf5340_app.c @@ -15,31 +15,11 @@ #include "ipc.h" #include "rng.h" -//========================== variables ========================================= - -static bool _ack_received[] = { - [DB_IPC_RNG_INIT_ACK] = false, - [DB_IPC_RNG_READ_ACK] = false, -}; - //========================== functions ========================================= -static inline void _network_call(ipc_event_type_t req, ipc_event_type_t ack) { - if (req != DB_IPC_NONE) { - ipc_shared_data.event = req; - NRF_IPC_S->TASKS_SEND[DB_IPC_CHAN_REQ] = 1; - mutex_unlock(); - } - while (!_ack_received[ack]) {} - _ack_received[ack] = false; -}; - //=========================== public =========================================== void db_rng_init(void) { - // On nrf53 configure constant latency mode for better performances - NRF_POWER_S->TASKS_CONSTLAT = 1; - // IPC (address at 0x41012000 => periph ID is 18) NRF_SPU_S->PERIPHID[18].PERM = (SPU_PERIPHID_PERM_SECUREMAPPING_UserSelectable << SPU_PERIPHID_PERM_SECUREMAPPING_Pos | SPU_PERIPHID_PERM_SECATTR_NonSecure << SPU_PERIPHID_PERM_SECATTR_Pos | @@ -55,9 +35,7 @@ void db_rng_init(void) { SPU_RAMREGION_PERM_WRITE_Enable << SPU_RAMREGION_PERM_WRITE_Pos | SPU_RAMREGION_PERM_SECATTR_Non_Secure << SPU_RAMREGION_PERM_SECATTR_Pos); - NRF_IPC_S->INTENSET = 1 << DB_IPC_CHAN_ACK; - NRF_IPC_S->SEND_CNF[DB_IPC_CHAN_REQ] = 1 << DB_IPC_CHAN_REQ; - NRF_IPC_S->RECEIVE_CNF[DB_IPC_CHAN_ACK] = 1 << DB_IPC_CHAN_ACK; + NRF_IPC_S->SEND_CNF[DB_IPC_CHAN_REQ] = 1 << DB_IPC_CHAN_REQ; NVIC_EnableIRQ(IPC_IRQn); NVIC_ClearPendingIRQ(IPC_IRQn); @@ -66,23 +44,10 @@ void db_rng_init(void) { // Start the network core release_network_core(); - mutex_lock(); - _network_call(DB_IPC_RNG_INIT_REQ, DB_IPC_RNG_INIT_ACK); + db_ipc_network_call(DB_IPC_RNG_INIT_REQ); } void db_rng_read(uint8_t *value) { - mutex_lock(); - _network_call(DB_IPC_RNG_READ_REQ, DB_IPC_RNG_READ_ACK); + db_ipc_network_call(DB_IPC_RNG_READ_REQ); *value = ipc_shared_data.rng.value; } - -//=========================== interrupt handlers =============================== - -void IPC_IRQHandler(void) { - if (NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_ACK]) { - NRF_IPC_S->EVENTS_RECEIVE[DB_IPC_CHAN_ACK] = 0; - mutex_lock(); - _ack_received[ipc_shared_data.event] = true; - mutex_unlock(); - } -} diff --git a/projects/03app_nrf5340_net/main.c b/projects/03app_nrf5340_net/main.c index 6bde15f65..ebe97042f 100644 --- a/projects/03app_nrf5340_net/main.c +++ b/projects/03app_nrf5340_net/main.c @@ -18,8 +18,8 @@ //=========================== variables ========================================= -static bool _data_received = false; -static ipc_event_type_t _event_received = DB_IPC_NONE; +static bool _data_received = false; +static ipc_req_t _req_received = DB_IPC_REQ_NONE; //=========================== functions ========================================= @@ -27,6 +27,7 @@ void radio_callback(uint8_t *packet, uint8_t length) { mutex_lock(); ipc_shared_data.radio.rx_pdu.length = length; memcpy((void *)ipc_shared_data.radio.rx_pdu.buffer, packet, length); + mutex_unlock(); _data_received = true; } @@ -38,7 +39,6 @@ int main(void) { NRF_POWER_NS->TASKS_CONSTLAT = 1; NRF_IPC_NS->INTENSET = 1 << DB_IPC_CHAN_REQ; - NRF_IPC_NS->SEND_CNF[DB_IPC_CHAN_ACK] = 1 << DB_IPC_CHAN_ACK; NRF_IPC_NS->SEND_CNF[DB_IPC_CHAN_RADIO_RX] = 1 << DB_IPC_CHAN_RADIO_RX; NRF_IPC_NS->RECEIVE_CNF[DB_IPC_CHAN_REQ] = 1 << DB_IPC_CHAN_REQ; @@ -53,89 +53,52 @@ int main(void) { if (_data_received) { _data_received = false; NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_RADIO_RX] = 1; - mutex_unlock(); } - switch (_event_received) { - case DB_IPC_RADIO_INIT_REQ: - mutex_lock(); - db_radio_init(&radio_callback, ipc_shared_data.radio.mode); - ipc_shared_data.event = DB_IPC_RADIO_INIT_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_FREQ_REQ: - mutex_lock(); - db_radio_set_frequency(ipc_shared_data.radio.frequency); - ipc_shared_data.event = DB_IPC_RADIO_FREQ_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_CHAN_REQ: - mutex_lock(); - db_radio_set_channel(ipc_shared_data.radio.channel); - ipc_shared_data.event = DB_IPC_RADIO_CHAN_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_ADDR_REQ: - mutex_lock(); - db_radio_set_network_address(ipc_shared_data.radio.addr); - ipc_shared_data.event = DB_IPC_RADIO_ADDR_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_RX_REQ: - mutex_lock(); - db_radio_rx(); - ipc_shared_data.event = DB_IPC_RADIO_RX_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_DIS_REQ: - mutex_lock(); - db_radio_disable(); - ipc_shared_data.event = DB_IPC_RADIO_DIS_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_TX_REQ: - mutex_lock(); - db_radio_tx((uint8_t *)ipc_shared_data.radio.tx_pdu.buffer, ipc_shared_data.radio.tx_pdu.length); - ipc_shared_data.event = DB_IPC_RADIO_TX_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RADIO_RSSI_REQ: - mutex_lock(); - ipc_shared_data.radio.rssi = db_radio_rssi(); - ipc_shared_data.event = DB_IPC_RADIO_RSSI_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RNG_INIT_REQ: - mutex_lock(); - db_rng_init(); - ipc_shared_data.event = DB_IPC_RNG_INIT_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - case DB_IPC_RNG_READ_REQ: - mutex_lock(); - db_rng_read((uint8_t *)&ipc_shared_data.rng.value); - ipc_shared_data.event = DB_IPC_RNG_READ_ACK; - NRF_IPC_NS->TASKS_SEND[DB_IPC_CHAN_ACK] = 1; - mutex_unlock(); - break; - default: - break; + if (_req_received != DB_IPC_REQ_NONE) { + ipc_shared_data.net_ack = false; + switch (_req_received) { + case DB_IPC_RADIO_INIT_REQ: + db_radio_init(&radio_callback, ipc_shared_data.radio.mode); + break; + case DB_IPC_RADIO_FREQ_REQ: + db_radio_set_frequency(ipc_shared_data.radio.frequency); + break; + case DB_IPC_RADIO_CHAN_REQ: + db_radio_set_channel(ipc_shared_data.radio.channel); + break; + case DB_IPC_RADIO_ADDR_REQ: + db_radio_set_network_address(ipc_shared_data.radio.addr); + break; + case DB_IPC_RADIO_RX_REQ: + db_radio_rx(); + break; + case DB_IPC_RADIO_DIS_REQ: + db_radio_disable(); + break; + case DB_IPC_RADIO_TX_REQ: + db_radio_tx((uint8_t *)ipc_shared_data.radio.tx_pdu.buffer, ipc_shared_data.radio.tx_pdu.length); + break; + case DB_IPC_RADIO_RSSI_REQ: + ipc_shared_data.radio.rssi = db_radio_rssi(); + break; + case DB_IPC_RNG_INIT_REQ: + db_rng_init(); + break; + case DB_IPC_RNG_READ_REQ: + db_rng_read((uint8_t *)&ipc_shared_data.rng.value); + break; + default: + break; + } + ipc_shared_data.net_ack = true; + _req_received = DB_IPC_REQ_NONE; } - _event_received = DB_IPC_NONE; }; } void IPC_IRQHandler(void) { if (NRF_IPC_NS->EVENTS_RECEIVE[DB_IPC_CHAN_REQ]) { NRF_IPC_NS->EVENTS_RECEIVE[DB_IPC_CHAN_REQ] = 0; - _event_received = ipc_shared_data.event; + _req_received = ipc_shared_data.req; } } From 90e9b8cbcbcf9a2966fb6953f8c116d78b396ccd Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Thu, 7 Sep 2023 15:29:11 +0200 Subject: [PATCH 4/4] bsp.emProject: remove useless dependency to timer_hf for rng and radio libraries --- bsp/bsp.emProject | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bsp/bsp.emProject b/bsp/bsp.emProject index f7cd32a48..6f20f3385 100644 --- a/bsp/bsp.emProject +++ b/bsp/bsp.emProject @@ -103,7 +103,7 @@ @@ -112,7 +112,6 @@