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
FatPartition.h
Go to the documentation of this file.
1
25#ifndef FatPartition_h
26#define FatPartition_h
31#include "../common/BlockDevice.h"
32#include "../common/FsCache.h"
33#include "../common/FsStructs.h"
34#include "../common/SysCall.h"
35#include "FatLibConfig.h"
36#include <stddef.h>
37
39const uint8_t FAT_TYPE_FAT12 = 12;
40
42const uint8_t FAT_TYPE_FAT16 = 16;
43
45const uint8_t FAT_TYPE_FAT32 = 32;
46
47//------------------------------------------------------------------------------
51union cache_t {
53 uint8_t data[512];
55 uint16_t fat16[256];
57 uint32_t fat32[128];
60};
61//==============================================================================
67{
68 public:
72 {
73 }
74
76 uint8_t bytesPerClusterShift() const
77 {
79 }
81 uint16_t bytesPerCluster() const
82 {
84 }
86 uint16_t bytesPerSector() const
87 {
88 return m_bytesPerSector;
89 }
91 uint8_t bytesPerSectorShift() const
92 {
94 }
96 uint16_t sectorMask() const
97 {
98 return m_sectorMask;
99 }
101 uint8_t sectorsPerCluster() const
102 {
103 return m_sectorsPerCluster;
104 }
105#ifndef DOXYGEN_SHOULD_SKIP_THIS
106 // Use sectorsPerCluster(). blocksPerCluster() will be removed in the future.
107 uint8_t blocksPerCluster() __attribute__((deprecated))
108 {
109 return sectorsPerCluster();
110 } // NOLINT
111#endif // DOXYGEN_SHOULD_SKIP_THIS
113 uint32_t sectorsPerFat() const
114 {
115 return m_sectorsPerFat;
116 }
120 uint8_t *cacheClear()
121 {
122 return m_cache.clear();
123 }
125 uint32_t clusterCount() const
126 {
127 return m_lastCluster - 1;
128 }
131 {
133 }
135 uint32_t dataStartSector() const
136 {
137 return m_dataStartSector;
138 }
140 uint8_t fatCount() const
141 {
142 return 2;
143 }
145 uint32_t fatStartSector() const
146 {
147 return m_fatStartSector;
148 }
150 uint8_t fatType() const
151 {
152 return m_fatType;
153 }
158 int32_t freeClusterCount();
169 bool init(BlockDevice *dev, uint8_t part = 1);
171 uint16_t rootDirEntryCount() const
172 {
173 return m_rootDirEntryCount;
174 }
177 uint32_t rootDirStart() const
178 {
179 return m_rootDirStart;
180 }
182 uint32_t volumeSectorCount() const
183 {
184 return sectorsPerCluster() * clusterCount();
185 }
192 int8_t dbgFat(uint32_t n, uint32_t *v)
193 {
194 return fatGet(n, v);
195 }
201 bool isBusy()
202 {
203 return m_blockDev->isBusy();
204 }
205 //----------------------------------------------------------------------------
206#ifndef DOXYGEN_SHOULD_SKIP_THIS
207 void dmpDirSector(print_t *pr, uint32_t sector);
208 void dmpFat(print_t *pr, uint32_t start, uint32_t count);
209 void dmpRootDir(print_t *pr);
210 void dmpSector(print_t *pr, uint32_t sector, uint8_t bits = 8);
211#endif // DOXYGEN_SHOULD_SKIP_THIS
212 //----------------------------------------------------------------------------
213 private:
215 friend class FatFile;
216 //----------------------------------------------------------------------------
217 static const uint8_t m_bytesPerSectorShift = 9;
218 static const uint16_t m_bytesPerSector = 512;
219 static const uint16_t m_sectorMask = 0x1FF;
220 //----------------------------------------------------------------------------
221 BlockDevice *m_blockDev; // sector device
222 uint8_t m_sectorsPerCluster; // Cluster size in sectors.
223 uint8_t m_clusterSectorMask; // Mask to extract sector of cluster.
224 uint8_t m_sectorsPerClusterShift; // Cluster count to sector count shift.
225 uint8_t m_fatType = 0; // Volume type (12, 16, OR 32).
226 uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir.
227 uint32_t m_allocSearchStart; // Start cluster for alloc search.
228 uint32_t m_sectorsPerFat; // FAT size in sectors
229 uint32_t m_dataStartSector; // First data sector number.
230 uint32_t m_fatStartSector; // Start sector for first FAT.
231 uint32_t m_lastCluster; // Last cluster number in FAT.
232 uint32_t m_rootDirStart; // Start sector FAT16, cluster FAT32.
233 //----------------------------------------------------------------------------
234 // sector I/O functions.
235 bool cacheSafeRead(uint32_t sector, uint8_t *dst)
236 {
237 return m_cache.cacheSafeRead(sector, dst);
238 }
239 bool cacheSafeRead(uint32_t sector, uint8_t *dst, size_t count)
240 {
241 return m_cache.cacheSafeRead(sector, dst, count);
242 }
243 bool cacheSafeWrite(uint32_t sector, const uint8_t *dst)
244 {
245 return m_cache.cacheSafeWrite(sector, dst);
246 }
247 bool cacheSafeWrite(uint32_t sector, const uint8_t *dst, size_t count)
248 {
249 return m_cache.cacheSafeWrite(sector, dst, count);
250 }
251 bool readSector(uint32_t sector, uint8_t *dst)
252 {
253 return m_blockDev->readSector(sector, dst);
254 }
256 {
257 return m_blockDev->syncDevice();
258 }
259 bool writeSector(uint32_t sector, const uint8_t *src)
260 {
261 return m_blockDev->writeSector(sector, src);
262 }
263#if MAINTAIN_FREE_CLUSTER_COUNT
264 int32_t m_freeClusterCount; // Count of free clusters in volume.
266 {
268 }
269 void updateFreeClusterCount(int32_t change)
270 {
271 if (m_freeClusterCount >= 0)
272 {
273 m_freeClusterCount += change;
274 }
275 }
276#else // MAINTAIN_FREE_CLUSTER_COUNT
278 {
279 (void)value;
280 }
281 void updateFreeClusterCount(int32_t change)
282 {
283 (void)change;
284 }
285#endif // MAINTAIN_FREE_CLUSTER_COUNT
286 // sector caches
288#if USE_SEPARATE_FAT_CACHE
290 cache_t *cacheFetchFat(uint32_t sector, uint8_t options)
291 {
293 return reinterpret_cast<cache_t *>(m_fatCache.get(sector, options));
294 }
296 {
297 return m_cache.sync() && m_fatCache.sync() && syncDevice();
298 }
299#else // USE_SEPARATE_FAT_CACHE
300 cache_t *cacheFetchFat(uint32_t sector, uint8_t options)
301 {
303 return cacheFetchData(sector, options);
304 }
306 {
307 return m_cache.sync() && syncDevice();
308 }
309#endif // USE_SEPARATE_FAT_CACHE
310 cache_t *cacheFetchData(uint32_t sector, uint8_t options)
311 {
312 return reinterpret_cast<cache_t *>(m_cache.get(sector, options));
313 }
315 {
317 }
319 {
320 return m_cache.sync();
321 }
323 {
324 return reinterpret_cast<cache_t *>(m_cache.cacheBuffer());
325 }
327 {
328 return m_cache.sector();
329 }
331 {
332 m_cache.dirty();
333 }
334 //----------------------------------------------------------------------------
335 bool allocateCluster(uint32_t current, uint32_t *next);
336 bool allocContiguous(uint32_t count, uint32_t *firstCluster);
337 uint8_t sectorOfCluster(uint32_t position) const
338 {
339 return (position >> 9) & m_clusterSectorMask;
340 }
341 uint32_t clusterStartSector(uint32_t cluster) const
342 {
343 return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift);
344 }
345 int8_t fatGet(uint32_t cluster, uint32_t *value);
346 bool fatPut(uint32_t cluster, uint32_t value);
347 bool fatPutEOC(uint32_t cluster)
348 {
349 return fatPut(cluster, 0x0FFFFFFF);
350 }
351 bool freeChain(uint32_t cluster);
352 bool isEOC(uint32_t cluster) const
353 {
354 return cluster > m_lastCluster;
355 }
356};
357#endif // FatPartition
configuration definitions
const uint8_t FAT_TYPE_FAT12
Definition FatPartition.h:39
const uint8_t FAT_TYPE_FAT16
Definition FatPartition.h:42
const uint8_t FAT_TYPE_FAT32
Definition FatPartition.h:45
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 FatFile.h:112
Access FAT16 and FAT32 partitions on raw file devices.
Definition FatPartition.h:67
void dmpRootDir(print_t *pr)
Definition FatDbg.cpp:121
static const uint16_t m_sectorMask
Definition FatPartition.h:219
int8_t dbgFat(uint32_t n, uint32_t *v)
Definition FatPartition.h:192
FsCache m_fatCache
Definition FatPartition.h:289
void dmpDirSector(print_t *pr, uint32_t sector)
Definition FatDbg.cpp:107
void dmpSector(print_t *pr, uint32_t sector, uint8_t bits=8)
Definition FatDbg.cpp:140
int8_t fatGet(uint32_t cluster, uint32_t *value)
Definition FatPartition.cpp:184
uint32_t cacheSectorNumber()
Definition FatPartition.h:326
bool allocContiguous(uint32_t count, uint32_t *firstCluster)
Definition FatPartition.cpp:107
FatPartition()
Definition FatPartition.h:71
uint8_t blocksPerCluster() __attribute__((deprecated))
Definition FatPartition.h:107
uint8_t bytesPerClusterShift() const
Definition FatPartition.h:76
bool cacheSync()
Definition FatPartition.h:295
uint32_t clusterStartSector(uint32_t cluster) const
Definition FatPartition.h:341
static const uint8_t m_bytesPerSectorShift
Definition FatPartition.h:217
bool cacheSafeWrite(uint32_t sector, const uint8_t *dst, size_t count)
Definition FatPartition.h:247
bool cacheSafeRead(uint32_t sector, uint8_t *dst)
Definition FatPartition.h:235
uint8_t fatCount() const
Definition FatPartition.h:140
uint16_t bytesPerSector() const
Definition FatPartition.h:86
void updateFreeClusterCount(int32_t change)
Definition FatPartition.h:269
uint8_t m_fatType
Definition FatPartition.h:225
uint16_t m_rootDirEntryCount
Definition FatPartition.h:226
uint8_t sectorsPerClusterShift() const
Definition FatPartition.h:130
bool freeChain(uint32_t cluster)
Definition FatPartition.cpp:353
uint32_t rootDirStart() const
Definition FatPartition.h:177
bool fatPut(uint32_t cluster, uint32_t value)
Definition FatPartition.cpp:264
uint32_t m_lastCluster
Definition FatPartition.h:231
bool cacheSyncData()
Definition FatPartition.h:318
uint32_t fatStartSector() const
Definition FatPartition.h:145
static const uint16_t m_bytesPerSector
Definition FatPartition.h:218
uint16_t rootDirEntryCount() const
Definition FatPartition.h:171
uint8_t m_clusterSectorMask
Definition FatPartition.h:223
uint32_t m_sectorsPerFat
Definition FatPartition.h:228
uint32_t m_dataStartSector
Definition FatPartition.h:229
void cacheDirty()
Definition FatPartition.h:330
uint32_t m_fatStartSector
Definition FatPartition.h:230
cache_t * cacheFetchData(uint32_t sector, uint8_t options)
Definition FatPartition.h:310
uint32_t dataStartSector() const
Definition FatPartition.h:135
uint8_t sectorsPerCluster() const
Definition FatPartition.h:101
cache_t * cacheAddress()
Definition FatPartition.h:322
bool readSector(uint32_t sector, uint8_t *dst)
Definition FatPartition.h:251
bool fatPutEOC(uint32_t cluster)
Definition FatPartition.h:347
void dmpFat(print_t *pr, uint32_t start, uint32_t count)
Definition FatDbg.cpp:177
uint32_t m_rootDirStart
Definition FatPartition.h:232
uint32_t volumeSectorCount() const
Definition FatPartition.h:182
bool cacheSafeWrite(uint32_t sector, const uint8_t *dst)
Definition FatPartition.h:243
void setFreeClusterCount(int32_t value)
Definition FatPartition.h:265
BlockDevice * m_blockDev
Definition FatPartition.h:221
bool cacheSafeRead(uint32_t sector, uint8_t *dst, size_t count)
Definition FatPartition.h:239
uint8_t m_sectorsPerCluster
Definition FatPartition.h:222
uint8_t bytesPerSectorShift() const
Definition FatPartition.h:91
bool isEOC(uint32_t cluster) const
Definition FatPartition.h:352
uint8_t * cacheClear()
Definition FatPartition.h:120
void cacheInvalidate()
Definition FatPartition.h:314
bool isBusy()
Definition FatPartition.h:201
bool init(BlockDevice *dev, uint8_t part=1)
Definition FatPartition.cpp:468
uint32_t clusterCount() const
Definition FatPartition.h:125
uint16_t bytesPerCluster() const
Definition FatPartition.h:81
cache_t * cacheFetchFat(uint32_t sector, uint8_t options)
Definition FatPartition.h:290
int32_t freeClusterCount()
Definition FatPartition.cpp:386
int32_t m_freeClusterCount
Definition FatPartition.h:264
uint32_t m_allocSearchStart
Definition FatPartition.h:227
FsCache m_cache
Definition FatPartition.h:287
uint8_t fatType() const
Definition FatPartition.h:150
uint8_t m_sectorsPerClusterShift
Definition FatPartition.h:224
uint16_t sectorMask() const
Definition FatPartition.h:96
uint8_t sectorOfCluster(uint32_t position) const
Definition FatPartition.h:337
bool writeSector(uint32_t sector, const uint8_t *src)
Definition FatPartition.h:259
bool syncDevice()
Definition FatPartition.h:255
bool allocateCluster(uint32_t current, uint32_t *next)
Definition FatPartition.cpp:31
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
bool sync()
Definition FsCache.cpp:61
uint32_t sector()
Definition FsCache.h:175
void invalidate()
Definition FsCache.h:147
static const uint8_t CACHE_STATUS_MIRROR_FAT
Definition FsCache.h:43
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
uint8_t * cacheBuffer()
Definition FsCache.h:56
void dirty()
Definition FsCache.h:134
static bool value
Definition DigitalPin.h:210
Definition FsStructs.h:237
Cache type for a sector.
Definition FatPartition.h:51
DirFat_t dir[16]
Definition FatPartition.h:59
uint32_t fat32[128]
Definition FatPartition.h:57
uint16_t fat16[256]
Definition FatPartition.h:55
uint8_t data[512]
Definition FatPartition.h:53