Skip to content

Commit 827962b

Browse files
nordic-bamikartben
authored andcommitted
samples: drivers: flash: Add nrf54h support in nrf_soc_flash sample
nrf54h has got built in MRAM memory with 16B word alignment. Signed-off-by: Bartosz Miller <bartosz.miller@nordicsemi.no>
1 parent 1d1f733 commit 827962b

File tree

3 files changed

+132
-106
lines changed

3 files changed

+132
-106
lines changed

samples/drivers/soc_flash_nrf/prj.conf

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
CONFIG_STDOUT_CONSOLE=y
22
CONFIG_FLASH=y
33
CONFIG_MPU_ALLOW_FLASH_WRITE=y
4-
CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y
54
CONFIG_FCB=y
65
CONFIG_FLASH_MAP=y
76
CONFIG_SETTINGS=y
Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
sample:
2-
name: SoC Flash on NRF52
2+
name: SoC Flash on Nordic nRF52, nRF53, nrf54 and nRF91 series
33
tests:
44
sample.drivers.flash.soc_flash_nrf:
55
platform_allow:
66
- nrf52dk/nrf52832
77
- nrf9160dk/nrf9160
88
- nrf9160dk/nrf9160/ns
9+
- nrf52840dk/nrf52840
10+
- nrf54h20dk/nrf54h20/cpuapp
11+
- nrf5340dk/nrf5340/cpuapp
912
integration_platforms:
1013
- nrf52dk/nrf52832
14+
- nrf52840dk/nrf52840
15+
- nrf5340dk/nrf5340/cpuapp
16+
- nrf54h20dk/nrf54h20/cpuapp
1117
tags:
1218
- flash
1319
- drivers
@@ -17,16 +23,55 @@ tests:
1723
type: multi_line
1824
ordered: true
1925
regex:
20-
- "Flash erase succeeded"
21-
- "Data read: 1234"
26+
- "Test 1: Internal storage erase page"
27+
- "Erase succeeded|Erase not required"
28+
- "Test 2: Internal storage write"
2229
- "Data read matches data written. Good!"
23-
- "Flash erase succeeded"
24-
- "Data read: 1122"
30+
- "Test 3: Internal storage erase"
31+
- "Erase succeeded|Erase not required"
32+
- "Test 4: Internal storage erase page at \\d+"
33+
- "Erase succeeded|Erase not required"
34+
- "Test 5: Non-word aligned write"
35+
- "Skipping unaligned write, not supported"
36+
- "Test 6: Page layout API"
37+
- "SoC flash consists of \\d+ pages"
38+
- "Test 7: Write block size API"
39+
- "write-block-size = \\d+"
40+
- "Finished!"
41+
42+
sample.drivers.flash.soc_flash_nrf.one_byte_access:
43+
platform_allow:
44+
- nrf52dk/nrf52832
45+
- nrf9160dk/nrf9160/ns
46+
- nrf52840dk/nrf52840
47+
- nrf5340dk/nrf5340/cpuapp
48+
integration_platforms:
49+
- nrf52dk/nrf52832
50+
- nrf52840dk/nrf52840
51+
- nrf5340dk/nrf5340/cpuapp
52+
tags:
53+
- flash
54+
- drivers
55+
extra_configs:
56+
- CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y
57+
harness: console
58+
harness_config:
59+
fixture: external_flash
60+
type: multi_line
61+
ordered: true
62+
regex:
63+
- "Test 1: Internal storage erase page"
64+
- "Erase succeeded|Erase not required"
65+
- "Test 2: Internal storage write"
2566
- "Data read matches data written. Good!"
26-
- "Flash erase succeeded"
27-
- "Data read: 1234"
28-
- "Data read: 1234"
67+
- "Test 3: Internal storage erase"
68+
- "Erase succeeded|Erase not required"
69+
- "Test 4: Internal storage erase page at \\d+"
70+
- "Erase succeeded|Erase not required"
71+
- "Test 5: Non-word aligned write"
2972
- "Data read matches data written. Good!"
30-
- "SoC flash consists of \\d+ pages."
31-
- "write-block-size = 1"
73+
- "Test 6: Page layout API"
74+
- "SoC flash consists of \\d+ pages"
75+
- "Test 7: Write block size API"
76+
- "write-block-size = \\d+"
3277
- "Finished!"

samples/drivers/soc_flash_nrf/src/main.c

Lines changed: 77 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,19 @@
1313
#include <zephyr/devicetree.h>
1414
#include <stdio.h>
1515

16+
#define TEST_PARTITION storage_partition
17+
#define TEST_PARTITION_OFFSET FIXED_PARTITION_OFFSET(TEST_PARTITION)
18+
#define TEST_PARTITION_DEVICE FIXED_PARTITION_DEVICE(TEST_PARTITION)
1619

17-
#define TEST_PARTITION storage_partition
18-
19-
#define TEST_PARTITION_OFFSET FIXED_PARTITION_OFFSET(TEST_PARTITION)
20-
#define TEST_PARTITION_DEVICE FIXED_PARTITION_DEVICE(TEST_PARTITION)
21-
22-
#define FLASH_PAGE_SIZE 4096
23-
#define TEST_DATA_WORD_0 0x1122
24-
#define TEST_DATA_WORD_1 0xaabb
25-
#define TEST_DATA_WORD_2 0xabcd
26-
#define TEST_DATA_WORD_3 0x1234
20+
#if defined(CONFIG_SOC_NRF54H20)
21+
#define FLASH_PAGE_SIZE 2048
22+
#else
23+
#define FLASH_PAGE_SIZE 4096
24+
#endif
2725

28-
#define FLASH_TEST_OFFSET2 0x41234
29-
#define FLASH_TEST_PAGE_IDX 37
26+
#define TEST_DATA_SIZE_IN_BYTES 128
27+
#define FLASH_TEST_OFFSET2 0x41234
28+
#define FLASH_TEST_PAGE_IDX 37
3029

3130
#if defined(CONFIG_FLASH_HAS_EXPLICIT_ERASE) && \
3231
defined(CONFIG_FLASH_HAS_NO_EXPLICIT_ERASE)
@@ -63,22 +62,67 @@ static void erase_when_needed(const struct device *dev, bool condition,
6362
}
6463
}
6564

65+
/*
66+
* Fill test data with incrementing values
67+
*/
68+
static void prepare_test_data(uint8_t *test_data_buf)
69+
{
70+
uint32_t counter;
71+
72+
for (counter = 0; counter < TEST_DATA_SIZE_IN_BYTES; counter++) {
73+
*(test_data_buf + counter) = counter;
74+
}
75+
}
76+
77+
/*
78+
* The function align writes with write-block-size of a device,
79+
* the additional_address_offset parameter can be
80+
* used to de-align writes by a provided value.
81+
*/
82+
static void write_and_verify_test_data(const struct device *flash_dev, uint8_t *test_data,
83+
uint8_t write_block_size, uint8_t addtitonal_address_offset)
84+
{
85+
uint32_t i, offset;
86+
uint8_t write_cycles;
87+
uint8_t read_buffer[TEST_DATA_SIZE_IN_BYTES];
88+
89+
write_cycles = TEST_DATA_SIZE_IN_BYTES / write_block_size;
90+
printf(" Write block size: %u\n", write_block_size);
91+
printf(" Required write cycles for given data and memory: %u\n", write_cycles);
92+
93+
for (i = 0U; i < write_cycles; i++) {
94+
offset = TEST_PARTITION_OFFSET + i * write_block_size + addtitonal_address_offset;
95+
printf(" Writing %u data bytes to 0x%x\n", write_block_size, offset);
96+
if (flash_write(flash_dev, offset, &test_data[i * write_block_size],
97+
write_block_size) != 0) {
98+
printf(" Write failed!\n");
99+
return;
100+
}
101+
printf(" Reading %u data bytes from 0x%x\n", write_block_size, offset);
102+
if (flash_read(flash_dev, offset, &read_buffer[i * write_block_size],
103+
write_block_size) != 0) {
104+
printf(" Read failed!\n");
105+
return;
106+
}
107+
}
108+
109+
if (memcmp(test_data, read_buffer, TEST_DATA_SIZE_IN_BYTES)) {
110+
printf(" Data read does not match data written!\n");
111+
} else {
112+
printf(" Data read matches data written. Good!\n");
113+
}
114+
}
115+
66116
int main(void)
67117
{
118+
uint32_t offset;
68119
const struct device *flash_dev = TEST_PARTITION_DEVICE;
69120
struct flash_parameters flash_params;
70-
uint32_t buf_array_1[4] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1,
71-
TEST_DATA_WORD_2, TEST_DATA_WORD_3 };
72-
uint32_t buf_array_2[4] = { TEST_DATA_WORD_3, TEST_DATA_WORD_1,
73-
TEST_DATA_WORD_2, TEST_DATA_WORD_0 };
74-
uint32_t buf_array_3[8] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1,
75-
TEST_DATA_WORD_2, TEST_DATA_WORD_3,
76-
TEST_DATA_WORD_0, TEST_DATA_WORD_1,
77-
TEST_DATA_WORD_2, TEST_DATA_WORD_3 };
78-
uint32_t buf_word = 0U;
79-
uint32_t i, offset;
121+
122+
uint8_t test_data[TEST_DATA_SIZE_IN_BYTES];
80123

81124
memcpy(&flash_params, flash_get_parameters(flash_dev), sizeof(flash_params));
125+
prepare_test_data(test_data);
82126

83127
printf("\nNordic nRF5 Internal Storage Sample\n");
84128
printf("=====================================\n");
@@ -93,86 +137,26 @@ int main(void)
93137
flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT,
94138
TEST_PARTITION_OFFSET, FLASH_PAGE_SIZE);
95139

96-
printf("\nTest 2: Internal storage write (word array 1)\n");
97-
for (i = 0U; i < ARRAY_SIZE(buf_array_1); i++) {
98-
offset = TEST_PARTITION_OFFSET + (i << 2);
99-
printf(" Attempted to write %x at 0x%x\n", buf_array_1[i],
100-
offset);
101-
if (flash_write(flash_dev, offset, &buf_array_1[i],
102-
sizeof(uint32_t)) != 0) {
103-
printf(" Write failed!\n");
104-
return 0;
105-
}
106-
printf(" Attempted to read 0x%x\n", offset);
107-
if (flash_read(flash_dev, offset, &buf_word,
108-
sizeof(uint32_t)) != 0) {
109-
printf(" Read failed!\n");
110-
return 0;
111-
}
112-
printf(" Data read: %x\n", buf_word);
113-
if (buf_array_1[i] == buf_word) {
114-
printf(" Data read matches data written. Good!\n");
115-
} else {
116-
printf(" Data read does not match data written!\n");
117-
}
118-
}
140+
printf("\nTest 2: Internal storage write\n");
141+
write_and_verify_test_data(flash_dev, test_data, flash_params.write_block_size, 0);
119142

120143
offset = TEST_PARTITION_OFFSET;
121144
printf("\nTest 3: Internal storage erase (2 pages at 0x%x)\n", offset);
122145
erase_when_needed(flash_dev,
123146
flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT,
124147
offset, FLASH_PAGE_SIZE * 2);
125-
printf("\nTest 4: Internal storage write (word array 2)\n");
126-
for (i = 0U; i < ARRAY_SIZE(buf_array_2); i++) {
127-
offset = TEST_PARTITION_OFFSET + (i << 2);
128-
printf(" Attempted to write %x at 0x%x\n", buf_array_2[i],
129-
offset);
130-
if (flash_write(flash_dev, offset, &buf_array_2[i],
131-
sizeof(uint32_t)) != 0) {
132-
printf(" Write failed!\n");
133-
return 0;
134-
}
135-
printf(" Attempted to read 0x%x\n", offset);
136-
if (flash_read(flash_dev, offset, &buf_word,
137-
sizeof(uint32_t)) != 0) {
138-
printf(" Read failed!\n");
139-
return 0;
140-
}
141-
printf(" Data read: %x\n", buf_word);
142-
if (buf_array_2[i] == buf_word) {
143-
printf(" Data read matches data written. Good!\n");
144-
} else {
145-
printf(" Data read does not match data written!\n");
146-
}
147-
}
148148

149-
printf("\nTest 5: Internal storage erase page at 0x%x\n", TEST_PARTITION_OFFSET);
149+
printf("\nTest 4: Internal storage erase page at 0x%x\n", TEST_PARTITION_OFFSET);
150150
erase_when_needed(flash_dev,
151151
flash_params_get_erase_cap(&flash_params) & FLASH_ERASE_C_EXPLICIT,
152152
TEST_PARTITION_OFFSET, FLASH_PAGE_SIZE);
153153

154-
printf("\nTest 6: Non-word aligned write (word array 3)\n");
155-
for (i = 0U; i < ARRAY_SIZE(buf_array_3); i++) {
156-
offset = TEST_PARTITION_OFFSET + (i << 2) + 1;
157-
printf(" Attempted to write %x at 0x%x\n", buf_array_3[i],
158-
offset);
159-
if (flash_write(flash_dev, offset, &buf_array_3[i],
160-
sizeof(uint32_t)) != 0) {
161-
printf(" Write failed!\n");
162-
return 0;
163-
}
164-
printf(" Attempted to read 0x%x\n", offset);
165-
if (flash_read(flash_dev, offset, &buf_word,
166-
sizeof(uint32_t)) != 0) {
167-
printf(" Read failed!\n");
168-
return 0;
169-
}
170-
printf(" Data read: %x\n", buf_word);
171-
if (buf_array_3[i] == buf_word) {
172-
printf(" Data read matches data written. Good!\n");
173-
} else {
174-
printf(" Data read does not match data written!\n");
175-
}
154+
printf("\nTest 5: Non-word aligned write\n");
155+
156+
if (flash_params.write_block_size != 1) {
157+
printf(" Skipping unaligned write, not supported\n");
158+
} else {
159+
write_and_verify_test_data(flash_dev, test_data, flash_params.write_block_size, 1);
176160
}
177161

178162
#if defined(CONFIG_FLASH_PAGE_LAYOUT)
@@ -181,7 +165,7 @@ int main(void)
181165

182166
rc = flash_get_page_info_by_offs(flash_dev, FLASH_TEST_OFFSET2, &info);
183167

184-
printf("\nTest 7: Page layout API\n");
168+
printf("\nTest 6: Page layout API\n");
185169

186170
if (!rc) {
187171
printf(" Offset 0x%08x:\n", FLASH_TEST_OFFSET2);
@@ -206,7 +190,6 @@ int main(void)
206190
printf(" ERROR: Page index resolved to %u\n",
207191
info.index);
208192
}
209-
210193
} else {
211194
printf(" Error: flash_get_page_info_by_idx returns %d\n", rc);
212195
}
@@ -216,9 +199,8 @@ int main(void)
216199

217200
#endif
218201

219-
printf("\nTest 8: Write block size API\n");
202+
printf("\nTest 7: Write block size API\n");
220203
printf(" write-block-size = %u\n", flash_params.write_block_size);
221-
222204
printf("\nFinished!\n");
223205
return 0;
224206
}

0 commit comments

Comments
 (0)