@@ -55,6 +55,9 @@ typedef struct {
55
55
unsigned long sectors;
56
56
bool supports_crc;
57
57
int status;
58
+
59
+ const char * lockcode;
60
+ int lockcode_len;
58
61
} ardu_sdcard_t ;
59
62
60
63
static ardu_sdcard_t * s_cards[FF_VOLUMES] = { NULL };
@@ -416,6 +419,58 @@ unsigned long sdGetSectorsCount(uint8_t pdrv)
416
419
return 0 ;
417
420
}
418
421
422
+ bool sdLockUnlock (uint8_t pdrv, const char * buffer, int len, char mode )
423
+ {
424
+ ardu_sdcard_t * card = s_cards[pdrv];
425
+ unsigned short crc;
426
+ char token;
427
+ char cmdPacket[16 +2 ];
428
+
429
+ if (!sdSelectCard (pdrv)) {
430
+ return false ;
431
+ }
432
+
433
+ cmdPacket[0 ] = 42 | 0x40 ;
434
+ cmdPacket[1 ] = 0 ;
435
+ cmdPacket[2 ] = 0 ;
436
+ cmdPacket[3 ] = 0 ;
437
+ cmdPacket[4 ] = 0 ;
438
+ cmdPacket[5 ] = (CRC7 (cmdPacket, 5 ) << 1 ) | 0x00 ; // 0x01; //0x28;
439
+ cmdPacket[6 ] = 0xFF ;
440
+ card->spi ->writeBytes ((uint8_t *)cmdPacket, 7 );
441
+
442
+ for (int i = 0 ; i < 9 ; i++) {
443
+ token = card->spi ->transfer (0xFF );
444
+ if ((token & 0x80 )==0x00 ) {
445
+ break ;
446
+ }
447
+ }
448
+
449
+ if ((token&0x80 )==0x00 ) {
450
+ // Data Token
451
+ card->spi ->write (0xFE ); // Data Token
452
+
453
+ // Data Block
454
+ memset (cmdPacket, 0xFF , sizeof (cmdPacket));
455
+ cmdPacket[0 ] = mode;
456
+ cmdPacket[1 ] = len;
457
+ memcpy (&cmdPacket[2 ], buffer, len);
458
+ card->spi ->writeBytes ((uint8_t *)cmdPacket, 16 +2 );
459
+
460
+ // CRC
461
+ crc = CRC16 (cmdPacket, 16 +2 );
462
+ card->spi ->write16 (crc);
463
+
464
+ // Wait for Data Response
465
+ uint32_t start = millis ();
466
+ do {
467
+ token = card->spi ->transfer (0xFF );
468
+ } while (token == 0xFF && (millis () - start) < 500 );
469
+ }
470
+ sdDeselectCard (pdrv);
471
+
472
+ return true ;
473
+ }
419
474
420
475
namespace
421
476
{
@@ -547,6 +602,13 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
547
602
}
548
603
}
549
604
605
+ if ((card->lockcode != NULL ) && (card->lockcode_len > 0 )) {
606
+ if (sdTransaction (pdrv, SET_BLOCKLEN, 16 +2 , NULL ) == 0x00 ) {
607
+ sdLockUnlock (pdrv, card->lockcode , card->lockcode_len , 0x02 );
608
+ sdTransaction (pdrv, SET_BLOCKLEN, 512 , NULL );
609
+ }
610
+ }
611
+
550
612
if (card->type != CARD_SDHC) {
551
613
if (sdTransaction (pdrv, SET_BLOCKLEN, 512 , NULL ) != 0x00 ) {
552
614
log_w (" SET_BLOCKLEN failed" );
@@ -658,7 +720,7 @@ uint8_t sdcard_uninit(uint8_t pdrv)
658
720
return err;
659
721
}
660
722
661
- uint8_t sdcard_init (uint8_t cs, SPIClass * spi, int hz)
723
+ uint8_t sdcard_init (uint8_t cs, SPIClass * spi, int hz, const char * lockcode, int lockcode_len )
662
724
{
663
725
664
726
uint8_t pdrv = 0xFF ;
@@ -680,6 +742,9 @@ uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz)
680
742
card->type = CARD_NONE;
681
743
card->status = STA_NOINIT;
682
744
745
+ card->lockcode = lockcode;
746
+ card->lockcode_len = lockcode_len;
747
+
683
748
pinMode (card->ssPin , OUTPUT);
684
749
digitalWrite (card->ssPin , HIGH);
685
750
0 commit comments