diff --git a/docs/arduino-ide/mac.md b/docs/arduino-ide/mac.md index d734a2c64c8..cea62a6d1b2 100644 --- a/docs/arduino-ide/mac.md +++ b/docs/arduino-ide/mac.md @@ -7,7 +7,7 @@ Installation instructions for Mac OS ```bash mkdir -p ~/Documents/Arduino/hardware/espressif && \ cd ~/Documents/Arduino/hardware/espressif && \ - git clone https://github.com/espressif/arduino-esp32.git esp32 && \ + git clone https://github.com/aho1go/arduino-esp32.git esp32 && \ cd esp32 && \ git submodule update --init --recursive && \ cd tools && \ diff --git a/libraries/SD/src/SD.cpp b/libraries/SD/src/SD.cpp index 40d16c869a0..92165aa7b28 100644 --- a/libraries/SD/src/SD.cpp +++ b/libraries/SD/src/SD.cpp @@ -22,7 +22,7 @@ using namespace fs; SDFS::SDFS(FSImplPtr impl): FS(impl), _pdrv(0xFF) {} -bool SDFS::begin(uint8_t ssPin, SPIClass &spi, uint32_t frequency, const char * mountpoint) +bool SDFS::begin(uint8_t ssPin, SPIClass &spi, uint32_t frequency, const char * mountpoint, const char* lockcode, int lockcode_len) { if(_pdrv != 0xFF) { return true; @@ -30,7 +30,7 @@ bool SDFS::begin(uint8_t ssPin, SPIClass &spi, uint32_t frequency, const char * spi.begin(); - _pdrv = sdcard_init(ssPin, &spi, frequency); + _pdrv = sdcard_init(ssPin, &spi, frequency, lockcode, lockcode_len); if(_pdrv == 0xFF) { return false; } diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index 54e41ce38ab..d3b0b6a3b76 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -28,7 +28,7 @@ class SDFS : public FS public: SDFS(FSImplPtr impl); - bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd"); + bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", const char * lockcode=NULL, int lockcode_len=0); void end(); sdcard_type_t cardType(); uint64_t cardSize(); diff --git a/libraries/SD/src/sd_diskio.cpp b/libraries/SD/src/sd_diskio.cpp index ca0f0d6b05e..7d3b60665e9 100644 --- a/libraries/SD/src/sd_diskio.cpp +++ b/libraries/SD/src/sd_diskio.cpp @@ -55,6 +55,9 @@ typedef struct { unsigned long sectors; bool supports_crc; int status; + + const char * lockcode; + int lockcode_len; } ardu_sdcard_t; static ardu_sdcard_t* s_cards[FF_VOLUMES] = { NULL }; @@ -416,6 +419,58 @@ unsigned long sdGetSectorsCount(uint8_t pdrv) return 0; } +bool sdLockUnlock(uint8_t pdrv, const char* buffer, int len, char mode ) +{ + ardu_sdcard_t * card = s_cards[pdrv]; + unsigned short crc; + char token; + char cmdPacket[16+2]; + + if(!sdSelectCard(pdrv)) { + return false; + } + + cmdPacket[0] = 42 | 0x40; + cmdPacket[1] = 0; + cmdPacket[2] = 0; + cmdPacket[3] = 0; + cmdPacket[4] = 0; + cmdPacket[5] = (CRC7(cmdPacket, 5) << 1) | 0x00; //0x01; //0x28; + cmdPacket[6] = 0xFF; + card->spi->writeBytes((uint8_t*)cmdPacket, 7); + + for (int i = 0; i < 9; i++) { + token = card->spi->transfer(0xFF); + if ((token & 0x80)==0x00) { + break; + } + } + + if((token&0x80)==0x00) { + // Data Token + card->spi->write(0xFE); // Data Token + + // Data Block + memset(cmdPacket, 0xFF, sizeof(cmdPacket)); + cmdPacket[0] = mode; + cmdPacket[1] = len; + memcpy(&cmdPacket[2], buffer, len); + card->spi->writeBytes((uint8_t*)cmdPacket, 16+2); + + // CRC + crc = CRC16(cmdPacket, 16+2); + card->spi->write16(crc); + + // Wait for Data Response + uint32_t start = millis(); + do { + token = card->spi->transfer(0xFF); + } while (token == 0xFF && (millis() - start) < 500); + } + sdDeselectCard(pdrv); + + return true; +} namespace { @@ -547,6 +602,13 @@ DSTATUS ff_sd_initialize(uint8_t pdrv) } } + if ((card->lockcode != NULL) && (card->lockcode_len > 0)) { + if (sdTransaction(pdrv, SET_BLOCKLEN, 16+2, NULL) == 0x00) { + sdLockUnlock(pdrv, card->lockcode, card->lockcode_len, 0x02); + sdTransaction(pdrv, SET_BLOCKLEN, 512, NULL); + } + } + if (card->type != CARD_SDHC) { if (sdTransaction(pdrv, SET_BLOCKLEN, 512, NULL) != 0x00) { log_w("SET_BLOCKLEN failed"); @@ -658,7 +720,7 @@ uint8_t sdcard_uninit(uint8_t pdrv) return err; } -uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz) +uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz, const char * lockcode, int lockcode_len) { uint8_t pdrv = 0xFF; @@ -680,6 +742,9 @@ uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz) card->type = CARD_NONE; card->status = STA_NOINIT; + card->lockcode = lockcode; + card->lockcode_len = lockcode_len; + pinMode(card->ssPin, OUTPUT); digitalWrite(card->ssPin, HIGH); diff --git a/libraries/SD/src/sd_diskio.h b/libraries/SD/src/sd_diskio.h index 177542575ad..df088dd4556 100644 --- a/libraries/SD/src/sd_diskio.h +++ b/libraries/SD/src/sd_diskio.h @@ -18,7 +18,7 @@ #include "SPI.h" #include "sd_defines.h" -uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz); +uint8_t sdcard_init(uint8_t cs, SPIClass * spi, int hz, const char * lockcode, int lockcode_len); uint8_t sdcard_uninit(uint8_t pdrv); bool sdcard_mount(uint8_t pdrv, const char* path); @@ -28,4 +28,6 @@ sdcard_type_t sdcard_type(uint8_t pdrv); uint32_t sdcard_num_sectors(uint8_t pdrv); uint32_t sdcard_sector_size(uint8_t pdrv); +bool sdLockUnlock(uint8_t pdrv, const char* buffer, int len, char mode ); + #endif /* _SD_DISKIO_H_ */