Merge branch 'fix/disable_erase_check_for_spiffs_on_linux' into 'master'

fix(storage/esp_partition): add option to control erase check during write for linux target

Closes IDF-9201

See merge request espressif/esp-idf!29294
This commit is contained in:
Martin Vychodil 2024-05-29 20:35:31 +08:00
commit 3b771d7af2
6 changed files with 54 additions and 1 deletions

View File

@ -7,4 +7,13 @@ menu "Partition API Configuration"
help
This option enables gathering host test statistics and SPI flash wear levelling simulation.
config ESP_PARTITION_ERASE_CHECK
bool "Check if flash is erased before writing"
depends on IDF_TARGET_LINUX
default y
help
This option controls whether the partition implementation checks
if the flash is erased before writing to it.
This is necessary for SPIFFS, which expects to be able to write without erasing first.
endmenu

View File

@ -396,12 +396,14 @@ esp_err_t esp_partition_write(const esp_partition_t *partition, size_t dst_offse
for (size_t x = 0; x < new_size; x++) {
#ifdef CONFIG_ESP_PARTITION_ERASE_CHECK
// Check if address to be written was erased first
if((~((uint8_t *)dst_addr)[x] & ((uint8_t *)src)[x]) != 0) {
ESP_LOGW(TAG, "invalid flash operation detected");
ret = ESP_ERR_FLASH_OP_FAIL;
break;
}
#endif // CONFIG_ESP_PARTITION_ERASE_CHECK
// AND with destination byte (to emulate real NOR FLASH behavior)
((uint8_t *)dst_addr)[x] &= ((uint8_t *)src)[x];

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2016-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -274,10 +274,49 @@ TEST(spiffs, can_read_spiffs_image)
deinit_spiffs(&fs);
}
TEST(spiffs, erase_check)
{
spiffs fs;
init_spiffs(&fs, 5);
for (int boot_iter = 0; boot_iter <= 10000; ++boot_iter) {
for (int write_iter = 0; write_iter < 1000; ++write_iter) {
spiffs_file f = SPIFFS_open(&fs, "/test", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
if (f < 0) {
fprintf(stderr, "Failed to open file\n");
#if !CONFIG_ESP_PARTITION_ERASE_CHECK
TEST_FAIL();
#endif
return;
}
const int data_sz = 7 * 1024;
char data[data_sz];
memset(data, 0x55, data_sz);
int cb = SPIFFS_write(&fs, f, data, data_sz);
if (cb != data_sz) {
fprintf(stderr, "Failed to write file\n");
TEST_FAIL();
}
int rc = SPIFFS_close(&fs, f);
if (rc < 0) {
fprintf(stderr, "Failed to close file\n");
TEST_FAIL();
}
}
}
#if CONFIG_ESP_PARTITION_ERASE_CHECK
TEST_FAIL();
#endif
}
TEST_GROUP_RUNNER(spiffs)
{
RUN_TEST_CASE(spiffs, format_disk_open_file_write_and_read_file);
RUN_TEST_CASE(spiffs, can_read_spiffs_image);
RUN_TEST_CASE(spiffs, erase_check);
}
static void run_all_tests(void)

View File

@ -6,5 +6,6 @@ from pytest_embedded import Dut
@pytest.mark.linux
@pytest.mark.host_test
@pytest.mark.parametrize('config', ['erase_check', 'no_erase_check'])
def test_spiffs_linux(dut: Dut) -> None:
dut.expect_unity_test_output(timeout=5)

View File

@ -0,0 +1 @@
CONFIG_ESP_PARTITION_ERASE_CHECK=y

View File

@ -0,0 +1 @@
CONFIG_ESP_PARTITION_ERASE_CHECK=n