forked from mfulz_github/qmk_firmware
Add LED flashing to the incomplete Mass Storage class bootloader. Clean up virtual FAT implementation.
This commit is contained in:
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…
Reference in New Issue