1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-17 12:02:15 +03:00

Re-add original SD FAT info access methods (#6092)

Fixes #6081

The SD rewrite blanked out some of the internal FAT info.. Restore the
function calls and return proper values.

Because size() is used in many printf()s, we can't just change its
return type to uint64.  Instead, when size is > size-max warn.

Add SD.size64 which can be used by new apps who care about >4GB cards.
Prints a warning if debugging enabled
This commit is contained in:
Earle F. Philhower, III
2019-05-19 08:43:23 -07:00
committed by GitHub
parent 82adc95d64
commit b5560759ec
3 changed files with 49 additions and 7 deletions

View File

@ -24,6 +24,8 @@
#include <memory>
#include <Arduino.h>
class SDClass;
namespace fs {
class File;
@ -208,8 +210,10 @@ public:
bool gc();
friend class ::SDClass; // More of a frenemy, but SD needs internal implementation to get private FAT bits
protected:
FSImplPtr _impl;
FSImplPtr getImpl() { return _impl; }
};
} // namespace fs

View File

@ -84,19 +84,23 @@ public:
}
uint8_t type() {
return 0;//card.type();
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
return sd->type();
}
uint8_t fatType() {
return 0;//volume.fatType();
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
return sd->fatType();
}
size_t blocksPerCluster() {
return 0;//volume.blocksPerCluster();
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
return sd->blocksPerCluster();
}
size_t totalClusters() {
return 0;//volume.clusterCount();
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
return sd->totalClusters();
}
size_t blockSize() {
@ -104,15 +108,25 @@ public:
}
size_t totalBlocks() {
return 0;//(totalClusters() / blocksPerCluster());
return (totalClusters() / blocksPerCluster());
}
size_t clusterSize() {
return 0;//blocksPerCluster() * blockSize();
return blocksPerCluster() * blockSize();
}
size_t size() {
return 0;//(clusterSize() * totalClusters());
uint64_t sz = size64();
#ifdef DEBUG_ESP_PORT
if (sz > (uint64_t)SIZE_MAX) {
DEBUG_ESP_PORT.printf_P(PSTR("WARNING: SD card size overflow (%lld>= 4GB). Please update source to use size64().\n"), sz);
}
#endif
return (size_t)sz;
}
uint64_t size64() {
return ((uint64_t)clusterSize() * (uint64_t)totalClusters());
}
private:

View File

@ -159,6 +159,30 @@ public:
bool format() override;
// The following are not common FS interfaces, but are needed only to
// support the older SD.h exports
uint8_t type() {
return _fs.card()->type();
}
uint8_t fatType() {
return _fs.vol()->fatType();
}
size_t blocksPerCluster() {
return _fs.vol()->blocksPerCluster();
}
size_t totalClusters() {
return _fs.vol()->clusterCount();
}
size_t totalBlocks() {
return (totalClusters() / blocksPerCluster());
}
size_t clusterSize() {
return blocksPerCluster() * 512; // 512b block size
}
size_t size() {
return (clusterSize() * totalClusters());
}
protected:
friend class SDFileImpl;
friend class SDFSDirImpl;