Skip to content

Commit b5b6bdc

Browse files
[Silabs] Fix the secure soc reset issue (#37965)
* Added platform abstraction reset function for EFR and SoC platforms * Renamed the SPAM soft reset API * Added SPAM reset call in matter code * Fixed EFR32 build issue due to namespace is missing * Update examples/platform/silabs/Rpc.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/platformAbstraction/SilabsPlatformBase.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/platformAbstraction/SilabsPlatformBase.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> --------- Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com>
1 parent ce89c61 commit b5b6bdc

File tree

7 files changed

+29
-4
lines changed

7 files changed

+29
-4
lines changed

examples/platform/silabs/Rpc.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "pigweed/RpcService.h"
2222
#include "pw_sys_io_efr32/init.h"
2323
#include <cmsis_os2.h>
24+
#include <platform/silabs/platformAbstraction/SilabsPlatform.h>
2425
#include <sl_cmsis_os2_common.h>
2526

2627
#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE
@@ -73,6 +74,8 @@ size_t pw_trace_GetTraceTimeTicksPerSecond()
7374

7475
#endif // defined(PW_RPC_TRACING_SERVICE) && PW_RPC_TRACING_SERVICE
7576

77+
using namespace chip::DeviceLayer::Silabs;
78+
7679
namespace chip {
7780
namespace rpc {
7881

@@ -117,7 +120,7 @@ class Efr32Device final : public Device
117120
osTimer_t mRebootTimerBuffer;
118121
osTimerAttr_t mRebootTimerAttr = { .name = "Reboot", .cb_mem = &mRebootTimerBuffer, .cb_size = osTimerCbSize };
119122

120-
static void RebootHandler(void * timerCbArg) { NVIC_SystemReset(); }
123+
static void RebootHandler(void * timerCbArg) { GetPlatform().SoftwareReset(); }
121124
};
122125
#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE
123126

@@ -225,6 +228,5 @@ void Init()
225228
// Start App task.
226229
sRpcTaskHandle = osThreadNew(RunRpcService, nullptr, &kRpcTaskAttr);
227230
}
228-
229231
} // namespace rpc
230232
} // namespace chip

src/platform/silabs/ConfigurationManagerImpl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg)
306306
// Block the task for 500 ms before the reset occurs to allow RPC response to be sent
307307
vTaskDelay(pdMS_TO_TICKS(500));
308308

309-
NVIC_SystemReset();
309+
Silabs::GetPlatform().SoftwareReset();
310310
}
311311

312312
#ifdef SL_WIFI

src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <app/clusters/ota-requestor/OTARequestorInterface.h>
2121
#include <platform/silabs/OTAImageProcessorImpl.h>
2222
#include <platform/silabs/SilabsConfig.h>
23+
#include <platform/silabs/platformAbstraction/SilabsPlatform.h>
2324

2425
#if CHIP_CONFIG_ENABLE_ICD_SERVER
2526
#include <platform/silabs/wifi/icd/WifiSleepManager.h>
@@ -42,6 +43,8 @@ extern "C" {
4243
uint8_t flag = RPS_HEADER;
4344
static chip::OTAImageProcessorImpl gImageProcessor;
4445

46+
using namespace chip::DeviceLayer::Silabs;
47+
4548
namespace chip {
4649

4750
// Define static memebers
@@ -228,7 +231,7 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context)
228231
// send system reset request to reset the MCU and upgrade the m4 image
229232
ChipLogProgress(SoftwareUpdate, "SoC Soft Reset initiated!");
230233
// Reboots the device
231-
sl_si91x_soc_nvic_reset();
234+
GetPlatform().SoftwareReset();
232235
}
233236
}
234237

src/platform/silabs/platformAbstraction/GsdkSpam.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ CHIP_ERROR SilabsPlatform::Init(void)
124124
return CHIP_NO_ERROR;
125125
}
126126

127+
void SilabsPlatform::SoftwareReset()
128+
{
129+
NVIC_SystemReset();
130+
}
131+
127132
CHIP_ERROR SilabsPlatform::FlashInit()
128133
{
129134
#if defined(SL_TRUSTZONE_NONSECURE)

src/platform/silabs/platformAbstraction/SilabsPlatform.h

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class SilabsPlatform : virtual public SilabsPlatformAbstractionBase
6161
CHIP_ERROR FlashErasePage(uint32_t addr) override;
6262
CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) override;
6363

64+
void SoftwareReset(void) override;
65+
6466
private:
6567
friend SilabsPlatform & GetPlatform(void);
6668

src/platform/silabs/platformAbstraction/SilabsPlatformBase.h

+6
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ class SilabsPlatformAbstractionBase
5656
virtual CHIP_ERROR FlashErasePage(uint32_t addr) { return CHIP_ERROR_NOT_IMPLEMENTED; }
5757
virtual CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
5858

59+
/**
60+
* @brief Function trigger the platform to execute a software reset.
61+
* Anything after this function will not be executed since the device will reboot.
62+
*/
63+
virtual void SoftwareReset(void) = 0;
64+
5965
// BLE Specific Method
6066

6167
protected:

src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extern "C" {
3838
#endif // SL_SI91X_BOARD_INIT
3939
#include "sl_event_handler.h"
4040

41+
#include "sl_si91x_hal_soc_soft_reset.h"
42+
4143
#ifdef SL_CATALOG_SIMPLE_BUTTON_PRESENT
4244
#include "sl_si91x_button.h"
4345
#include "sl_si91x_button_pin_config.h"
@@ -208,6 +210,11 @@ uint8_t SilabsPlatform::GetButtonState(uint8_t button)
208210
}
209211
#endif // SL_CATALOG_SIMPLE_BUTTON_PRESENT
210212

213+
void SilabsPlatform::SoftwareReset()
214+
{
215+
sl_si91x_soc_nvic_reset();
216+
}
217+
211218
CHIP_ERROR SilabsPlatform::FlashInit()
212219
{
213220
return CHIP_NO_ERROR;

0 commit comments

Comments
 (0)