mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-01 13:32:04 +00:00
Add FLASH writing routine to the VirtualFAT layer of the incomplete Mass Storage class bootloader.
This commit is contained in:
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…
Reference in New Issue
Block a user