@@ -42,11 +42,16 @@ typedef struct {
42
42
#define MAX_DEVICEKEY_DATA_SIZE 64
43
43
#define RESERVED_AREA_SIZE (MAX_DEVICEKEY_DATA_SIZE+sizeof (reserved_trailer_t )) /* DeviceKey Max Data size + metadata trailer */
44
44
45
+ #define STR_EXPAND (tok ) #tok
46
+ #define STR (tok ) STR_EXPAND(tok)
47
+
45
48
// -------------------------------------------------- Local Functions Declaration ----------------------------------------------------
46
- static int calc_area_params (FlashIAP *flash, uint32_t tdb_start_offset , uint32_t tdb_end_offset,
49
+ static int calc_area_params (FlashIAP *flash, uint32_t out_tdb_start_offset , uint32_t tdb_end_offset,
47
50
tdbstore_area_data_t *area_params);
48
51
static int reserved_data_get (FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
49
52
size_t reserved_data_buf_size, size_t *actual_data_size_ptr);
53
+ static inline uint32_t align_up (uint64_t val, uint64_t size);
54
+ static inline uint32_t align_down (uint64_t val, uint64_t size);
50
55
static uint32_t calc_crc (uint32_t init_crc, uint32_t data_size, const void *data_buf);
51
56
52
57
// -------------------------------------------------- API Functions Implementation ----------------------------------------------------
@@ -97,38 +102,100 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
97
102
exit_point:
98
103
if (true == is_flash_init) {
99
104
flash.deinit ();
100
- is_flash_init = false ;
101
105
}
102
106
103
107
return status;
104
108
}
105
109
110
+ int get_expected_internal_TDBStore_position (uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
111
+ {
112
+ uint32_t flash_end_address;
113
+ uint32_t flash_start_address;
114
+ uint32_t aligned_start_address;
115
+ uint32_t aligned_end_address;
116
+ FlashIAP flash;
117
+ bool is_default_configuration = false ;
118
+ uint32_t tdb_size;
119
+
120
+ if (strcmp (STR (MBED_CONF_STORAGE_STORAGE_TYPE), " FILESYSTEM" ) == 0 ) {
121
+ *out_tdb_start_offset = MBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS;
122
+ tdb_size = MBED_CONF_STORAGE_FILESYSTEM_RBP_INTERNAL_SIZE;
123
+ } else if (strcmp (STR (MBED_CONF_STORAGE_STORAGE_TYPE), " TDB_EXTERNAL" ) == 0 ) {
124
+ *out_tdb_start_offset = MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
125
+ tdb_size = MBED_CONF_STORAGE_TDB_EXTERNAL_RBP_INTERNAL_SIZE;
126
+ } else {
127
+ return MBED_ERROR_UNSUPPORTED;
128
+ }
129
+
130
+ *out_tdb_end_offset = (*out_tdb_start_offset) + tdb_size;
131
+
132
+ if ((*out_tdb_start_offset == 0 ) && (tdb_size == 0 )) {
133
+ is_default_configuration = true ;
134
+ } else if ((*out_tdb_start_offset == 0 ) || (tdb_size == 0 )) {
135
+ return MBED_ERROR_UNSUPPORTED;
136
+ }
137
+
138
+ int ret = flash.init ();
139
+ if (ret != 0 ) {
140
+ return MBED_ERROR_FAILED_OPERATION;
141
+ }
142
+
143
+ uint32_t flash_first_writable_sector_address = (uint32_t )(align_up (FLASHIAP_APP_ROM_END_ADDR,
144
+ flash.get_sector_size (FLASHIAP_APP_ROM_END_ADDR)));
145
+
146
+ // Get flash parameters before starting
147
+ flash_start_address = flash.get_flash_start ();
148
+ flash_end_address = flash_start_address + flash.get_flash_size ();
149
+
150
+ if (!is_default_configuration) {
151
+ aligned_start_address = align_down (*out_tdb_start_offset, flash.get_sector_size (*out_tdb_start_offset));
152
+ aligned_end_address = align_up (*out_tdb_end_offset, flash.get_sector_size (*out_tdb_end_offset - 1 ));
153
+ if ((*out_tdb_start_offset != aligned_start_address) || (*out_tdb_end_offset != aligned_end_address)
154
+ || (*out_tdb_end_offset > flash_end_address)) {
155
+ flash.deinit ();
156
+ return MBED_ERROR_INVALID_OPERATION;
157
+ }
158
+ } else {
159
+ aligned_start_address = flash_end_address - (flash.get_sector_size (flash_end_address - 1 ) * 2 );
160
+ if (aligned_start_address < flash_first_writable_sector_address) {
161
+ flash.deinit ();
162
+ return MBED_ERROR_INVALID_OPERATION;
163
+ }
164
+ *out_tdb_start_offset = aligned_start_address;
165
+ *out_tdb_end_offset = flash_end_address;
166
+ }
167
+
168
+ flash.deinit ();
169
+
170
+ return MBED_SUCCESS;
171
+ }
172
+
106
173
// -------------------------------------------------- Local Functions Implementation ----------------------------------------------------
107
- static int calc_area_params (FlashIAP *flash, uint32_t tdb_start_offset , uint32_t tdb_end_offset,
174
+ static int calc_area_params (FlashIAP *flash, uint32_t out_tdb_start_offset , uint32_t tdb_end_offset,
108
175
tdbstore_area_data_t *area_params)
109
176
{
110
177
uint32_t bd_size = 0 ;
111
- uint32_t initial_erase_size = flash->get_sector_size (tdb_start_offset );
178
+ uint32_t initial_erase_size = flash->get_sector_size (out_tdb_start_offset );
112
179
uint32_t erase_unit_size = initial_erase_size;
113
180
size_t cur_area_size = 0 ;
114
181
115
- if ((tdb_end_offset < (tdb_start_offset + 2 * RESERVED_AREA_SIZE - 1 )) ||
182
+ if ((tdb_end_offset < (out_tdb_start_offset + 2 * RESERVED_AREA_SIZE - 1 )) ||
116
183
(tdb_end_offset > (flash->get_flash_start () + flash->get_flash_size ()))) {
117
184
tr_error (" calc_area_params failed - Invalid input addresses" );
118
185
return MBED_ERROR_INVALID_ARGUMENT;
119
186
}
120
187
121
188
// Entire TDBStore can't exceed 32 bits
122
- bd_size = (tdb_end_offset - tdb_start_offset + 1 );
189
+ bd_size = (tdb_end_offset - out_tdb_start_offset + 1 );
123
190
124
191
while (cur_area_size < bd_size / 2 ) {
125
- erase_unit_size = flash->get_sector_size (tdb_start_offset + cur_area_size);
192
+ erase_unit_size = flash->get_sector_size (out_tdb_start_offset + cur_area_size);
126
193
cur_area_size += erase_unit_size;
127
194
}
128
195
129
- area_params[0 ].address = tdb_start_offset ;
196
+ area_params[0 ].address = out_tdb_start_offset ;
130
197
area_params[0 ].size = cur_area_size;
131
- area_params[1 ].address = tdb_start_offset + cur_area_size;
198
+ area_params[1 ].address = out_tdb_start_offset + cur_area_size;
132
199
area_params[1 ].size = bd_size - cur_area_size;
133
200
134
201
return MBED_SUCCESS;
@@ -137,7 +204,7 @@ static int calc_area_params(FlashIAP *flash, uint32_t tdb_start_offset, uint32_t
137
204
static int reserved_data_get (FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
138
205
size_t reserved_data_buf_size, size_t *actual_data_size_ptr)
139
206
{
140
- int status = MBED_SUCCESS;;
207
+ int status = MBED_SUCCESS;
141
208
reserved_trailer_t trailer;
142
209
uint8_t *buf;
143
210
int ret = MBED_SUCCESS;
@@ -196,6 +263,16 @@ static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params,
196
263
return status;
197
264
}
198
265
266
+ static inline uint32_t align_up (uint64_t val, uint64_t size)
267
+ {
268
+ return (((val - 1 ) / size) + 1 ) * size;
269
+ }
270
+
271
+ static inline uint32_t align_down (uint64_t val, uint64_t size)
272
+ {
273
+ return (((val) / size)) * size;
274
+ }
275
+
199
276
static uint32_t calc_crc (uint32_t init_crc, uint32_t data_size, const void *data_buf)
200
277
{
201
278
uint32_t crc;
0 commit comments