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+
66116int 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