Soldered SD Card Arduino Library 1.0.0
Easily read and write files to and form the SD card breakout! A fork of the original SDFat library by Bill Greiman.
Loading...
Searching...
No Matches
ExFatPartition.h
Go to the documentation of this file.
1
25#ifndef ExFatPartition_h
26#define ExFatPartition_h
31#include "../common/BlockDevice.h"
32#include "../common/FsCache.h"
33#include "../common/SysCall.h"
34#include "ExFatConfig.h"
35#include "ExFatTypes.h"
37const uint8_t FAT_TYPE_EXFAT = 64;
38
39class ExFatFile;
40
41//==============================================================================
47{
48 public:
50 {
51 }
53 uint32_t bytesPerCluster() const
54 {
55 return m_bytesPerCluster;
56 }
58 uint8_t bytesPerClusterShift() const
59 {
61 }
63 uint16_t bytesPerSector() const
64 {
65 return m_bytesPerSector;
66 }
68 uint8_t bytesPerSectorShift() const
69 {
71 }
72
76 uint8_t *cacheClear()
77 {
78 return m_dataCache.clear();
79 }
81 uint32_t clusterCount() const
82 {
83 return m_clusterCount;
84 }
86 uint32_t clusterHeapStartSector() const
87 {
89 }
91 uint32_t fatLength() const
92 {
93 return m_fatLength;
94 }
96 uint32_t fatStartSector() const
97 {
98 return m_fatStartSector;
99 }
101 uint8_t fatType() const
102 {
103 return m_fatType;
104 }
106 uint32_t freeClusterCount();
116 bool init(BlockDevice *dev, uint8_t part);
122 bool isBusy()
123 {
124 return m_blockDev->isBusy();
125 }
127 uint32_t rootDirectoryCluster() const
128 {
130 }
132 uint32_t rootLength();
134 uint32_t sectorsPerCluster() const
135 {
136 return 1UL << m_sectorsPerClusterShift;
137 }
138#ifndef DOXYGEN_SHOULD_SKIP_THIS
139 // Use sectorsPerCluster(). blocksPerCluster() will be removed in the future.
140 uint32_t blocksPerCluster() __attribute__((deprecated))
141 {
142 return sectorsPerCluster();
143 } // NOLINT
144#endif // DOXYGEN_SHOULD_SKIP_THIS
146 uint8_t sectorsPerClusterShift() const
147 {
149 }
150 //----------------------------------------------------------------------------
151#ifndef DOXYGEN_SHOULD_SKIP_THIS
152 void checkUpcase(print_t *pr);
153 bool printDir(print_t *pr, ExFatFile *file);
154 void dmpBitmap(print_t *pr);
155 void dmpCluster(print_t *pr, uint32_t cluster, uint32_t offset, uint32_t count);
156 void dmpFat(print_t *pr, uint32_t start, uint32_t count);
157 void dmpSector(print_t *pr, uint32_t sector);
159 void printFat(print_t *pr);
161#endif // DOXYGEN_SHOULD_SKIP_THIS
162 //----------------------------------------------------------------------------
163 private:
165 friend class ExFatFile;
166 uint32_t bitmapFind(uint32_t cluster, uint32_t count);
167 bool bitmapModify(uint32_t cluster, uint32_t count, bool value);
168 //----------------------------------------------------------------------------
169 // Cache functions.
170 uint8_t *bitmapCacheGet(uint32_t sector, uint8_t option)
171 {
172#if USE_EXFAT_BITMAP_CACHE
173 return m_bitmapCache.get(sector, option);
174#else // USE_EXFAT_BITMAP_CACHE
175 return m_dataCache.get(sector, option);
176#endif // USE_EXFAT_BITMAP_CACHE
177 }
179 {
180#if USE_EXFAT_BITMAP_CACHE
181 m_bitmapCache.init(dev);
182#endif // USE_EXFAT_BITMAP_CACHE
183 m_dataCache.init(dev);
184 }
186 {
187#if USE_EXFAT_BITMAP_CACHE
188 return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice();
189#else // USE_EXFAT_BITMAP_CACHE
190 return m_dataCache.sync() && syncDevice();
191#endif // USE_EXFAT_BITMAP_CACHE
192 }
194 {
196 }
198 {
200 }
201 uint8_t *dataCacheGet(uint32_t sector, uint8_t option)
202 {
203 return m_dataCache.get(sector, option);
204 }
206 {
207 return m_dataCache.sector();
208 }
210 {
211 return m_dataCache.sync();
212 }
213 //----------------------------------------------------------------------------
214 uint32_t clusterMask() const
215 {
216 return m_clusterMask;
217 }
218 uint32_t clusterStartSector(uint32_t cluster)
219 {
220 return m_clusterHeapStartSector + ((cluster - 2) << m_sectorsPerClusterShift);
221 }
222 uint8_t *dirCache(DirPos_t *pos, uint8_t options);
223 int8_t dirSeek(DirPos_t *pos, uint32_t offset);
224 uint8_t fatGet(uint32_t cluster, uint32_t *value);
225 bool fatPut(uint32_t cluster, uint32_t value);
226 uint32_t chainSize(uint32_t cluster);
227 bool freeChain(uint32_t cluster);
228 uint16_t sectorMask() const
229 {
230 return m_sectorMask;
231 }
233 {
234 return m_blockDev->syncDevice();
235 }
236 bool cacheSafeRead(uint32_t sector, uint8_t *dst)
237 {
238 return m_dataCache.cacheSafeRead(sector, dst);
239 }
240 bool cacheSafeWrite(uint32_t sector, const uint8_t *src)
241 {
242 return m_dataCache.cacheSafeWrite(sector, src);
243 }
244 bool cacheSafeRead(uint32_t sector, uint8_t *dst, size_t count)
245 {
246 return m_dataCache.cacheSafeRead(sector, dst, count);
247 }
248 bool cacheSafeWrite(uint32_t sector, const uint8_t *src, size_t count)
249 {
250 return m_dataCache.cacheSafeWrite(sector, src, count);
251 }
252 bool readSector(uint32_t sector, uint8_t *dst)
253 {
254 return m_blockDev->readSector(sector, dst);
255 }
256 bool writeSector(uint32_t sector, const uint8_t *src)
257 {
258 return m_blockDev->writeSector(sector, src);
259 }
260 //----------------------------------------------------------------------------
261 static const uint8_t m_bytesPerSectorShift = 9;
262 static const uint16_t m_bytesPerSector = 512;
263 static const uint16_t m_sectorMask = 0x1FF;
264 //----------------------------------------------------------------------------
265#if USE_EXFAT_BITMAP_CACHE
267#endif // USE_EXFAT_BITMAP_CACHE
271 uint32_t m_fatLength;
278 uint8_t m_fatType = 0;
280};
281#endif // ExFatPartition_h
const uint8_t FAT_TYPE_EXFAT
Definition ExFatPartition.h:37
union csd_t __attribute__
Print print_t
Definition SysCall.h:66
BlockDeviceInterface class.
Definition BlockDeviceInterface.h:39
virtual bool syncDevice()=0
virtual bool readSector(uint32_t sector, uint8_t *dst)=0
virtual bool writeSector(uint32_t sector, const uint8_t *src)=0
virtual bool isBusy()=0
Basic file class.
Definition ExFatFile.h:95
Access exFat partitions on raw file devices.
Definition ExFatPartition.h:47
uint32_t m_fatLength
Definition ExFatPartition.h:271
void dmpSector(print_t *pr, uint32_t sector)
Definition ExFatDbg.cpp:443
uint32_t sectorsPerCluster() const
Definition ExFatPartition.h:134
uint32_t fatLength() const
Definition ExFatPartition.h:91
uint32_t clusterCount() const
Definition ExFatPartition.h:81
bool bitmapModify(uint32_t cluster, uint32_t count, bool value)
Definition ExFatPartition.cpp:91
uint8_t bytesPerSectorShift() const
Definition ExFatPartition.h:68
static const uint8_t m_bytesPerSectorShift
Definition ExFatPartition.h:261
bool syncDevice()
Definition ExFatPartition.h:232
uint8_t * dataCacheGet(uint32_t sector, uint8_t option)
Definition ExFatPartition.h:201
uint32_t clusterHeapStartSector() const
Definition ExFatPartition.h:86
uint32_t m_fatStartSector
Definition ExFatPartition.h:270
bool cacheSafeWrite(uint32_t sector, const uint8_t *src)
Definition ExFatPartition.h:240
uint16_t bytesPerSector() const
Definition ExFatPartition.h:63
bool cacheSafeRead(uint32_t sector, uint8_t *dst)
Definition ExFatPartition.h:236
uint8_t fatType() const
Definition ExFatPartition.h:101
uint32_t dataCacheSector()
Definition ExFatPartition.h:205
uint32_t m_bytesPerCluster
Definition ExFatPartition.h:276
uint8_t m_sectorsPerClusterShift
Definition ExFatPartition.h:279
void dmpFat(print_t *pr, uint32_t start, uint32_t count)
Definition ExFatDbg.cpp:411
static const uint16_t m_sectorMask
Definition ExFatPartition.h:263
bool dataCacheSync()
Definition ExFatPartition.h:209
uint8_t * bitmapCacheGet(uint32_t sector, uint8_t option)
Definition ExFatPartition.h:170
bool cacheSafeRead(uint32_t sector, uint8_t *dst, size_t count)
Definition ExFatPartition.h:244
void dmpBitmap(print_t *pr)
Definition ExFatDbg.cpp:394
uint16_t sectorMask() const
Definition ExFatPartition.h:228
bool freeChain(uint32_t cluster)
Definition ExFatPartition.cpp:251
void printUpcase(print_t *pr)
bool printVolInfo(print_t *pr)
uint32_t clusterStartSector(uint32_t cluster)
Definition ExFatPartition.h:218
uint8_t * dirCache(DirPos_t *pos, uint8_t options)
Definition ExFatPartition.cpp:167
bool writeSector(uint32_t sector, const uint8_t *src)
Definition ExFatPartition.h:256
void cacheInit(BlockDevice *dev)
Definition ExFatPartition.h:178
uint8_t fatGet(uint32_t cluster, uint32_t *value)
Definition ExFatPartition.cpp:200
bool readSector(uint32_t sector, uint8_t *dst)
Definition ExFatPartition.h:252
uint32_t rootLength()
Definition ExFatPartition.cpp:391
static const uint16_t m_bytesPerSector
Definition ExFatPartition.h:262
uint32_t m_clusterCount
Definition ExFatPartition.h:273
uint8_t m_fatType
Definition ExFatPartition.h:278
uint32_t bitmapFind(uint32_t cluster, uint32_t count)
Definition ExFatPartition.cpp:31
void checkUpcase(print_t *pr)
Definition ExFatDbg.cpp:307
FsCache m_dataCache
Definition ExFatPartition.h:268
uint32_t m_rootDirectoryCluster
Definition ExFatPartition.h:274
uint32_t m_clusterHeapStartSector
Definition ExFatPartition.h:272
uint32_t chainSize(uint32_t cluster)
Definition ExFatPartition.cpp:153
uint32_t fatStartSector() const
Definition ExFatPartition.h:96
uint32_t m_bitmapStart
Definition ExFatPartition.h:269
uint32_t bytesPerCluster() const
Definition ExFatPartition.h:53
uint32_t m_clusterMask
Definition ExFatPartition.h:275
bool printDir(print_t *pr, ExFatFile *file)
Definition ExFatDbg.cpp:467
uint32_t rootDirectoryCluster() const
Definition ExFatPartition.h:127
uint32_t clusterMask() const
Definition ExFatPartition.h:214
void printFat(print_t *pr)
ExFatPartition()
Definition ExFatPartition.h:49
BlockDevice * m_blockDev
Definition ExFatPartition.h:277
bool fatPut(uint32_t cluster, uint32_t value)
Definition ExFatPartition.cpp:228
bool init(BlockDevice *dev, uint8_t part)
Definition ExFatPartition.cpp:326
void dataCacheDirty()
Definition ExFatPartition.h:193
uint32_t freeClusterCount()
Definition ExFatPartition.cpp:287
bool isBusy()
Definition ExFatPartition.h:122
int8_t dirSeek(DirPos_t *pos, uint32_t offset)
Definition ExFatPartition.cpp:176
uint8_t bytesPerClusterShift() const
Definition ExFatPartition.h:58
bool cacheSync()
Definition ExFatPartition.h:185
FsCache m_bitmapCache
Definition ExFatPartition.h:266
uint32_t blocksPerCluster() __attribute__((deprecated))
Definition ExFatPartition.h:140
bool cacheSafeWrite(uint32_t sector, const uint8_t *src, size_t count)
Definition ExFatPartition.h:248
void dataCacheInvalidate()
Definition ExFatPartition.h:197
void dmpCluster(print_t *pr, uint32_t cluster, uint32_t offset, uint32_t count)
Definition ExFatDbg.cpp:400
uint8_t * cacheClear()
Definition ExFatPartition.h:76
Sector cache.
Definition FsCache.h:38
uint8_t * clear()
Definition FsCache.h:124
uint8_t * get(uint32_t sector, uint8_t option)
Definition FsCache.cpp:29
void init(BlockDevice *blockDev)
Definition FsCache.h:141
bool sync()
Definition FsCache.cpp:61
uint32_t sector()
Definition FsCache.h:175
void invalidate()
Definition FsCache.h:147
bool cacheSafeWrite(uint32_t sector, const uint8_t *src)
Definition FsCache.h:99
bool cacheSafeRead(uint32_t sector, uint8_t *dst)
Definition FsCache.h:67
void dirty()
Definition FsCache.h:134
static bool value
Definition DigitalPin.h:210
Internal type for position in directory file.
Definition ExFatTypes.h:49