aboutsummaryrefslogtreecommitdiffstats
path: root/Bootloaders/Incomplete/MassStorage
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2013-03-09 09:13:44 +0000
committerDean Camera <dean@fourwalledcubicle.com>2013-03-09 09:13:44 +0000
commit0f0f9638a30d4267db80f235a7f3e4883a1d9f9d (patch)
tree136a4718e2dddab2b09a37a9e1132c050bd96e9c /Bootloaders/Incomplete/MassStorage
parentf00754ed9787390f16092652230d0b9fabcb64d5 (diff)
downloadlufa-0f0f9638a30d4267db80f235a7f3e4883a1d9f9d.tar.gz
lufa-0f0f9638a30d4267db80f235a7f3e4883a1d9f9d.tar.bz2
lufa-0f0f9638a30d4267db80f235a7f3e4883a1d9f9d.zip
Use real firmware file size in the VirtualFAT layer, clean up FAT12 chain update function.
Diffstat (limited to 'Bootloaders/Incomplete/MassStorage')
-rw-r--r--Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c72
1 files changed, 38 insertions, 34 deletions
diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c
index b111a5352..d43ac86cb 100644
--- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c
+++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c
@@ -64,10 +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];
@@ -82,67 +105,48 @@ static void WriteBlock(uint16_t BlockNumber)
// TODO: Write to FLASH
}
-void WriteFAT12ClusterEntry(uint8_t* FATTable, uint8_t Index, uint16_t NextEntry)
-{
- uint8_t StartOffset = ((uint16_t)Index * 3) / 2;
-
- /* Check if the start of the entry is at an upper nibble of the byte */
- if (((uint16_t)Index * 3) % 2)
- {
- FATTable[StartOffset] |= ((NextEntry & 0x0F) << 4);
- FATTable[StartOffset + 1] = (NextEntry >> 4);
- }
- else
- {
- FATTable[StartOffset] = NextEntry;
- FATTable[StartOffset + 1] = (NextEntry >> 8);
- }
-}
-
-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(" <B>\r\n");
break;
case 1:
case 2:
- printf(" <F>\r\n");
-
/* Cluster 0: Media type/Reserved */
- WriteFAT12ClusterEntry(BlockBuffer, 0, 0xF00 | BootBlock.MediaDescriptor);
+ UpdateFAT12ClusterEntry(BlockBuffer, 0, 0xF00 | BootBlock.MediaDescriptor);
/* Cluster 1: Reserved */
- WriteFAT12ClusterEntry(BlockBuffer, 1, 0xFFF);
+ UpdateFAT12ClusterEntry(BlockBuffer, 1, 0xFFF);
/* Cluster 2 onwards: Cluster chain of FIRMWARE.BIN */
- for (uint16_t i = 0; i < FILE_CLUSTERS(2049); i++)
- WriteFAT12ClusterEntry(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 */
- WriteFAT12ClusterEntry(BlockBuffer, FILE_CLUSTERS(2049) + 1, 0xFFF);
+ UpdateFAT12ClusterEntry(BlockBuffer, FILE_CLUSTERS(FIRMWARE_FILE_SIZE) + 1, 0xFFF);
break;
case 3:
- printf("<R>\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("<D>\r\n");
+// printf("<D>\r\n");
for (uint16_t i = 0; i < 512; i++)
- BlockBuffer[i] = '0' + BlockNumber; //A' + (i % 26);
+ BlockBuffer[i] = 'A' + (i % 26);
+ }
+ else
+ {
+ printf("INVALID %d\r\n", BlockNumber);
}
break;