diff --git a/samples/drivers/soc_flash_nrf/prj.conf b/samples/drivers/soc_flash_nrf/prj.conf index 4a6b0a51c56..df9f7057ca5 100644 --- a/samples/drivers/soc_flash_nrf/prj.conf +++ b/samples/drivers/soc_flash_nrf/prj.conf @@ -1,7 +1,6 @@ CONFIG_STDOUT_CONSOLE=y CONFIG_FLASH=y CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y CONFIG_FCB=y CONFIG_FLASH_MAP=y CONFIG_SETTINGS=y diff --git a/samples/drivers/soc_flash_nrf/sample.yaml b/samples/drivers/soc_flash_nrf/sample.yaml index bdec7c607cc..e2d582a3577 100644 --- a/samples/drivers/soc_flash_nrf/sample.yaml +++ b/samples/drivers/soc_flash_nrf/sample.yaml @@ -1,13 +1,19 @@ sample: - name: SoC Flash on NRF52 + name: SoC Flash on Nordic nRF52, nRF53, nrf54 and nRF91 series tests: sample.drivers.flash.soc_flash_nrf: platform_allow: - nrf52dk/nrf52832 - nrf9160dk/nrf9160 - nrf9160dk/nrf9160/ns + - nrf52840dk/nrf52840 + - nrf54h20dk/nrf54h20/cpuapp + - nrf5340dk/nrf5340/cpuapp integration_platforms: - nrf52dk/nrf52832 + - nrf52840dk/nrf52840 + - nrf5340dk/nrf5340/cpuapp + - nrf54h20dk/nrf54h20/cpuapp tags: - flash - drivers @@ -17,16 +23,55 @@ tests: type: multi_line ordered: true regex: - - "Flash erase succeeded" - - "Data read: 1234" + - "Test 1: Internal storage erase page" + - "Erase succeeded|Erase not required" + - "Test 2: Internal storage write" - "Data read matches data written. Good!" - - "Flash erase succeeded" - - "Data read: 1122" + - "Test 3: Internal storage erase" + - "Erase succeeded|Erase not required" + - "Test 4: Internal storage erase page at \\d+" + - "Erase succeeded|Erase not required" + - "Test 5: Non-word aligned write" + - "Skipping unaligned write, not supported" + - "Test 6: Page layout API" + - "SoC flash consists of \\d+ pages" + - "Test 7: Write block size API" + - "write-block-size = \\d+" + - "Finished!" + + sample.drivers.flash.soc_flash_nrf.one_byte_access: + platform_allow: + - nrf52dk/nrf52832 + - nrf9160dk/nrf9160/ns + - nrf52840dk/nrf52840 + - nrf5340dk/nrf5340/cpuapp + integration_platforms: + - nrf52dk/nrf52832 + - nrf52840dk/nrf52840 + - nrf5340dk/nrf5340/cpuapp + tags: + - flash + - drivers + extra_configs: + - CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y + harness: console + harness_config: + fixture: external_flash + type: multi_line + ordered: true + regex: + - "Test 1: Internal storage erase page" + - "Erase succeeded|Erase not required" + - "Test 2: Internal storage write" - "Data read matches data written. Good!" - - "Flash erase succeeded" - - "Data read: 1234" - - "Data read: 1234" + - "Test 3: Internal storage erase" + - "Erase succeeded|Erase not required" + - "Test 4: Internal storage erase page at \\d+" + - "Erase succeeded|Erase not required" + - "Test 5: Non-word aligned write" - "Data read matches data written. Good!" - - "SoC flash consists of \\d+ pages." - - "write-block-size = 1" + - "Test 6: Page layout API" + - "SoC flash consists of \\d+ pages" + - "Test 7: Write block size API" + - "write-block-size = \\d+" - "Finished!" diff --git a/samples/drivers/soc_flash_nrf/src/main.c b/samples/drivers/soc_flash_nrf/src/main.c index 0297a17d1f8..e509deda044 100644 --- a/samples/drivers/soc_flash_nrf/src/main.c +++ b/samples/drivers/soc_flash_nrf/src/main.c @@ -13,20 +13,19 @@ #include #include +#define TEST_PARTITION storage_partition +#define TEST_PARTITION_OFFSET FIXED_PARTITION_OFFSET(TEST_PARTITION) +#define TEST_PARTITION_DEVICE FIXED_PARTITION_DEVICE(TEST_PARTITION) -#define TEST_PARTITION storage_partition - -#define TEST_PARTITION_OFFSET FIXED_PARTITION_OFFSET(TEST_PARTITION) -#define TEST_PARTITION_DEVICE FIXED_PARTITION_DEVICE(TEST_PARTITION) - -#define FLASH_PAGE_SIZE 4096 -#define TEST_DATA_WORD_0 0x1122 -#define TEST_DATA_WORD_1 0xaabb -#define TEST_DATA_WORD_2 0xabcd -#define TEST_DATA_WORD_3 0x1234 +#if defined(CONFIG_SOC_NRF54H20) +#define FLASH_PAGE_SIZE 2048 +#else +#define FLASH_PAGE_SIZE 4096 +#endif -#define FLASH_TEST_OFFSET2 0x41234 -#define FLASH_TEST_PAGE_IDX 37 +#define TEST_DATA_SIZE_IN_BYTES 128 +#define FLASH_TEST_OFFSET2 0x41234 +#define FLASH_TEST_PAGE_IDX 37 #if defined(CONFIG_FLASH_HAS_EXPLICIT_ERASE) && \ defined(CONFIG_FLASH_HAS_NO_EXPLICIT_ERASE) @@ -63,22 +62,67 @@ static void erase_when_needed(const struct device *dev, bool condition, } } +/* + * Fill test data with incrementing values + */ +static void prepare_test_data(uint8_t *test_data_buf) +{ + uint32_t counter; + + for (counter = 0; counter < TEST_DATA_SIZE_IN_BYTES; counter++) { + *(test_data_buf + counter) = counter; + } +} + +/* + * The function align writes with write-block-size of a device, + * the additional_address_offset parameter can be + * used to de-align writes by a provided value. + */ +static void write_and_verify_test_data(const struct device *flash_dev, uint8_t *test_data, + uint8_t write_block_size, uint8_t addtitonal_address_offset) +{ + uint32_t i, offset; + uint8_t write_cycles; + uint8_t read_buffer[TEST_DATA_SIZE_IN_BYTES]; + + write_cycles = TEST_DATA_SIZE_IN_BYTES / write_block_size; + printf(" Write block size: %u\n", write_block_size); + printf(" Required write cycles for given data and memory: %u\n", write_cycles); + + for (i = 0U; i < write_cycles; i++) { + offset = TEST_PARTITION_OFFSET + i * write_block_size + addtitonal_address_offset; + printf(" Writing %u data bytes to 0x%x\n", write_block_size, offset); + if (flash_write(flash_dev, offset, &test_data[i * write_block_size], + write_block_size) != 0) { + printf(" Write failed!\n"); + return; + } + printf(" Reading %u data bytes from 0x%x\n", write_block_size, offset); + if (flash_read(flash_dev, offset, &read_buffer[i * write_block_size], + write_block_size) != 0) { + printf(" Read failed!\n"); + return; + } + } + + if (memcmp(test_data, read_buffer, TEST_DATA_SIZE_IN_BYTES)) { + printf(" Data read does not match data written!\n"); + } else { + printf(" Data read matches data written. Good!\n"); + } +} + int main(void) { + uint32_t offset; const struct device *flash_dev = TEST_PARTITION_DEVICE; struct flash_parameters flash_params; - uint32_t buf_array_1[4] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1, - TEST_DATA_WORD_2, TEST_DATA_WORD_3 }; - uint32_t buf_array_2[4] = { TEST_DATA_WORD_3, TEST_DATA_WORD_1, - TEST_DATA_WORD_2, TEST_DATA_WORD_0 }; - uint32_t buf_array_3[8] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1, - TEST_DATA_WORD_2, TEST_DATA_WORD_3, - TEST_DATA_WORD_0, TEST_DATA_WORD_1, - TEST_DATA_WORD_2, TEST_DATA_WORD_3 }; - uint32_t buf_word = 0U; - uint32_t i, offset; + + uint8_t test_data[TEST_DATA_SIZE_IN_BYTES]; memcpy(&flash_params, flash_get_parameters(flash_dev), sizeof(flash_params)); + prepare_test_data(test_data); printf("\nNordic nRF5 Internal Storage Sample\n"); printf("=====================================\n"); @@ -93,86 +137,26 @@ int main(void) flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT, TEST_PARTITION_OFFSET, FLASH_PAGE_SIZE); - printf("\nTest 2: Internal storage write (word array 1)\n"); - for (i = 0U; i < ARRAY_SIZE(buf_array_1); i++) { - offset = TEST_PARTITION_OFFSET + (i << 2); - printf(" Attempted to write %x at 0x%x\n", buf_array_1[i], - offset); - if (flash_write(flash_dev, offset, &buf_array_1[i], - sizeof(uint32_t)) != 0) { - printf(" Write failed!\n"); - return 0; - } - printf(" Attempted to read 0x%x\n", offset); - if (flash_read(flash_dev, offset, &buf_word, - sizeof(uint32_t)) != 0) { - printf(" Read failed!\n"); - return 0; - } - printf(" Data read: %x\n", buf_word); - if (buf_array_1[i] == buf_word) { - printf(" Data read matches data written. Good!\n"); - } else { - printf(" Data read does not match data written!\n"); - } - } + printf("\nTest 2: Internal storage write\n"); + write_and_verify_test_data(flash_dev, test_data, flash_params.write_block_size, 0); offset = TEST_PARTITION_OFFSET; printf("\nTest 3: Internal storage erase (2 pages at 0x%x)\n", offset); erase_when_needed(flash_dev, flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT, offset, FLASH_PAGE_SIZE * 2); - printf("\nTest 4: Internal storage write (word array 2)\n"); - for (i = 0U; i < ARRAY_SIZE(buf_array_2); i++) { - offset = TEST_PARTITION_OFFSET + (i << 2); - printf(" Attempted to write %x at 0x%x\n", buf_array_2[i], - offset); - if (flash_write(flash_dev, offset, &buf_array_2[i], - sizeof(uint32_t)) != 0) { - printf(" Write failed!\n"); - return 0; - } - printf(" Attempted to read 0x%x\n", offset); - if (flash_read(flash_dev, offset, &buf_word, - sizeof(uint32_t)) != 0) { - printf(" Read failed!\n"); - return 0; - } - printf(" Data read: %x\n", buf_word); - if (buf_array_2[i] == buf_word) { - printf(" Data read matches data written. Good!\n"); - } else { - printf(" Data read does not match data written!\n"); - } - } - printf("\nTest 5: Internal storage erase page at 0x%x\n", TEST_PARTITION_OFFSET); + printf("\nTest 4: Internal storage erase page at 0x%x\n", TEST_PARTITION_OFFSET); erase_when_needed(flash_dev, flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT, TEST_PARTITION_OFFSET, FLASH_PAGE_SIZE); - printf("\nTest 6: Non-word aligned write (word array 3)\n"); - for (i = 0U; i < ARRAY_SIZE(buf_array_3); i++) { - offset = TEST_PARTITION_OFFSET + (i << 2) + 1; - printf(" Attempted to write %x at 0x%x\n", buf_array_3[i], - offset); - if (flash_write(flash_dev, offset, &buf_array_3[i], - sizeof(uint32_t)) != 0) { - printf(" Write failed!\n"); - return 0; - } - printf(" Attempted to read 0x%x\n", offset); - if (flash_read(flash_dev, offset, &buf_word, - sizeof(uint32_t)) != 0) { - printf(" Read failed!\n"); - return 0; - } - printf(" Data read: %x\n", buf_word); - if (buf_array_3[i] == buf_word) { - printf(" Data read matches data written. Good!\n"); - } else { - printf(" Data read does not match data written!\n"); - } + printf("\nTest 5: Non-word aligned write\n"); + + if (flash_params.write_block_size != 1) { + printf(" Skipping unaligned write, not supported\n"); + } else { + write_and_verify_test_data(flash_dev, test_data, flash_params.write_block_size, 1); } #if defined(CONFIG_FLASH_PAGE_LAYOUT) @@ -181,7 +165,7 @@ int main(void) rc = flash_get_page_info_by_offs(flash_dev, FLASH_TEST_OFFSET2, &info); - printf("\nTest 7: Page layout API\n"); + printf("\nTest 6: Page layout API\n"); if (!rc) { printf(" Offset 0x%08x:\n", FLASH_TEST_OFFSET2); @@ -206,7 +190,6 @@ int main(void) printf(" ERROR: Page index resolved to %u\n", info.index); } - } else { printf(" Error: flash_get_page_info_by_idx returns %d\n", rc); } @@ -216,9 +199,8 @@ int main(void) #endif - printf("\nTest 8: Write block size API\n"); + printf("\nTest 7: Write block size API\n"); printf(" write-block-size = %u\n", flash_params.write_block_size); - printf("\nFinished!\n"); return 0; }