diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2013-03-09 10:32:17 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2013-03-09 10:32:17 +0000 |
commit | bb8754e2b8f1f8e6d027da98f76ed66de4a361cc (patch) | |
tree | cea1f9ee5e37bbfd179454748f05c019af9ab74e /Bootloaders/Incomplete/MassStorage/Lib | |
parent | 63e1fc6e6c435dcdaa0ebc465c00b1df05f69ed4 (diff) | |
download | lufa-bb8754e2b8f1f8e6d027da98f76ed66de4a361cc.tar.gz lufa-bb8754e2b8f1f8e6d027da98f76ed66de4a361cc.tar.bz2 lufa-bb8754e2b8f1f8e6d027da98f76ed66de4a361cc.zip |
Add FLASH writing routine to the VirtualFAT layer of the incomplete Mass Storage class bootloader.
Diffstat (limited to 'Bootloaders/Incomplete/MassStorage/Lib')
-rw-r--r-- | Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c index f5e5f840d..5d91cefaf 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c @@ -92,7 +92,7 @@ static void UpdateFAT12ClusterEntry(uint8_t* FATTable, static void WriteBlock(const uint16_t BlockNumber) { - uint8_t BlockBuffer[512]; + uint8_t BlockBuffer[SECTOR_SIZE_BYTES]; /* Wait until endpoint is ready before continuing */ if (Endpoint_WaitUntilReady()) @@ -101,12 +101,40 @@ static void WriteBlock(const uint16_t BlockNumber) Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); 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) { - uint8_t BlockBuffer[512]; + uint8_t BlockBuffer[SECTOR_SIZE_BYTES]; memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); switch (BlockNumber) |