From d5d83b8e8f8238114426a0ca4476062cdc765ea1 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 9 Mar 2013 10:51:19 +0000 Subject: [PATCH] Add LED flashing to the incomplete Mass Storage class bootloader. Clean up virtual FAT implementation. --- .../MassStorage/BootloaderMassStorage.c | 13 +++++- .../Incomplete/MassStorage/Lib/VirtualFAT.c | 40 ++++++++----------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Bootloaders/Incomplete/MassStorage/BootloaderMassStorage.c b/Bootloaders/Incomplete/MassStorage/BootloaderMassStorage.c index 14d1eb0765..40f13b3e66 100644 --- a/Bootloaders/Incomplete/MassStorage/BootloaderMassStorage.c +++ b/Bootloaders/Incomplete/MassStorage/BootloaderMassStorage.c @@ -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. */ diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c index 5d91cefafe..85f274bfac 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c @@ -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++); }