@@ -41,13 +41,13 @@ static SingletonPtr<PlatformMutex> _mutex;
41
41
// Mutex is protecting rand() per srand for buffer writing and verification.
42
42
// Mutex is also protecting printouts for clear logs.
43
43
// Mutex is NOT protecting Block Device actions: erase/program/read - which is the purpose of the multithreaded test!
44
- void basic_erase_program_read_test (SPIFBlockDevice& blockD , bd_size_t block_size, uint8_t *write_block,
44
+ void basic_erase_program_read_test (SPIFBlockDevice& block_device , bd_size_t block_size, uint8_t *write_block,
45
45
uint8_t *read_block, unsigned addrwidth)
46
46
{
47
47
int err = 0 ;
48
48
_mutex->lock ();
49
49
// Find a random block
50
- bd_addr_t block = (rand () * block_size) % blockD .size ();
50
+ bd_addr_t block = (rand () * block_size) % block_device .size ();
51
51
52
52
// Use next random number as temporary seed to keep
53
53
// the address progressing in the pseudorandom sequence
@@ -62,13 +62,13 @@ void basic_erase_program_read_test(SPIFBlockDevice& blockD, bd_size_t block_size
62
62
utest_printf (" \n test %0*llx:%llu..." , addrwidth, block, block_size);
63
63
_mutex->unlock ();
64
64
65
- err = blockD .erase (block, block_size);
65
+ err = block_device .erase (block, block_size);
66
66
TEST_ASSERT_EQUAL (0 , err);
67
67
68
- err = blockD .program (write_block, block, block_size);
68
+ err = block_device .program (write_block, block, block_size);
69
69
TEST_ASSERT_EQUAL (0 , err);
70
70
71
- err = blockD .read (read_block, block, block_size);
71
+ err = block_device .read (read_block, block, block_size);
72
72
TEST_ASSERT_EQUAL (0 , err);
73
73
74
74
_mutex->lock ();
@@ -91,16 +91,17 @@ void test_spif_random_program_read_erase()
91
91
{
92
92
utest_printf (" \n Test Random Program Read Erase Starts..\n " );
93
93
94
- SPIFBlockDevice blockD (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO, MBED_CONF_SPIF_DRIVER_SPI_CLK,
95
- MBED_CONF_SPIF_DRIVER_SPI_CS);
94
+ SPIFBlockDevice block_device (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO,
95
+ MBED_CONF_SPIF_DRIVER_SPI_CLK,
96
+ MBED_CONF_SPIF_DRIVER_SPI_CS);
96
97
97
- int err = blockD .init ();
98
+ int err = block_device .init ();
98
99
TEST_ASSERT_EQUAL (0 , err);
99
100
100
101
for (unsigned atr = 0 ; atr < sizeof (ATTRS) / sizeof (ATTRS[0 ]); atr++) {
101
102
static const char *prefixes[] = {" " , " k" , " M" , " G" };
102
103
for (int i_ind = 3 ; i_ind >= 0 ; i_ind--) {
103
- bd_size_t size = (blockD .*ATTRS[atr].method )();
104
+ bd_size_t size = (block_device .*ATTRS[atr].method )();
104
105
if (size >= (1ULL << 10 * i_ind)) {
105
106
utest_printf (" %s: %llu%sbytes (%llubytes)\n " ,
106
107
ATTRS[atr].name , size >> 10 * i_ind, prefixes[i_ind], size);
@@ -109,8 +110,8 @@ void test_spif_random_program_read_erase()
109
110
}
110
111
}
111
112
112
- bd_size_t block_size = blockD .get_erase_size ();
113
- unsigned addrwidth = ceil (log (float (blockD .size () - 1 )) / log (float (16 ))) + 1 ;
113
+ bd_size_t block_size = block_device .get_erase_size ();
114
+ unsigned addrwidth = ceil (log (float (block_device .size () - 1 )) / log (float (16 ))) + 1 ;
114
115
115
116
uint8_t *write_block = new (std::nothrow) uint8_t [block_size];
116
117
uint8_t *read_block = new (std::nothrow) uint8_t [block_size];
@@ -120,31 +121,32 @@ void test_spif_random_program_read_erase()
120
121
}
121
122
122
123
for (int b = 0 ; b < TEST_BLOCK_COUNT; b++) {
123
- basic_erase_program_read_test (blockD , block_size, write_block, read_block, addrwidth);
124
+ basic_erase_program_read_test (block_device , block_size, write_block, read_block, addrwidth);
124
125
}
125
126
126
- err = blockD .deinit ();
127
+ err = block_device .deinit ();
127
128
TEST_ASSERT_EQUAL (0 , err);
128
129
129
130
end:
130
131
delete[] write_block;
131
132
delete[] read_block;
132
133
}
133
134
134
- void test_spif_unaligned_program ()
135
+ void test_spif_unaligned_erase ()
135
136
{
136
- utest_printf (" \n Test Unaligned Program Starts..\n " );
137
+ utest_printf (" \n Test Unaligned Erase Starts..\n " );
137
138
138
- SPIFBlockDevice blockD (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO, MBED_CONF_SPIF_DRIVER_SPI_CLK,
139
- MBED_CONF_SPIF_DRIVER_SPI_CS);
139
+ SPIFBlockDevice block_device (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO,
140
+ MBED_CONF_SPIF_DRIVER_SPI_CLK,
141
+ MBED_CONF_SPIF_DRIVER_SPI_CS);
140
142
141
- int err = blockD .init ();
143
+ int err = block_device .init ();
142
144
TEST_ASSERT_EQUAL (0 , err);
143
145
144
146
for (unsigned atr = 0 ; atr < sizeof (ATTRS) / sizeof (ATTRS[0 ]); atr++) {
145
147
static const char *prefixes[] = {" " , " k" , " M" , " G" };
146
148
for (int i_ind = 3 ; i_ind >= 0 ; i_ind--) {
147
- bd_size_t size = (blockD .*ATTRS[atr].method )();
149
+ bd_size_t size = (block_device .*ATTRS[atr].method )();
148
150
if (size >= (1ULL << 10 * i_ind)) {
149
151
utest_printf (" %s: %llu%sbytes (%llubytes)\n " ,
150
152
ATTRS[atr].name , size >> 10 * i_ind, prefixes[i_ind], size);
@@ -153,68 +155,53 @@ void test_spif_unaligned_program()
153
155
}
154
156
}
155
157
156
- bd_size_t block_size = blockD.get_erase_size ();
157
- unsigned addrwidth = ceil (log (float (blockD.size () - 1 )) / log (float (16 ))) + 1 ;
158
+ bd_addr_t addr = 0 ;
159
+ bd_size_t sector_erase_size = block_device.get_erase_size (addr);
160
+ unsigned addrwidth = ceil (log (float (block_device.size () - 1 )) / log (float (16 ))) + 1 ;
158
161
159
- uint8_t *write_block = new (std::nothrow) uint8_t [block_size];
160
- uint8_t *read_block = new (std::nothrow) uint8_t [block_size];
161
- if (!write_block || !read_block ) {
162
- utest_printf (" \n Not enough memory for test" );
163
- goto end;
164
- }
165
-
166
- {
167
- bd_addr_t block = (rand () * block_size) % blockD.size () + 1 ;
162
+ utest_printf (" \n test %0*llx:%llu..." , addrwidth, addr, sector_erase_size);
168
163
169
- // Use next random number as temporary seed to keep
170
- // the address progressing in the pseudorandom sequence
171
- unsigned seed = rand ();
164
+ // unaligned start address
165
+ addr += 1 ;
166
+ err = block_device.erase (addr, sector_erase_size - 1 );
167
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS, err);
172
168
173
- // Fill with random sequence
174
- srand (seed);
175
- for (bd_size_t i_ind = 0 ; i_ind < block_size; i_ind++) {
176
- write_block[i_ind] = 0xff & rand ();
177
- }
169
+ err = block_device.erase (addr, sector_erase_size);
170
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS, err);
178
171
179
- // Write, sync, and read the block
180
- utest_printf ( " \n test %0*llx:%llu... " , addrwidth, block, block_size );
172
+ err = block_device. erase (addr, 1 );
173
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS, err );
181
174
182
- err = blockD. erase (block, block_size);
183
- TEST_ASSERT_EQUAL ( 0 , err) ;
175
+ // unaligned end address
176
+ addr = 0 ;
184
177
185
- // err = blockD .erase(block+4096, block_size );
186
- // TEST_ASSERT_EQUAL(0 , err);
178
+ err = block_device .erase (addr, 1 );
179
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS , err);
187
180
188
- err = blockD. program (write_block, block, block_size );
189
- TEST_ASSERT_EQUAL (0 , err);
181
+ err = block_device. erase (addr, sector_erase_size + 1 );
182
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS , err);
190
183
191
- err = blockD.read (read_block, block, block_size);
192
- TEST_ASSERT_EQUAL (0 , err);
184
+ // erase size exceeds flash device size
185
+ err = block_device.erase (addr, block_device.size () + 1 );
186
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_INVALID_ERASE_PARAMS, err);
193
187
194
- // Check that the data was unmodified
195
- srand (seed);
196
- for (bd_size_t i_ind = 0 ; i_ind < block_size; i_ind++) {
197
- // printf("index %d\n", i_ind);
198
- TEST_ASSERT_EQUAL (0xff & rand (), read_block[i_ind]);
199
- }
188
+ // Valid erase
189
+ err = block_device.erase (addr, sector_erase_size);
190
+ TEST_ASSERT_EQUAL (SPIF_BD_ERROR_OK, err);
200
191
201
- err = blockD.deinit ();
202
- TEST_ASSERT_EQUAL (0 , err);
203
- }
204
- end:
205
- delete[] write_block;
206
- delete[] read_block;
192
+ err = block_device.deinit ();
193
+ TEST_ASSERT_EQUAL (0 , err);
207
194
}
208
195
209
- static void test_spif_thread_job (void *vBlockD /* , int thread_num*/ )
196
+ static void test_spif_thread_job (void *block_device_ptr /* , int thread_num*/ )
210
197
{
211
198
static int thread_num = 0 ;
212
199
thread_num++;
213
- SPIFBlockDevice *blockD = (SPIFBlockDevice *)vBlockD ;
200
+ SPIFBlockDevice *block_device = (SPIFBlockDevice *)block_device_ptr ;
214
201
utest_printf (" \n Thread %d Started \n " , thread_num);
215
202
216
- bd_size_t block_size = blockD ->get_erase_size ();
217
- unsigned addrwidth = ceil (log (float (blockD ->size () - 1 )) / log (float (16 ))) + 1 ;
203
+ bd_size_t block_size = block_device ->get_erase_size ();
204
+ unsigned addrwidth = ceil (log (float (block_device ->size () - 1 )) / log (float (16 ))) + 1 ;
218
205
219
206
uint8_t *write_block = new (std::nothrow) uint8_t [block_size];
220
207
uint8_t *read_block = new (std::nothrow) uint8_t [block_size];
@@ -224,7 +211,7 @@ static void test_spif_thread_job(void *vBlockD/*, int thread_num*/)
224
211
}
225
212
226
213
for (int b = 0 ; b < TEST_BLOCK_COUNT; b++) {
227
- basic_erase_program_read_test ((*blockD ), block_size, write_block, read_block, addrwidth);
214
+ basic_erase_program_read_test ((*block_device ), block_size, write_block, read_block, addrwidth);
228
215
}
229
216
230
217
end:
@@ -236,16 +223,17 @@ void test_spif_multi_threads()
236
223
{
237
224
utest_printf (" \n Test Multi Threaded Erase/Program/Read Starts..\n " );
238
225
239
- SPIFBlockDevice blockD (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO, MBED_CONF_SPIF_DRIVER_SPI_CLK,
240
- MBED_CONF_SPIF_DRIVER_SPI_CS);
226
+ SPIFBlockDevice block_device (MBED_CONF_SPIF_DRIVER_SPI_MOSI, MBED_CONF_SPIF_DRIVER_SPI_MISO,
227
+ MBED_CONF_SPIF_DRIVER_SPI_CLK,
228
+ MBED_CONF_SPIF_DRIVER_SPI_CS);
241
229
242
- int err = blockD .init ();
230
+ int err = block_device .init ();
243
231
TEST_ASSERT_EQUAL (0 , err);
244
232
245
233
for (unsigned atr = 0 ; atr < sizeof (ATTRS) / sizeof (ATTRS[0 ]); atr++) {
246
234
static const char *prefixes[] = {" " , " k" , " M" , " G" };
247
235
for (int i_ind = 3 ; i_ind >= 0 ; i_ind--) {
248
- bd_size_t size = (blockD .*ATTRS[atr].method )();
236
+ bd_size_t size = (block_device .*ATTRS[atr].method )();
249
237
if (size >= (1ULL << 10 * i_ind)) {
250
238
utest_printf (" %s: %llu%sbytes (%llubytes)\n " ,
251
239
ATTRS[atr].name , size >> 10 * i_ind, prefixes[i_ind], size);
@@ -260,7 +248,7 @@ void test_spif_multi_threads()
260
248
int i_ind;
261
249
262
250
for (i_ind = 0 ; i_ind < SPIF_TEST_NUM_OF_THREADS; i_ind++) {
263
- threadStatus = spif_bd_thread[i_ind].start (test_spif_thread_job, (void *)&blockD );
251
+ threadStatus = spif_bd_thread[i_ind].start (test_spif_thread_job, (void *)&block_device );
264
252
if (threadStatus != 0 ) {
265
253
utest_printf (" \n Thread %d Start Failed!" , i_ind + 1 );
266
254
}
@@ -270,7 +258,7 @@ void test_spif_multi_threads()
270
258
spif_bd_thread[i_ind].join ();
271
259
}
272
260
273
- err = blockD .deinit ();
261
+ err = block_device .deinit ();
274
262
TEST_ASSERT_EQUAL (0 , err);
275
263
}
276
264
@@ -282,7 +270,7 @@ utest::v1::status_t test_setup(const size_t number_of_cases)
282
270
}
283
271
284
272
Case cases[] = {
285
- Case (" Testing unaligned program blocks" , test_spif_unaligned_program ),
273
+ Case (" Testing unaligned erase blocks" , test_spif_unaligned_erase ),
286
274
Case (" Testing read write random blocks" , test_spif_random_program_read_erase),
287
275
Case (" Testing Multi Threads Erase Program Read" , test_spif_multi_threads)
288
276
};
0 commit comments