From 409343b58344b335990f39db12b2be062ce4c2f3 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 18 Dec 2020 17:16:12 -0800 Subject: [PATCH 01/10] Update to SdFat 2.0.0 --- libraries/ESP8266SdFat | 2 +- libraries/SD/src/SD.h | 2 +- libraries/SDFS/src/SDFS.cpp | 11 ++++--- libraries/SDFS/src/SDFS.h | 51 +++++++++++++++--------------- libraries/SDFS/src/SDFSFormatter.h | 4 +++ tests/common.sh | 1 + tests/host/Makefile | 9 ++++-- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index b240d2231a..33deb5f98a 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit b240d2231a117bbd89b79902eb54cae948ee2f42 +Subproject commit 33deb5f98a9e2a281d7402ea724ce4fe01a85ab4 diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index 0f76e654e0..fee20da548 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -32,7 +32,7 @@ class SDClass { public: - boolean begin(uint8_t csPin, SPISettings cfg = SPI_HALF_SPEED) { + boolean begin(uint8_t csPin, uint32_t cfg = SPI_HALF_SPEED) { SDFS.setConfig(SDFSConfig(csPin, cfg)); return (boolean)SDFS.begin(); } diff --git a/libraries/SDFS/src/SDFS.cpp b/libraries/SDFS/src/SDFS.cpp index cbcc166000..4396099baa 100644 --- a/libraries/SDFS/src/SDFS.cpp +++ b/libraries/SDFS/src/SDFS.cpp @@ -65,13 +65,13 @@ FileImplPtr SDFSImpl::open(const char* path, OpenMode openMode, AccessMode acces } free(pathStr); } - sdfat::File fd = _fs.open(path, flags); + sdfat::File32 fd = _fs.open(path, flags); if (!fd) { DEBUGV("SDFSImpl::openFile: fd=%p path=`%s` openMode=%d accessMode=%d", &fd, path, openMode, accessMode); return FileImplPtr(); } - auto sharedFd = std::make_shared(fd); + auto sharedFd = std::make_shared(fd); return std::make_shared(this, sharedFd, path); } @@ -91,7 +91,7 @@ DirImplPtr SDFSImpl::openDir(const char* path) } // At this point we have a name of "/blah/blah/blah" or "blah" or "" // If that references a directory, just open it and we're done. - sdfat::File dirFile; + sdfat::File32 dirFile; const char *filter = ""; if (!pathStr[0]) { // openDir("") === openDir("/") @@ -136,7 +136,7 @@ DirImplPtr SDFSImpl::openDir(const char* path) DEBUGV("SDFSImpl::openDir: path=`%s`\n", path); return DirImplPtr(); } - auto sharedDir = std::make_shared(dirFile); + auto sharedDir = std::make_shared(dirFile); auto ret = std::make_shared(filter, this, sharedDir, pathStr); free(pathStr); return ret; @@ -146,9 +146,12 @@ bool SDFSImpl::format() { if (_mounted) { return false; } + return false; // TODO - Update implementation! +#if 0 SDFSFormatter formatter; bool ret = formatter.format(&_fs, _cfg._csPin, _cfg._spiSettings); return ret; +#endif } diff --git a/libraries/SDFS/src/SDFS.h b/libraries/SDFS/src/SDFS.h index a3d159fbb3..348284637d 100644 --- a/libraries/SDFS/src/SDFS.h +++ b/libraries/SDFS/src/SDFS.h @@ -47,7 +47,7 @@ class SDFSConfig : public FSConfig public: static constexpr uint32_t FSId = 0x53444653; - SDFSConfig(uint8_t csPin = 4, SPISettings spi = SD_SCK_MHZ(10)) : FSConfig(FSId, false), _csPin(csPin), _part(0), _spiSettings(spi) { } + SDFSConfig(uint8_t csPin = 4, uint32_t spi = SD_SCK_MHZ(10)) : FSConfig(FSId, false), _csPin(csPin), _part(0), _spiSettings(spi) { } SDFSConfig setAutoFormat(bool val = true) { _autoFormat = val; @@ -57,7 +57,7 @@ class SDFSConfig : public FSConfig _csPin = pin; return *this; } - SDFSConfig setSPI(SPISettings spi) { + SDFSConfig setSPI(uint32_t spi) { _spiSettings = spi; return *this; } @@ -67,9 +67,9 @@ class SDFSConfig : public FSConfig } // Inherit _type and _autoFormat - uint8_t _csPin; - uint8_t _part; - SPISettings _spiSettings; + uint8_t _csPin; + uint8_t _part; + uint32_t _spiSettings; }; class SDFSImpl : public FSImpl @@ -97,11 +97,11 @@ class SDFSImpl : public FSImpl return false; } info.maxOpenFiles = 999; // TODO - not valid - info.blockSize = _fs.vol()->blocksPerCluster() * 512; + info.blockSize = _fs.vol()->sectorsPerCluster() * _fs.vol()->bytesPerSector(); info.pageSize = 0; // TODO ? info.maxPathLength = 255; // TODO ? - info.totalBytes =_fs.vol()->volumeBlockCount() * 512LL; - info.usedBytes = info.totalBytes - (_fs.vol()->freeClusterCount() * _fs.vol()->blocksPerCluster() * 512LL); + info.totalBytes =_fs.vol()->clusterCount() * info.blockSize; + info.usedBytes = info.totalBytes - (_fs.vol()->freeClusterCount() * _fs.vol()->sectorsPerCluster() * _fs.vol()->bytesPerSector()); return true; } @@ -156,7 +156,7 @@ class SDFSImpl : public FSImpl format(); _mounted = _fs.begin(_cfg._csPin, _cfg._spiSettings); } - sdfat::SdFile::dateTimeCallback(dateTimeCB); + sdfat::FsDateTime::setCallback(dateTimeCB); return _mounted; } @@ -176,7 +176,7 @@ class SDFSImpl : public FSImpl return _fs.vol()->fatType(); } size_t blocksPerCluster() { - return _fs.vol()->blocksPerCluster(); + return _fs.vol()->sectorsPerCluster(); } size_t totalClusters() { return _fs.vol()->clusterCount(); @@ -185,7 +185,7 @@ class SDFSImpl : public FSImpl return (totalClusters() / blocksPerCluster()); } size_t clusterSize() { - return blocksPerCluster() * 512; // 512b block size + return blocksPerCluster() * _fs.vol()->bytesPerSector(); } size_t size() { return (clusterSize() * totalClusters()); @@ -264,7 +264,7 @@ class SDFSImpl : public FSImpl class SDFSFileImpl : public FileImpl { public: - SDFSFileImpl(SDFSImpl *fs, std::shared_ptr fd, const char *name) + SDFSFileImpl(SDFSImpl *fs, std::shared_ptr fd, const char *name) : _fs(fs), _fd(fd), _opened(true) { _name = std::shared_ptr(new char[strlen(name) + 1], std::default_delete()); @@ -295,7 +295,6 @@ class SDFSFileImpl : public FileImpl void flush() override { if (_opened) { - _fd->flush(); _fd->sync(); } } @@ -375,15 +374,15 @@ class SDFSFileImpl : public FileImpl bool isDirectory() const override { - return _opened ? _fd->isDirectory() : false; + return _opened ? _fd->isDir() : false; } time_t getLastWrite() override { time_t ftime = 0; if (_opened && _fd) { - sdfat::dir_t tmp; + sdfat::DirFat_t tmp; if (_fd.get()->dirEntry(&tmp)) { - ftime = SDFSImpl::FatToTimeT(tmp.lastWriteDate, tmp.lastWriteTime); + ftime = SDFSImpl::FatToTimeT(*(uint16_t*)tmp.modifyDate, *(uint16_t*)tmp.modifyTime); } } return ftime; @@ -392,9 +391,9 @@ class SDFSFileImpl : public FileImpl time_t getCreationTime() override { time_t ftime = 0; if (_opened && _fd) { - sdfat::dir_t tmp; + sdfat::DirFat_t tmp; if (_fd.get()->dirEntry(&tmp)) { - ftime = SDFSImpl::FatToTimeT(tmp.creationDate, tmp.creationTime); + ftime = SDFSImpl::FatToTimeT(*(uint16_t*)tmp.createDate, *(uint16_t*)tmp.createTime); } } return ftime; @@ -404,7 +403,7 @@ class SDFSFileImpl : public FileImpl protected: SDFSImpl* _fs; - std::shared_ptr _fd; + std::shared_ptr _fd; std::shared_ptr _name; bool _opened; }; @@ -412,7 +411,7 @@ class SDFSFileImpl : public FileImpl class SDFSDirImpl : public DirImpl { public: - SDFSDirImpl(const String& pattern, SDFSImpl* fs, std::shared_ptr dir, const char *dirPath = nullptr) + SDFSDirImpl(const String& pattern, SDFSImpl* fs, std::shared_ptr dir, const char *dirPath = nullptr) : _pattern(pattern), _fs(fs), _dir(dir), _valid(false), _dirPath(nullptr) { if (dirPath) { @@ -487,17 +486,17 @@ class SDFSDirImpl : public DirImpl { const int n = _pattern.length(); do { - sdfat::File file; + sdfat::File32 file; file.openNext(_dir.get(), sdfat::O_READ); if (file) { _valid = 1; _size = file.fileSize(); _isFile = file.isFile(); - _isDirectory = file.isDirectory(); - sdfat::dir_t tmp; + _isDirectory = file.isDir(); + sdfat::DirFat_t tmp; if (file.dirEntry(&tmp)) { - _time = SDFSImpl::FatToTimeT(tmp.lastWriteDate, tmp.lastWriteTime); - _creation = SDFSImpl::FatToTimeT(tmp.creationDate, tmp.creationTime); + _time = SDFSImpl::FatToTimeT(*(uint16_t*)tmp.modifyDate, *(uint16_t*)tmp.modifyTime); + _creation = SDFSImpl::FatToTimeT(*(uint16_t*)tmp.createDate, *(uint16_t*)tmp.createTime); } else { _time = 0; _creation = 0; @@ -521,7 +520,7 @@ class SDFSDirImpl : public DirImpl protected: String _pattern; SDFSImpl* _fs; - std::shared_ptr _dir; + std::shared_ptr _dir; bool _valid; char _lfn[64]; time_t _time; diff --git a/libraries/SDFS/src/SDFSFormatter.h b/libraries/SDFS/src/SDFSFormatter.h index d1fe6c94a7..46b5b4c829 100644 --- a/libraries/SDFS/src/SDFSFormatter.h +++ b/libraries/SDFS/src/SDFSFormatter.h @@ -30,6 +30,7 @@ namespace sdfs { class SDFSFormatter { +#if 0 private: // Taken from main FS object sdfat::Sd2Card *card; @@ -397,6 +398,9 @@ class SDFSFormatter { return makeFat32(); } } + + +#endif }; // class SDFSFormatter }; // namespace sdfs diff --git a/tests/common.sh b/tests/common.sh index 0c6ac9540d..cb889e727c 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -17,6 +17,7 @@ function skip_ino() /SoftwareSpi/ /STM32Test/ /extras/ +/ESP8266SdFat/ EOL echo $ino | grep -q -F "$skiplist" echo $(( 1 - $? )) diff --git a/tests/host/Makefile b/tests/host/Makefile index b7314a6d41..963b1b7d06 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -103,8 +103,13 @@ CORE_CPP_FILES := \ FatLib/FatFilePrint.cpp \ FatLib/FatFileSFN.cpp \ FatLib/FatVolume.cpp \ - FatLib/FmtNumber.cpp \ - FatLib/StdioStream.cpp \ + FatLib/FatPartition.cpp \ + common/FmtNumber.cpp \ + common/FsStructs.cpp \ + common/FsDateTime.cpp \ + common/PrintBasic.cpp \ + SdCard/SdSpiCard.cpp \ + SpiDriver/SdSpiESP.cpp \ ) \ $(abspath $(LIBRARIES_PATH)/SDFS/src/SDFS.cpp) \ $(abspath $(LIBRARIES_PATH)/SD/src/SD.cpp) \ From 042b7ca96f86746244505163168b48343175abc4 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 18 Dec 2020 19:57:38 -0800 Subject: [PATCH 02/10] Updated host tests --- libraries/ESP8266SdFat | 2 +- tests/host/Makefile | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index 33deb5f98a..6646b53dc8 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit 33deb5f98a9e2a281d7402ea724ce4fe01a85ab4 +Subproject commit 6646b53dc8f0083e40fa792aefdd09f009704b03 diff --git a/tests/host/Makefile b/tests/host/Makefile index 963b1b7d06..a6da581b65 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -108,8 +108,6 @@ CORE_CPP_FILES := \ common/FsStructs.cpp \ common/FsDateTime.cpp \ common/PrintBasic.cpp \ - SdCard/SdSpiCard.cpp \ - SpiDriver/SdSpiESP.cpp \ ) \ $(abspath $(LIBRARIES_PATH)/SDFS/src/SDFS.cpp) \ $(abspath $(LIBRARIES_PATH)/SD/src/SD.cpp) \ From 900ab0b76c86f07737d7069469d837db0aee3644 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 18 Dec 2020 21:51:17 -0800 Subject: [PATCH 03/10] Fix host tests, reinstaet FAT formatting --- libraries/ESP8266SdFat | 2 +- libraries/SDFS/src/SDFS.cpp | 14 +- libraries/SDFS/src/SDFSFormatter.h | 409 ----------------------------- tests/host/Makefile | 1 + 4 files changed, 11 insertions(+), 415 deletions(-) delete mode 100644 libraries/SDFS/src/SDFSFormatter.h diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index 6646b53dc8..fc0932c4ed 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit 6646b53dc8f0083e40fa792aefdd09f009704b03 +Subproject commit fc0932c4ed1c4f6d7214499566b3142262397f62 diff --git a/libraries/SDFS/src/SDFS.cpp b/libraries/SDFS/src/SDFS.cpp index 4396099baa..7439855f74 100644 --- a/libraries/SDFS/src/SDFS.cpp +++ b/libraries/SDFS/src/SDFS.cpp @@ -146,12 +146,16 @@ bool SDFSImpl::format() { if (_mounted) { return false; } - return false; // TODO - Update implementation! -#if 0 - SDFSFormatter formatter; - bool ret = formatter.format(&_fs, _cfg._csPin, _cfg._spiSettings); + sdfat::SdCardFactory cardFactory; + sdfat::SdCard* card = cardFactory.newCard(sdfat::SdSpiConfig(_cfg._csPin, DEDICATED_SPI, _cfg._spiSettings)); + if (!card || card->errorCode()) { + return false; + } + sdfat::FatFormatter fatFormatter; + uint8_t *sectorBuffer = new uint8_t[512]; + bool ret = fatFormatter.format(card, sectorBuffer, nullptr); + delete sectorBuffer; return ret; -#endif } diff --git a/libraries/SDFS/src/SDFSFormatter.h b/libraries/SDFS/src/SDFSFormatter.h deleted file mode 100644 index 46b5b4c829..0000000000 --- a/libraries/SDFS/src/SDFSFormatter.h +++ /dev/null @@ -1,409 +0,0 @@ -/* - SDFSFormatter.cpp - Formatter for SdFat SD cards - Copyright (c) 2019 Earle F. Philhower, III. All rights reserved. - - A C++ implementation of the SdFat/examples/SdFormatter sketch: - | Copyright (c) 2011-2018 Bill Greiman - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef _SDFSFORMATTER_H -#define _SDFSFORMATTER_H - -#include "SDFS.h" -#include -#include - -namespace sdfs { - -class SDFSFormatter { -#if 0 -private: - // Taken from main FS object - sdfat::Sd2Card *card; - sdfat::cache_t *cache; - - uint32_t cardSizeBlocks; - uint32_t cardCapacityMB; - - - // MBR information - uint8_t partType; - uint32_t relSector; - uint32_t partSize; - - // Fake disk geometry - uint8_t numberOfHeads; - uint8_t sectorsPerTrack; - - // FAT parameters - uint16_t reservedSectors; - uint8_t sectorsPerCluster; - uint32_t fatStart; - uint32_t fatSize; - uint32_t dataStart; - - uint8_t writeCache(uint32_t lbn) { - return card->writeBlock(lbn, cache->data); - } - - void clearCache(uint8_t addSig) { - memset(cache, 0, sizeof(*cache)); - if (addSig) { - cache->mbr.mbrSig0 = sdfat::BOOTSIG0; - cache->mbr.mbrSig1 = sdfat::BOOTSIG1; - } - } - - bool clearFatDir(uint32_t bgn, uint32_t count) { - clearCache(false); - if (!card->writeStart(bgn, count)) { - DEBUGV("SDFS: Clear FAT/DIR writeStart failed"); - return false; - } - esp8266::polledTimeout::periodicFastMs timeToYield(5); // Yield every 5ms of runtime - for (uint32_t i = 0; i < count; i++) { - if (timeToYield) { - delay(0); // WDT feed - } - if (!card->writeData(cache->data)) { - DEBUGV("SDFS: Clear FAT/DIR writeData failed"); - return false; - } - } - if (!card->writeStop()) { - DEBUGV("SDFS: Clear FAT/DIR writeStop failed"); - return false; - } - return true; - } - - uint16_t lbnToCylinder(uint32_t lbn) { - return lbn / (numberOfHeads * sectorsPerTrack); - } - - uint8_t lbnToHead(uint32_t lbn) { - return (lbn % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; - } - - uint8_t lbnToSector(uint32_t lbn) { - return (lbn % sectorsPerTrack) + 1; - } - - bool writeMbr() { - clearCache(true); - sdfat::part_t* p = cache->mbr.part; - p->boot = 0; - uint16_t c = lbnToCylinder(relSector); - if (c > 1023) { - DEBUGV("SDFS: MBR CHS"); - return false; - } - p->beginCylinderHigh = c >> 8; - p->beginCylinderLow = c & 0XFF; - p->beginHead = lbnToHead(relSector); - p->beginSector = lbnToSector(relSector); - p->type = partType; - uint32_t endLbn = relSector + partSize - 1; - c = lbnToCylinder(endLbn); - if (c <= 1023) { - p->endCylinderHigh = c >> 8; - p->endCylinderLow = c & 0XFF; - p->endHead = lbnToHead(endLbn); - p->endSector = lbnToSector(endLbn); - } else { - // Too big flag, c = 1023, h = 254, s = 63 - p->endCylinderHigh = 3; - p->endCylinderLow = 255; - p->endHead = 254; - p->endSector = 63; - } - p->firstSector = relSector; - p->totalSectors = partSize; - if (!writeCache(0)) { - DEBUGV("SDFS: write MBR"); - return false; - } - return true; - } - - uint32_t volSerialNumber() { - return (cardSizeBlocks << 8) + micros(); - } - - bool makeFat16() { - uint16_t const BU16 = 128; - uint32_t nc; - for (dataStart = 2 * BU16;; dataStart += BU16) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 255)/256; - uint32_t r = BU16 + 1 + 2 * fatSize + 32; - if (dataStart < r) { - continue; - } - relSector = dataStart - r + BU16; - break; - } - // check valid cluster count for FAT16 volume - if (nc < 4085 || nc >= 65525) { - DEBUGV("SDFS: Bad cluster count"); - } - reservedSectors = 1; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + 2 * fatSize + reservedSectors + 32; - if (partSize < 32680) { - partType = 0X01; - } else if (partSize < 65536) { - partType = 0X04; - } else { - partType = 0X06; - } - // write MBR - if (!writeMbr()) { - DEBUGV("SDFS: writembr failed"); - return false; - } - - clearCache(true); - sdfat::fat_boot_t* pb = &cache->fbs; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->rootDirEntryCount = 512; - pb->mediaType = 0XF8; - pb->sectorsPerFat16 = fatSize; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->driveNumber = 0X80; - pb->bootSignature = sdfat::EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy_P(pb->volumeLabel, PSTR("NO NAME "), sizeof(pb->volumeLabel)); - memcpy_P(pb->fileSystemType, PSTR("FAT16 "), sizeof(pb->fileSystemType)); - // write partition boot sector - if (!writeCache(relSector)) { - DEBUGV("SDFS: FAT16 write PBS failed"); - return false; - } - // clear FAT and root directory - if (!clearFatDir(fatStart, dataStart - fatStart)) { - DEBUGV("SDFS: FAT16 clear root failed\n"); - return false; - } - clearCache(false); - cache->fat16[0] = 0XFFF8; - cache->fat16[1] = 0XFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) || !writeCache(fatStart + fatSize)) { - DEBUGV("FAT16 reserve failed"); - return false; - } - return true; - } - - bool makeFat32() { - uint16_t const BU32 = 8192; - uint32_t nc; - relSector = BU32; - for (dataStart = 2 * BU32;; dataStart += BU32) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 127)/128; - uint32_t r = relSector + 9 + 2 * fatSize; - if (dataStart >= r) { - break; - } - } - // error if too few clusters in FAT32 volume - if (nc < 65525) { - DEBUGV("SDFS: Bad cluster count"); - return false; - } - reservedSectors = dataStart - relSector - 2 * fatSize; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + dataStart - relSector; - // type depends on address of end sector - // max CHS has lbn = 16450560 = 1024*255*63 - if ((relSector + partSize) <= 16450560) { - // FAT32 - partType = 0X0B; - } else { - // FAT32 with INT 13 - partType = 0X0C; - } - if (!writeMbr()) { - DEBUGV("SDFS: writembr failed"); - return false; - } - - clearCache(true); - - sdfat::fat32_boot_t* pb = &cache->fbs32; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->mediaType = 0XF8; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->sectorsPerFat32 = fatSize; - pb->fat32RootCluster = 2; - pb->fat32FSInfo = 1; - pb->fat32BackBootBlock = 6; - pb->driveNumber = 0X80; - pb->bootSignature = sdfat::EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy_P(pb->volumeLabel, PSTR("NO NAME "), sizeof(pb->volumeLabel)); - memcpy_P(pb->fileSystemType, PSTR("FAT32 "), sizeof(pb->fileSystemType)); - // write partition boot sector and backup - if (!writeCache(relSector) || !writeCache(relSector + 6)) { - DEBUGV("SDFS: FAT32 write PBS failed"); - return false; - } - clearCache(true); - // write extra boot area and backup - if (!writeCache(relSector + 2) || !writeCache(relSector + 8)) { - DEBUGV("SDFS: FAT32 PBS ext failed"); - return false; - } - sdfat::fat32_fsinfo_t* pf = &cache->fsinfo; - pf->leadSignature = sdfat::FSINFO_LEAD_SIG; - pf->structSignature = sdfat::FSINFO_STRUCT_SIG; - pf->freeCount = 0XFFFFFFFF; - pf->nextFree = 0XFFFFFFFF; - // write FSINFO sector and backup - if (!writeCache(relSector + 1) || !writeCache(relSector + 7)) { - DEBUGV("SDFS: FAT32 FSINFO failed"); - return false; - } - clearFatDir(fatStart, 2 * fatSize + sectorsPerCluster); - clearCache(false); - cache->fat32[0] = 0x0FFFFFF8; - cache->fat32[1] = 0x0FFFFFFF; - cache->fat32[2] = 0x0FFFFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) || !writeCache(fatStart + fatSize)) { - DEBUGV("SDFS: FAT32 reserve failed"); - return false; - } - return true; - } - -public: - bool format(sdfat::SdFat *_fs, int8_t _csPin, SPISettings _spiSettings) { - card = static_cast(_fs->card()); - cache = _fs->cacheClear(); - - if (!card->begin(_csPin, _spiSettings)) { - return false; - } - cardSizeBlocks = card->cardSize(); - if (cardSizeBlocks == 0) { - return false; - } - - cardCapacityMB = (cardSizeBlocks + 2047)/2048; - - if (cardCapacityMB <= 6) { - return false; // Card is too small - } else if (cardCapacityMB <= 16) { - sectorsPerCluster = 2; - } else if (cardCapacityMB <= 32) { - sectorsPerCluster = 4; - } else if (cardCapacityMB <= 64) { - sectorsPerCluster = 8; - } else if (cardCapacityMB <= 128) { - sectorsPerCluster = 16; - } else if (cardCapacityMB <= 1024) { - sectorsPerCluster = 32; - } else if (cardCapacityMB <= 32768) { - sectorsPerCluster = 64; - } else { - // SDXC cards - sectorsPerCluster = 128; - } - - // set fake disk geometry - sectorsPerTrack = cardCapacityMB <= 256 ? 32 : 63; - - if (cardCapacityMB <= 16) { - numberOfHeads = 2; - } else if (cardCapacityMB <= 32) { - numberOfHeads = 4; - } else if (cardCapacityMB <= 128) { - numberOfHeads = 8; - } else if (cardCapacityMB <= 504) { - numberOfHeads = 16; - } else if (cardCapacityMB <= 1008) { - numberOfHeads = 32; - } else if (cardCapacityMB <= 2016) { - numberOfHeads = 64; - } else if (cardCapacityMB <= 4032) { - numberOfHeads = 128; - } else { - numberOfHeads = 255; - } - - // Erase all data on card (TRIM) - uint32_t const ERASE_SIZE = 262144L; - uint32_t firstBlock = 0; - uint32_t lastBlock; - do { - lastBlock = firstBlock + ERASE_SIZE - 1; - if (lastBlock >= cardSizeBlocks) { - lastBlock = cardSizeBlocks - 1; - } - if (!card->erase(firstBlock, lastBlock)) { - return false; // Erase fail - } - delay(0); // yield to the OS to avoid WDT - firstBlock += ERASE_SIZE; - } while (firstBlock < cardSizeBlocks); - - if (!card->readBlock(0, cache->data)) { - return false; - } - - if (card->type() != sdfat::SD_CARD_TYPE_SDHC) { - return makeFat16(); - } else { - return makeFat32(); - } - } - - -#endif -}; // class SDFSFormatter - -}; // namespace sdfs - - -#endif // _SDFSFORMATTER_H diff --git a/tests/host/Makefile b/tests/host/Makefile index a6da581b65..d35d746ccf 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -102,6 +102,7 @@ CORE_CPP_FILES := \ FatLib/FatFileLFN.cpp \ FatLib/FatFilePrint.cpp \ FatLib/FatFileSFN.cpp \ + FatLib/FatFormatter.cpp \ FatLib/FatVolume.cpp \ FatLib/FatPartition.cpp \ common/FmtNumber.cpp \ From 4fcd37d7ea0859f8fbd3aac833d76d1c6763d040 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 18 Dec 2020 22:00:34 -0800 Subject: [PATCH 04/10] Fix obsolete include directive --- libraries/SDFS/src/SDFS.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/SDFS/src/SDFS.cpp b/libraries/SDFS/src/SDFS.cpp index 7439855f74..0d41b1f3ff 100644 --- a/libraries/SDFS/src/SDFS.cpp +++ b/libraries/SDFS/src/SDFS.cpp @@ -25,7 +25,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "SDFS.h" -#include "SDFSFormatter.h" #include using namespace fs; From 31c5cc5ed7c87570828bed5e590e99294a5b9da4 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 18 Dec 2020 22:08:39 -0800 Subject: [PATCH 05/10] Correct array delete[] --- libraries/SDFS/src/SDFS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SDFS/src/SDFS.cpp b/libraries/SDFS/src/SDFS.cpp index 0d41b1f3ff..e7a891a08a 100644 --- a/libraries/SDFS/src/SDFS.cpp +++ b/libraries/SDFS/src/SDFS.cpp @@ -153,7 +153,7 @@ bool SDFSImpl::format() { sdfat::FatFormatter fatFormatter; uint8_t *sectorBuffer = new uint8_t[512]; bool ret = fatFormatter.format(card, sectorBuffer, nullptr); - delete sectorBuffer; + delete[] sectorBuffer; return ret; } From 95428c03d578ce1b74b069d49fb3ca36716ca158 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 19 Dec 2020 10:03:10 -0800 Subject: [PATCH 06/10] Include FreeStack() method for ESP8266 --- libraries/ESP8266SdFat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index fc0932c4ed..cce2a90091 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit fc0932c4ed1c4f6d7214499566b3142262397f62 +Subproject commit cce2a90091fac4ee003c345897e58ca11756b6c1 From bc8a96c7d55ed554e5487e1c54f73563af644ac1 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 19 Dec 2020 10:27:13 -0800 Subject: [PATCH 07/10] Use updated master branch for ESP8266SdFat library Avoid branch insanity by merging the fix20 branch into ESP8266SdFat/master and referencing that in the core. --- libraries/ESP8266SdFat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index cce2a90091..c91f12a708 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit cce2a90091fac4ee003c345897e58ca11756b6c1 +Subproject commit c91f12a708eef896abf74f7eae767194d4440740 From 288446e669d9d1b1fdd020e2a5737a430d6b330f Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 19 Dec 2020 12:54:25 -0800 Subject: [PATCH 08/10] Avoid yield() while in SYS context --- libraries/ESP8266SdFat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index c91f12a708..81aa7e6868 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit c91f12a708eef896abf74f7eae767194d4440740 +Subproject commit 81aa7e68681a6061e95cde2c248c102e51c7a96c From 9b8ab5db7502a648ee6b167b791bbde7aa2b1691 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 21 Dec 2020 12:36:22 -0800 Subject: [PATCH 09/10] Reinstate example builds for passing examples The ESP8266SdFat examples now build, even if they're not recommended and are incompatible with the Arduino EWSP8266 File implementation. --- libraries/ESP8266SdFat | 2 +- tests/common.sh | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index 81aa7e6868..94094c090a 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit 81aa7e68681a6061e95cde2c248c102e51c7a96c +Subproject commit 94094c090a0f10734e608158f6e85f5f4553c345 diff --git a/tests/common.sh b/tests/common.sh index cb889e727c..1b247ff296 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -8,16 +8,19 @@ function skip_ino() # Add items to the following list with "\n" netween them to skip running. No spaces, tabs, etc. allowed read -d '' skiplist << EOL || true /#attic/ -/AnalogBinLogger/ -/LowLatencyLogger/ -/LowLatencyLoggerADXL345/ -/LowLatencyLoggerMPU6050/ -/PrintBenchmark/ -/TeensySdioDemo/ +/AvrAdcLogger/ +/BackwardCompatibility/ +/examplesV1/ +/ExFatFormatter/ +/ExFatLogger/ +/ExFatUnicodeTest/ +/RtcTimestampTest/ /SoftwareSpi/ /STM32Test/ -/extras/ -/ESP8266SdFat/ +/TeensyRtcTimestamp/ +/TeensySdioDemo/ +/UserChipSelectFunction/ +/UserSPIDriver/ EOL echo $ino | grep -q -F "$skiplist" echo $(( 1 - $? )) From 74904427c3a40a41beef34f3e7175889b88cf101 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 21 Dec 2020 17:55:41 -0800 Subject: [PATCH 10/10] Add SDFS::availableForWrite handler Fixes #7650 --- libraries/ESP8266SdFat | 2 +- libraries/SDFS/src/SDFS.h | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index 94094c090a..0a46e4ebb2 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit 94094c090a0f10734e608158f6e85f5f4553c345 +Subproject commit 0a46e4ebb2de585c5a64f981dbc2b2223a438984 diff --git a/libraries/SDFS/src/SDFS.h b/libraries/SDFS/src/SDFS.h index 348284637d..0051852a2d 100644 --- a/libraries/SDFS/src/SDFS.h +++ b/libraries/SDFS/src/SDFS.h @@ -279,7 +279,7 @@ class SDFSFileImpl : public FileImpl int availableForWrite() override { - return _opened ? _fd->availableForWrite() : 0; + return _opened ? _fd->availableSpaceForWrite() : 0; } size_t write(const uint8_t *buf, size_t size) override @@ -399,8 +399,6 @@ class SDFSFileImpl : public FileImpl return ftime; } - - protected: SDFSImpl* _fs; std::shared_ptr _fd;