242
242
#define SPI_READ_ERROR_OFR (0x1 << 3 ) /* !< Out of Range */
243
243
244
244
SDBlockDevice::SDBlockDevice (PinName mosi, PinName miso, PinName sclk, PinName cs, uint64_t hz)
245
- : _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0 )
245
+ : _sectors( 0 ), _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0 )
246
246
{
247
247
_cs = 1 ;
248
248
_card_type = SDCARD_NONE;
@@ -253,6 +253,7 @@ SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName c
253
253
254
254
// Only HC block size is supported.
255
255
_block_size = BLOCK_SIZE_HC;
256
+ _erase_size = BLOCK_SIZE_HC;
256
257
}
257
258
258
259
SDBlockDevice::~SDBlockDevice ()
@@ -346,44 +347,45 @@ int SDBlockDevice::_initialise_card()
346
347
347
348
int SDBlockDevice::init ()
348
349
{
349
- _lock. lock ();
350
+ lock ();
350
351
int err = _initialise_card ();
351
352
_is_initialized = (err == BD_ERROR_OK);
352
353
if (!_is_initialized) {
353
354
debug_if (SD_DBG, " Fail to initialize card\n " );
354
- _lock. unlock ();
355
+ unlock ();
355
356
return err;
356
357
}
357
358
debug_if (SD_DBG, " init card = %d\n " , _is_initialized);
358
359
_sectors = _sd_sectors ();
359
360
// CMD9 failed
360
361
if (0 == _sectors) {
361
- _lock. unlock ();
362
+ unlock ();
362
363
return BD_ERROR_DEVICE_ERROR;
363
364
}
364
365
365
366
// Set block length to 512 (CMD16)
366
367
if (_cmd (CMD16_SET_BLOCKLEN, _block_size) != 0 ) {
367
368
debug_if (SD_DBG, " Set %d-byte block timed out\n " , _block_size);
368
- _lock. unlock ();
369
+ unlock ();
369
370
return BD_ERROR_DEVICE_ERROR;
370
371
}
371
372
372
373
// Set SCK for data transfer
373
374
err = _freq ();
374
375
if (err) {
375
- _lock. unlock ();
376
+ unlock ();
376
377
return err;
377
378
}
378
- _lock. unlock ();
379
+ unlock ();
379
380
return BD_ERROR_OK;
380
381
}
381
382
382
383
int SDBlockDevice::deinit ()
383
384
{
384
- _lock. lock ();
385
+ lock ();
385
386
_is_initialized = false ;
386
- _lock.unlock ();
387
+ _sectors = 0 ;
388
+ unlock ();
387
389
return 0 ;
388
390
}
389
391
@@ -394,9 +396,9 @@ int SDBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
394
396
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
395
397
}
396
398
397
- _lock. lock ();
399
+ lock ();
398
400
if (!_is_initialized) {
399
- _lock. unlock ();
401
+ unlock ();
400
402
return SD_BLOCK_DEVICE_ERROR_NO_INIT;
401
403
}
402
404
@@ -417,7 +419,7 @@ int SDBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
417
419
if (blockCnt == 1 ) {
418
420
// Single block write command
419
421
if (BD_ERROR_OK != (status = _cmd (CMD24_WRITE_BLOCK, addr))) {
420
- _lock. unlock ();
422
+ unlock ();
421
423
return status;
422
424
}
423
425
@@ -435,7 +437,7 @@ int SDBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
435
437
436
438
// Multiple block write command
437
439
if (BD_ERROR_OK != (status = _cmd (CMD25_WRITE_MULTIPLE_BLOCK, addr))) {
438
- _lock. unlock ();
440
+ unlock ();
439
441
return status;
440
442
}
441
443
@@ -457,7 +459,7 @@ int SDBlockDevice::program(const void *b, bd_addr_t addr, bd_size_t size)
457
459
}
458
460
459
461
_deselect ();
460
- _lock. unlock ();
462
+ unlock ();
461
463
return status;
462
464
}
463
465
@@ -467,9 +469,9 @@ int SDBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
467
469
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
468
470
}
469
471
470
- _lock. lock ();
472
+ lock ();
471
473
if (!_is_initialized) {
472
- _lock. unlock ();
474
+ unlock ();
473
475
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
474
476
}
475
477
@@ -490,7 +492,7 @@ int SDBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
490
492
status = _cmd (CMD17_READ_SINGLE_BLOCK, addr);
491
493
}
492
494
if (BD_ERROR_OK != status) {
493
- _lock. unlock ();
495
+ unlock ();
494
496
return status;
495
497
}
496
498
@@ -509,7 +511,7 @@ int SDBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size)
509
511
if (size > _block_size) {
510
512
status = _cmd (CMD12_STOP_TRANSMISSION, 0x0 );
511
513
}
512
- _lock. unlock ();
514
+ unlock ();
513
515
return status;
514
516
}
515
517
@@ -519,9 +521,9 @@ int SDBlockDevice::erase(bd_addr_t addr, bd_size_t size)
519
521
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
520
522
}
521
523
522
- _lock. lock ();
524
+ lock ();
523
525
if (!_is_initialized) {
524
- _lock. unlock ();
526
+ unlock ();
525
527
return SD_BLOCK_DEVICE_ERROR_NO_INIT;
526
528
}
527
529
int status = BD_ERROR_OK;
@@ -544,17 +546,17 @@ int SDBlockDevice::erase(bd_addr_t addr, bd_size_t size)
544
546
545
547
// Start lba sent in start command
546
548
if (BD_ERROR_OK != (status = _cmd (CMD32_ERASE_WR_BLK_START_ADDR, addr))) {
547
- _lock. unlock ();
549
+ unlock ();
548
550
return status;
549
551
}
550
552
551
553
// End lba = addr+size sent in end addr command
552
554
if (BD_ERROR_OK != (status = _cmd (CMD33_ERASE_WR_BLK_END_ADDR, addr+size))) {
553
- _lock. unlock ();
555
+ unlock ();
554
556
return status;
555
557
}
556
558
status = _cmd (CMD38_ERASE, 0x0 );
557
- _lock. unlock ();
559
+ unlock ();
558
560
return status;
559
561
}
560
562
@@ -575,13 +577,7 @@ bd_size_t SDBlockDevice::get_erase_size() const
575
577
576
578
bd_size_t SDBlockDevice::size () const
577
579
{
578
- bd_size_t sectors = 0 ;
579
- _lock.lock ();
580
- if (_is_initialized) {
581
- sectors = _sectors;
582
- }
583
- _lock.unlock ();
584
- return _block_size*sectors;
580
+ return _block_size*_sectors;
585
581
}
586
582
587
583
void SDBlockDevice::debug (bool dbg)
@@ -591,10 +587,10 @@ void SDBlockDevice::debug(bool dbg)
591
587
592
588
int SDBlockDevice::frequency (uint64_t freq)
593
589
{
594
- _lock. lock ();
590
+ lock ();
595
591
_transfer_sck = freq;
596
592
int err = _freq ();
597
- _lock. unlock ();
593
+ unlock ();
598
594
return err;
599
595
}
600
596
0 commit comments