From 5f363996e3b6fc66017ff02eb2de6f477e0f328e Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 1 Feb 2010 03:42:10 +0000
Subject: [PATCH] Fixed issues with EEPROM and FLASH ISP programming in the
 AVRISP project.

---
 LUFA/ManPages/ChangeLog.txt                |  1 +
 Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c | 15 ++++++++-------
 Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c   |  2 +-
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index b9436d6fe..8215bbe8e 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -49,6 +49,7 @@
   *    ranges are specified (thanks to Thomas Bleeker)
   *  - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two seperate pipes, not one half-duplex pipe
   *  - Fixed Pipe_IsEndpointBound() not taking the endpoint's direction into account
+  *  - Fixed EEPROM and FLASH ISP programming in the AVRISP project
   *
   *  \section Sec_ChangeLog091223 Version 091223
   *
diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
index 59a77e575..33ccbf91e 100644
--- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
@@ -198,14 +198,15 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
 			
 			/* AVR FLASH addressing requires us to modify the write command based on if we are writing a high
 			 * or low byte at the current word address */
-			Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK;
+			if (V2Command == CMD_PROGRAM_FLASH_ISP)
+			  Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK;
 
 			/* Check to see the write completion method, to see if we have a valid polling address */
 			if (!(PollAddress) && (ByteToWrite != PollValue))
 			{
 				if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP))
 				  Write_Memory_Params.ProgrammingCommands[2] |= READ_WRITE_HIGH_BYTE_MASK;
-				  
+
 				PollAddress = (CurrentAddress & 0xFFFF);				
 			}		
 
@@ -239,17 +240,17 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
 		{
 			bool    IsOddByte   = (CurrentByte & 0x01);
 			uint8_t ByteToWrite = *(NextWriteByte++);
-		
-			if (IsOddByte && (V2Command == CMD_READ_FLASH_ISP))
-			  Write_Memory_Params.ProgrammingCommands[0] |=  READ_WRITE_HIGH_BYTE_MASK;
-			else
-			  Write_Memory_Params.ProgrammingCommands[0] &= ~READ_WRITE_HIGH_BYTE_MASK;			
 			  
 			SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]);
 			SPI_SendByte(CurrentAddress >> 8);
 			SPI_SendByte(CurrentAddress & 0xFF);
 			SPI_SendByte(ByteToWrite);
 			
+			/* AVR FLASH addressing requires us to modify the write command based on if we are writing a high
+			 * or low byte at the current word address */
+			if (V2Command == CMD_PROGRAM_FLASH_ISP)
+			  Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK;
+
 			if (ByteToWrite != PollValue)
 			{
 				if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP))
diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
index 19b0aa07b..c9822d0a6 100644
--- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
+++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
@@ -128,7 +128,7 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
 				SPI_SendByte(PollAddress >> 8);
 				SPI_SendByte(PollAddress & 0xFF);
 			}
-			while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMSRemaining);
+			while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining);
 
 			if (!(TimeoutMSRemaining))
 			 ProgrammingStatus = STATUS_CMD_TOUT;
-- 
GitLab