Skip to content

Commit 2814f11

Browse files
author
Kyle Kearney
committed
Move TDB bounds computation for better reuse
Migrate into TDBStore so that DirectAccessDeviceKey can use it as well.
1 parent ff71b0b commit 2814f11

File tree

4 files changed

+184
-178
lines changed

4 files changed

+184
-178
lines changed

features/storage/kvstore/conf/kv_config.cpp

Lines changed: 2 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -266,140 +266,10 @@ FileSystem *_get_filesystem_default(const char *mount)
266266
#endif
267267
}
268268

269-
int get_default_flash_addresses(bd_addr_t *start_address, bd_size_t *size)
270-
{
271-
int ret = MBED_SUCCESS;
272-
273-
#if COMPONENT_FLASHIAP
274-
FlashIAP flash;
275-
if (flash.init() != 0) {
276-
return MBED_ERROR_INITIALIZATION_FAILED;
277-
}
278-
279-
// Use the last 2 sectors or 10 pages of flash for the TDBStore by default (whichever is larger)
280-
// For each area: must be a minimum of 1 page of reserved and 2 pages for master record
281-
static const int STORE_SECTORS = 2;
282-
static const int STORE_PAGES = 10;
283-
284-
// Let's work from end of the flash backwards
285-
bd_addr_t curr_addr = flash.get_flash_start() + flash.get_flash_size();
286-
bd_size_t sector_space = 0;
287-
288-
for (int i = STORE_SECTORS; i; i--) {
289-
bd_size_t sector_size = flash.get_sector_size(curr_addr - 1);
290-
sector_space += sector_size;
291-
}
292-
293-
bd_size_t page_space = flash.get_page_size() * STORE_PAGES;
294-
if (sector_space > page_space) {
295-
curr_addr -= sector_space;
296-
*size = sector_space;
297-
} else {
298-
curr_addr -= page_space;
299-
*size = page_space;
300-
}
301-
302-
// Store- and application-sectors mustn't overlap
303-
uint32_t first_wrtbl_sector_addr =
304-
(uint32_t)(align_up(FLASHIAP_APP_ROM_END_ADDR, flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR)));
305-
306-
MBED_ASSERT(curr_addr >= first_wrtbl_sector_addr);
307-
if (curr_addr < first_wrtbl_sector_addr) {
308-
ret = MBED_ERROR_MEDIA_FULL;
309-
} else {
310-
*start_address = curr_addr;
311-
}
312-
313-
flash.deinit();
314-
#endif
315-
316-
return ret;
317-
}
318-
319-
int get_flash_bounds_from_config(bd_addr_t *start_address, bd_size_t *size)
320-
{
321-
#if COMPONENT_FLASHIAP
322-
323-
bd_addr_t flash_end_address;
324-
bd_addr_t flash_start_address;
325-
bd_addr_t flash_first_writable_sector_address;
326-
bd_addr_t aligned_start_address;
327-
bd_addr_t aligned_end_address;
328-
bd_addr_t end_address;
329-
FlashIAP flash;
330-
331-
if (!start_address || !size) {
332-
return MBED_ERROR_INVALID_ARGUMENT;
333-
}
334-
335-
int ret = flash.init();
336-
if (ret != 0) {
337-
return MBED_ERROR_INITIALIZATION_FAILED;
338-
}
339-
340-
// Get flash parameters
341-
flash_first_writable_sector_address = align_up(FLASHIAP_APP_ROM_END_ADDR, flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR));
342-
flash_start_address = flash.get_flash_start();
343-
flash_end_address = flash_start_address + flash.get_flash_size();
344-
345-
if (*start_address == 0) {
346-
if (*size == 0) {
347-
flash.deinit();
348-
return MBED_ERROR_INVALID_ARGUMENT;
349-
}
350-
351-
*start_address = flash_end_address - *size;
352-
aligned_start_address = align_down(*start_address, flash.get_sector_size(*start_address));
353-
if (*start_address != aligned_start_address) {
354-
// Start address not aligned - size should likely be changed so that it is
355-
flash.deinit();
356-
return MBED_ERROR_INVALID_SIZE;
357-
}
358-
} else {
359-
aligned_start_address = align_down(*start_address, flash.get_sector_size(*start_address));
360-
if (*start_address != aligned_start_address) {
361-
// Start address not aligned - size should likely be changed so that it is
362-
flash.deinit();
363-
return MBED_ERROR_INVALID_SIZE;
364-
}
365-
366-
if (*size == 0) {
367-
//The block device will have all space from start address to the end of the flash
368-
*size = (flash_end_address - *start_address);
369-
} else {
370-
// Do checks on end address to make sure configured start address/size are good
371-
372-
end_address = *start_address + *size;
373-
if (end_address > flash_end_address) {
374-
// End address is out of flash bounds
375-
flash.deinit();
376-
return MBED_ERROR_INVALID_SIZE;
377-
}
378-
379-
aligned_end_address = align_up(end_address, flash.get_sector_size(end_address - 1));
380-
if (end_address != aligned_end_address) {
381-
// End address not aligned - size should likely be changed so that it is
382-
flash.deinit();
383-
return MBED_ERROR_INVALID_SIZE;
384-
}
385-
}
386-
}
387-
388-
flash.deinit();
389-
390-
if (*start_address < flash_first_writable_sector_address) {
391-
// Calculated start address overlaps with ROM
392-
return MBED_ERROR_MEDIA_FULL;
393-
}
394-
#endif
395-
396-
return MBED_SUCCESS;
397-
}
398-
399269
BlockDevice *_get_blockdevice_FLASHIAP(bd_addr_t &start_address, bd_size_t &size)
400270
{
401271
#if COMPONENT_FLASHIAP
402-
int ret = get_flash_bounds_from_config(&start_address, &size);
272+
int ret = TDBStore::get_flash_bounds_from_config(&start_address, &size);
403273
if (ret != 0) {
404274
tr_error("KV Config: Determination of internal block device bounds failed. The configured start address/size is likely invalid.");
405275
return NULL;
@@ -684,7 +554,7 @@ int _create_internal_tdb(BlockDevice **internal_bd, KVStore **internal_tdb, bd_s
684554
//Get the default address and size for the TDBStore
685555
if (*size == 0 && *start_address == 0) {
686556
//Calculate the block device size and start address in case default values are used.
687-
ret = get_default_flash_addresses(start_address, size);
557+
ret = TDBStore::get_default_flash_addresses(start_address, size);
688558
if (ret != MBED_SUCCESS) {
689559
return MBED_ERROR_FAILED_OPERATION;
690560
}

features/storage/kvstore/direct_access_devicekey/DirectAccessDevicekey.cpp

Lines changed: 19 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "mbed_error.h"
2323
#include "MbedCRC.h"
2424
#include "mbed_trace.h"
25+
#include "TDBStore.h"
2526
#define TRACE_GROUP "DADK"
2627

2728
using namespace mbed;
@@ -81,7 +82,7 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
8182

8283
status = calc_area_params(&flash, tdb_start_offset, tdb_end_offset, area_params);
8384
if (status != MBED_SUCCESS) {
84-
tr_error("Couldn't calulate Area Params - err: %d", status);
85+
tr_error("Couldn't calculate Area Params - err: %d", status);
8586
goto exit_point;
8687
}
8788

@@ -107,37 +108,33 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
107108
return status;
108109
}
109110

110-
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
111+
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
111112
{
112-
uint32_t flash_end_address;
113-
uint32_t flash_start_address;
114-
uint32_t aligned_start_address;
115-
uint32_t aligned_end_address;
113+
bd_addr_t tdb_start_address;
114+
bd_size_t tdb_size;
116115
FlashIAP flash;
117-
bool is_default_configuration = false;
118-
uint32_t tdb_size;
119116

120117
if (strcmp(STR(MBED_CONF_STORAGE_STORAGE_TYPE), "FILESYSTEM") == 0) {
121118
#ifndef MBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS
122119
return MBED_ERROR_ITEM_NOT_FOUND;
123120
#else
124-
*out_tdb_start_offset = MBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS;
121+
tdb_start_address = MBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS;
125122
tdb_size = MBED_CONF_STORAGE_FILESYSTEM_RBP_INTERNAL_SIZE;
126123
#endif
127124

128125
} else if (strcmp(STR(MBED_CONF_STORAGE_STORAGE_TYPE), "TDB_EXTERNAL") == 0) {
129126
#ifndef MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS
130127
return MBED_ERROR_ITEM_NOT_FOUND;
131128
#else
132-
*out_tdb_start_offset = MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
129+
tdb_start_address = MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
133130
tdb_size = MBED_CONF_STORAGE_TDB_EXTERNAL_RBP_INTERNAL_SIZE;
134131
#endif
135132

136133
} else if (strcmp(STR(MBED_CONF_STORAGE_STORAGE_TYPE), "TDB_INTERNAL") == 0) {
137134
#ifndef MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS
138135
return MBED_ERROR_ITEM_NOT_FOUND;
139136
#else
140-
*out_tdb_start_offset = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS;
137+
tdb_start_address = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS;
141138
tdb_size = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_SIZE;
142139
#endif
143140

@@ -146,7 +143,7 @@ int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uin
146143
return MBED_ERROR_ITEM_NOT_FOUND;
147144
#else
148145
#if COMPONENT_QSPIF || COMPONENT_SPIF || COMPONENT_DATAFLASH
149-
*out_tdb_start_offset = MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
146+
tdb_start_address = MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
150147
tdb_size = MBED_CONF_STORAGE_TDB_EXTERNAL_RBP_INTERNAL_SIZE;
151148
#elif COMPONENT_SD
152149
tdb_size = MBED_CONF_STORAGE_FILESYSTEM_RBP_INTERNAL_SIZE;
@@ -158,45 +155,21 @@ int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uin
158155
return MBED_ERROR_UNSUPPORTED;
159156
}
160157

161-
*out_tdb_end_offset = (*out_tdb_start_offset) + tdb_size;
162-
163-
if ((*out_tdb_start_offset == 0) && (tdb_size == 0)) {
164-
is_default_configuration = true;
165-
} else if ((*out_tdb_start_offset == 0) || (tdb_size == 0)) {
166-
return MBED_ERROR_UNSUPPORTED;
158+
int ret;
159+
if ((tdb_start_address == 0) && (tdb_size == 0)) {
160+
ret = TDBStore::get_default_flash_addresses(&tdb_start_address, &tdb_size);
161+
if (ret != MBED_SUCCESS) {
162+
return MBED_ERROR_FAILED_OPERATION;
163+
}
167164
}
168165

169-
int ret = flash.init();
170-
if (ret != 0) {
166+
ret = TDBStore::get_flash_bounds_from_config(&tdb_start_address, &tdb_size);
167+
if (ret != MBED_SUCCESS) {
171168
return MBED_ERROR_FAILED_OPERATION;
172169
}
173170

174-
uint32_t flash_first_writable_sector_address = (uint32_t)(align_up(FLASHIAP_APP_ROM_END_ADDR,
175-
flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR)));
176-
177-
//Get flash parameters before starting
178-
flash_start_address = flash.get_flash_start();
179-
flash_end_address = flash_start_address + flash.get_flash_size();
180-
181-
if (!is_default_configuration) {
182-
aligned_start_address = align_down(*out_tdb_start_offset, flash.get_sector_size(*out_tdb_start_offset));
183-
aligned_end_address = align_up(*out_tdb_end_offset, flash.get_sector_size(*out_tdb_end_offset - 1));
184-
if ((*out_tdb_start_offset != aligned_start_address) || (*out_tdb_end_offset != aligned_end_address)
185-
|| (*out_tdb_end_offset > flash_end_address)) {
186-
flash.deinit();
187-
return MBED_ERROR_INVALID_OPERATION;
188-
}
189-
} else {
190-
aligned_start_address = flash_end_address - (flash.get_sector_size(flash_end_address - 1) * 2);
191-
if (aligned_start_address < flash_first_writable_sector_address) {
192-
flash.deinit();
193-
return MBED_ERROR_INVALID_OPERATION;
194-
}
195-
*out_tdb_start_offset = aligned_start_address;
196-
*out_tdb_end_offset = flash_end_address;
197-
}
198-
199-
flash.deinit();
171+
*out_tdb_start_offset = tdb_start_address;
172+
*out_tdb_end_offset = tdb_start_address + tdb_size;
200173

201174
return MBED_SUCCESS;
202175
}

0 commit comments

Comments
 (0)