27 #include <avr/pgmspace.h>
36 #define ALLOW_DEPRECATED_FUNCTIONS 1
97 static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) {
98 return (year - 1980) << 9 | month << 5 | day;
101 static inline uint16_t FAT_YEAR(uint16_t fatDate) {
102 return 1980 + (fatDate >> 9);
105 static inline uint8_t FAT_MONTH(uint16_t fatDate) {
106 return (fatDate >> 5) & 0XF;
109 static inline uint8_t FAT_DAY(uint16_t fatDate) {
110 return fatDate & 0X1F;
113 static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) {
114 return hour << 11 | minute << 5 | second >> 1;
117 static inline uint8_t FAT_HOUR(uint16_t fatTime) {
118 return fatTime >> 11;
121 static inline uint8_t FAT_MINUTE(uint16_t fatTime) {
122 return(fatTime >> 5) & 0X3F;
125 static inline uint8_t FAT_SECOND(uint16_t fatTime) {
126 return 2*(fatTime & 0X1F);
152 flags_ &= ~F_FILE_UNBUFFERED_READ;
157 const char* fileName, uint32_t size);
191 void (*dateTime)(uint16_t* date, uint16_t* time)) {
192 dateTime_ = dateTime;
223 void ls(uint8_t flags = 0, uint8_t indent = 0);
225 uint8_t
open(
SdFile* dirFile, uint16_t index, uint8_t oflag);
226 uint8_t
open(
SdFile* dirFile,
const char* fileName, uint8_t oflag);
241 return read(&b, 1) == 1 ? b : -1;
243 int16_t
read(
void* buf, uint16_t nbyte);
245 static uint8_t
remove(
SdFile* dirFile,
const char* fileName);
246 uint8_t
remove(void);
249 curPosition_ = curCluster_ = 0;
255 return seekSet(curPosition_ + pos);
270 if (
isFile()) flags_ |= F_FILE_UNBUFFERED_READ;
272 uint8_t
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day,
273 uint8_t hour, uint8_t minute, uint8_t second);
280 uint8_t
type(
void)
const {
return type_;}
284 return flags_ & F_FILE_UNBUFFERED_READ;
288 size_t write(uint8_t b);
289 size_t write(
const void* buf, uint16_t nbyte);
290 size_t write(
const char* str);
292 void write_P(PGM_P str);
293 void writeln_P(PGM_P str);
296 #if ALLOW_DEPRECATED_FUNCTIONS
309 const char* fileName, uint32_t size) {
319 void (*dateTime)(uint16_t& date, uint16_t& time)) {
320 oldDateTime_ = dateTime;
321 dateTime_ = dateTime ? oldToNew : 0;
335 const char* fileName, uint8_t oflag) {
336 return open(&dirFile, fileName, oflag);
345 uint8_t
open(
SdFile& dirFile, uint16_t index, uint8_t oflag) {
346 return open(&dirFile, index, oflag);
356 static uint8_t
remove(
SdFile& dirFile,
const char* fileName) {
357 return remove(&dirFile, fileName);
362 static void (*oldDateTime_)(uint16_t& date, uint16_t& time);
363 static void oldToNew(uint16_t* date, uint16_t* time) {
370 #endif // ALLOW_DEPRECATED_FUNCTIONS
376 static uint8_t
const F_UNUSED = 0X30;
378 static uint8_t
const F_FILE_UNBUFFERED_READ = 0X40;
380 static uint8_t
const F_FILE_DIR_DIRTY = 0X80;
383 #if ((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG)
384 #error flags_ bits conflict
385 #endif // flags_ bits
390 uint32_t curCluster_;
391 uint32_t curPosition_;
395 uint32_t firstCluster_;
399 uint8_t addCluster(
void);
400 uint8_t addDirCluster(
void);
401 dir_t* cacheDirEntry(uint8_t action);
402 static void (*dateTime_)(uint16_t* date, uint16_t* time);
403 static uint8_t make83Name(
const char* str, uint8_t*
name);
404 uint8_t openCachedEntry(uint8_t cacheIndex, uint8_t oflags);
405 dir_t* readDirCache(
void);
434 SdVolume(
void) :allocSearchStart_(2), fatType_(0) {}
440 cacheBlockNumber_ = 0XFFFFFFFF;
441 return cacheBuffer_.
data;
473 uint8_t
fatType(
void)
const {
return fatType_;}
482 #if ALLOW_DEPRECATED_FUNCTIONS
489 return init(&dev, part);
491 #endif // ALLOW_DEPRECATED_FUNCTIONS
498 static uint8_t
const CACHE_FOR_READ = 0;
500 static uint8_t
const CACHE_FOR_WRITE = 1;
503 static uint32_t cacheBlockNumber_;
505 static uint8_t cacheDirty_;
506 static uint32_t cacheMirrorBlock_;
508 uint32_t allocSearchStart_;
509 uint8_t blocksPerCluster_;
510 uint32_t blocksPerFat_;
511 uint32_t clusterCount_;
512 uint8_t clusterSizeShift_;
513 uint32_t dataStartBlock_;
515 uint32_t fatStartBlock_;
517 uint16_t rootDirEntryCount_;
518 uint32_t rootDirStart_;
520 uint8_t allocContiguous(uint32_t count, uint32_t*
curCluster);
521 uint8_t blockOfCluster(uint32_t position)
const {
522 return (position >> 9) & (blocksPerCluster_ - 1);}
523 uint32_t clusterStartBlock(uint32_t cluster)
const {
524 return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
525 uint32_t blockNumber(uint32_t cluster, uint32_t position)
const {
526 return clusterStartBlock(cluster) + blockOfCluster(position);}
527 static uint8_t cacheFlush(
void);
528 static uint8_t cacheRawBlock(uint32_t blockNumber, uint8_t action);
529 static void cacheSetDirty(
void) {cacheDirty_ |= CACHE_FOR_WRITE;}
530 static uint8_t cacheZeroBlock(uint32_t blockNumber);
531 uint8_t chainSize(uint32_t beginCluster, uint32_t* size)
const;
532 uint8_t fatGet(uint32_t cluster, uint32_t* value)
const;
533 uint8_t fatPut(uint32_t cluster, uint32_t value);
534 uint8_t fatPutEOC(uint32_t cluster) {
535 return fatPut(cluster, 0x0FFFFFFF);
537 uint8_t freeChain(uint32_t cluster);
538 uint8_t isEOC(uint32_t cluster)
const {
541 uint8_t readBlock(uint32_t block, uint8_t* dst) {
543 uint8_t readData(uint32_t block, uint16_t offset,
544 uint16_t count, uint8_t* dst) {
545 return sdCard_->
readData(block, offset, count, dst);
547 uint8_t writeBlock(uint32_t block,
const uint8_t* dst) {
uint8_t seekCur(uint32_t pos)
Definition: SdFat.h:254
uint8_t createContiguous(SdFile &dirFile, const char *fileName, uint32_t size)
Definition: SdFat.h:308
uint32_t curCluster(void) const
Definition: SdFat.h:159
uint8_t openRoot(SdVolume *vol)
Definition: SdFile.cpp:558
Access FAT16 and FAT32 files on SD and SDHC cards.
Definition: SdFat.h:137
SdVolume(void)
Definition: SdFat.h:434
uint8_t const LS_SIZE
Definition: SdFat.h:47
uint32_t rootDirEntryCount(void) const
Definition: SdFat.h:475
uint8_t fatCount(void) const
Definition: SdFat.h:469
Master Boot Record.
Definition: FatStructs.h:104
uint8_t blocksPerCluster(void) const
Definition: SdFat.h:459
uint8_t seekEnd(void)
Definition: SdFat.h:261
Boot sector for a FAT16 or FAT32 volume.
Definition: FatStructs.h:249
uint8_t close(void)
Definition: SdFile.cpp:76
uint8_t open(SdFile &dirFile, uint16_t index, uint8_t oflag)
Definition: SdFat.h:345
uint8_t name[11]
Definition: FatStructs.h:292
static void dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))
Definition: SdFat.h:190
uint8_t makeDir(SdFile *dir, const char *dirName)
Definition: SdFile.cpp:292
uint8_t const O_WRITE
Definition: SdFat.h:57
uint8_t writeBlock(uint32_t blockNumber, const uint8_t *src)
Definition: Sd2Card.cpp:560
static void dateTimeCallbackCancel(void)
Definition: SdFat.h:197
uint8_t createContiguous(SdFile *dirFile, const char *fileName, uint32_t size)
Definition: SdFile.cpp:131
uint32_t blocksPerFat(void) const
Definition: SdFat.h:461
uint32_t firstCluster(void) const
Definition: SdFat.h:210
uint8_t openRoot(SdVolume &vol)
Definition: SdFat.h:349
uint8_t init(Sd2Card *dev)
Definition: SdFat.h:454
uint8_t dirEntry(dir_t &dir)
Definition: SdFat.h:324
uint8_t const O_RDWR
Definition: SdFat.h:61
uint32_t fat32[128]
Definition: SdFat.h:418
uint32_t rootDirStart(void) const
Definition: SdFat.h:478
uint8_t dirEntry(dir_t *dir)
Definition: SdFile.cpp:160
uint8_t contiguousRange(uint32_t &bgnBlock, uint32_t &endBlock)
Definition: SdFat.h:301
uint8_t truncate(uint32_t size)
Definition: SdFile.cpp:1073
uint8_t const O_WRONLY
Definition: SdFat.h:59
uint32_t dirBlock(void) const
Definition: SdFat.h:202
Cache for an SD data block.
Definition: SdFat.h:412
uint16_t const FAT_DEFAULT_DATE
Definition: SdFat.h:129
uint8_t const O_READ
Definition: SdFat.h:53
int8_t readDir(dir_t *dir)
Definition: SdFile.cpp:732
uint16_t const FAT_DEFAULT_TIME
Definition: SdFat.h:131
Access FAT16 and FAT32 volumes on SD and SDHC cards.
Definition: SdFat.h:431
uint32_t const FAT32EOC_MIN
Definition: FatStructs.h:284
uint8_t const T_CREATE
Definition: SdFat.h:79
uint8_t const O_TRUNC
Definition: SdFat.h:73
uint8_t rmDir(void)
Definition: SdFile.cpp:839
uint8_t isOpen(void) const
Definition: SdFat.h:216
uint8_t sync(void)
Definition: SdFile.cpp:965
uint8_t isFile(void) const
Definition: SdFat.h:214
uint8_t const FAT_FILE_TYPE_ROOT32
Definition: SdFat.h:90
static void printFatTime(uint16_t fatTime)
Definition: SdFile.cpp:634
static void dirName(const dir_t &dir, char *name)
Definition: SdFile.cpp:180
fbs_t fbs
Definition: SdFat.h:424
uint8_t const FAT_FILE_TYPE_SUBDIR
Definition: SdFat.h:92
uint8_t dirIndex(void) const
Definition: SdFat.h:205
static void printFatDate(uint16_t fatDate)
Definition: SdFile.cpp:620
uint8_t const FAT_FILE_TYPE_MIN_DIR
Definition: SdFat.h:94
void rewind(void)
Definition: SdFat.h:248
uint8_t const FAT_FILE_TYPE_CLOSED
Definition: SdFat.h:84
uint8_t const O_APPEND
Definition: SdFat.h:65
uint8_t const T_ACCESS
Definition: SdFat.h:77
size_t write(uint8_t b)
Definition: SdFile.cpp:1231
part_t part[4]
Definition: FatStructs.h:42
uint32_t clusterCount(void) const
Definition: SdFat.h:463
uint8_t fatType(void) const
Definition: SdFat.h:473
uint8_t const LS_R
Definition: SdFat.h:49
uint8_t unbufferedRead(void) const
Definition: SdFat.h:283
static Sd2Card * sdCard(void)
Definition: SdFat.h:480
uint8_t const LS_DATE
Definition: SdFat.h:45
uint8_t const O_ACCMODE
Definition: SdFat.h:63
uint8_t open(SdFile *dirFile, uint16_t index, uint8_t oflag)
Definition: SdFile.cpp:484
static uint8_t * cacheClear(void)
Definition: SdFat.h:438
void setUnbufferedRead(void)
Definition: SdFat.h:269
uint16_t fat16[256]
Definition: SdFat.h:416
uint8_t open(SdFile &dirFile, const char *fileName, uint8_t oflag)
Definition: SdFat.h:334
static void printTwoDigits(uint8_t v)
Definition: SdFile.cpp:646
int8_t readDir(dir_t &dir)
Definition: SdFat.h:352
void clearUnbufferedRead(void)
Definition: SdFat.h:151
uint8_t seekSet(uint32_t pos)
Definition: SdFile.cpp:924
Raw access to SD and SDHC flash memory cards.
Definition: Sd2Card.h:159
uint32_t fileSize(void) const
Definition: SdFat.h:208
uint8_t data[512]
Definition: SdFat.h:414
uint8_t type(void) const
Definition: SdFat.h:280
uint8_t isRoot(void) const
Definition: SdFat.h:220
uint8_t timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
Definition: SdFile.cpp:1025
uint8_t clusterSizeShift(void) const
Definition: SdFat.h:465
FAT short directory entry.
Definition: FatStructs.h:321
mbr_t mbr
Definition: SdFat.h:422
uint8_t isDir(void) const
Definition: SdFat.h:212
uint8_t const O_EXCL
Definition: SdFat.h:71
uint8_t init(Sd2Card &dev, uint8_t part)
Definition: SdFat.h:488
uint32_t fatStartBlock(void) const
Definition: SdFat.h:471
void ls(uint8_t flags=0, uint8_t indent=0)
Definition: SdFile.cpp:203
uint8_t const O_SYNC
Definition: SdFat.h:67
uint16_t const FAT16EOC_MIN
Definition: FatStructs.h:280
int16_t read(void)
Definition: SdFat.h:239
uint8_t const FAT_FILE_TYPE_NORMAL
Definition: SdFat.h:86
uint8_t const FAT_FILE_TYPE_ROOT16
Definition: SdFat.h:88
SdVolume * volume(void) const
Definition: SdFat.h:287
static void dateTimeCallback(void(*dateTime)(uint16_t &date, uint16_t &time))
Definition: SdFat.h:318
SdFile(void)
Definition: SdFat.h:140
uint8_t const O_CREAT
Definition: SdFat.h:69
uint8_t open(SdFile &dirFile, const char *fileName)
Definition: SdFat.h:339
uint8_t init(Sd2Card &dev)
Definition: SdFat.h:485
uint8_t rmRfStar(void)
Definition: SdFile.cpp:877
dir_t dir[16]
Definition: SdFat.h:420
uint8_t isSubDir(void) const
Definition: SdFat.h:218
uint32_t dataStartBlock(void) const
Definition: SdFat.h:467
uint8_t readData(uint32_t block, uint16_t offset, uint16_t count, uint8_t *dst)
Definition: Sd2Card.cpp:369
static void printDirName(const dir_t &dir, uint8_t width)
Definition: SdFile.cpp:593
uint8_t contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)
Definition: SdFile.cpp:93
uint8_t const O_RDONLY
Definition: SdFat.h:55
uint32_t curPosition(void) const
Definition: SdFat.h:161
uint8_t readBlock(uint32_t block, uint8_t *dst)
Definition: Sd2Card.cpp:355
uint8_t const T_WRITE
Definition: SdFat.h:81
uint8_t makeDir(SdFile &dir, const char *dirName)
Definition: SdFat.h:328