efuse: Validates data after burning and re-burnes it if necessary

This commit is contained in:
Konstantin Kondrashov
2022-04-27 01:10:41 +08:00
parent 1f0e27ca63
commit df30b362a8
25 changed files with 721 additions and 127 deletions

View File

@@ -94,7 +94,7 @@ esp_err_t esp_efuse_write_field_blob(const esp_efuse_desc_t* field[], const void
if (err == ESP_OK) {
err = esp_efuse_utility_apply_new_coding_scheme();
if (err == ESP_OK) {
esp_efuse_utility_burn_efuses();
err = esp_efuse_utility_burn_efuses();
}
}
esp_efuse_utility_reset();
@@ -129,7 +129,7 @@ esp_err_t esp_efuse_write_field_cnt(const esp_efuse_desc_t* field[], size_t cnt)
if (err == ESP_OK) {
err = esp_efuse_utility_apply_new_coding_scheme();
if (err == ESP_OK) {
esp_efuse_utility_burn_efuses();
err = esp_efuse_utility_burn_efuses();
}
}
esp_efuse_utility_reset();
@@ -194,7 +194,7 @@ esp_err_t esp_efuse_write_reg(esp_efuse_block_t blk, unsigned int num_reg, uint3
if (err == ESP_OK) {
err = esp_efuse_utility_apply_new_coding_scheme();
if (err == ESP_OK) {
esp_efuse_utility_burn_efuses();
err = esp_efuse_utility_burn_efuses();
}
}
esp_efuse_utility_reset();
@@ -277,7 +277,7 @@ esp_err_t esp_efuse_batch_write_commit(void)
if (--s_batch_writing_mode == 0) {
esp_err_t err = esp_efuse_utility_apply_new_coding_scheme();
if (err == ESP_OK) {
esp_efuse_utility_burn_efuses();
err = esp_efuse_utility_burn_efuses();
ESP_LOGI(TAG, "Batch mode. Prepared fields are committed");
} else {
esp_efuse_utility_reset();

View File

@@ -165,11 +165,12 @@ void esp_efuse_utility_reset(void)
}
// Burn values written to the efuse write registers
void esp_efuse_utility_burn_efuses(void)
esp_err_t esp_efuse_utility_burn_efuses(void)
{
++s_burn_counter;
esp_efuse_utility_burn_chip();
esp_err_t err = esp_efuse_utility_burn_chip();
++s_burn_counter;
return err;
}
// Erase the virt_blocks array.
@@ -474,3 +475,29 @@ void esp_efuse_utility_write_efuses_to_flash(void)
}
}
#endif // CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
bool esp_efuse_utility_is_correct_written_data(esp_efuse_block_t block, unsigned r_data_len)
{
uint32_t* w_data = (uint32_t*)range_write_addr_blocks[block].start;
uint32_t* r_data = (uint32_t*)range_read_addr_blocks[block].start;
bool correct_written_data = memcmp(w_data, r_data, r_data_len) == 0;
if (correct_written_data) {
ESP_LOGI(TAG, "BURN BLOCK%d - OK (write block == read block)", block);
return true;
}
correct_written_data = true;
for (unsigned i = 0; i < r_data_len / 4; i++) {
if ((*(r_data + i) & *(w_data + i)) != *(w_data + i)) {
correct_written_data = false;
break;
}
}
if (correct_written_data) {
ESP_LOGI(TAG, "BURN BLOCK%d - OK (all write block bits are set)", block);
} else {
ESP_LOGE(TAG, "BURN BLOCK%d - ERROR (written bits != read bits)", block);
}
return correct_written_data;
}