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_readFSinfo(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) != 0 || memcmp(sectorBuffer+FSIB_SIG2, FS_INFO_SIG2, 4) != 0 || u8array_to_u32(sectorBuffer, FSIB_numberOfFreeCluster) == 0) { //sector does not yet exist, create one! _FAT_partition_createFSinfo(partition); } else { partition->fat.numberFreeCluster = u8array_to_u32(sectorBuffer, FSIB_numberOfFreeCluster); if(partition->fat.numberFreeCluster == 0xffffffff) { _FAT_updateFS_INFO(partition,sectorBuffer); partition->fat.numberFreeCluster = u8array_to_u32(sectorBuffer, FSIB_numberOfFreeCluster); } partition->fat.numberLastAllocCluster = u8array_to_u32(sectorBuffer, FSIB_numberLastAllocCluster); } _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); }
sec_t FindFirstValidPartition(const DISC_INTERFACE* disc) { uint8_t *sectorBuffer = (uint8_t*) _FAT_mem_align(MAX_SECTOR_SIZE); if (!sectorBuffer) return 0; sec_t ret = FindFirstValidPartition_buf(disc, sectorBuffer); _FAT_mem_free(sectorBuffer); return ret; }
PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t sectorsPerPage, sec_t startSector) { uint8_t *sectorBuffer = (uint8_t*) _FAT_mem_align(MAX_SECTOR_SIZE); if (!sectorBuffer) return NULL; PARTITION *ret = _FAT_partition_constructor_buf(disc, cacheSize, sectorsPerPage, startSector, sectorBuffer); _FAT_mem_free(sectorBuffer); return ret; }
CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition, unsigned int bytesPerSector) { CACHE* cache; unsigned int i; CACHE_ENTRY* cacheEntries; if (numberOfPages < 2) { numberOfPages = 2; } if (sectorsPerPage < 8) { sectorsPerPage = 8; } cache = (CACHE*) _FAT_mem_allocate (sizeof(CACHE)); if (cache == NULL) { return NULL; } cache->disc = discInterface; cache->endOfPartition = endOfPartition; cache->numberOfPages = numberOfPages; cache->sectorsPerPage = sectorsPerPage; cache->bytesPerSector = bytesPerSector; cacheEntries = (CACHE_ENTRY*) _FAT_mem_allocate ( sizeof(CACHE_ENTRY) * numberOfPages); if (cacheEntries == NULL) { _FAT_mem_free (cache); return NULL; } for (i = 0; i < numberOfPages; i++) { cacheEntries[i].sector = CACHE_FREE; cacheEntries[i].count = 0; cacheEntries[i].last_access = 0; cacheEntries[i].dirty = false; cacheEntries[i].cache = (uint8_t*) _FAT_mem_align ( sectorsPerPage * bytesPerSector ); } cache->cacheEntries = cacheEntries; return cache; }
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]; } sectorBuffer[FSIB_bootSig_55] = 0x55; sectorBuffer[FSIB_bootSig_AA] = 0xAA; _FAT_updateFS_INFO(partition,sectorBuffer); _FAT_mem_free(sectorBuffer); }