efuse: Validates data after burning and re-burnes it if necessary
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user