Skip to content

Commit 6592e85

Browse files
author
offirko
committed
Added utility function to help locate expected internal flash tdbstore position.
(Supporting FILESYSTEM and TDB_EXTERNAL configuration only)
1 parent bb0d1af commit 6592e85

File tree

3 files changed

+115
-11
lines changed

3 files changed

+115
-11
lines changed

features/storage/TESTS/kvstore/direct_access_devicekey_test/main.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,18 @@ void test_direct_access_to_device_inject_root()
278278

279279
uint32_t tdb_st_add = 0;
280280
uint32_t tdb_end_add = 0;
281-
282281
ret = get_virtual_TDBStore_position(internal_start_address, internal_rbp_size, is_conf_tdb_internal, &tdb_st_add, &tdb_end_add);
283282
TEST_SKIP_UNLESS_MESSAGE(ret != -2, "Test skipped. Not enough available space on Internal FlashIAP");
284283
TEST_ASSERT_EQUAL(0, ret);
285284

285+
uint32_t expected_tdb_st_add = 0;
286+
uint32_t expected_tdb_end_add = 0;
287+
ret = get_expected_internal_TDBStore_position(&expected_tdb_st_add, &expected_tdb_end_add);
288+
if (ret == MBED_SUCCESS) {
289+
TEST_ASSERT_EQUAL(expected_tdb_st_add, tdb_st_add);
290+
TEST_ASSERT_EQUAL(expected_tdb_end_add, tdb_end_add);
291+
}
292+
286293
memset(rkey, 0, sizeof(rkey));
287294
size_t actual_data_size = 0;
288295
ret = ((TDBStore *)inner_store)->reserved_data_get(rkey, DEVICE_KEY_16BYTE, &actual_data_size);

features/storage/kvstore/tdbstore/DirectAccessDevicekey.cpp

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,16 @@ typedef struct {
4242
#define MAX_DEVICEKEY_DATA_SIZE 64
4343
#define RESERVED_AREA_SIZE (MAX_DEVICEKEY_DATA_SIZE+sizeof(reserved_trailer_t)) /* DeviceKey Max Data size + metadata trailer */
4444

45+
#define STR_EXPAND(tok) #tok
46+
#define STR(tok) STR_EXPAND(tok)
47+
4548
// -------------------------------------------------- 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,
4750
tdbstore_area_data_t *area_params);
4851
static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
4952
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);
5055
static uint32_t calc_crc(uint32_t init_crc, uint32_t data_size, const void *data_buf);
5156

5257
// -------------------------------------------------- API Functions Implementation ----------------------------------------------------
@@ -97,38 +102,100 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
97102
exit_point:
98103
if (true == is_flash_init) {
99104
flash.deinit();
100-
is_flash_init = false;
101105
}
102106

103107
return status;
104108
}
105109

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+
106173
// -------------------------------------------------- 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,
108175
tdbstore_area_data_t *area_params)
109176
{
110177
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);
112179
uint32_t erase_unit_size = initial_erase_size;
113180
size_t cur_area_size = 0;
114181

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)) ||
116183
(tdb_end_offset > (flash->get_flash_start() + flash->get_flash_size()))) {
117184
tr_error("calc_area_params failed - Invalid input addresses");
118185
return MBED_ERROR_INVALID_ARGUMENT;
119186
}
120187

121188
// 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);
123190

124191
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);
126193
cur_area_size += erase_unit_size;
127194
}
128195

129-
area_params[0].address = tdb_start_offset;
196+
area_params[0].address = out_tdb_start_offset;
130197
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;
132199
area_params[1].size = bd_size - cur_area_size;
133200

134201
return MBED_SUCCESS;
@@ -137,7 +204,7 @@ static int calc_area_params(FlashIAP *flash, uint32_t tdb_start_offset, uint32_t
137204
static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
138205
size_t reserved_data_buf_size, size_t *actual_data_size_ptr)
139206
{
140-
int status = MBED_SUCCESS;;
207+
int status = MBED_SUCCESS;
141208
reserved_trailer_t trailer;
142209
uint8_t *buf;
143210
int ret = MBED_SUCCESS;
@@ -196,6 +263,16 @@ static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params,
196263
return status;
197264
}
198265

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+
199276
static uint32_t calc_crc(uint32_t init_crc, uint32_t data_size, const void *data_buf)
200277
{
201278
uint32_t crc;

features/storage/kvstore/tdbstore/DirectAccessDevicekey.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,24 @@
3939
int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offset, void *data_buf,
4040
size_t data_buf_size, size_t *actual_data_size_ptr);
4141

42+
/**
43+
* @brief Returns the expected tdb internal position.
44+
* Limitations:
45+
* 1. supporting FILESYSTEM or TDB_EXTERNAL configuration only
46+
* 2. supporting either both start_address and size are explicitly given (different than zero)
47+
* or both of them are zero (default configuration)
48+
*
49+
* @param[out] out_tdb_start_offset Expected FlashIAP Start address offset of tdb store
50+
* @param[out] out_tdb_end_offset Expected FlashIAP End address offset of tdb store
51+
*
52+
* @returns MBED_ERROR_FAILED_OPERATION internal flash failure
53+
* MBED_ERROR_UNSUPPORTED kvstore configuration different than FILESYSTEM or TDB_EXTERNAL
54+
* or start_address or size are different than 0 and the other isn't
55+
* MBED_ERROR_INVALID_OPERATION tdb_start_offset or tdb_end_offset are not aligned or lower
56+
* than end of code segment (when using default configuration)
57+
* MBED_SUCCESS successful
58+
*
59+
*/
60+
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset);
61+
4262
#endif /* MBED_DIRECT_ACCESS_DEVICEKEY_H */

0 commit comments

Comments
 (0)