From f05f3fbde87a9ce45c6818f71b49cd13888fd457 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 7 Jun 2018 13:32:37 +0300 Subject: [PATCH] Added test for version update from V1 to V2. Problems for tests on host are fixed. Random function changed to esp_random() --- .../spi_flash/sim/stubs/log/include/esp_log.h | 6 +- components/wear_levelling/WL_Flash.cpp | 86 +++++++++--------- .../wear_levelling/doc/wl_sw_structure.rst | 7 +- .../wear_levelling/private_include/WL_Flash.h | 1 - .../wear_levelling/private_include/WL_State.h | 1 + components/wear_levelling/test/component.mk | 1 + .../wear_levelling/test/test_partition_v1.bin | Bin 0 -> 32768 bytes components/wear_levelling/test/test_wl.c | 54 ++++++++++- .../wear_levelling/test_wl_host/Makefile | 1 + .../test_wl_host/stubs/log/esp_random.c | 14 +++ .../stubs/log/include/esp_system.h | 15 +++ components/wear_levelling/wear_levelling.cpp | 1 - 12 files changed, 139 insertions(+), 48 deletions(-) create mode 100644 components/wear_levelling/test/test_partition_v1.bin create mode 100644 components/wear_levelling/test_wl_host/stubs/log/esp_random.c create mode 100644 components/wear_levelling/test_wl_host/stubs/log/include/esp_system.h diff --git a/components/spi_flash/sim/stubs/log/include/esp_log.h b/components/spi_flash/sim/stubs/log/include/esp_log.h index 6c9bb6f759..68cd216bce 100644 --- a/components/spi_flash/sim/stubs/log/include/esp_log.h +++ b/components/spi_flash/sim/stubs/log/include/esp_log.h @@ -44,11 +44,13 @@ void esp_log_write(esp_log_level_t level, const char* tag, const char* format, . #define ESP_LOGE( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_ERROR) { esp_log_write(ESP_LOG_ERROR, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } -#define ESP_LOGV( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_VERBOSE) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } +#define ESP_LOGW( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_WARN) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } + +#define ESP_LOGI( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_INFO) { esp_log_write(ESP_LOG_INFO, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } #define ESP_LOGD( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_DEBUG) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_FORMAT(D, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } -#define ESP_LOGW( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_WARN) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } +#define ESP_LOGV( tag, format, ... ) if (LOG_LOCAL_LEVEL >= ESP_LOG_VERBOSE) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } // Assume that flash encryption is not enabled. Put here since in partition.c // esp_log.h is included later than esp_flash_encrypt.h. diff --git a/components/wear_levelling/WL_Flash.cpp b/components/wear_levelling/WL_Flash.cpp index fec527a627..28e5d64804 100644 --- a/components/wear_levelling/WL_Flash.cpp +++ b/components/wear_levelling/WL_Flash.cpp @@ -12,11 +12,13 @@ // limitations under the License. #include +#include "esp_system.h" #include "esp_log.h" #include "WL_Flash.h" #include #include "crc32.h" #include +#include static const char *TAG = "wl_flash"; #ifndef WL_CFG_CRC_CONST @@ -143,7 +145,7 @@ esp_err_t WL_Flash::init() this->state.pos, this->state.move_count); - ESP_LOGD(TAG, "%s starts: crc1=%i, crc2 = %i, this->state.crc=%i, state_copy->crc=%i, version=%i, read_version=%i", __func__, crc1, crc2, this->state.crc, state_copy->crc, this->cfg.version, this->state.version); + ESP_LOGD(TAG, "%s starts: crc1= 0x%08x, crc2 = 0x%08x, this->state.crc= 0x%08x, state_copy->crc= 0x%08x, version=%i, read_version=%i", __func__, crc1, crc2, this->state.crc, state_copy->crc, this->cfg.version, this->state.version); if ((crc1 == this->state.crc) && (crc2 == state_copy->crc)) { // The state is OK. Check the ID if (this->state.version != this->cfg.version) { @@ -158,7 +160,7 @@ esp_err_t WL_Flash::init() result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); WL_RESULT_CHECK(result); for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size)*this->cfg.wr_size); i++) { - bool pos_bits = 0; + bool pos_bits; result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); WL_RESULT_CHECK(result); pos_bits = this->OkBuffSet(i); @@ -169,14 +171,16 @@ esp_err_t WL_Flash::init() } } } - ESP_LOGD(TAG, "%s: crc1=%i, crc2 = %i, result=%i", __func__, crc1, crc2, result); + ESP_LOGD(TAG, "%s: crc1=0x%08x, crc2 = 0x%08x, result= 0x%08x", __func__, crc1, crc2, (uint32_t)result); result = this->recoverPos(); WL_RESULT_CHECK(result); } } else if ((crc1 != this->state.crc) && (crc2 != state_copy->crc)) { // This is just new flash or new version // Check if this is new version or just new instance of WL + ESP_LOGD(TAG, "%s: try to update version - crc1= 0x%08x, crc2 = 0x%08x, result= 0x%08x", __func__, (uint32_t)crc1, (uint32_t)crc2, (uint32_t)result); result = this->updateVersion(); if (result == ESP_FAIL) { + ESP_LOGD(TAG, "%s: init flash sections", __func__); result = this->initSections(); WL_RESULT_CHECK(result); } @@ -190,7 +194,7 @@ esp_err_t WL_Flash::init() result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); WL_RESULT_CHECK(result); for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) { - bool pos_bits = 0; + bool pos_bits; result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); WL_RESULT_CHECK(result); pos_bits = this->OkBuffSet(i); @@ -207,7 +211,7 @@ esp_err_t WL_Flash::init() result = this->flash_drv->write(this->addr_state1, state_copy, sizeof(wl_state_t)); WL_RESULT_CHECK(result); for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) { - bool pos_bits = 0; + bool pos_bits; result = this->flash_drv->read(this->addr_state2 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); WL_RESULT_CHECK(result); @@ -230,11 +234,11 @@ esp_err_t WL_Flash::init() } if (result != ESP_OK) { this->initialized = false; - ESP_LOGE(TAG, "%s: returned 0x%x", __func__, (uint32_t)result); + ESP_LOGE(TAG, "%s: returned 0x%08x", __func__, (uint32_t)result); return result; } this->initialized = true; - ESP_LOGD(TAG, "%s - move_count=%08x", __func__, (uint32_t)this->state.move_count); + ESP_LOGD(TAG, "%s - move_count= 0x%08x", __func__, (uint32_t)this->state.move_count); return ESP_OK; } @@ -244,12 +248,12 @@ esp_err_t WL_Flash::recoverPos() size_t position = 0; ESP_LOGV(TAG, "%s start", __func__); for (size_t i = 0; i < this->state.max_pos; i++) { - bool pos_bits = false; + bool pos_bits; position = i; result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); pos_bits = this->OkBuffSet(i); WL_RESULT_CHECK(result); - ESP_LOGV(TAG, "%s - check pos: result=%i, position=%i, pos_bits=0x%08x", __func__, (uint32_t)result, (uint32_t)position, (uint32_t)pos_bits); + ESP_LOGV(TAG, "%s - check pos: result=0x%08x, position= %i, pos_bits= 0x%08x", __func__, (uint32_t)result, (uint32_t)position, (uint32_t)pos_bits); if (pos_bits == false) { break; // we have found position } @@ -259,8 +263,8 @@ esp_err_t WL_Flash::recoverPos() if (this->state.pos == this->state.max_pos) { this->state.pos--; } - ESP_LOGD(TAG, "%s - this->state.pos=0x%08x, position=0x%08x, result=%08x, max_pos=%08x", __func__, (uint32_t)this->state.pos, (uint32_t)position, (uint32_t)result, (uint32_t)this->state.max_pos); - ESP_LOGV(TAG, "%s done", __func__); + ESP_LOGD(TAG, "%s - this->state.pos= 0x%08x, position= 0x%08x, result= 0x%08x, max_pos= 0x%08x", __func__, (uint32_t)this->state.pos, (uint32_t)position, (uint32_t)result, (uint32_t)this->state.max_pos); + ESP_LOGV(TAG, "%s done", __func__); return result; } @@ -277,8 +281,8 @@ esp_err_t WL_Flash::initSections() } this->state.version = this->cfg.version; this->state.block_size = this->cfg.page_size; - this->used_bits = 0; - this->state.device_id = rand(); + this->state.device_id = esp_random(); + memset(this->state.reserved, 0, sizeof(this->state.reserved)); this->state.max_pos = 1 + this->flash_size / this->cfg.page_size; @@ -299,8 +303,8 @@ esp_err_t WL_Flash::initSections() result = this->flash_drv->write(this->addr_cfg, &this->cfg, sizeof(wl_config_t)); WL_RESULT_CHECK(result); - ESP_LOGD(TAG, "%s - this->state->max_count=%08x, this->state->max_pos=%08x", __func__, this->state.max_count, this->state.max_pos); - ESP_LOGD(TAG, "%s - result=%08x", __func__, result); + ESP_LOGD(TAG, "%s - this->state->max_count= 0x%08x, this->state->max_pos= 0x%08x", __func__, this->state.max_count, this->state.max_pos); + ESP_LOGD(TAG, "%s - result= 0x%08x", __func__, result); return result; } @@ -309,7 +313,7 @@ esp_err_t WL_Flash::updateVersion() esp_err_t result = ESP_OK; result = this->updateV1_V2(); - if (ESP_OK == result) return result; + if (result == ESP_OK) return result; // check next version return result; } @@ -319,7 +323,7 @@ esp_err_t WL_Flash::updateV1_V2() esp_err_t result = ESP_OK; // Check crc for old version and old version ESP_LOGV(TAG, "%s start", __func__); - int check_size = offsetof(wl_state_t, crc) - sizeof(uint32_t); + int check_size = offsetof(wl_state_t, device_id); // Chech CRC and recover state uint32_t crc1 = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, check_size); // For V1 crc in place of device_id and version @@ -329,14 +333,14 @@ esp_err_t WL_Flash::updateV1_V2() if ((crc1 == v1_crc) && (this->state.version == 1)){ // Here we have to update all internal structures - ESP_LOGV(TAG, "%s Update from V1 to V2", __func__); + ESP_LOGI(TAG, "%s Update from V1 to V2", __func__); uint32_t pos = 0; for (size_t i = 0; i < this->state.max_pos; i++) { - uint8_t pos_bits = 0; + uint8_t pos_bits; result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, &pos_bits, 1); WL_RESULT_CHECK(result); - ESP_LOGV(TAG, "%s- result=%i, pos=%i, pos_bits=0x%08x", __func__, (uint32_t)result, (uint32_t)pos, (uint32_t)pos_bits); + ESP_LOGV(TAG, "%s- result= 0x%08x, pos= %i, pos_bits= 0x%08x", __func__, (uint32_t)result, (uint32_t)pos, (uint32_t)pos_bits); pos = i; if (pos_bits == 0xff) { break; // we have found position @@ -350,7 +354,7 @@ esp_err_t WL_Flash::updateV1_V2() this->state.version = 2; this->state.pos = 0; this->state.crc = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, offsetof(wl_state_t, crc)); - this->state.device_id = rand(); + this->state.device_id = esp_random(); result = this->flash_drv->erase_range(this->addr_state1, this->state_size); WL_RESULT_CHECK(result); @@ -358,7 +362,7 @@ esp_err_t WL_Flash::updateV1_V2() WL_RESULT_CHECK(result); memset(this->temp_buff, 0, this->cfg.wr_size); - for (int i=0 ; i< pos; i++) { + for (uint32_t i=0 ; i<= pos; i++) { this->fillOkBuff(i); result = this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); WL_RESULT_CHECK(result); @@ -368,10 +372,10 @@ esp_err_t WL_Flash::updateV1_V2() WL_RESULT_CHECK(result); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); WL_RESULT_CHECK(result); - ESP_LOGD(TAG, "%s - move_count=%08x, pos=%08x, ", __func__, this->state.move_count, this->state.pos); + ESP_LOGD(TAG, "%s - move_count= 0x%08x, pos= 0x%08x", __func__, this->state.move_count, this->state.pos); memset(this->temp_buff, 0, this->cfg.wr_size); - for (int i=0 ; i< pos; i++) { + for (uint32_t i=0 ; i<= pos; i++) { this->fillOkBuff(i); result = this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + i * this->cfg.wr_size, this->temp_buff, this->cfg.wr_size); WL_RESULT_CHECK(result); @@ -415,7 +419,7 @@ esp_err_t WL_Flash::updateWL() } // Here we have to move the block and increase the state this->state.access_count = 0; - ESP_LOGV(TAG, "%s - access_count=0x%08x, pos=0x%08x", __func__, this->state.access_count, this->state.pos); + ESP_LOGV(TAG, "%s - access_count= 0x%08x, pos= 0x%08x", __func__, this->state.access_count, this->state.pos); // copy data to dummy block size_t data_addr = this->state.pos + 1; // next block, [pos+1] copy to [pos] if (data_addr >= this->state.max_pos) { @@ -425,7 +429,7 @@ esp_err_t WL_Flash::updateWL() this->dummy_addr = this->cfg.start_addr + this->state.pos * this->cfg.page_size; result = this->flash_drv->erase_range(this->dummy_addr, this->cfg.page_size); if (result != ESP_OK) { - ESP_LOGE(TAG, "%s - erase wl dummy sector result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - erase wl dummy sector result= 0x%08x", __func__, result); this->state.access_count = this->state.max_count - 1; // we will update next time return result; } @@ -434,13 +438,13 @@ esp_err_t WL_Flash::updateWL() for (size_t i = 0; i < copy_count; i++) { result = this->flash_drv->read(data_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size); if (result != ESP_OK) { - ESP_LOGE(TAG, "%s - not possible to read buffer, will try next time, result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - not possible to read buffer, will try next time, result= 0x%08x", __func__, result); this->state.access_count = this->state.max_count - 1; // we will update next time return result; } result = this->flash_drv->write(this->dummy_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size); if (result != ESP_OK) { - ESP_LOGE(TAG, "%s - not possible to write buffer, will try next time, result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - not possible to write buffer, will try next time, result= 0x%08x", __func__, result); this->state.access_count = this->state.max_count - 1; // we will update next time return result; } @@ -453,14 +457,14 @@ esp_err_t WL_Flash::updateWL() // write state to mem. We updating only affected bits result |= this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + byte_pos, this->temp_buff, this->cfg.wr_size); if (result != ESP_OK) { - ESP_LOGE(TAG, "%s - update position 1 result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - update position 1 result= 0x%08x", __func__, result); this->state.access_count = this->state.max_count - 1; // we will update next time return result; } this->fillOkBuff(this->state.pos); result |= this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + byte_pos, this->temp_buff, this->cfg.wr_size); if (result != ESP_OK) { - ESP_LOGE(TAG, "%s - update position 2 result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - update position 2 result= 0x%08x", __func__, result); this->state.access_count = this->state.max_count - 1; // we will update next time return result; } @@ -484,13 +488,13 @@ esp_err_t WL_Flash::updateWL() WL_RESULT_CHECK(result); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); WL_RESULT_CHECK(result); - ESP_LOGD(TAG, "%s - move_count=%08x, pos=%08x, ", __func__, this->state.move_count, this->state.pos); + ESP_LOGD(TAG, "%s - move_count= 0x%08x, pos= 0x%08x, ", __func__, this->state.move_count, this->state.pos); } // Save structures to the flash... and check result if (result == ESP_OK) { - ESP_LOGV(TAG, "%s - result=%08x", __func__, result); + ESP_LOGV(TAG, "%s - result= 0x%08x", __func__, result); } else { - ESP_LOGE(TAG, "%s - result=%08x", __func__, result); + ESP_LOGE(TAG, "%s - result= 0x%08x", __func__, result); } return result; } @@ -503,7 +507,7 @@ size_t WL_Flash::calcAddr(size_t addr) } else { result += this->cfg.page_size; } - ESP_LOGV(TAG, "%s - addr=0x%08x -> result=0x%08x, dummy_addr=0x%08x", __func__, (uint32_t) addr, (uint32_t) result, (uint32_t)dummy_addr); + ESP_LOGV(TAG, "%s - addr= 0x%08x -> result= 0x%08x, dummy_addr= 0x%08x", __func__, (uint32_t) addr, (uint32_t) result, (uint32_t)dummy_addr); return result; } @@ -530,7 +534,7 @@ esp_err_t WL_Flash::erase_sector(size_t sector) if (!this->initialized) { return ESP_ERR_INVALID_STATE; } - ESP_LOGD(TAG, "%s - sector=0x%08x", __func__, (uint32_t) sector); + ESP_LOGD(TAG, "%s - sector= 0x%08x", __func__, (uint32_t) sector); result = this->updateWL(); WL_RESULT_CHECK(result); size_t virt_addr = this->calcAddr(sector * this->cfg.sector_size); @@ -544,14 +548,14 @@ esp_err_t WL_Flash::erase_range(size_t start_address, size_t size) if (!this->initialized) { return ESP_ERR_INVALID_STATE; } - ESP_LOGD(TAG, "%s - start_address=0x%08x, size=0x%08x", __func__, (uint32_t) start_address, (uint32_t) size); + ESP_LOGD(TAG, "%s - start_address= 0x%08x, size= 0x%08x", __func__, (uint32_t) start_address, (uint32_t) size); size_t erase_count = (size + this->cfg.sector_size - 1) / this->cfg.sector_size; size_t start_sector = start_address / this->cfg.sector_size; for (size_t i = 0; i < erase_count; i++) { result = this->erase_sector(start_sector + i); WL_RESULT_CHECK(result); } - ESP_LOGV(TAG, "%s - result=%08x", __func__, result); + ESP_LOGV(TAG, "%s - result= 0x%08x", __func__, result); return result; } @@ -561,7 +565,7 @@ esp_err_t WL_Flash::write(size_t dest_addr, const void *src, size_t size) if (!this->initialized) { return ESP_ERR_INVALID_STATE; } - ESP_LOGD(TAG, "%s - dest_addr=0x%08x, size=0x%08x", __func__, (uint32_t) dest_addr, (uint32_t) size); + ESP_LOGD(TAG, "%s - dest_addr= 0x%08x, size= 0x%08x", __func__, (uint32_t) dest_addr, (uint32_t) size); uint32_t count = (size - 1) / this->cfg.page_size; for (size_t i = 0; i < count; i++) { size_t virt_addr = this->calcAddr(dest_addr + i * this->cfg.page_size); @@ -580,11 +584,11 @@ esp_err_t WL_Flash::read(size_t src_addr, void *dest, size_t size) if (!this->initialized) { return ESP_ERR_INVALID_STATE; } - ESP_LOGD(TAG, "%s - src_addr=0x%08x, size=0x%08x", __func__, (uint32_t) src_addr, (uint32_t) size); + ESP_LOGD(TAG, "%s - src_addr= 0x%08x, size= 0x%08x", __func__, (uint32_t) src_addr, (uint32_t) size); uint32_t count = (size - 1) / this->cfg.page_size; for (size_t i = 0; i < count; i++) { size_t virt_addr = this->calcAddr(src_addr + i * this->cfg.page_size); - ESP_LOGV(TAG, "%s - real_addr=0x%08x, size=0x%08x", __func__, (uint32_t) this->cfg.start_addr + virt_addr, (uint32_t) size); + ESP_LOGV(TAG, "%s - real_addr= 0x%08x, size= 0x%08x", __func__, (uint32_t) (this->cfg.start_addr + virt_addr), (uint32_t) size); result = this->flash_drv->read(this->cfg.start_addr + virt_addr, &((uint8_t *)dest)[i * this->cfg.page_size], this->cfg.page_size); WL_RESULT_CHECK(result); } @@ -608,6 +612,6 @@ esp_err_t WL_Flash::flush() esp_err_t result = ESP_OK; this->state.access_count = this->state.max_count - 1; result = this->updateWL(); - ESP_LOGD(TAG, "%s - result=%08x, move_count=%08x", __func__, result, this->state.move_count); + ESP_LOGD(TAG, "%s - result= 0x%08x, move_count= 0x%08x", __func__, result, this->state.move_count); return result; } diff --git a/components/wear_levelling/doc/wl_sw_structure.rst b/components/wear_levelling/doc/wl_sw_structure.rst index d09b86b62e..9492140d26 100644 --- a/components/wear_levelling/doc/wl_sw_structure.rst +++ b/components/wear_levelling/doc/wl_sw_structure.rst @@ -5,6 +5,11 @@ Wear Levelling Component (WLC) it is a software component that is implemented to The WLC do not have internal cache. When write operation is finished, that means that data was really stored to the flash. As a parameter the WLC requires the driver to access the flash device. The driver has to implement Flash_Access interface. +The WLC Versioning and Compatibility +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The WLC accept data formats from older version. Latest version of the WLC will update data format from older versions to the current one. +Current implementation of WLC has version 2. The data format from current version incompatible with data format from previous versions, and could not be +used with previous versions. The WLC Files ^^^^^^^^^^^^^^^ @@ -49,9 +54,9 @@ The wl_config_t contains configuration parameters for the WLC component. Internal Memory Organization ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The WLC divide the memory that are define by start_addr and full_mem_size to three regions: - - Configuration - Data - States + - Configuration The Configuration region used to store configuration information. The user can use it to recover the WLC from memory dump. The Data - is a region where user data stored. diff --git a/components/wear_levelling/private_include/WL_Flash.h b/components/wear_levelling/private_include/WL_Flash.h index fca72de24b..19a682e064 100644 --- a/components/wear_levelling/private_include/WL_Flash.h +++ b/components/wear_levelling/private_include/WL_Flash.h @@ -65,7 +65,6 @@ protected: uint32_t cfg_size; uint8_t *temp_buff = NULL; size_t dummy_addr; - uint8_t used_bits; uint32_t pos_data[4]; esp_err_t initSections(); diff --git a/components/wear_levelling/private_include/WL_State.h b/components/wear_levelling/private_include/WL_State.h index 7d232d51ef..a59de6d7ab 100644 --- a/components/wear_levelling/private_include/WL_State.h +++ b/components/wear_levelling/private_include/WL_State.h @@ -37,6 +37,7 @@ public: uint32_t block_size; /*!< size of move block*/ uint32_t version; /*!< state id used to identify the version of current libary implementaion*/ uint32_t device_id; /*!< ID of current WL instance*/ + uint32_t reserved[7]; /*!< Reserved space for future use*/ uint32_t crc; /*!< CRC of structure*/ } wl_state_t; diff --git a/components/wear_levelling/test/component.mk b/components/wear_levelling/test/component.mk index ce464a212a..47bab96485 100644 --- a/components/wear_levelling/test/component.mk +++ b/components/wear_levelling/test/component.mk @@ -1 +1,2 @@ COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive +COMPONENT_EMBED_FILES := test_partition_v1.bin diff --git a/components/wear_levelling/test/test_partition_v1.bin b/components/wear_levelling/test/test_partition_v1.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4b2437d72b4b886fb502b9db011e3fbda61ac1b GIT binary patch literal 32768 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

q+@I%q-$&56l!cD6lQE96mD!H z6k%*46lrWC6lH886m4uG6k}{66l-iE6lZKA6mM)IlwfQklxS=slw@oolx%Dwlwxcm zlxl1ulxA!qlx}PylwoWllxb`tlx1uplx=Jxlw)inlxu7vlxJ)rly7VzRA6i(RA_7> zRAg)-RBUV_RAOu*RBCJ@RAy`address, test_partition->size); + esp_partition_erase_range(test_partition, 0, test_partition->size); // test small partition: result should be error for (int i=0 ; i< 5 ; i++) { @@ -40,7 +40,6 @@ TEST_CASE("wl_mount check partition parameters", "[wear_levelling][ignore]") TEST_ESP_ERR(ESP_ERR_INVALID_ARG, wl_mount(&fake_partition, &handle)); size_after = xPortGetFreeHeapSize(); TEST_ASSERT_EQUAL_HEX32(size_before, size_after); - printf("Test for size 0x%08x passed\n", fake_partition.size); // currently this test leaks memory } @@ -236,3 +235,54 @@ TEST_CASE("multiple write is correct", "[wear_levelling]") free(buff); wl_unmount(handle); } + +extern const uint8_t test_partition_v1_bin_start[] asm("_binary_test_partition_v1_bin_start"); +extern const uint8_t test_partition_v1_bin_end[] asm("_binary_test_partition_v1_bin_end"); + +#define COMPARE_START_CONST 0x12340000 + +// We write to partition prepared image with V1 +// Then we convert image to new version and verifying the data + +TEST_CASE("Version update test", "[wear_levelling]") +{ + const esp_partition_t *partition = get_test_data_partition(); + esp_partition_t fake_partition; + memcpy(&fake_partition, partition, sizeof(fake_partition)); + + if (partition->encrypted) + { + printf("Update from V1 to V2 will not work.\n"); + return; + } + fake_partition.size = (size_t)(test_partition_v1_bin_end - test_partition_v1_bin_start); + + printf("Data file size = %i, partition address = 0x%08x, file addr=0x%08x\n", (uint32_t)fake_partition.size, (uint32_t)fake_partition.address, (uint32_t)test_partition_v1_bin_start); + + esp_partition_erase_range(&fake_partition, 0, fake_partition.size); + + esp_partition_write(&fake_partition, 0, test_partition_v1_bin_start, fake_partition.size); + + wl_handle_t handle; + TEST_ESP_OK(wl_mount(&fake_partition, &handle)); + size_t sector_size = wl_sector_size(handle); + uint32_t* buff = (uint32_t*)malloc(sector_size); + + uint32_t init_val = COMPARE_START_CONST; + int test_count = fake_partition.size/sector_size - 4; + + for (int m=0 ; m < test_count; m++) { + TEST_ESP_OK(wl_read(handle, sector_size * m, buff, sector_size)); + for (int i=0 ; i< sector_size/sizeof(uint32_t) ; i++) { + uint32_t compare_val = init_val + i + m*sector_size; + if (buff[i] != compare_val) + { + printf("error compare: 0x%08x != 0x%08x \n", buff[i], compare_val); + } + TEST_ASSERT_EQUAL( buff[i], compare_val); + } + } + + free(buff); + wl_unmount(handle); +} diff --git a/components/wear_levelling/test_wl_host/Makefile b/components/wear_levelling/test_wl_host/Makefile index eaf5e7b3b7..496529ec7f 100644 --- a/components/wear_levelling/test_wl_host/Makefile +++ b/components/wear_levelling/test_wl_host/Makefile @@ -16,6 +16,7 @@ SPI_FLASH_SIM_LIB := libspi_flash.a include Makefile.files all: test + log/esp_random.c \ ifndef SDKCONFIG SDKCONFIG_DIR := $(dir $(realpath sdkconfig/sdkconfig.h)) diff --git a/components/wear_levelling/test_wl_host/stubs/log/esp_random.c b/components/wear_levelling/test_wl_host/stubs/log/esp_random.c new file mode 100644 index 0000000000..e664c561f0 --- /dev/null +++ b/components/wear_levelling/test_wl_host/stubs/log/esp_random.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include +#include +#include + +#include "esp_system.h" + +uint32_t esp_random(void) +{ + return (uint32_t)rand(); +} + diff --git a/components/wear_levelling/test_wl_host/stubs/log/include/esp_system.h b/components/wear_levelling/test_wl_host/stubs/log/include/esp_system.h new file mode 100644 index 0000000000..74511d5ab9 --- /dev/null +++ b/components/wear_levelling/test_wl_host/stubs/log/include/esp_system.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint32_t esp_random(void); + +#ifdef __cplusplus +} +#endif + diff --git a/components/wear_levelling/wear_levelling.cpp b/components/wear_levelling/wear_levelling.cpp index b878ff9190..e5e5ffeb80 100644 --- a/components/wear_levelling/wear_levelling.cpp +++ b/components/wear_levelling/wear_levelling.cpp @@ -174,7 +174,6 @@ esp_err_t wl_unmount(wl_handle_t handle) _lock_acquire(&s_instances_lock); result = check_handle(handle, __func__); if (result == ESP_OK) { - ESP_LOGV(TAG, "deleting handle 0x%08x", handle); // We have to flush state of the component result = s_instances[handle].instance->flush(); // We use placement new in wl_mount, so call destructor directly