Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion samples/drivers/soc_flash_nrf/prj.conf
Original file line number Diff line number Diff line change
@@ -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
Expand Down
65 changes: 55 additions & 10 deletions samples/drivers/soc_flash_nrf/sample.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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!"
172 changes: 77 additions & 95 deletions samples/drivers/soc_flash_nrf/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,19 @@
#include <zephyr/devicetree.h>
#include <stdio.h>

#define TEST_PARTITION storage_partition
#define TEST_PARTITION_OFFSET FIXED_PARTITION_OFFSET(TEST_PARTITION)

Check notice on line 17 in samples/drivers/soc_flash_nrf/src/main.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

samples/drivers/soc_flash_nrf/src/main.c:17 -#define TEST_PARTITION storage_partition +#define TEST_PARTITION storage_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)
Expand Down Expand Up @@ -63,22 +62,67 @@
}
}

/*
* 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");
Expand All @@ -93,86 +137,26 @@
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)
Expand All @@ -181,7 +165,7 @@

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);
Expand All @@ -206,7 +190,6 @@
printf(" ERROR: Page index resolved to %u\n",
info.index);
}

} else {
printf(" Error: flash_get_page_info_by_idx returns %d\n", rc);
}
Expand All @@ -216,9 +199,8 @@

#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;
}
Loading