13
13
#include <zephyr/devicetree.h>
14
14
#include <stdio.h>
15
15
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)
16
19
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
27
25
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
30
29
31
30
#if defined(CONFIG_FLASH_HAS_EXPLICIT_ERASE ) && \
32
31
defined(CONFIG_FLASH_HAS_NO_EXPLICIT_ERASE )
@@ -63,22 +62,67 @@ static void erase_when_needed(const struct device *dev, bool condition,
63
62
}
64
63
}
65
64
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
+
66
116
int main (void )
67
117
{
118
+ uint32_t offset ;
68
119
const struct device * flash_dev = TEST_PARTITION_DEVICE ;
69
120
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 ];
80
123
81
124
memcpy (& flash_params , flash_get_parameters (flash_dev ), sizeof (flash_params ));
125
+ prepare_test_data (test_data );
82
126
83
127
printf ("\nNordic nRF5 Internal Storage Sample\n" );
84
128
printf ("=====================================\n" );
@@ -93,86 +137,26 @@ int main(void)
93
137
flash_params_get_erase_cap (& flash_params ) & FLASH_ERASE_C_EXPLICIT ,
94
138
TEST_PARTITION_OFFSET , FLASH_PAGE_SIZE );
95
139
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 );
119
142
120
143
offset = TEST_PARTITION_OFFSET ;
121
144
printf ("\nTest 3: Internal storage erase (2 pages at 0x%x)\n" , offset );
122
145
erase_when_needed (flash_dev ,
123
146
flash_params_get_erase_cap (& flash_params ) & FLASH_ERASE_C_EXPLICIT ,
124
147
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
- }
148
148
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 );
150
150
erase_when_needed (flash_dev ,
151
151
flash_params_get_erase_cap (& flash_params ) & FLASH_ERASE_C_EXPLICIT ,
152
152
TEST_PARTITION_OFFSET , FLASH_PAGE_SIZE );
153
153
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 );
176
160
}
177
161
178
162
#if defined(CONFIG_FLASH_PAGE_LAYOUT )
@@ -181,7 +165,7 @@ int main(void)
181
165
182
166
rc = flash_get_page_info_by_offs (flash_dev , FLASH_TEST_OFFSET2 , & info );
183
167
184
- printf ("\nTest 7 : Page layout API\n" );
168
+ printf ("\nTest 6 : Page layout API\n" );
185
169
186
170
if (!rc ) {
187
171
printf (" Offset 0x%08x:\n" , FLASH_TEST_OFFSET2 );
@@ -206,7 +190,6 @@ int main(void)
206
190
printf (" ERROR: Page index resolved to %u\n" ,
207
191
info .index );
208
192
}
209
-
210
193
} else {
211
194
printf (" Error: flash_get_page_info_by_idx returns %d\n" , rc );
212
195
}
@@ -216,9 +199,8 @@ int main(void)
216
199
217
200
#endif
218
201
219
- printf ("\nTest 8 : Write block size API\n" );
202
+ printf ("\nTest 7 : Write block size API\n" );
220
203
printf (" write-block-size = %u\n" , flash_params .write_block_size );
221
-
222
204
printf ("\nFinished!\n" );
223
205
return 0 ;
224
206
}
0 commit comments