Add LED flashing to the incomplete Mass Storage class bootloader. Clean up virtual FAT implementation.

pull/1469/head
Dean Camera 12 years ago
parent 726b325c73
commit d5d83b8e8f

@ -30,8 +30,7 @@
/** \file /** \file
* *
* Main source file for the MassStorage demo. This file contains the main tasks of * Main source file for the Mass Storage class bootloader. This file contains the complete bootloader logic.
* the demo and is responsible for the initial application hardware configuration.
*/ */
#include "BootloaderMassStorage.h" #include "BootloaderMassStorage.h"
@ -96,6 +95,16 @@ void SetupHardware(void)
/* Hardware Initialization */ /* Hardware Initialization */
LEDs_Init(); LEDs_Init();
USB_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. */ /** Event handler for the library USB Connection event. */

@ -57,14 +57,14 @@ static const FATBootBlock_t BootBlock =
static FATDirectoryEntry_t FirmwareFileEntry = static FATDirectoryEntry_t FirmwareFileEntry =
{ {
.Filename = "FIRMWARE", .Filename = "FIRMWARE",
.Extension = "BIN", .Extension = "BIN",
.Attributes = 0, .Attributes = 0,
.Reserved = {0}, .Reserved = {0},
.CreationTime = FAT_TIME(1, 1, 0), .CreationTime = FAT_TIME(1, 1, 0),
.CreationDate = FAT_DATE(14, 2, 1989), .CreationDate = FAT_DATE(14, 2, 1989),
.StartingCluster = 2, .StartingCluster = 2,
.FileSizeBytes = FIRMWARE_FILE_SIZE, .FileSizeBytes = FIRMWARE_FILE_SIZE,
}; };
@ -94,10 +94,7 @@ static void WriteBlock(const uint16_t BlockNumber)
{ {
uint8_t BlockBuffer[SECTOR_SIZE_BYTES]; uint8_t BlockBuffer[SECTOR_SIZE_BYTES];
/* Wait until endpoint is ready before continuing */ /* Buffer the entire block to be written from the host */
if (Endpoint_WaitUntilReady())
return;
Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL);
Endpoint_ClearOUT(); Endpoint_ClearOUT();
@ -139,12 +136,12 @@ static void ReadBlock(const uint16_t BlockNumber)
switch (BlockNumber) switch (BlockNumber)
{ {
case 0: case 0: /* Block 0: Boot block sector */
memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t)); memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t));
break; break;
case 1: case 1: /* Block 1: First FAT12 cluster chain copy */
case 2: case 2: /* Block 2: Second FAT12 cluster chain copy */
/* Cluster 0: Media type/Reserved */ /* Cluster 0: Media type/Reserved */
UpdateFAT12ClusterEntry(BlockBuffer, 0, 0xF00 | BootBlock.MediaDescriptor); 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); UpdateFAT12ClusterEntry(BlockBuffer, FILE_CLUSTERS(FIRMWARE_FILE_SIZE) + 1, 0xFFF);
break; break;
case 3: case 3: /* Block 3: Root file entries */
memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t)); memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t));
break; break;
default: default: /* Blocks 4 onwards: Data allocation section */
if ((BlockNumber >= 4) && (BlockNumber < (4 + (FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES)))) if ((BlockNumber >= 4) && (BlockNumber < (4 + (FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES))))
{ {
uint32_t ReadFlashAddress = (uint32_t)(BlockNumber - 4) * 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; break;
} }
/* Wait until endpoint is ready before continuing */ /* Write the entire read block Buffer to the host */
if (Endpoint_WaitUntilReady())
return;
Endpoint_Write_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); Endpoint_Write_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL);
Endpoint_ClearIN(); Endpoint_ClearIN();
} }
@ -190,7 +184,7 @@ void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo,
uint16_t CurrentBlock = (uint16_t)BlockAddress; uint16_t CurrentBlock = (uint16_t)BlockAddress;
/* Emulated FAT is performed per-block, pass each requested block index /* Emulated FAT is performed per-block, pass each requested block index
* to the emulation function */ * to the emulated FAT block write function */
while (TotalBlocks--) while (TotalBlocks--)
WriteBlock(CurrentBlock++); WriteBlock(CurrentBlock++);
} }
@ -202,7 +196,7 @@ void VirtualFAT_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo,
uint16_t CurrentBlock = (uint16_t)BlockAddress; uint16_t CurrentBlock = (uint16_t)BlockAddress;
/* Emulated FAT is performed per-block, pass each requested block index /* Emulated FAT is performed per-block, pass each requested block index
* to the emulation function */ * to the emulated FAT block read function */
while (TotalBlocks--) while (TotalBlocks--)
ReadBlock(CurrentBlock++); ReadBlock(CurrentBlock++);
} }

Loading…
Cancel
Save