Add FLASH writing routine to the VirtualFAT layer of the incomplete Mass Storage...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 9 Mar 2013 10:32:17 +0000 (10:32 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 9 Mar 2013 10:32:17 +0000 (10:32 +0000)
Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c
Bootloaders/Incomplete/MassStorage/makefile

index f5e5f84..5d91cef 100644 (file)
@@ -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 */
        if (Endpoint_WaitUntilReady())
 
        /* 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();
 
        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)
 {
 }
 
 static void ReadBlock(const uint16_t BlockNumber)
 {
-       uint8_t BlockBuffer[512];
+       uint8_t BlockBuffer[SECTOR_SIZE_BYTES];
        memset(BlockBuffer, 0x00, sizeof(BlockBuffer));
 
        switch (BlockNumber)
        memset(BlockBuffer, 0x00, sizeof(BlockBuffer));
 
        switch (BlockNumber)
index 532f9f2..c922b9d 100644 (file)
@@ -14,7 +14,7 @@
 MCU          = at90usb1287\r
 ARCH         = AVR8\r
 BOARD        = USBKEY\r
 MCU          = at90usb1287\r
 ARCH         = AVR8\r
 BOARD        = USBKEY\r
-F_CPU        = 16000000\r
+F_CPU        = 8000000\r
 F_USB        = $(F_CPU)\r
 OPTIMIZATION = s\r
 TARGET       = BootloaderMassStorage\r
 F_USB        = $(F_CPU)\r
 OPTIMIZATION = s\r
 TARGET       = BootloaderMassStorage\r