Skip to content

Commit 73cc54e

Browse files
authored
Merge pull request #8524 from korjaa/more_blockdevice_tests
Add more generic BlockDevice tests.
2 parents 0e6eac5 + 0d04f03 commit 73cc54e

File tree

3 files changed

+246
-7
lines changed

3 files changed

+246
-7
lines changed

components/storage/blockdevice/COMPONENT_DATAFLASH/DataFlashBlockDevice.cpp

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ DataFlashBlockDevice::DataFlashBlockDevice(PinName mosi,
164164

165165
int DataFlashBlockDevice::init()
166166
{
167+
_mutex.lock();
167168
DEBUG_PRINTF("init\r\n");
168169

169170
if (!_is_initialized) {
@@ -173,6 +174,7 @@ int DataFlashBlockDevice::init()
173174
uint32_t val = core_util_atomic_incr_u32(&_init_ref_count, 1);
174175

175176
if (val != 1) {
177+
_mutex.unlock();
176178
return BD_ERROR_OK;
177179
}
178180

@@ -281,33 +283,40 @@ int DataFlashBlockDevice::init()
281283
_is_initialized = true;
282284
}
283285

286+
_mutex.unlock();
284287
return result;
285288
}
286289

287290
int DataFlashBlockDevice::deinit()
288291
{
292+
_mutex.lock();
289293
DEBUG_PRINTF("deinit\r\n");
290294

291295
if (!_is_initialized) {
292296
_init_ref_count = 0;
297+
_mutex.unlock();
293298
return BD_ERROR_OK;
294299
}
295300

296301
uint32_t val = core_util_atomic_decr_u32(&_init_ref_count, 1);
297302

298303
if (val) {
304+
_mutex.unlock();
299305
return BD_ERROR_OK;
300306
}
301307

302308
_is_initialized = false;
309+
_mutex.unlock();
303310
return BD_ERROR_OK;
304311
}
305312

306313
int DataFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
307314
{
315+
_mutex.lock();
308316
DEBUG_PRINTF("read: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
309317

310318
if (!_is_initialized) {
319+
_mutex.unlock();
311320
return BD_ERROR_DEVICE_ERROR;
312321
}
313322

@@ -345,14 +354,17 @@ int DataFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
345354
result = BD_ERROR_OK;
346355
}
347356

357+
_mutex.unlock();
348358
return result;
349359
}
350360

351361
int DataFlashBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
352362
{
363+
_mutex.lock();
353364
DEBUG_PRINTF("program: %p %" PRIX64 " %" PRIX64 "\r\n", buffer, addr, size);
354365

355366
if (!_is_initialized) {
367+
_mutex.unlock();
356368
return BD_ERROR_DEVICE_ERROR;
357369
}
358370

@@ -411,14 +423,17 @@ int DataFlashBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t
411423
_write_enable(false);
412424
}
413425

426+
_mutex.unlock();
414427
return result;
415428
}
416429

417430
int DataFlashBlockDevice::erase(bd_addr_t addr, bd_size_t size)
418431
{
432+
_mutex.lock();
419433
DEBUG_PRINTF("erase: %" PRIX64 " %" PRIX64 "\r\n", addr, size);
420434

421435
if (!_is_initialized) {
436+
_mutex.unlock();
422437
return BD_ERROR_DEVICE_ERROR;
423438
}
424439

@@ -465,6 +480,7 @@ int DataFlashBlockDevice::erase(bd_addr_t addr, bd_size_t size)
465480
_write_enable(false);
466481
}
467482

483+
_mutex.unlock();
468484
return result;
469485
}
470486

@@ -484,23 +500,29 @@ bd_size_t DataFlashBlockDevice::get_program_size() const
484500

485501
bd_size_t DataFlashBlockDevice::get_erase_size() const
486502
{
503+
_mutex.lock();
487504
DEBUG_PRINTF("erase size: %" PRIX16 "\r\n", _block_size);
488-
489-
return _block_size;
505+
bd_size_t block_size = _block_size;
506+
_mutex.unlock();
507+
return block_size;
490508
}
491509

492510
bd_size_t DataFlashBlockDevice::get_erase_size(bd_addr_t addr) const
493511
{
512+
_mutex.lock();
494513
DEBUG_PRINTF("erase size: %" PRIX16 "\r\n", _block_size);
495-
496-
return _block_size;
514+
bd_size_t block_size = _block_size;
515+
_mutex.unlock();
516+
return block_size;
497517
}
498518

499519
bd_size_t DataFlashBlockDevice::size() const
500520
{
521+
_mutex.lock();
501522
DEBUG_PRINTF("device size: %" PRIX32 "\r\n", _device_size);
502-
503-
return _device_size;
523+
bd_size_t device_size = _device_size;
524+
_mutex.unlock();
525+
return device_size;
504526
}
505527

506528
/**
@@ -512,6 +534,7 @@ bd_size_t DataFlashBlockDevice::size() const
512534
*/
513535
uint16_t DataFlashBlockDevice::_get_register(uint8_t opcode)
514536
{
537+
_mutex.lock();
515538
DEBUG_PRINTF("_get_register: %" PRIX8 "\r\n", opcode);
516539

517540
/* activate device */
@@ -527,6 +550,7 @@ uint16_t DataFlashBlockDevice::_get_register(uint8_t opcode)
527550
/* deactivate device */
528551
_cs = 1;
529552

553+
_mutex.unlock();
530554
return status;
531555
}
532556

components/storage/blockdevice/COMPONENT_DATAFLASH/DataFlashBlockDevice.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ class DataFlashBlockDevice : public BlockDevice {
173173
int _sync(void);
174174
int _write_page(const uint8_t *buffer, uint32_t addr, uint32_t offset, uint32_t size);
175175
uint32_t _translate_address(bd_addr_t addr);
176+
177+
// Mutex for thread safety
178+
mutable PlatformMutex _mutex;
176179
};
177180

178181

0 commit comments

Comments
 (0)