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 // 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 diff --git a/Demos/Mouse/Mouse.c b/Demos/Mouse/Mouse.c index da8a4a809c..f8ec0a0f5b 100644 --- a/Demos/Mouse/Mouse.c +++ b/Demos/Mouse/Mouse.c @@ -113,6 +113,9 @@ EVENT_HANDLER(USB_Connect) /* Indicate USB enumerating */ UpdateStatus(Status_USBEnumerating); + + /* Default to report protocol on connect */ + UsingReportProtocol = true; } /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via @@ -141,9 +144,6 @@ EVENT_HANDLER(USB_ConfigurationChanged) /* Indicate USB connected and ready */ UpdateStatus(Status_USBReady); - /* Default to report protocol on connect */ - UsingReportProtocol = true; - /* Start running mouse reporting task */ Scheduler_SetTaskMode(USB_Mouse_Report, TASK_RUN); } diff --git a/LUFA.pnproj b/LUFA.pnproj index 8c68c4895f..6af35f58a4 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt index 6e837f36c5..721d5e864c 100644 --- a/LUFA/ChangeLog.txt +++ b/LUFA/ChangeLog.txt @@ -38,6 +38,7 @@ * - Added DataflashManager_WriteBlocks_RAM() and DataflashManager_ReadBlocks_RAM() functions to the MassStorage demo, to allow for easy * interfacing with a FAT library for dataflash file level access * - Incomplete non-functional BluetoothHost demo removed until it has reached a stable state to prevent confusion + * - Corrected CDC class bootloader to fix a few bugs, changed address counter to store x2 addresses for convenience * * \section Sec_ChangeLog090209 Version 090209 *