diff --git a/examples/platform/silabs/provision/ProvisionStorageDefault.cpp b/examples/platform/silabs/provision/ProvisionStorageDefault.cpp index 801eb9e0b70c2e..6ceaf0c9f3d2ad 100644 --- a/examples/platform/silabs/provision/ProvisionStorageDefault.cpp +++ b/examples/platform/silabs/provision/ProvisionStorageDefault.cpp @@ -17,6 +17,7 @@ #include "AttestationKey.h" #include "ProvisionStorage.h" #include +#include #include #include #include @@ -34,7 +35,13 @@ #ifdef SLI_SI91X_MCU_INTERFACE #include #else +#ifdef _SILICON_LABS_32B_SERIES_2 #include +#elif defined(_SILICON_LABS_32B_SERIES_3) +#include "sl_se_manager.h" +#include "sl_se_manager_types.h" +#include +#endif // _SILICON_LABS_32B_SERIES_2 #include #endif @@ -44,6 +51,16 @@ extern void setNvm3End(uint32_t addr); #include #endif +#if defined(_SILICON_LABS_32B_SERIES_3) +// To remove any ambiguities regarding the Flash aliases, use the below macro to ignore the 8 MSB. +#define FLASH_GENERIC_MASK 0x00FFFFFF +#define GENERIC_ADDRESS(addr) ((addr) &FLASH_GENERIC_MASK) + +// Transforms any address into an address using the same alias as FLASH_BASE from the CMSIS. +#define CMSIS_CONVERTED_ADDRESS(addr) (GENERIC_ADDRESS(addr) | FLASH_BASE) +sl_se_command_context_t cmd_ctx; +#endif // _SILICON_LABS_32B_SERIES_3 + extern uint8_t linker_nvm_end[]; using namespace chip::Credentials; @@ -68,6 +85,16 @@ CHIP_ERROR ErasePage(uint32_t addr) rsi_flash_erase_sector((uint32_t *) addr); #else MSC_ErasePage((uint32_t *) addr); +#elif defined(_SILICON_LABS_32B_SERIES_3) + sl_status_t status; + uint32_t * data_start = NULL; + size_t data_size; + + status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status)); + VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS); + status = sl_se_data_region_erase(&cmd_ctx, (void *) addr, 1); // Erase one page + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status)); #endif return CHIP_NO_ERROR; } @@ -78,6 +105,16 @@ CHIP_ERROR WritePage(uint32_t addr, const uint8_t * data, size_t size) rsi_flash_write((uint32_t *) addr, (unsigned char *) data, size); #else MSC_WriteWord((uint32_t *) addr, data, size); +#elif defined(_SILICON_LABS_32B_SERIES_3) + sl_status_t status; + uint32_t * data_start = NULL; + size_t data_size; + + status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status)); + VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS); + status = sl_se_data_region_write(&cmd_ctx, (void *) addr, data, size); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status)); #endif return CHIP_NO_ERROR; } @@ -161,7 +198,15 @@ CHIP_ERROR Storage::Initialize(uint32_t flash_addr, uint32_t flash_size) { #ifndef SLI_SI91X_MCU_INTERFACE base_addr = (flash_addr + flash_size - FLASH_PAGE_SIZE); + +#ifdef _SILICON_LABS_32B_SERIES_2 MSC_Init(); +#elif defined(_SILICON_LABS_32B_SERIES_3) + sl_status_t status; + status = sl_se_init(); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_INTERNAL); + status = sl_se_init_command_context(&cmd_ctx); +#endif // _SILICON_LABS_32B_SERIES #endif // SLI_SI91X_MCU_INTERFACE #ifdef SL_PROVISION_GENERATOR setNvm3End(base_addr); diff --git a/src/platform/silabs/platformAbstraction/GsdkSpam.cpp b/src/platform/silabs/platformAbstraction/GsdkSpam.cpp index eb8704ecfc1116..92ddd281f8fe55 100644 --- a/src/platform/silabs/platformAbstraction/GsdkSpam.cpp +++ b/src/platform/silabs/platformAbstraction/GsdkSpam.cpp @@ -21,7 +21,7 @@ #include "em_rmu.h" #else #include "sl_hal_emu.h" -#endif +#endif // _SILICON_LABS_32B_SERIES_2 #include "sl_system_kernel.h" #ifdef ENABLE_WSTK_LEDS