Add FLASH writing routine to the VirtualFAT layer of the incomplete Mass Storage class bootloader.

pull/1469/head
Dean Camera 12 years ago
parent 63e1fc6e6c
commit bb8754e2b8

@ -92,7 +92,7 @@ static void UpdateFAT12ClusterEntry(uint8_t* FATTable,
static void WriteBlock(const uint16_t BlockNumber) static void WriteBlock(const uint16_t BlockNumber)
{ {
uint8_t BlockBuffer[512]; uint8_t BlockBuffer[SECTOR_SIZE_BYTES];
/* Wait until endpoint is ready before continuing */ /* Wait until endpoint is ready before continuing */
if (Endpoint_WaitUntilReady()) if (Endpoint_WaitUntilReady())
@ -101,12 +101,40 @@ static void WriteBlock(const uint16_t BlockNumber)
Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL);
Endpoint_ClearOUT(); Endpoint_ClearOUT();
// TODO: Write to FLASH if ((BlockNumber >= 4) && (BlockNumber < (4 + (FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES))))
{
uint32_t WriteFlashAddress = (uint32_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES;
for (uint16_t i = 0; i < SECTOR_SIZE_BYTES; i += 2)
{
/* Disallow writing to the bootloader section */
if (WriteFlashAddress > BOOT_START_ADDR)
continue;
if ((WriteFlashAddress % SPM_PAGESIZE) == 0)
{
/* Erase the given FLASH page, ready to be programmed */
boot_page_erase(WriteFlashAddress);
boot_spm_busy_wait();
}
/* Write the next data word to the FLASH page */
boot_page_fill(WriteFlashAddress, (BlockBuffer[i + 1] << 8) | BlockBuffer[i]);
WriteFlashAddress += 2;
if ((WriteFlashAddress % SPM_PAGESIZE) == 0)
{
/* Write the filled FLASH page to memory */
boot_page_write(WriteFlashAddress - SPM_PAGESIZE);
boot_spm_busy_wait();
}
}
}
} }
static void ReadBlock(const uint16_t BlockNumber) static void ReadBlock(const uint16_t BlockNumber)
{ {
uint8_t BlockBuffer[512]; uint8_t BlockBuffer[SECTOR_SIZE_BYTES];
memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); memset(BlockBuffer, 0x00, sizeof(BlockBuffer));
switch (BlockNumber) switch (BlockNumber)

@ -14,7 +14,7 @@
MCU = at90usb1287 MCU = at90usb1287
ARCH = AVR8 ARCH = AVR8
BOARD = USBKEY BOARD = USBKEY
F_CPU = 16000000 F_CPU = 8000000
F_USB = $(F_CPU) F_USB = $(F_CPU)
OPTIMIZATION = s OPTIMIZATION = s
TARGET = BootloaderMassStorage TARGET = BootloaderMassStorage

Loading…
Cancel
Save