Add LED flashing to the incomplete Mass Storage class bootloader. Clean up virtual...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 9 Mar 2013 10:51:19 +0000 (10:51 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 9 Mar 2013 10:51:19 +0000 (10:51 +0000)
Bootloaders/Incomplete/MassStorage/BootloaderMassStorage.c
Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c

index 14d1eb0..40f13b3 100644 (file)
@@ -30,8 +30,7 @@
 
 /** \file
  *
- *  Main source file for the MassStorage demo. This file contains the main tasks of
- *  the demo and is responsible for the initial application hardware configuration.
+ *  Main source file for the Mass Storage class bootloader. This file contains the complete bootloader logic.
  */
 
 #include "BootloaderMassStorage.h"
@@ -96,6 +95,16 @@ void SetupHardware(void)
        /* Hardware Initialization */
        LEDs_Init();
        USB_Init();
+
+       /* Bootloader active LED toggle timer initialization */
+       TIMSK1 = (1 << TOIE1);
+       TCCR1B = ((1 << CS11) | (1 << CS10));
+}
+
+/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */
+ISR(TIMER1_OVF_vect, ISR_BLOCK)
+{
+       LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 }
 
 /** Event handler for the library USB Connection event. */
index 5d91cef..85f274b 100644 (file)
@@ -57,14 +57,14 @@ static const FATBootBlock_t BootBlock =
 
 static FATDirectoryEntry_t FirmwareFileEntry =
        {
-               .Filename        = "FIRMWARE",
-               .Extension       = "BIN",
-               .Attributes      = 0,
-               .Reserved        = {0},
-               .CreationTime    = FAT_TIME(1, 1, 0),
-               .CreationDate    = FAT_DATE(14, 2, 1989),
-               .StartingCluster = 2,
-               .FileSizeBytes   = FIRMWARE_FILE_SIZE,
+               .Filename               = "FIRMWARE",
+               .Extension              = "BIN",
+               .Attributes             = 0,
+               .Reserved               = {0},
+               .CreationTime           = FAT_TIME(1, 1, 0),
+               .CreationDate           = FAT_DATE(14, 2, 1989),
+               .StartingCluster        = 2,
+               .FileSizeBytes          = FIRMWARE_FILE_SIZE,
        };
 
 
@@ -94,10 +94,7 @@ static void WriteBlock(const uint16_t BlockNumber)
 {
        uint8_t BlockBuffer[SECTOR_SIZE_BYTES];
 
-       /* Wait until endpoint is ready before continuing */
-       if (Endpoint_WaitUntilReady())
-         return;
-
+       /* Buffer the entire block to be written from the host */
        Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL);
        Endpoint_ClearOUT();
 
@@ -139,12 +136,12 @@ static void ReadBlock(const uint16_t BlockNumber)
 
        switch (BlockNumber)
        {
-               case 0:
+               case 0: /* Block 0: Boot block sector */
                        memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t));
                        break;
 
-               case 1:
-               case 2:
+               case 1: /* Block 1: First FAT12 cluster chain copy */
+               case 2: /* Block 2: Second FAT12 cluster chain copy */
                        /* Cluster 0: Media type/Reserved */
                        UpdateFAT12ClusterEntry(BlockBuffer, 0, 0xF00 | BootBlock.MediaDescriptor);
 
@@ -159,11 +156,11 @@ static void ReadBlock(const uint16_t BlockNumber)
                        UpdateFAT12ClusterEntry(BlockBuffer, FILE_CLUSTERS(FIRMWARE_FILE_SIZE) + 1, 0xFFF);
                        break;
 
-               case 3:
+               case 3: /* Block 3: Root file entries */
                        memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t));
                        break;
 
-               default:
+               default: /* Blocks 4 onwards: Data allocation section */
                        if ((BlockNumber >= 4) && (BlockNumber < (4 + (FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES))))
                        {
                                uint32_t ReadFlashAddress = (uint32_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES;
@@ -175,10 +172,7 @@ static void ReadBlock(const uint16_t BlockNumber)
                        break;
        }
 
-       /* Wait until endpoint is ready before continuing */
-       if (Endpoint_WaitUntilReady())
-         return;
-
+       /* Write the entire read block Buffer to the host */
        Endpoint_Write_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL);
        Endpoint_ClearIN();
 }
@@ -190,7 +184,7 @@ void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo,
        uint16_t CurrentBlock = (uint16_t)BlockAddress;
 
        /* Emulated FAT is performed per-block, pass each requested block index
-        * to the emulation function */
+        * to the emulated FAT block write function */
        while (TotalBlocks--)
          WriteBlock(CurrentBlock++);
 }
@@ -202,7 +196,7 @@ void VirtualFAT_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo,
        uint16_t CurrentBlock = (uint16_t)BlockAddress;
 
        /* Emulated FAT is performed per-block, pass each requested block index
-        * to the emulation function */
+        * to the emulated FAT block read function */
        while (TotalBlocks--)
          ReadBlock(CurrentBlock++);
 }