17
17
#include " AttestationKey.h"
18
18
#include " ProvisionStorage.h"
19
19
#include < credentials/examples/DeviceAttestationCredsExample.h>
20
+ #include < em_device.h>
20
21
#include < lib/support/BytesToHex.h>
21
22
#include < lib/support/CHIPMemString.h>
22
23
#include < lib/support/CodeUtils.h>
34
35
#ifdef SLI_SI91X_MCU_INTERFACE
35
36
#include < sl_si91x_common_flash_intf.h>
36
37
#else
38
+ #ifdef _SILICON_LABS_32B_SERIES_2
37
39
#include < em_msc.h>
40
+ #elif defined(_SILICON_LABS_32B_SERIES_3)
41
+ #include " sl_se_manager.h"
42
+ #include " sl_se_manager_types.h"
43
+ #include < sl_se_manager_extmem.h>
44
+ #endif // _SILICON_LABS_32B_SERIES_2
38
45
#include < psa/crypto.h>
39
46
#endif
40
47
@@ -44,6 +51,16 @@ extern void setNvm3End(uint32_t addr);
44
51
#include < sl_matter_provision_config.h>
45
52
#endif
46
53
54
+ #if defined(_SILICON_LABS_32B_SERIES_3)
55
+ // To remove any ambiguities regarding the Flash aliases, use the below macro to ignore the 8 MSB.
56
+ #define FLASH_GENERIC_MASK 0x00FFFFFF
57
+ #define GENERIC_ADDRESS (addr ) ((addr) &FLASH_GENERIC_MASK)
58
+
59
+ // Transforms any address into an address using the same alias as FLASH_BASE from the CMSIS.
60
+ #define CMSIS_CONVERTED_ADDRESS (addr ) (GENERIC_ADDRESS(addr) | FLASH_BASE)
61
+ sl_se_command_context_t cmd_ctx;
62
+ #endif // _SILICON_LABS_32B_SERIES_3
63
+
47
64
extern uint8_t linker_nvm_end[];
48
65
49
66
using namespace chip ::Credentials;
@@ -66,8 +83,18 @@ CHIP_ERROR ErasePage(uint32_t addr)
66
83
{
67
84
#ifdef SLI_SI91X_MCU_INTERFACE
68
85
rsi_flash_erase_sector ((uint32_t *) addr);
69
- #else
86
+ #elif defined(_SILICON_LABS_32B_SERIES_2)
70
87
MSC_ErasePage ((uint32_t *) addr);
88
+ #elif defined(_SILICON_LABS_32B_SERIES_3)
89
+ sl_status_t status;
90
+ uint32_t * data_start = NULL ;
91
+ size_t data_size;
92
+
93
+ status = sl_se_data_region_get_location (&cmd_ctx, (void **) &data_start, &data_size);
94
+ VerifyOrReturnError (status == SL_STATUS_OK, CHIP_ERROR (status));
95
+ VerifyOrReturnError (GENERIC_ADDRESS (addr) > GENERIC_ADDRESS ((uint32_t ) data_start), CHIP_ERROR_INVALID_ADDRESS);
96
+ status = sl_se_data_region_erase (&cmd_ctx, (void *) addr, 1 ); // Erase one page
97
+ VerifyOrReturnError (status == SL_STATUS_OK, CHIP_ERROR (status));
71
98
#endif
72
99
return CHIP_NO_ERROR;
73
100
}
@@ -76,8 +103,18 @@ CHIP_ERROR WritePage(uint32_t addr, const uint8_t * data, size_t size)
76
103
{
77
104
#ifdef SLI_SI91X_MCU_INTERFACE
78
105
rsi_flash_write ((uint32_t *) addr, (unsigned char *) data, size);
79
- #else
106
+ #elif defined(_SILICON_LABS_32B_SERIES_2)
80
107
MSC_WriteWord ((uint32_t *) addr, data, size);
108
+ #elif defined(_SILICON_LABS_32B_SERIES_3)
109
+ sl_status_t status;
110
+ uint32_t * data_start = NULL ;
111
+ size_t data_size;
112
+
113
+ status = sl_se_data_region_get_location (&cmd_ctx, (void **) &data_start, &data_size);
114
+ VerifyOrReturnError (status == SL_STATUS_OK, CHIP_ERROR (status));
115
+ VerifyOrReturnError (GENERIC_ADDRESS (addr) > GENERIC_ADDRESS ((uint32_t ) data_start), CHIP_ERROR_INVALID_ADDRESS);
116
+ status = sl_se_data_region_write (&cmd_ctx, (void *) addr, data, size);
117
+ VerifyOrReturnError (status == SL_STATUS_OK, CHIP_ERROR (status));
81
118
#endif
82
119
return CHIP_NO_ERROR;
83
120
}
@@ -161,7 +198,15 @@ CHIP_ERROR Storage::Initialize(uint32_t flash_addr, uint32_t flash_size)
161
198
{
162
199
#ifndef SLI_SI91X_MCU_INTERFACE
163
200
base_addr = (flash_addr + flash_size - FLASH_PAGE_SIZE);
201
+
202
+ #ifdef _SILICON_LABS_32B_SERIES_2
164
203
MSC_Init ();
204
+ #elif defined(_SILICON_LABS_32B_SERIES_3)
205
+ sl_status_t status;
206
+ status = sl_se_init ();
207
+ VerifyOrReturnError (status == SL_STATUS_OK, CHIP_ERROR_INTERNAL);
208
+ status = sl_se_init_command_context (&cmd_ctx);
209
+ #endif // _SILICON_LABS_32B_SERIES
165
210
#endif // SLI_SI91X_MCU_INTERFACE
166
211
#ifdef SL_PROVISION_GENERATOR
167
212
setNvm3End (base_addr);
0 commit comments