void _FAT_partition_writeFSinfo(PARTITION * partition) { if(partition->filesysType != FS_FAT32) return; uint8_t *sectorBuffer = (uint8_t*) _FAT_mem_align(partition->bytesPerSector); if (!sectorBuffer) return; memset(sectorBuffer, 0, partition->bytesPerSector); // Read first sector of disc if (!_FAT_disc_readSectors (partition->disc, partition->fsInfoSector, 1, sectorBuffer)) { _FAT_mem_free(sectorBuffer); return; } if(memcmp(sectorBuffer+FSIB_SIG1, FS_INFO_SIG1, 4) || memcmp(sectorBuffer+FSIB_SIG2, FS_INFO_SIG2, 4)) { _FAT_mem_free(sectorBuffer); return; } u32_to_u8array(sectorBuffer, FSIB_numberOfFreeCluster, partition->fat.numberFreeCluster); u32_to_u8array(sectorBuffer, FSIB_numberLastAllocCluster, partition->fat.numberLastAllocCluster); // Write first sector of disc _FAT_disc_writeSectors (partition->disc, partition->fsInfoSector, 1, sectorBuffer); _FAT_mem_free(sectorBuffer); }
void _FAT_partition_createFSinfo(PARTITION * partition) { if(partition->readOnly || partition->filesysType != FS_FAT32) return; uint8_t *sectorBuffer = (uint8_t*) _FAT_mem_align(partition->bytesPerSector); if (!sectorBuffer) return; memset(sectorBuffer, 0, partition->bytesPerSector); int i; for(i = 0; i < 4; ++i) { sectorBuffer[FSIB_SIG1+i] = FS_INFO_SIG1[i]; sectorBuffer[FSIB_SIG2+i] = FS_INFO_SIG2[i]; } partition->fat.numberFreeCluster = _FAT_fat_freeClusterCount(partition); u32_to_u8array(sectorBuffer, FSIB_numberOfFreeCluster, partition->fat.numberFreeCluster); u32_to_u8array(sectorBuffer, FSIB_numberLastAllocCluster, partition->fat.numberLastAllocCluster); sectorBuffer[FSIB_bootSig_55] = 0x55; sectorBuffer[FSIB_bootSig_AA] = 0xAA; _FAT_disc_writeSectors (partition->disc, partition->fsInfoSector, 1, sectorBuffer); _FAT_mem_free(sectorBuffer); }
bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int size) { uint8_t buf[4] = {0, 0, 0, 0}; switch(size) { case 1: buf[0] = value; break; case 2: u16_to_u8array(buf, 0, value); break; case 4: u32_to_u8array(buf, 0, value); break; default: return false; } return _FAT_cache_writePartialSector(cache, buf, sector, offset, size); }
static void _FAT_updateFS_INFO(PARTITION * partition, uint8_t *sectorBuffer) { partition->fat.numberFreeCluster = _FAT_fat_freeClusterCount(partition); u32_to_u8array(sectorBuffer, FSIB_numberOfFreeCluster, partition->fat.numberFreeCluster); u32_to_u8array(sectorBuffer, FSIB_numberLastAllocCluster, partition->fat.numberLastAllocCluster); _FAT_disc_writeSectors (partition->disc, partition->fsInfoSector, 1, sectorBuffer); }