Commit cd0093a1 authored by Dean Camera's avatar Dean Camera
Browse files

Fixed AVRISP-MKII clone project not correctly issuing SET EXTENDED ADDRESS...

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.
parent 1331cce0
......@@ -17,6 +17,9 @@
* <b>Fixed:</b>
* - 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
*
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
......@@ -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
......
......@@ -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
......
......@@ -60,7 +60,7 @@
# MCU name
MCU = atmega32u4
MCU = atmega32u2
# Target board (see library "Board Types" documentation, NONE for projects not requiring
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment