diff options
author | Dean Camera <[email protected]> | 2009-03-17 13:56:26 +0000 |
---|---|---|
committer | Dean Camera <[email protected]> | 2009-03-17 13:56:26 +0000 |
commit | ceb68a06408ca31d41cfb57eb3cd20268c1aed15 (patch) | |
tree | 5cff01a80b3235215682ac33996b5a2c0b84a6f9 /Bootloaders | |
parent | 904ad3abd2df55b8f7da2ab84cee13f087386958 (diff) | |
download | qmk_firmware-ceb68a06408ca31d41cfb57eb3cd20268c1aed15.tar.gz qmk_firmware-ceb68a06408ca31d41cfb57eb3cd20268c1aed15.zip |
Corrected CDC class bootloader to fix a few bugs, changed address counter to store x2 addresses for convenience.
Diffstat (limited to 'Bootloaders')
-rw-r--r-- | Bootloaders/CDC/BootloaderCDC.c | 203 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.c | 7 | ||||
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.h | 7 |
3 files changed, 111 insertions, 106 deletions
diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index 0add977ce4..a1394bdfa1 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -52,7 +52,7 @@ CDC_Line_Coding_t LineCoding = { BaudRateBPS: 9600, * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued
* command.)
*/
-uint16_t CurrAddress;
+uint32_t CurrAddress;
/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
* via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application
@@ -223,101 +223,101 @@ static void ReadWriteMemoryBlock(const uint8_t Command) MemoryType = FetchNextCommandByte();
- if ((MemoryType == 'E') || (MemoryType == 'F'))
+ if ((MemoryType != 'E') && (MemoryType != 'F'))
{
- /* Check if command is to read memory */
- if (Command == 'g')
- {
- /* Re-enable RWW section */
- boot_rww_enable();
+ /* Send error byte back to the host */
+ WriteNextResponseByte('?');
+
+ return;
+ }
- while (BlockSize--)
+ /* Check if command is to read memory */
+ if (Command == 'g')
+ {
+ /* Re-enable RWW section */
+ boot_rww_enable();
+
+ while (BlockSize--)
+ {
+ if (MemoryType == 'E')
{
- if (MemoryType == 'E')
- {
- /* Read the next EEPROM byte into the endpoint */
- WriteNextResponseByte(eeprom_read_byte((uint8_t*)CurrAddress));
+ /* Read the next EEPROM byte into the endpoint */
+ WriteNextResponseByte(eeprom_read_byte((uint8_t*)(uint16_t)(CurrAddress >> 1)));
- /* Increment the address counter after use */
- CurrAddress++;
- }
- else
- {
- /* Read the next FLASH byte from the current FLASH page */
- #if defined(RAMPZ)
- WriteNextResponseByte(pgm_read_byte_far(((uint32_t)CurrAddress << 1) + HighByte));
- #else
- WriteNextResponseByte(pgm_read_byte((CurrAddress << 1) + HighByte));
- #endif
-
- /* If both bytes in current word have been read, increment the address counter */
- if (HighByte)
- CurrAddress++;
-
- HighByte ^= 1;
- }
+ /* Increment the address counter after use */
+ CurrAddress += 2;
+ }
+ else
+ {
+ /* Read the next FLASH byte from the current FLASH page */
+ #if defined(RAMPZ)
+ WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte));
+ #else
+ WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte));
+ #endif
+
+ /* If both bytes in current word have been read, increment the address counter */
+ if (HighByte)
+ CurrAddress += 2;
+
+ HighByte = !HighByte;
}
}
- else
+ }
+ else
+ {
+ uint32_t PageStartAddress = CurrAddress;
+
+ if (MemoryType == 'F')
+ {
+ boot_page_erase(PageStartAddress);
+ boot_spm_busy_wait();
+ }
+
+ while (BlockSize--)
{
- uint32_t PageStartAddress = ((uint32_t)CurrAddress << 1);
-
if (MemoryType == 'F')
- {
- boot_page_erase(PageStartAddress);
- boot_spm_busy_wait();
- }
-
- while (BlockSize--)
- {
- if (MemoryType == 'E')
+ {
+ /* If both bytes in current word have been written, increment the address counter */
+ if (HighByte)
{
- /* Write the next EEPROM byte from the endpoint */
- eeprom_write_byte((uint8_t*)CurrAddress, FetchNextCommandByte());
+ /* Write the next FLASH word to the current FLASH page */
+ boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte));
/* Increment the address counter after use */
- CurrAddress++;
+ CurrAddress += 2;
+
+ HighByte = false;
}
else
- {
- /* If both bytes in current word have been written, increment the address counter */
- if (HighByte)
- {
- /* Write the next FLASH word to the current FLASH page */
- boot_page_fill(((uint32_t)CurrAddress << 1), ((FetchNextCommandByte() << 8) | LowByte));
-
- HighByte = false;
-
- /* Increment the address counter after use */
- CurrAddress++;
- }
- else
- {
- LowByte = FetchNextCommandByte();
-
- HighByte = true;
- }
+ {
+ LowByte = FetchNextCommandByte();
+
+ HighByte = true;
}
}
-
- /* If in FLASH programming mode, commit the page after writing */
- if (MemoryType == 'F')
+ else
{
- /* Commit the flash page to memory */
- boot_page_write(PageStartAddress);
-
- /* Wait until write operation has completed */
- boot_spm_busy_wait();
+ /* Write the next EEPROM byte from the endpoint */
+ eeprom_write_byte((uint8_t*)(uint16_t)(CurrAddress >> 1), FetchNextCommandByte());
+
+ /* Increment the address counter after use */
+ CurrAddress += 2;
}
-
- /* Send response byte back to the host */
- WriteNextResponseByte('\r');
}
- }
- else
- {
- /* Send error byte back to the host */
- WriteNextResponseByte('?');
+
+ /* If in FLASH programming mode, commit the page after writing */
+ if (MemoryType == 'F')
+ {
+ /* Commit the flash page to memory */
+ boot_page_write(PageStartAddress);
+
+ /* Wait until write operation has completed */
+ boot_spm_busy_wait();
+ }
+
+ /* Send response byte back to the host */
+ WriteNextResponseByte('\r');
}
}
@@ -402,8 +402,8 @@ TASK(CDC_Task) else if (Command == 'A')
{
/* Set the current address to that given by the host */
- CurrAddress = (FetchNextCommandByte() << 8);
- CurrAddress |= FetchNextCommandByte();
+ CurrAddress = (FetchNextCommandByte() << 9);
+ CurrAddress |= (FetchNextCommandByte() << 1);
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
@@ -426,9 +426,9 @@ TASK(CDC_Task) }
else if (Command == 's')
{
- WriteNextResponseByte(boot_signature_byte_get(4));
- WriteNextResponseByte(boot_signature_byte_get(2));
- WriteNextResponseByte(boot_signature_byte_get(0));
+ WriteNextResponseByte(SIGNATURE_0);
+ WriteNextResponseByte(SIGNATURE_1);
+ WriteNextResponseByte(SIGNATURE_2);
}
else if (Command == 'b')
{
@@ -478,24 +478,29 @@ TASK(CDC_Task) {
WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS));
}
- else if ((Command == 'C') || (Command == 'c'))
- {
- if (Command == 'c')
- {
- /* Increment the address if the second byte is being written */
- CurrAddress++;
- }
-
+ else if (Command == 'C')
+ {
/* Write the high byte to the current flash page */
- boot_page_fill(((uint32_t)CurrAddress << 1), FetchNextCommandByte());
+ boot_page_fill(CurrAddress, FetchNextCommandByte());
+
+ /* Send confirmation byte back to the host */
+ WriteNextResponseByte('\r');
+ }
+ else if (Command == 'c')
+ {
+ /* Write the low byte to the current flash page */
+ boot_page_fill(CurrAddress | 1, FetchNextCommandByte());
+ /* Increment the address */
+ CurrAddress += 2;
+
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
}
else if (Command == 'm')
{
/* Commit the flash page to memory */
- boot_page_write((uint32_t)CurrAddress << 1);
+ boot_page_write(CurrAddress);
/* Wait until write operation has completed */
boot_spm_busy_wait();
@@ -511,9 +516,9 @@ TASK(CDC_Task) else if (Command == 'R')
{
#if defined(RAMPZ)
- uint16_t ProgramWord = pgm_read_word_far(((uint32_t)CurrAddress << 1));
+ uint16_t ProgramWord = pgm_read_word_far(CurrAddress);
#else
- uint16_t ProgramWord = pgm_read_word(CurrAddress << 1);
+ uint16_t ProgramWord = pgm_read_word(CurrAddress);
#endif
WriteNextResponseByte(ProgramWord >> 8);
@@ -522,10 +527,10 @@ TASK(CDC_Task) else if (Command == 'D')
{
/* Read the byte from the endpoint and write it to the EEPROM */
- eeprom_write_byte((uint8_t*)CurrAddress, FetchNextCommandByte());
+ eeprom_write_byte((uint8_t*)(uint16_t)(CurrAddress >> 1), FetchNextCommandByte());
/* Increment the address after use */
- CurrAddress++;
+ CurrAddress += 2;
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
@@ -533,10 +538,10 @@ TASK(CDC_Task) else if (Command == 'd')
{
/* Read the EEPROM byte and write it to the endpoint */
- WriteNextResponseByte(eeprom_read_byte((uint8_t*)CurrAddress));
+ WriteNextResponseByte(eeprom_read_byte((uint8_t*)(uint16_t)(CurrAddress >> 1)));
/* Increment the address after use */
- CurrAddress++;
+ CurrAddress += 2;
}
else if (Command == 27)
{
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c index 9fff20c12d..6bea9b25fd 100644 --- a/Bootloaders/DFU/BootloaderDFU.c +++ b/Bootloaders/DFU/BootloaderDFU.c @@ -32,13 +32,6 @@ *
* Main source file for the DFU class bootloader. This file contains the complete bootloader logic.
*/
-
-/** Configuration define. Define this token to true to case the bootloader to reject all memory commands
- * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this
- * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are
- * allowed at any time.
- */
-#define SECURE_MODE false
#define INCLUDE_FROM_BOOTLOADER_C
#include "BootloaderDFU.h"
diff --git a/Bootloaders/DFU/BootloaderDFU.h b/Bootloaders/DFU/BootloaderDFU.h index 21e8fce71f..5a83403dfb 100644 --- a/Bootloaders/DFU/BootloaderDFU.h +++ b/Bootloaders/DFU/BootloaderDFU.h @@ -50,6 +50,13 @@ #include <LUFA/Drivers/USB/USB.h> // USB Functionality
/* Macros: */
+ /** Configuration define. Define this token to true to case the bootloader to reject all memory commands
+ * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this
+ * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are
+ * allowed at any time.
+ */
+ #define SECURE_MODE false
+
/** Major bootloader version number. */
#define BOOTLOADER_VERSION_MINOR 2
|