* <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
*
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 */
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]);
* 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);
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);
/* 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