From 279e1b6ece7fbc90db6cb642f1c289b45648cf9c Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Fri, 4 Feb 2011 18:17:31 +0000
Subject: 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).

---
 LUFA/ManPages/ChangeLog.txt                    |  2 ++
 LUFA/ManPages/LUFAPoweredProjects.txt          |  1 +
 Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c     | 13 +++++++++++--
 Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c |  9 +++++++++
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 5b7fbb5f2..c5f46b663 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 0bc4f8a54..b8aa0e9c3 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 27e1cc96c..8b9ff2764 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 1b105ddb0..ffc07ad33 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);
-- 
cgit v1.2.3