@@ -164,6 +164,7 @@ DataFlashBlockDevice::DataFlashBlockDevice(PinName mosi,
164
164
165
165
int DataFlashBlockDevice::init ()
166
166
{
167
+ _mutex.lock ();
167
168
DEBUG_PRINTF (" init\r\n " );
168
169
169
170
if (!_is_initialized) {
@@ -173,6 +174,7 @@ int DataFlashBlockDevice::init()
173
174
uint32_t val = core_util_atomic_incr_u32 (&_init_ref_count, 1 );
174
175
175
176
if (val != 1 ) {
177
+ _mutex.unlock ();
176
178
return BD_ERROR_OK;
177
179
}
178
180
@@ -281,33 +283,40 @@ int DataFlashBlockDevice::init()
281
283
_is_initialized = true ;
282
284
}
283
285
286
+ _mutex.unlock ();
284
287
return result;
285
288
}
286
289
287
290
int DataFlashBlockDevice::deinit ()
288
291
{
292
+ _mutex.lock ();
289
293
DEBUG_PRINTF (" deinit\r\n " );
290
294
291
295
if (!_is_initialized) {
292
296
_init_ref_count = 0 ;
297
+ _mutex.unlock ();
293
298
return BD_ERROR_OK;
294
299
}
295
300
296
301
uint32_t val = core_util_atomic_decr_u32 (&_init_ref_count, 1 );
297
302
298
303
if (val) {
304
+ _mutex.unlock ();
299
305
return BD_ERROR_OK;
300
306
}
301
307
302
308
_is_initialized = false ;
309
+ _mutex.unlock ();
303
310
return BD_ERROR_OK;
304
311
}
305
312
306
313
int DataFlashBlockDevice::read (void *buffer, bd_addr_t addr, bd_size_t size)
307
314
{
315
+ _mutex.lock ();
308
316
DEBUG_PRINTF (" read: %p %" PRIX64 " %" PRIX64 " \r\n " , buffer, addr, size);
309
317
310
318
if (!_is_initialized) {
319
+ _mutex.unlock ();
311
320
return BD_ERROR_DEVICE_ERROR;
312
321
}
313
322
@@ -345,14 +354,17 @@ int DataFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
345
354
result = BD_ERROR_OK;
346
355
}
347
356
357
+ _mutex.unlock ();
348
358
return result;
349
359
}
350
360
351
361
int DataFlashBlockDevice::program (const void *buffer, bd_addr_t addr, bd_size_t size)
352
362
{
363
+ _mutex.lock ();
353
364
DEBUG_PRINTF (" program: %p %" PRIX64 " %" PRIX64 " \r\n " , buffer, addr, size);
354
365
355
366
if (!_is_initialized) {
367
+ _mutex.unlock ();
356
368
return BD_ERROR_DEVICE_ERROR;
357
369
}
358
370
@@ -411,14 +423,17 @@ int DataFlashBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t
411
423
_write_enable (false );
412
424
}
413
425
426
+ _mutex.unlock ();
414
427
return result;
415
428
}
416
429
417
430
int DataFlashBlockDevice::erase (bd_addr_t addr, bd_size_t size)
418
431
{
432
+ _mutex.lock ();
419
433
DEBUG_PRINTF (" erase: %" PRIX64 " %" PRIX64 " \r\n " , addr, size);
420
434
421
435
if (!_is_initialized) {
436
+ _mutex.unlock ();
422
437
return BD_ERROR_DEVICE_ERROR;
423
438
}
424
439
@@ -465,6 +480,7 @@ int DataFlashBlockDevice::erase(bd_addr_t addr, bd_size_t size)
465
480
_write_enable (false );
466
481
}
467
482
483
+ _mutex.unlock ();
468
484
return result;
469
485
}
470
486
@@ -484,23 +500,29 @@ bd_size_t DataFlashBlockDevice::get_program_size() const
484
500
485
501
bd_size_t DataFlashBlockDevice::get_erase_size () const
486
502
{
503
+ _mutex.lock ();
487
504
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;
490
508
}
491
509
492
510
bd_size_t DataFlashBlockDevice::get_erase_size (bd_addr_t addr) const
493
511
{
512
+ _mutex.lock ();
494
513
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;
497
517
}
498
518
499
519
bd_size_t DataFlashBlockDevice::size () const
500
520
{
521
+ _mutex.lock ();
501
522
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;
504
526
}
505
527
506
528
/* *
@@ -512,6 +534,7 @@ bd_size_t DataFlashBlockDevice::size() const
512
534
*/
513
535
uint16_t DataFlashBlockDevice::_get_register (uint8_t opcode)
514
536
{
537
+ _mutex.lock ();
515
538
DEBUG_PRINTF (" _get_register: %" PRIX8 " \r\n " , opcode);
516
539
517
540
/* activate device */
@@ -527,6 +550,7 @@ uint16_t DataFlashBlockDevice::_get_register(uint8_t opcode)
527
550
/* deactivate device */
528
551
_cs = 1 ;
529
552
553
+ _mutex.unlock ();
530
554
return status;
531
555
}
532
556
0 commit comments