Skip to content

Commit a3d6f73

Browse files
lpbeliveau-silabsandy31415
authored andcommitted
Pull request #2067: Provision SPAM (#36404)
Merge in WMN_TOOLS/matter from provision_SPAM to dev/provision_source_code Squashed commit of the following: commit ae6d6bd09b963838fa8ae70efefa0770c33c5b73 Author: lpbeliveau-silabs <louis-philip.beliveau@silabs.com> Date: Wed Sep 25 11:08:23 2024 -0400 Updated the GsdkSpam for series 3 now that provisioning relies on it commit fb0cb797ca3eea51856e2b62e5b2c0a4dfb8cac3 Author: lpbeliveau-silabs <louis-philip.beliveau@silabs.com> Date: Tue Sep 24 17:53:54 2024 -0400 Updated provisioning to use Silabs Platform Abstraction Manager Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent c8371e1 commit a3d6f73

File tree

5 files changed

+102
-64
lines changed

5 files changed

+102
-64
lines changed

examples/platform/silabs/provision/ProvisionStorageDefault.cpp

+5-62
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "AttestationKey.h"
1818
#include "ProvisionStorage.h"
1919
#include <credentials/examples/DeviceAttestationCredsExample.h>
20-
#include <em_device.h>
2120
#include <lib/support/BytesToHex.h>
2221
#include <lib/support/CHIPMemString.h>
2322
#include <lib/support/CodeUtils.h>
@@ -28,6 +27,7 @@
2827
#include <platform/CHIPDeviceConfig.h>
2928
#include <platform/silabs/MigrationManager.h>
3029
#include <platform/silabs/SilabsConfig.h>
30+
#include <platform/silabs/platformAbstraction/SilabsPlatform.h>
3131
#include <silabs_creds.h>
3232
#ifndef NDEBUG
3333
#if defined(SL_MATTER_TEST_EVENT_TRIGGER_ENABLED) && (SL_MATTER_GN_BUILD == 0)
@@ -37,16 +37,7 @@
3737
#ifdef OTA_ENCRYPTION_ENABLE
3838
#include <platform/silabs/multi-ota/OtaTlvEncryptionKey.h>
3939
#endif // OTA_ENCRYPTION_ENABLE
40-
#ifdef SLI_SI91X_MCU_INTERFACE
41-
#include <sl_si91x_common_flash_intf.h>
42-
#else
43-
#ifdef _SILICON_LABS_32B_SERIES_2
44-
#include <em_msc.h>
45-
#elif defined(_SILICON_LABS_32B_SERIES_3)
46-
#include "sl_se_manager.h"
47-
#include "sl_se_manager_types.h"
48-
#include <sl_se_manager_extmem.h>
49-
#endif // _SILICON_LABS_32B_SERIES_2
40+
#ifndef SLI_SI91X_MCU_INTERFACE
5041
#include <psa/crypto.h>
5142
#endif
5243

@@ -56,16 +47,6 @@ extern void setNvm3End(uint32_t addr);
5647
#include <sl_matter_provision_config.h>
5748
#endif
5849

59-
#if defined(_SILICON_LABS_32B_SERIES_3)
60-
// To remove any ambiguities regarding the Flash aliases, use the below macro to ignore the 8 MSB.
61-
#define FLASH_GENERIC_MASK 0x00FFFFFF
62-
#define GENERIC_ADDRESS(addr) ((addr) &FLASH_GENERIC_MASK)
63-
64-
// Transforms any address into an address using the same alias as FLASH_BASE from the CMSIS.
65-
#define CMSIS_CONVERTED_ADDRESS(addr) (GENERIC_ADDRESS(addr) | FLASH_BASE)
66-
sl_se_command_context_t cmd_ctx;
67-
#endif // _SILICON_LABS_32B_SERIES_3
68-
6950
extern uint8_t linker_nvm_end[];
7051

7152
using namespace chip::Credentials;
@@ -86,42 +67,12 @@ size_t sCredentialsOffset = 0;
8667

8768
CHIP_ERROR ErasePage(uint32_t addr)
8869
{
89-
#ifdef SLI_SI91X_MCU_INTERFACE
90-
rsi_flash_erase_sector((uint32_t *) addr);
91-
#elif defined(_SILICON_LABS_32B_SERIES_2)
92-
MSC_ErasePage((uint32_t *) addr);
93-
#elif defined(_SILICON_LABS_32B_SERIES_3)
94-
sl_status_t status;
95-
uint32_t * data_start = NULL;
96-
size_t data_size;
97-
98-
status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size);
99-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
100-
VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS);
101-
status = sl_se_data_region_erase(&cmd_ctx, (void *) addr, 1); // Erase one page
102-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
103-
#endif
104-
return CHIP_NO_ERROR;
70+
return chip::DeviceLayer::Silabs::GetPlatform().FlashErasePage(addr);
10571
}
10672

10773
CHIP_ERROR WritePage(uint32_t addr, const uint8_t * data, size_t size)
10874
{
109-
#ifdef SLI_SI91X_MCU_INTERFACE
110-
rsi_flash_write((uint32_t *) addr, (unsigned char *) data, size);
111-
#elif defined(_SILICON_LABS_32B_SERIES_2)
112-
MSC_WriteWord((uint32_t *) addr, data, size);
113-
#elif defined(_SILICON_LABS_32B_SERIES_3)
114-
sl_status_t status;
115-
uint32_t * data_start = NULL;
116-
size_t data_size;
117-
118-
status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size);
119-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
120-
VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS);
121-
status = sl_se_data_region_write(&cmd_ctx, (void *) addr, data, size);
122-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
123-
#endif
124-
return CHIP_NO_ERROR;
75+
return chip::DeviceLayer::Silabs::GetPlatform().FlashWritePage(addr, data, size);
12576
}
12677

12778
size_t RoundNearest(size_t n, size_t multiple)
@@ -203,16 +154,8 @@ CHIP_ERROR Storage::Initialize(uint32_t flash_addr, uint32_t flash_size)
203154
{
204155
#ifndef SLI_SI91X_MCU_INTERFACE
205156
base_addr = (flash_addr + flash_size - FLASH_PAGE_SIZE);
206-
207-
#ifdef _SILICON_LABS_32B_SERIES_2
208-
MSC_Init();
209-
#elif defined(_SILICON_LABS_32B_SERIES_3)
210-
sl_status_t status;
211-
status = sl_se_init();
212-
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_INTERNAL);
213-
status = sl_se_init_command_context(&cmd_ctx);
214-
#endif // _SILICON_LABS_32B_SERIES
215157
#endif // SLI_SI91X_MCU_INTERFACE
158+
chip::DeviceLayer::Silabs::GetPlatform().FlashInit();
216159
#ifdef SL_PROVISION_GENERATOR
217160
setNvm3End(base_addr);
218161
#endif

src/platform/silabs/platformAbstraction/GsdkSpam.cpp

+69-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@
1515
* limitations under the License.
1616
*/
1717

18+
#include <em_device.h>
19+
#include <lib/support/CodeUtils.h>
1820
#include <platform/silabs/platformAbstraction/SilabsPlatform.h>
19-
2021
#if defined(_SILICON_LABS_32B_SERIES_2)
22+
#include "em_msc.h"
2123
#include "em_rmu.h"
22-
#else
24+
#elif defined(_SILICON_LABS_32B_SERIES_3)
2325
#include "sl_hal_emu.h"
26+
#include "sl_se_manager.h"
27+
#include "sl_se_manager_types.h"
28+
#include <sl_se_manager_extmem.h>
2429
#endif // _SILICON_LABS_32B_SERIES_2
2530
#include "sl_system_kernel.h"
2631

@@ -65,6 +70,18 @@ extern "C" {
6570
#include "silabs_utils.h"
6671
#endif
6772

73+
#if defined(_SILICON_LABS_32B_SERIES_3)
74+
// To remove any ambiguities regarding the Flash aliases, use the below macro to ignore the 8 MSB.
75+
#define FLASH_GENERIC_MASK 0x00FFFFFF
76+
#define GENERIC_ADDRESS(addr) ((addr) &FLASH_GENERIC_MASK)
77+
78+
// Transforms any address into an address using the same alias as FLASH_BASE from the CMSIS.
79+
#define CMSIS_CONVERTED_ADDRESS(addr) (GENERIC_ADDRESS(addr) | FLASH_BASE)
80+
namespace {
81+
sl_se_command_context_t cmd_ctx;
82+
}
83+
#endif // _SILICON_LABS_32B_SERIES_3
84+
6885
namespace chip {
6986
namespace DeviceLayer {
7087
namespace Silabs {
@@ -107,6 +124,56 @@ CHIP_ERROR SilabsPlatform::Init(void)
107124
return CHIP_NO_ERROR;
108125
}
109126

127+
CHIP_ERROR SilabsPlatform::FlashInit()
128+
{
129+
#if defined(_SILICON_LABS_32B_SERIES_2)
130+
MSC_Init();
131+
#elif defined(_SILICON_LABS_32B_SERIES_3)
132+
sl_status_t status;
133+
status = sl_se_init();
134+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
135+
status = sl_se_init_command_context(&cmd_ctx);
136+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
137+
#endif
138+
return CHIP_NO_ERROR;
139+
}
140+
141+
CHIP_ERROR SilabsPlatform::FlashErasePage(uint32_t addr)
142+
{
143+
#if defined(_SILICON_LABS_32B_SERIES_2)
144+
MSC_ErasePage((uint32_t *) addr);
145+
#elif defined(_SILICON_LABS_32B_SERIES_3)
146+
sl_status_t status;
147+
uint32_t * data_start = NULL;
148+
size_t data_size;
149+
150+
status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size);
151+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
152+
VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS);
153+
status = sl_se_data_region_erase(&cmd_ctx, (void *) addr, 1); // Erase one page
154+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
155+
#endif
156+
return CHIP_NO_ERROR;
157+
}
158+
159+
CHIP_ERROR SilabsPlatform::FlashWritePage(uint32_t addr, const uint8_t * data, size_t size)
160+
{
161+
#if defined(_SILICON_LABS_32B_SERIES_2)
162+
MSC_WriteWord((uint32_t *) addr, data, size);
163+
#elif defined(_SILICON_LABS_32B_SERIES_3)
164+
sl_status_t status;
165+
uint32_t * data_start = NULL;
166+
size_t data_size;
167+
168+
status = sl_se_data_region_get_location(&cmd_ctx, (void **) &data_start, &data_size);
169+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
170+
VerifyOrReturnError(GENERIC_ADDRESS(addr) > GENERIC_ADDRESS((uint32_t) data_start), CHIP_ERROR_INVALID_ADDRESS);
171+
status = sl_se_data_region_write(&cmd_ctx, (void *) addr, data, size);
172+
VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR(status));
173+
#endif
174+
return CHIP_NO_ERROR;
175+
}
176+
110177
#ifdef ENABLE_WSTK_LEDS
111178
void SilabsPlatform::InitLed(void)
112179
{

src/platform/silabs/platformAbstraction/SilabsPlatform.h

+4
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ class SilabsPlatform : virtual public SilabsPlatformAbstractionBase
5757

5858
void StartScheduler(void) override;
5959

60+
CHIP_ERROR FlashInit() override;
61+
CHIP_ERROR FlashErasePage(uint32_t addr) override;
62+
CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) override;
63+
6064
private:
6165
friend SilabsPlatform & GetPlatform(void);
6266

src/platform/silabs/platformAbstraction/SilabsPlatformBase.h

+5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ class SilabsPlatformAbstractionBase
5151
virtual bool GetLedState(uint8_t led) { return 0; }
5252
virtual CHIP_ERROR ToggleLed(uint8_t led) { return CHIP_ERROR_NOT_IMPLEMENTED; }
5353

54+
// Flash
55+
virtual CHIP_ERROR FlashInit() { return CHIP_ERROR_NOT_IMPLEMENTED; }
56+
virtual CHIP_ERROR FlashErasePage(uint32_t addr) { return CHIP_ERROR_NOT_IMPLEMENTED; }
57+
virtual CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
58+
5459
// BLE Specific Method
5560

5661
protected:

src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717

1818
#include <platform/silabs/platformAbstraction/SilabsPlatform.h>
1919
#include <sl_si91x_button_pin_config.h>
20+
#include <sl_si91x_common_flash_intf.h>
2021

2122
#include <FreeRTOS.h>
2223
#include <task.h>
2324

2425
#include <app/icd/server/ICDServerConfig.h>
26+
#include <lib/support/CodeUtils.h>
2527

2628
#include <lib/support/CodeUtils.h>
2729
#if SILABS_LOG_ENABLED
@@ -192,6 +194,23 @@ uint8_t SilabsPlatform::GetButtonState(uint8_t button)
192194
return (button < SL_SI91x_BUTTON_COUNT) ? sButtonStates[button] : 0;
193195
}
194196

197+
CHIP_ERROR SilabsPlatform::FlashInit()
198+
{
199+
return CHIP_NO_ERROR;
200+
}
201+
202+
CHIP_ERROR SilabsPlatform::FlashErasePage(uint32_t addr)
203+
{
204+
rsi_flash_erase_sector((uint32_t *) addr);
205+
return CHIP_NO_ERROR;
206+
}
207+
208+
CHIP_ERROR SilabsPlatform::FlashWritePage(uint32_t addr, const uint8_t * data, size_t size)
209+
{
210+
rsi_flash_write((uint32_t *) addr, (unsigned char *) data, size);
211+
return CHIP_NO_ERROR;
212+
}
213+
195214
} // namespace Silabs
196215
} // namespace DeviceLayer
197216
} // namespace chip

0 commit comments

Comments
 (0)