X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/6da1677bc33608eddb87b65b86dfc5881dd6c6e8..d5d9ff73e5216969aaa2915de3fa04f530ffe400:/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c index 7a248d87e..24df348f0 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c @@ -42,15 +42,15 @@ static const FATBootBlock_t BootBlock = .TotalSectors16 = LUN_MEDIA_BLOCKS, .MediaDescriptor = 0xF8, .SectorsPerFAT = 1, - .SectorsPerTrack = 32, - .Heads = 64, + .SectorsPerTrack = LUN_MEDIA_BLOCKS % 64, + .Heads = LUN_MEDIA_BLOCKS / 64, .HiddenSectors = 0, .TotalSectors32 = 0, .PhysicalDriveNum = 0, .ExtendedBootRecordSig = 0x29, .VolumeSerialNumber = 0x12345678, .VolumeLabel = "LUFA BOOT ", - .FilesystemIdentifier = "FAT16 ", + .FilesystemIdentifier = "FAT12 ", .BootstrapProgram = {0}, .MagicSignature = 0xAA55, }; @@ -64,11 +64,33 @@ static FATDirectoryEntry_t FirmwareFileEntry = .CreationTime = FAT_TIME(1, 1, 0), .CreationDate = FAT_DATE(14, 2, 1989), .StartingCluster = 2, - .FileSizeBytes = 2049, + .FileSizeBytes = FIRMWARE_FILE_SIZE, }; -static void WriteBlock(uint16_t BlockNumber) +static void UpdateFAT12ClusterEntry(uint8_t* FATTable, + const uint16_t Index, + const uint16_t ChainEntry) +{ + /* Calculate the starting offset of the cluster entry in the FAT12 table */ + uint8_t FATOffset = (Index * 3) / 2; + bool UpperNibble = (((Index * 3) % 2) != 0); + + /* Check if the start of the entry is at an upper nibble of the byte, fill + * out FAT12 entry as required */ + if (UpperNibble) + { + FATTable[FATOffset] = (FATTable[FATOffset] & 0x0F) | ((ChainEntry & 0x0F) << 4); + FATTable[FATOffset + 1] = (ChainEntry >> 4); + } + else + { + FATTable[FATOffset] = ChainEntry; + FATTable[FATOffset + 1] = (FATTable[FATOffset] & 0xF0) | (ChainEntry >> 8); + } +} + +static void WriteBlock(const uint16_t BlockNumber) { uint8_t BlockBuffer[512]; @@ -79,56 +101,45 @@ static void WriteBlock(uint16_t BlockNumber) Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); Endpoint_ClearOUT(); - printf("WRITE %d\r\n", BlockNumber); // TODO: Write to FLASH } -static void ReadBlock(uint16_t BlockNumber) +static void ReadBlock(const uint16_t BlockNumber) { uint8_t BlockBuffer[512]; memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); - printf("READ %d", BlockNumber); - switch (BlockNumber) { case 0: memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t)); - printf(" \r\n"); break; case 1: case 2: - printf(" \r\n"); - /* Cluster 0: Media type/Reserved */ - ((uint16_t*)&BlockBuffer)[0] = 0xFF00 | BootBlock.MediaDescriptor; + UpdateFAT12ClusterEntry(BlockBuffer, 0, 0xF00 | BootBlock.MediaDescriptor); /* Cluster 1: Reserved */ - ((uint16_t*)&BlockBuffer)[1] = 0xFFFF; + UpdateFAT12ClusterEntry(BlockBuffer, 1, 0xFFF); /* Cluster 2 onwards: Cluster chain of FIRMWARE.BIN */ - for (uint16_t i = 0; i < FILE_CLUSTERS(2049); i++) - { - ((uint16_t*)&BlockBuffer)[i + 2] = i + 3; - } + for (uint16_t i = 0; i < FILE_CLUSTERS(FIRMWARE_FILE_SIZE); i++) + UpdateFAT12ClusterEntry(BlockBuffer, i+2, i+3); /* Mark last cluster as end of file */ - ((uint16_t*)&BlockBuffer)[FILE_CLUSTERS(2049) + 1] = 0xFFFF; + UpdateFAT12ClusterEntry(BlockBuffer, FILE_CLUSTERS(FIRMWARE_FILE_SIZE) + 1, 0xFFF); break; case 3: - printf("\r\n"); memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t)); break; default: - if ((BlockNumber >= 4) && (BlockNumber < (4 + FILE_CLUSTERS(FIRMWARE_FILE_SIZE)))) + if ((BlockNumber >= 4) && (BlockNumber < (4 + (FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES)))) { - printf("\r\n"); - for (uint16_t i = 0; i < 512; i++) - BlockBuffer[i] = '0' + BlockNumber; //A' + (i % 26); + BlockBuffer[i] = 'A' + (i % 26); } break;