From 798cc84ff57cf4fee07a7267d76f4e551df15d12 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Tue, 29 Nov 2011 13:33:28 +0000
Subject: [PATCH] Fixed AVRISP-MKII Clone failing to start application firmware
 once a TPI programming session is exited.

---
 LUFA/DoxygenPages/ChangeLog.txt          |  1 +
 Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c | 12 +++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index 6e37c6eea..28c4dc558 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -39,6 +39,7 @@
   *  - Library Applications:
   *   - Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair)
   *   - Fixed AVRISP-MKII Clone compile warning on AVR8 U4 targets even when NO_VTARGET_DETECT is enabled
+  *   - Fixed AVRISP-MKII Clone failing to start application firmware once a TPI programming session is exited
   *
   *  \section Sec_ChangeLog111009 Version 111009
   *  <b>New:</b>
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index 26ffb9f10..8d74dd47f 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -146,9 +146,15 @@ void TINYNVM_DisableTPI(void)
 {
 	TINYNVM_WaitWhileNVMBusBusy();
 
-	/* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */
-	XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG);
-	XPROGTarget_SendByte(0x00);
+	do
+	{
+		/* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */
+		XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG);
+		XPROGTarget_SendByte(0x00);
+	
+		/* Read back the STATUS register, check to see if it took effect */
+		XPROGTarget_SendByte(TPI_CMD_SLDCS | PDI_RESET_REG);
+	} while (XPROGTarget_ReceiveByte() != 0x00);
 
 	XPROGTarget_DisableTargetTPI();
 }
-- 
GitLab