//------------------------------------------------------------------------------ // Store a FAT entry uint8_t SdVolume::fatPut(uint32_t cluster, uint32_t value) { // error if reserved cluster if (cluster < 2) return false; // error if not in FAT if (cluster > (clusterCount_ + 1)) return false; // calculate block address for entry uint32_t lba = fatStartBlock_; lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; if (lba != cacheBlockNumber_) { if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; } // store entry if (fatType_ == 16) { cacheBuffer_.fat16[cluster & 0XFF] = value; } else { cacheBuffer_.fat32[cluster & 0X7F] = value; } cacheSetDirty(); // mirror second FAT if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; return true; }
//------------------------------------------------------------------------------ // cache a zero block for blockNumber uint8_t SdVolume::cacheZeroBlock(uint32_t blockNumber) { if (!cacheFlush()) return false; // loop take less flash than memset(cacheBuffer_.data, 0, 512); for (uint16_t i = 0; i < 512; i++) { cacheBuffer_.data[i] = 0; } cacheBlockNumber_ = blockNumber; cacheSetDirty(); return true; }