mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Added utility function to help locate expected internal flash tdbstore position.
(Supporting FILESYSTEM and TDB_EXTERNAL configuration only)pull/9215/head
							parent
							
								
									bb0d1afa9a
								
							
						
					
					
						commit
						6592e85c13
					
				| 
						 | 
				
			
			@ -278,11 +278,18 @@ void test_direct_access_to_device_inject_root()
 | 
			
		|||
 | 
			
		||||
    uint32_t tdb_st_add = 0;
 | 
			
		||||
    uint32_t tdb_end_add = 0;
 | 
			
		||||
 | 
			
		||||
    ret = get_virtual_TDBStore_position(internal_start_address, internal_rbp_size, is_conf_tdb_internal, &tdb_st_add, &tdb_end_add);
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(ret != -2, "Test skipped. Not enough available space on Internal FlashIAP");
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, ret);
 | 
			
		||||
 | 
			
		||||
    uint32_t expected_tdb_st_add = 0;
 | 
			
		||||
    uint32_t expected_tdb_end_add = 0;
 | 
			
		||||
    ret = get_expected_internal_TDBStore_position(&expected_tdb_st_add, &expected_tdb_end_add);
 | 
			
		||||
    if (ret ==  MBED_SUCCESS) {
 | 
			
		||||
        TEST_ASSERT_EQUAL(expected_tdb_st_add, tdb_st_add);
 | 
			
		||||
        TEST_ASSERT_EQUAL(expected_tdb_end_add, tdb_end_add);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(rkey, 0, sizeof(rkey));
 | 
			
		||||
    size_t actual_data_size = 0;
 | 
			
		||||
    ret = ((TDBStore *)inner_store)->reserved_data_get(rkey, DEVICE_KEY_16BYTE, &actual_data_size);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,11 +42,16 @@ typedef struct {
 | 
			
		|||
#define MAX_DEVICEKEY_DATA_SIZE 64
 | 
			
		||||
#define RESERVED_AREA_SIZE (MAX_DEVICEKEY_DATA_SIZE+sizeof(reserved_trailer_t)) /* DeviceKey Max Data size + metadata trailer */
 | 
			
		||||
 | 
			
		||||
#define STR_EXPAND(tok) #tok
 | 
			
		||||
#define STR(tok) STR_EXPAND(tok)
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------- Local Functions Declaration ----------------------------------------------------
 | 
			
		||||
static int calc_area_params(FlashIAP *flash, uint32_t tdb_start_offset, uint32_t tdb_end_offset,
 | 
			
		||||
static int calc_area_params(FlashIAP *flash, uint32_t out_tdb_start_offset, uint32_t tdb_end_offset,
 | 
			
		||||
                            tdbstore_area_data_t *area_params);
 | 
			
		||||
static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
 | 
			
		||||
                             size_t reserved_data_buf_size, size_t *actual_data_size_ptr);
 | 
			
		||||
static inline uint32_t align_up(uint64_t val, uint64_t size);
 | 
			
		||||
static inline uint32_t align_down(uint64_t val, uint64_t size);
 | 
			
		||||
static uint32_t calc_crc(uint32_t init_crc, uint32_t data_size, const void *data_buf);
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------- API Functions Implementation ----------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -97,38 +102,100 @@ int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offse
 | 
			
		|||
exit_point:
 | 
			
		||||
    if (true == is_flash_init) {
 | 
			
		||||
        flash.deinit();
 | 
			
		||||
        is_flash_init = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int  get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t flash_end_address;
 | 
			
		||||
    uint32_t flash_start_address;
 | 
			
		||||
    uint32_t aligned_start_address;
 | 
			
		||||
    uint32_t aligned_end_address;
 | 
			
		||||
    FlashIAP flash;
 | 
			
		||||
    bool is_default_configuration = false;
 | 
			
		||||
    uint32_t tdb_size;
 | 
			
		||||
 | 
			
		||||
    if (strcmp(STR(MBED_CONF_STORAGE_STORAGE_TYPE), "FILESYSTEM") == 0) {
 | 
			
		||||
        *out_tdb_start_offset =  MBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS;
 | 
			
		||||
        tdb_size = MBED_CONF_STORAGE_FILESYSTEM_RBP_INTERNAL_SIZE;
 | 
			
		||||
    } else if (strcmp(STR(MBED_CONF_STORAGE_STORAGE_TYPE), "TDB_EXTERNAL") == 0) {
 | 
			
		||||
        *out_tdb_start_offset =  MBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS;
 | 
			
		||||
        tdb_size = MBED_CONF_STORAGE_TDB_EXTERNAL_RBP_INTERNAL_SIZE;
 | 
			
		||||
    } else {
 | 
			
		||||
        return MBED_ERROR_UNSUPPORTED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *out_tdb_end_offset = (*out_tdb_start_offset) + tdb_size;
 | 
			
		||||
 | 
			
		||||
    if ((*out_tdb_start_offset == 0) && (tdb_size == 0)) {
 | 
			
		||||
        is_default_configuration = true;
 | 
			
		||||
    } else if ((*out_tdb_start_offset == 0) || (tdb_size == 0)) {
 | 
			
		||||
        return MBED_ERROR_UNSUPPORTED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int ret = flash.init();
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        return MBED_ERROR_FAILED_OPERATION;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint32_t flash_first_writable_sector_address = (uint32_t)(align_up(FLASHIAP_APP_ROM_END_ADDR,
 | 
			
		||||
                                                                       flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR)));
 | 
			
		||||
 | 
			
		||||
    //Get flash parameters before starting
 | 
			
		||||
    flash_start_address = flash.get_flash_start();
 | 
			
		||||
    flash_end_address = flash_start_address + flash.get_flash_size();
 | 
			
		||||
 | 
			
		||||
    if (!is_default_configuration) {
 | 
			
		||||
        aligned_start_address = align_down(*out_tdb_start_offset, flash.get_sector_size(*out_tdb_start_offset));
 | 
			
		||||
        aligned_end_address = align_up(*out_tdb_end_offset, flash.get_sector_size(*out_tdb_end_offset - 1));
 | 
			
		||||
        if ((*out_tdb_start_offset != aligned_start_address) || (*out_tdb_end_offset != aligned_end_address)
 | 
			
		||||
                || (*out_tdb_end_offset > flash_end_address)) {
 | 
			
		||||
            flash.deinit();
 | 
			
		||||
            return MBED_ERROR_INVALID_OPERATION;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        aligned_start_address = flash_end_address - (flash.get_sector_size(flash_end_address - 1) * 2);
 | 
			
		||||
        if (aligned_start_address < flash_first_writable_sector_address) {
 | 
			
		||||
            flash.deinit();
 | 
			
		||||
            return MBED_ERROR_INVALID_OPERATION;
 | 
			
		||||
        }
 | 
			
		||||
        *out_tdb_start_offset = aligned_start_address;
 | 
			
		||||
        *out_tdb_end_offset = flash_end_address;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flash.deinit();
 | 
			
		||||
 | 
			
		||||
    return MBED_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------- Local Functions Implementation ----------------------------------------------------
 | 
			
		||||
static int calc_area_params(FlashIAP *flash, uint32_t tdb_start_offset, uint32_t tdb_end_offset,
 | 
			
		||||
static int calc_area_params(FlashIAP *flash, uint32_t out_tdb_start_offset, uint32_t tdb_end_offset,
 | 
			
		||||
                            tdbstore_area_data_t *area_params)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t bd_size = 0;
 | 
			
		||||
    uint32_t initial_erase_size = flash->get_sector_size(tdb_start_offset);
 | 
			
		||||
    uint32_t initial_erase_size = flash->get_sector_size(out_tdb_start_offset);
 | 
			
		||||
    uint32_t erase_unit_size = initial_erase_size;
 | 
			
		||||
    size_t cur_area_size = 0;
 | 
			
		||||
 | 
			
		||||
    if ((tdb_end_offset < (tdb_start_offset + 2 * RESERVED_AREA_SIZE - 1)) ||
 | 
			
		||||
    if ((tdb_end_offset < (out_tdb_start_offset + 2 * RESERVED_AREA_SIZE - 1)) ||
 | 
			
		||||
            (tdb_end_offset > (flash->get_flash_start() + flash->get_flash_size()))) {
 | 
			
		||||
        tr_error("calc_area_params failed - Invalid input addresses");
 | 
			
		||||
        return MBED_ERROR_INVALID_ARGUMENT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Entire TDBStore can't exceed 32 bits
 | 
			
		||||
    bd_size = (tdb_end_offset - tdb_start_offset + 1);
 | 
			
		||||
    bd_size = (tdb_end_offset - out_tdb_start_offset + 1);
 | 
			
		||||
 | 
			
		||||
    while (cur_area_size < bd_size / 2) {
 | 
			
		||||
        erase_unit_size = flash->get_sector_size(tdb_start_offset + cur_area_size);
 | 
			
		||||
        erase_unit_size = flash->get_sector_size(out_tdb_start_offset + cur_area_size);
 | 
			
		||||
        cur_area_size += erase_unit_size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    area_params[0].address = tdb_start_offset;
 | 
			
		||||
    area_params[0].address = out_tdb_start_offset;
 | 
			
		||||
    area_params[0].size = cur_area_size;
 | 
			
		||||
    area_params[1].address = tdb_start_offset + cur_area_size;
 | 
			
		||||
    area_params[1].address = out_tdb_start_offset + cur_area_size;
 | 
			
		||||
    area_params[1].size = bd_size - cur_area_size;
 | 
			
		||||
 | 
			
		||||
    return MBED_SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +204,7 @@ static int calc_area_params(FlashIAP *flash, uint32_t tdb_start_offset, uint32_t
 | 
			
		|||
static int reserved_data_get(FlashIAP *flash, tdbstore_area_data_t *area_params, void *reserved_data_buf,
 | 
			
		||||
                             size_t reserved_data_buf_size, size_t *actual_data_size_ptr)
 | 
			
		||||
{
 | 
			
		||||
    int status = MBED_SUCCESS;;
 | 
			
		||||
    int status = MBED_SUCCESS;
 | 
			
		||||
    reserved_trailer_t trailer;
 | 
			
		||||
    uint8_t *buf;
 | 
			
		||||
    int ret = MBED_SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +263,16 @@ exit_point:
 | 
			
		|||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t align_up(uint64_t val, uint64_t size)
 | 
			
		||||
{
 | 
			
		||||
    return (((val - 1) / size) + 1) * size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t align_down(uint64_t val, uint64_t size)
 | 
			
		||||
{
 | 
			
		||||
    return (((val) / size)) * size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t calc_crc(uint32_t init_crc, uint32_t data_size, const void *data_buf)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t crc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,4 +39,24 @@
 | 
			
		|||
int direct_access_to_devicekey(uint32_t tdb_start_offset, uint32_t tdb_end_offset, void *data_buf,
 | 
			
		||||
                               size_t data_buf_size, size_t *actual_data_size_ptr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Returns the expected tdb internal position.
 | 
			
		||||
 *        Limitations:
 | 
			
		||||
 *        1. supporting FILESYSTEM or TDB_EXTERNAL configuration only
 | 
			
		||||
 *        2. supporting either both start_address and size are explicitly given (different than zero)
 | 
			
		||||
 *           or both of them are zero (default configuration)
 | 
			
		||||
 *
 | 
			
		||||
 * @param[out]  out_tdb_start_offset Expected FlashIAP Start address offset of tdb store
 | 
			
		||||
 * @param[out]  out_tdb_end_offset   Expected FlashIAP End address offset of tdb store
 | 
			
		||||
 *
 | 
			
		||||
 * @returns MBED_ERROR_FAILED_OPERATION    internal flash failure
 | 
			
		||||
 *          MBED_ERROR_UNSUPPORTED         kvstore configuration different than FILESYSTEM or TDB_EXTERNAL
 | 
			
		||||
 *                                         or start_address or size are different than 0 and the other isn't
 | 
			
		||||
 *          MBED_ERROR_INVALID_OPERATION   tdb_start_offset or tdb_end_offset are not aligned or lower
 | 
			
		||||
 *                                         than end of code segment (when using default configuration)
 | 
			
		||||
 *          MBED_SUCCESS                   successful
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int get_expected_internal_TDBStore_position(uint32_t *out_tdb_start_offset, uint32_t *out_tdb_end_offset);
 | 
			
		||||
 | 
			
		||||
#endif /* MBED_DIRECT_ACCESS_DEVICEKEY_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue