diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 5b7fbb5f2c..c5f46b6630 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -82,6 +82,8 @@ * - Fixed possible programming problem in the AVRISP-MKII clone project when programming specific patterns into a target * memory space that is only byte (not page) addressable * - Fixed errors in the incomplete Test and Measurement device demo preventing proper operation (thanks to Pavel Plotnikov) + * - Fixed programming errors in the AVRISP-MKII project when the programming packet is a round multiple of the endpoint bank + * size under avrdude (thanks to Steffan Woltjer) * * * \section Sec_ChangeLog101122 Version 101122 diff --git a/LUFA/ManPages/LUFAPoweredProjects.txt b/LUFA/ManPages/LUFAPoweredProjects.txt index 0bc4f8a543..b8aa0e9c32 100644 --- a/LUFA/ManPages/LUFAPoweredProjects.txt +++ b/LUFA/ManPages/LUFAPoweredProjects.txt @@ -85,6 +85,7 @@ * - Digital Survey Instruments Magnetometer and Pointer: http://www.digitalsurveyinstruments.com/ * - Penguino, an Arduino Board With On-Board LUFA Powered Debugger/Programmer: http://wiki.icy.com.au/PenguinoAVR * - PIR-1, an IR control interface for consumer electronics: http://www.promixis.com/pir-1.php + * - PIR-4, a USB Connected 4 port IR transmitter: http://promixis.com/pir-4.php * - Many of Busware's Products: http://www.busware.de/ * - MIDIFighter, a USB-MIDI controller: http://www.midifighter.com/ * - Retrode, a USB Games Console Cartridge Reader: http://www.retrode.org diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c index 27e1cc96ca..8b9ff27647 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c @@ -147,7 +147,7 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) Endpoint_Read_Stream_LE(&Write_Memory_Params, (sizeof(Write_Memory_Params) - sizeof(Write_Memory_Params.ProgData)), NULL); Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite); - + if (Write_Memory_Params.BytesToWrite > sizeof(Write_Memory_Params.ProgData)) { Endpoint_ClearOUT(); @@ -162,6 +162,15 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) Endpoint_Read_Stream_LE(&Write_Memory_Params.ProgData, Write_Memory_Params.BytesToWrite, NULL); + // The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need + // to catch this and discard it before continuing on with packet processing to prevent communication issues + if (((sizeof(uint8_t) + sizeof(Write_Memory_Params) - sizeof(Write_Memory_Params.ProgData)) + + Write_Memory_Params.BytesToWrite) % AVRISP_DATA_EPSIZE == 0) + { + Endpoint_ClearOUT(); + Endpoint_WaitUntilReady(); + } + Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); @@ -281,7 +290,7 @@ void ISPProtocol_ReadMemory(uint8_t V2Command) Endpoint_Read_Stream_LE(&Read_Memory_Params, sizeof(Read_Memory_Params), NULL); Read_Memory_Params.BytesToRead = SwapEndian_16(Read_Memory_Params.BytesToRead); - + Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 1b105ddb0e..ffc07ad337 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -250,6 +250,15 @@ static void XPROGProtocol_WriteMemory(void) WriteMemory_XPROG_Params.Length = SwapEndian_16(WriteMemory_XPROG_Params.Length); Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NULL); + // The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need + // to catch this and discard it before continuing on with packet processing to prevent communication issues + if (((sizeof(uint8_t) + sizeof(WriteMemory_XPROG_Params) - sizeof(WriteMemory_XPROG_Params.ProgData)) + + WriteMemory_XPROG_Params.Length) % AVRISP_DATA_EPSIZE == 0) + { + Endpoint_ClearOUT(); + Endpoint_WaitUntilReady(); + } + Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);