drivers/flash: Add flash_fill() and flash_flatten()

The commit adds two new API calls:
 - flash_fill - that allows to fill selected part of device with
   specified value;
 - flash_flatten - that allows to erase or fill device with
   erase_value, depending on whether driver for the device provides
   erase callback.

Signed-off-by: Dominik Ermel <dominik.ermel@nordicsemi.no>
This commit is contained in:
Dominik Ermel 2024-03-07 22:42:41 +00:00 committed by Henrik Brix Andersen
commit b8d073c572
6 changed files with 245 additions and 2 deletions

View file

@ -180,4 +180,78 @@ ZTEST(flash_driver, test_read_unaligned_address)
}
}
ZTEST(flash_driver, test_flash_fill)
{
uint8_t buf[EXPECTED_SIZE];
int rc;
off_t i;
if (IS_ENABLED(CONFIG_FLASH_HAS_EXPLICIT_ERASE) && ebw_required) {
/* Erase a nb of pages aligned to the EXPECTED_SIZE */
rc = flash_erase(flash_dev, page_info.start_offset,
(page_info.size *
((EXPECTED_SIZE + page_info.size - 1)
/ page_info.size)));
zassert_equal(rc, 0, "Flash memory not properly erased");
} else {
rc = flash_fill(flash_dev, 0x55, page_info.start_offset,
(page_info.size *
((EXPECTED_SIZE + page_info.size - 1)
/ page_info.size)));
zassert_equal(rc, 0, "Leveling memory with fill failed\n");
}
/* Fill the device with 0xaa */
rc = flash_fill(flash_dev, 0xaa, page_info.start_offset,
(page_info.size *
((EXPECTED_SIZE + page_info.size - 1)
/ page_info.size)));
zassert_equal(rc, 0, "Fill failed\n");
rc = flash_read(flash_dev, TEST_AREA_OFFSET,
buf, EXPECTED_SIZE);
zassert_equal(rc, 0, "Cannot read flash");
for (i = 0; i < EXPECTED_SIZE; i++) {
if (buf[i] != 0xaa) {
break;
}
}
zassert_equal(i, EXPECTED_SIZE, "Expected device to be filled wth 0xaa");
}
ZTEST(flash_driver, test_flash_flatten)
{
uint8_t buf[EXPECTED_SIZE];
int rc;
off_t i;
rc = flash_flatten(flash_dev, page_info.start_offset,
(page_info.size *
((EXPECTED_SIZE + page_info.size - 1)
/ page_info.size)));
zassert_equal(rc, 0, "Flash not leveled not properly erased");
/* Fill the device with 0xaa */
rc = flash_fill(flash_dev, 0xaa, page_info.start_offset,
(page_info.size *
((EXPECTED_SIZE + page_info.size - 1)
/ page_info.size)));
zassert_equal(rc, 0, "Fill failed\n");
rc = flash_read(flash_dev, TEST_AREA_OFFSET,
buf, EXPECTED_SIZE);
zassert_equal(rc, 0, "Cannot read flash");
for (i = 0; i < EXPECTED_SIZE; i++) {
if (buf[i] != 0xaa) {
break;
}
}
zassert_equal(i, EXPECTED_SIZE, "Expected device to be filled wth 0xaa");
}
ZTEST_SUITE(flash_driver, NULL, flash_driver_setup, NULL, NULL, NULL);