Skip to content

Commit cda0af6

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 afa88b7 commit cda0af6

File tree

4 files changed

+185
-178
lines changed

4 files changed

+185
-178
lines changed

features/storage/kvstore/conf/kv_config.cpp

Lines changed: 4 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -270,140 +270,10 @@ FileSystem *_get_filesystem_default(const char *mount)
270270
#endif
271271
}
272272

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

692-
int _create_internal_tdb(BlockDevice **internal_bd, KVStore **internal_tdb, bd_size_t *size, bd_addr_t *start_address) {
562+
int _create_internal_tdb(BlockDevice **internal_bd, KVStore **internal_tdb, bd_size_t *size, bd_addr_t *start_address)
563+
{
693564
int ret;
694565

695566
//Get the default address and size for the TDBStore
696567
if (*size == 0 && *start_address == 0) {
697568
//Calculate the block device size and start address in case default values are used.
698-
ret = get_default_flash_addresses(start_address, size);
569+
ret = TDBStore::get_default_flash_addresses(start_address, size);
699570
if (ret != MBED_SUCCESS) {
700571
return MBED_ERROR_FAILED_OPERATION;
701572
}

features/storage/kvstore/direct_access_devicekey/DirectAccessDevicekey.cpp

Lines changed: 18 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "mbed_error.h"
2424
#include "MbedCRC.h"
2525
#include "mbed_trace.h"
26+
#include "TDBStore.h"
2627
#define TRACE_GROUP "DADK"
2728

2829
using namespace mbed;
@@ -82,7 +83,7 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
8283

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

@@ -108,29 +109,25 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
108109
return status;
109110
}
110111

111-
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
112+
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
112113
{
113-
uint32_t flash_end_address;
114-
uint32_t flash_start_address;
115-
uint32_t aligned_start_address;
116-
uint32_t aligned_end_address;
114+
bd_addr_t tdb_start_address;
115+
bd_size_t tdb_size;
117116
FlashIAP flash;
118-
bool is_default_configuration = false;
119-
uint32_t tdb_size;
120117

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

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

@@ -139,52 +136,28 @@ int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uin
139136
#ifndef MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS
140137
return MBED_ERROR_ITEM_NOT_FOUND;
141138
#else
142-
*out_tdb_start_offset = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS;
139+
tdb_start_address = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS;
143140
tdb_size = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_SIZE;
144141
#endif
145142
} else {
146143
return MBED_ERROR_UNSUPPORTED;
147144
}
148145

149-
*out_tdb_end_offset = (*out_tdb_start_offset) + tdb_size;
150-
151-
if ((*out_tdb_start_offset == 0) && (tdb_size == 0)) {
152-
is_default_configuration = true;
153-
} else if ((*out_tdb_start_offset == 0) || (tdb_size == 0)) {
154-
return MBED_ERROR_UNSUPPORTED;
146+
int ret;
147+
if ((tdb_start_address == 0) && (tdb_size == 0)) {
148+
ret = TDBStore::get_default_flash_addresses(&tdb_start_address, &tdb_size);
149+
if (ret != MBED_SUCCESS) {
150+
return MBED_ERROR_FAILED_OPERATION;
151+
}
155152
}
156153

157-
int ret = flash.init();
158-
if (ret != 0) {
154+
ret = TDBStore::get_flash_bounds_from_config(&tdb_start_address, &tdb_size);
155+
if (ret != MBED_SUCCESS) {
159156
return MBED_ERROR_FAILED_OPERATION;
160157
}
161158

162-
uint32_t flash_first_writable_sector_address = (uint32_t)(align_up(FLASHIAP_APP_ROM_END_ADDR,
163-
flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR)));
164-
165-
//Get flash parameters before starting
166-
flash_start_address = flash.get_flash_start();
167-
flash_end_address = flash_start_address + flash.get_flash_size();
168-
169-
if (!is_default_configuration) {
170-
aligned_start_address = align_down(*out_tdb_start_offset, flash.get_sector_size(*out_tdb_start_offset));
171-
aligned_end_address = align_up(*out_tdb_end_offset, flash.get_sector_size(*out_tdb_end_offset - 1));
172-
if ((*out_tdb_start_offset != aligned_start_address) || (*out_tdb_end_offset != aligned_end_address)
173-
|| (*out_tdb_end_offset > flash_end_address)) {
174-
flash.deinit();
175-
return MBED_ERROR_INVALID_OPERATION;
176-
}
177-
} else {
178-
aligned_start_address = flash_end_address - (flash.get_sector_size(flash_end_address - 1) * 2);
179-
if (aligned_start_address < flash_first_writable_sector_address) {
180-
flash.deinit();
181-
return MBED_ERROR_INVALID_OPERATION;
182-
}
183-
*out_tdb_start_offset = aligned_start_address;
184-
*out_tdb_end_offset = flash_end_address;
185-
}
186-
187-
flash.deinit();
159+
*out_tdb_start_offset = tdb_start_address;
160+
*out_tdb_end_offset = tdb_start_address + tdb_size;
188161

189162
return MBED_SUCCESS;
190163
}

0 commit comments

Comments
 (0)