mirror of
https://github.com/espressif/esp-idf.git
synced 2024-09-20 00:36:01 -04:00
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:
commit
3b771d7af2
@ -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
|
||||
|
@ -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];
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
1
components/spiffs/host_test/sdkconfig.ci.erase_check
Normal file
1
components/spiffs/host_test/sdkconfig.ci.erase_check
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ESP_PARTITION_ERASE_CHECK=y
|
1
components/spiffs/host_test/sdkconfig.ci.no_erase_check
Normal file
1
components/spiffs/host_test/sdkconfig.ci.no_erase_check
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ESP_PARTITION_ERASE_CHECK=n
|
Loading…
Reference in New Issue
Block a user