From 32fac08236923b3c017db647f2f2e3d326fc92f4 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:19:46 -0400 Subject: [PATCH 1/4] Add OTA support for rainer --- .../silabs/CHIPDevicePlatformConfig.h | 4 -- src/platform/silabs/OTAImageProcessorImpl.h | 2 + .../silabs/efr32/OTAImageProcessorImpl.cpp | 63 ++++++++++++++++--- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/platform/silabs/CHIPDevicePlatformConfig.h b/src/platform/silabs/CHIPDevicePlatformConfig.h index d8c58a9368..eace18141e 100644 --- a/src/platform/silabs/CHIPDevicePlatformConfig.h +++ b/src/platform/silabs/CHIPDevicePlatformConfig.h @@ -138,11 +138,7 @@ #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE #ifndef CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE -#if defined(EFR32MG21) -#define CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE (2 * 1024) -#else #define CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE (8 * 1024) -#endif #endif // CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE #define CHIP_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY 0 diff --git a/src/platform/silabs/OTAImageProcessorImpl.h b/src/platform/silabs/OTAImageProcessorImpl.h index 5598b67d4b..d79be006a1 100644 --- a/src/platform/silabs/OTAImageProcessorImpl.h +++ b/src/platform/silabs/OTAImageProcessorImpl.h @@ -50,6 +50,8 @@ class OTAImageProcessorImpl : public OTAImageProcessorInterface static void HandleApply(intptr_t context); static void HandleAbort(intptr_t context); static void HandleProcessBlock(intptr_t context); + static void LockRadioProcessing(); + static void UnlockRadioProcessing(); CHIP_ERROR ProcessHeader(ByteSpan & block); /** diff --git a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp index 846d4f720a..b06d0e77f1 100644 --- a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp +++ b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp @@ -30,6 +30,18 @@ extern "C" { #include +#ifdef _SILICON_LABS_32B_SERIES_2 +#define WRAP_CRITICAL_SECTION(code) \ + { \ + CORE_CRITICAL_SECTION(code;) \ + } +#else +#define WRAP_CRITICAL_SECTION(code) \ + { \ + code; \ + } +#endif + /// No error, operation OK #define SL_BOOTLOADER_OK 0L @@ -144,7 +156,14 @@ void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context) ChipLogProgress(SoftwareUpdate, "HandlePrepareDownload: started"); - CORE_CRITICAL_SECTION(bootloader_init();) +#ifdef _SILICON_LABS_32B_SERIES_2 + WRAP_CRITICAL_SECTION(err = bootloader_init()) + if (err != SL_BOOTLOADER_OK) + { + ChipLogProgress(SoftwareUpdate, "bootloader_init Failed error: %ld", err); + } +#endif + mSlotId = 0; // Single slot until we support multiple images writeBufOffset = 0; mWriteOffset = 0; @@ -186,7 +205,8 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) return; } #endif // SL_BTLCTRL_MUX - CORE_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes);) + WRAP_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) + #if SL_BTLCTRL_MUX err = sl_wfx_host_post_bootloader_spi_transfer(); if (err != SL_STATUS_OK) @@ -208,11 +228,26 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) ChipLogProgress(SoftwareUpdate, "OTA image downloaded successfully"); } +// TODO Investigate assert when thread process between bootloader_verifyImage or bootloader_setImageToBootload steps +void OTAImageProcessorImpl::LockRadioProcessing() +{ +#if !SL_WIFI + DeviceLayer::ThreadStackMgr().LockThreadStack(); +#endif // SL_WIFI +} + +void OTAImageProcessorImpl::UnlockRadioProcessing() +{ +#if !SL_WIFI + DeviceLayer::ThreadStackMgr().UnlockThreadStack(); +#endif // SL_WIFI +} + void OTAImageProcessorImpl::HandleApply(intptr_t context) { uint32_t err = SL_BOOTLOADER_OK; - ChipLogProgress(SoftwareUpdate, "HandleApply: started"); + ChipLogProgress(SoftwareUpdate, "HandleApply: verifying image"); // Force KVS to store pending keys such as data from StoreCurrentUpdateInfo() chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().ForceKeyMapSave(); @@ -224,7 +259,10 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) return; } #endif // SL_BTLCTRL_MUX - CORE_CRITICAL_SECTION(err = bootloader_verifyImage(mSlotId, NULL);) + + LockRadioProcessing(); + WRAP_CRITICAL_SECTION(err = bootloader_verifyImage(mSlotId, NULL)) + UnlockRadioProcessing(); if (err != SL_BOOTLOADER_OK) { ChipLogError(SoftwareUpdate, "bootloader_verifyImage() error: %ld", err); @@ -235,13 +273,14 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) if (err != SL_STATUS_OK) { ChipLogError(SoftwareUpdate, "sl_wfx_host_post_bootloader_spi_transfer() error: %ld", err); - return; } #endif // SL_BTLCTRL_MUX return; } - - CORE_CRITICAL_SECTION(err = bootloader_setImageToBootload(mSlotId);) + ChipLogError(SoftwareUpdate, "Image verified, Set image to bootloader"); + LockRadioProcessing(); + WRAP_CRITICAL_SECTION(err = bootloader_setImageToBootload(mSlotId)) + UnlockRadioProcessing(); if (err != SL_BOOTLOADER_OK) { ChipLogError(SoftwareUpdate, "bootloader_setImageToBootload() error: %ld", err); @@ -252,7 +291,6 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) if (err != SL_STATUS_OK) { ChipLogError(SoftwareUpdate, "sl_wfx_host_post_bootloader_spi_transfer() error: %ld", err); - return; } #endif // SL_BTLCTRL_MUX return; @@ -266,8 +304,12 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) return; } #endif // SL_BTLCTRL_MUX + + ChipLogError(SoftwareUpdate, "Reboot and install new image"); + LockRadioProcessing(); // This reboots the device - CORE_CRITICAL_SECTION(bootloader_rebootAndInstall();) + WRAP_CRITICAL_SECTION(bootloader_rebootAndInstall()) + UnlockRadioProcessing(); // Unneccessay but for good measure } void OTAImageProcessorImpl::HandleAbort(intptr_t context) @@ -326,7 +368,8 @@ void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) return; } #endif // SL_BTLCTRL_MUX - CORE_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes);) + WRAP_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) + #if SL_BTLCTRL_MUX err = sl_wfx_host_post_bootloader_spi_transfer(); if (err != SL_STATUS_OK) From 4438fda0d082059641d97d1db17494d790cddb07 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:29:43 -0400 Subject: [PATCH 2/4] add small delay for log output inbetween ota image apply --- src/platform/silabs/efr32/OTAImageProcessorImpl.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp index b06d0e77f1..94209367cc 100644 --- a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp +++ b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp @@ -260,6 +260,7 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } #endif // SL_BTLCTRL_MUX + osDelay(100); // delay for uart print before verifyImage LockRadioProcessing(); WRAP_CRITICAL_SECTION(err = bootloader_verifyImage(mSlotId, NULL)) UnlockRadioProcessing(); @@ -305,7 +306,8 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } #endif // SL_BTLCTRL_MUX - ChipLogError(SoftwareUpdate, "Reboot and install new image"); + ChipLogError(SoftwareUpdate, "Reboot and install new image..."); + osDelay(100); // delay for uart print before reboot LockRadioProcessing(); // This reboots the device WRAP_CRITICAL_SECTION(bootloader_rebootAndInstall()) From 33bbc4d76940fca4bd2bc3ac9f28ce3788447689 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:40:30 -0500 Subject: [PATCH 3/4] cleanup, add comments for context --- .../silabs/efr32/OTAImageProcessorImpl.cpp | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp index 94209367cc..f85f34cbf7 100644 --- a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp +++ b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp @@ -31,12 +31,14 @@ extern "C" { #include #ifdef _SILICON_LABS_32B_SERIES_2 -#define WRAP_CRITICAL_SECTION(code) \ +// Series 2 bootloader_ api calls must be called from a critical section context for thread safeness +#define WRAP_BL_DFU_CALL(code) \ { \ CORE_CRITICAL_SECTION(code;) \ } #else -#define WRAP_CRITICAL_SECTION(code) \ +// series 3 bootloader_ calls use rtos mutex for thread safeness. Cannot be callsed withing a critical sectionß +#define WRAP_BL_DFU_CALL(code) \ { \ code; \ } @@ -157,7 +159,8 @@ void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context) ChipLogProgress(SoftwareUpdate, "HandlePrepareDownload: started"); #ifdef _SILICON_LABS_32B_SERIES_2 - WRAP_CRITICAL_SECTION(err = bootloader_init()) + // TODO sl-temp: bootloader_init is called previously sl_platform_init(). Recalling it for series3 causes a crash. + WRAP_BL_DFU_CALL(err = bootloader_init()) if (err != SL_BOOTLOADER_OK) { ChipLogProgress(SoftwareUpdate, "bootloader_init Failed error: %ld", err); @@ -205,7 +208,7 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) return; } #endif // SL_BTLCTRL_MUX - WRAP_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) + WRAP_BL_DFU_CALL(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) #if SL_BTLCTRL_MUX err = sl_wfx_host_post_bootloader_spi_transfer(); @@ -228,7 +231,8 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) ChipLogProgress(SoftwareUpdate, "OTA image downloaded successfully"); } -// TODO Investigate assert when thread process between bootloader_verifyImage or bootloader_setImageToBootload steps +// TODO SE access is not thread safe. Assert if Other task acess it during bootloader_verifyImage or bootloader_setImageToBootload +// steps - MATTER-4155 - PLATFORM_HYD-3235 void OTAImageProcessorImpl::LockRadioProcessing() { #if !SL_WIFI @@ -260,9 +264,9 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } #endif // SL_BTLCTRL_MUX - osDelay(100); // delay for uart print before verifyImage + osDelay(100); // sl-temp: delay for uart print before verifyImage LockRadioProcessing(); - WRAP_CRITICAL_SECTION(err = bootloader_verifyImage(mSlotId, NULL)) + WRAP_BL_DFU_CALL(err = bootloader_verifyImage(mSlotId, NULL)) UnlockRadioProcessing(); if (err != SL_BOOTLOADER_OK) { @@ -280,7 +284,7 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } ChipLogError(SoftwareUpdate, "Image verified, Set image to bootloader"); LockRadioProcessing(); - WRAP_CRITICAL_SECTION(err = bootloader_setImageToBootload(mSlotId)) + WRAP_BL_DFU_CALL(err = bootloader_setImageToBootload(mSlotId)) UnlockRadioProcessing(); if (err != SL_BOOTLOADER_OK) { @@ -307,10 +311,10 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) #endif // SL_BTLCTRL_MUX ChipLogError(SoftwareUpdate, "Reboot and install new image..."); - osDelay(100); // delay for uart print before reboot + osDelay(100); // sl-temp: delay for uart print before reboot LockRadioProcessing(); // This reboots the device - WRAP_CRITICAL_SECTION(bootloader_rebootAndInstall()) + WRAP_BL_DFU_CALL(bootloader_rebootAndInstall()) UnlockRadioProcessing(); // Unneccessay but for good measure } @@ -370,7 +374,7 @@ void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) return; } #endif // SL_BTLCTRL_MUX - WRAP_CRITICAL_SECTION(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) + WRAP_BL_DFU_CALL(err = bootloader_eraseWriteStorage(mSlotId, mWriteOffset, writeBuffer, kAlignmentBytes)) #if SL_BTLCTRL_MUX err = sl_wfx_host_post_bootloader_spi_transfer(); From 01e537d960649bb249e1c62d6ef852c4fb018fb9 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Mon, 11 Nov 2024 15:15:50 -0500 Subject: [PATCH 4/4] address comments --- .../silabs/efr32/OTAImageProcessorImpl.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp index f85f34cbf7..11921d86f3 100644 --- a/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp +++ b/src/platform/silabs/efr32/OTAImageProcessorImpl.cpp @@ -37,7 +37,7 @@ extern "C" { CORE_CRITICAL_SECTION(code;) \ } #else -// series 3 bootloader_ calls use rtos mutex for thread safeness. Cannot be callsed withing a critical sectionß +// series 3 bootloader_ calls uses rtos mutex for thread safety. Cannot be called within a critical section #define WRAP_BL_DFU_CALL(code) \ { \ code; \ @@ -231,8 +231,8 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) ChipLogProgress(SoftwareUpdate, "OTA image downloaded successfully"); } -// TODO SE access is not thread safe. Assert if Other task acess it during bootloader_verifyImage or bootloader_setImageToBootload -// steps - MATTER-4155 - PLATFORM_HYD-3235 +// TODO: SE access is not thread safe. It assert if other tasks accesses it during bootloader_verifyImage or +// bootloader_setImageToBootload steps - MATTER-4155 - PLATFORM_HYD-3235 void OTAImageProcessorImpl::LockRadioProcessing() { #if !SL_WIFI @@ -264,7 +264,9 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } #endif // SL_BTLCTRL_MUX +#if defined(_SILICON_LABS_32B_SERIES_3) && CHIP_PROGRESS_LOGGING osDelay(100); // sl-temp: delay for uart print before verifyImage +#endif // _SILICON_LABS_32B_SERIES_3 && CHIP_PROGRESS_LOGGING LockRadioProcessing(); WRAP_BL_DFU_CALL(err = bootloader_verifyImage(mSlotId, NULL)) UnlockRadioProcessing(); @@ -282,7 +284,7 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) #endif // SL_BTLCTRL_MUX return; } - ChipLogError(SoftwareUpdate, "Image verified, Set image to bootloader"); + ChipLogProgress(SoftwareUpdate, "Image verified, Set image to bootload"); LockRadioProcessing(); WRAP_BL_DFU_CALL(err = bootloader_setImageToBootload(mSlotId)) UnlockRadioProcessing(); @@ -310,8 +312,10 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) } #endif // SL_BTLCTRL_MUX - ChipLogError(SoftwareUpdate, "Reboot and install new image..."); + ChipLogProgress(SoftwareUpdate, "Reboot and install new image..."); +#if defined(_SILICON_LABS_32B_SERIES_3) && CHIP_PROGRESS_LOGGING osDelay(100); // sl-temp: delay for uart print before reboot +#endif // _SILICON_LABS_32B_SERIES_3 && CHIP_PROGRESS_LOGGING LockRadioProcessing(); // This reboots the device WRAP_BL_DFU_CALL(bootloader_rebootAndInstall())