From cd0093a14bd12d61ceab6860341c1a1fcd0ebb04 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Thu, 13 May 2010 09:25:17 +0000 Subject: [PATCH] Fixed AVRISP-MKII clone project not correctly issuing SET EXTENDED ADDRESS commands when the extended address boundary is crossed during programming or readback (thanks to Gerard Sexton). Fixed warnings when building the AVRISP-MKII clone project with the ENABLE_XPROG_PROTOCOL compile time option disabled. --- LUFA/ManPages/ChangeLog.txt | 3 ++ Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c | 46 +++++++++++++++---- Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h | 2 +- .../AVRISP-MKII/Lib/XPROG/XPROGProtocol.h | 2 +- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h | 2 +- Projects/Benito/Lib/RingBuff.h | 2 +- Projects/Benito/makefile | 2 +- 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 09a168dc12..70c81dc006 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -17,6 +17,9 @@ * Fixed: * - Fixed possible device lockup when INTERRUPT_CONTROL_ENDPOINT is enabled and the control endpoint is not properly * selected when the ISR completes + * - Fixed AVRISP-MKII clone project not correctly issuing SET EXTENDED ADDRESS commands when the extended address + * boundary is crossed during programming or readback (thanks to Gerard Sexton) + * - Fixed warnings when building the AVRISP-MKII clone project with the ENABLE_XPROG_PROTOCOL compile time option disabled * * \section Sec_ChangeLog100512 Version 100512 * diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c index a16504da14..430772ddc2 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c @@ -227,8 +227,18 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) PollAddress = (CurrentAddress & 0xFFFF); } - if (IsOddByte || (V2Command == CMD_PROGRAM_EEPROM_ISP)) - CurrentAddress++; + /* EEPROM just increments the address each byte, flash needs to increment on each word and + * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended + * address boundary has been crossed */ + if (V2Command == CMD_PROGRAM_EEPROM_ISP) + { + CurrentAddress++; + } + else if (IsOddByte) + { + if (!(++CurrentAddress & 0xFFFF)) + ISPTarget_LoadExtendedAddress(); + } } /* If the current page must be committed, send the PROGRAM PAGE command to the target */ @@ -276,8 +286,18 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) PollAddress = (CurrentAddress & 0xFFFF); } - if (IsOddByte || (V2Command == CMD_PROGRAM_EEPROM_ISP)) - CurrentAddress++; + /* EEPROM just increments the address each byte, flash needs to increment on each word and + * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended + * address boundary has been crossed */ + if (V2Command == CMD_PROGRAM_EEPROM_ISP) + { + CurrentAddress++; + } + else if (IsOddByte) + { + if (!(++CurrentAddress & 0xFFFF)) + ISPTarget_LoadExtendedAddress(); + } ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue, Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]); @@ -346,11 +366,19 @@ void ISPProtocol_ReadMemory(uint8_t V2Command) * or low byte at the current word address */ if (V2Command == CMD_READ_FLASH_ISP) Read_Memory_Params.ReadMemoryCommand ^= READ_WRITE_HIGH_BYTE_MASK; - - /* Only increment the current address if we have read both bytes in the current word when in FLASH - * read mode, or for each byte when in EEPROM read mode */ - if (((CurrentByte & 0x01) && (V2Command == CMD_READ_FLASH_ISP)) || (V2Command == CMD_READ_EEPROM_ISP)) - CurrentAddress++; + + /* EEPROM just increments the address each byte, flash needs to increment on each word and + * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended + * address boundary has been crossed */ + if (V2Command == CMD_READ_EEPROM_ISP) + { + CurrentAddress++; + } + else if (CurrentByte & 0x01) + { + if (!(++CurrentAddress & 0xFFFF)) + ISPTarget_LoadExtendedAddress(); + } } Endpoint_Write_Byte(STATUS_CMD_OK); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h index 73bf1f9535..2daca16fcf 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h @@ -68,7 +68,7 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, uint8_t* WriteBuffer, uint16_t WriteLength); bool TINYNVM_EraseMemory(const uint8_t EraseCommand, const uint16_t Address); - #if defined(INCLUDE_FROM_TINYNVM_C) + #if (defined(INCLUDE_FROM_TINYNVM_C) && defined(ENABLE_XPROG_PROTOCOL)) static void TINYNVM_SendReadNVMRegister(const uint8_t Address); static void TINYNVM_SendWriteNVMRegister(const uint8_t Address); static void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h index 1fdb5a1b8a..c812578e51 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h @@ -119,7 +119,7 @@ void XPROGProtocol_SetMode(void); void XPROGProtocol_Command(void); - #if defined(INCLUDE_FROM_XPROGPROTOCOL_C) + #if (defined(INCLUDE_FROM_XPROGPROTOCOL_C) && defined(ENABLE_XPROG_PROTOCOL)) static void XPROGProtocol_EnterXPROGMode(void); static void XPROGProtocol_LeaveXPROGMode(void); static void XPROGProtocol_SetParam(void); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h index 436f0f30df..db233a1a49 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h @@ -118,7 +118,7 @@ void XPROGTarget_SendBreak(void); bool XPROGTarget_WaitWhileNVMBusBusy(void); - #if defined(INCLUDE_FROM_XPROGTARGET_C) + #if (defined(INCLUDE_FROM_XPROGTARGET_C) && defined(ENABLE_XPROG_PROTOCOL)) static void XPROGTarget_SetTxMode(void); static void XPROGTarget_SetRxMode(void); #endif diff --git a/Projects/Benito/Lib/RingBuff.h b/Projects/Benito/Lib/RingBuff.h index b4933aa4d5..30dbf104e8 100644 --- a/Projects/Benito/Lib/RingBuff.h +++ b/Projects/Benito/Lib/RingBuff.h @@ -30,7 +30,7 @@ /* Buffer Configuration: */ /* Buffer length - select static size of created ring buffers: */ - #define BUFF_STATICSIZE 128 // Set to the static ring buffer size for all ring buffers (place size after define) + #define BUFF_STATICSIZE 255 // Set to the static ring buffer size for all ring buffers (place size after define) /* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */ #define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access diff --git a/Projects/Benito/makefile b/Projects/Benito/makefile index 4fadc10c19..5bab672f45 100644 --- a/Projects/Benito/makefile +++ b/Projects/Benito/makefile @@ -60,7 +60,7 @@ # MCU name -MCU = atmega32u4 +MCU = atmega32u2 # Target board (see library "Board Types" documentation, NONE for projects not requiring