From 5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 21 Feb 2010 22:11:49 +0000
Subject: [PATCH] Remove dual ISR for software PDI mode, use a single ISR
 instead to reduce code complexity.

---
 Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 76 +++++++++-----------
 Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h | 22 +++++-
 Projects/AVRISP-MKII/makefile                |  2 +-
 3 files changed, 56 insertions(+), 44 deletions(-)

diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index 7bef25e6e0..85a750454e 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -49,59 +49,53 @@ volatile uint16_t           SoftUSART_Data;
 #define SoftUSART_BitCount  GPIOR2
 
 
-/** ISR to manage the rising edge of the PDI/TPI software USART when bit-banged USART mode is selected. */
+/** ISR to manage the PDI software USART when bit-banged PDI USART mode is selected. */
 ISR(TIMER1_COMPA_vect, ISR_BLOCK)
 {
 	/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
 	BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
-	TIFR1 |= (1 << OCF1B);
-	TIMSK1 = (1 << OCIE1B);
 
 	/* If not sending or receiving, just exit */
 	if (!(SoftUSART_BitCount))
 	  return;
 
-	/* If at rising clock edge and we are in send mode, abort */
-	if (IsSending)
-	  return;
-	  
-	/* Wait for the start bit when receiving */
-	if ((SoftUSART_BitCount == BITS_IN_USART_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
-	  return;
+	if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK)
+	{
+		/* If at rising clock edge and we are in send mode, abort */
+		if (IsSending)
+		  return;
+		  
+		/* Wait for the start bit when receiving */
+		if ((SoftUSART_BitCount == BITS_IN_USART_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
+		  return;
 
-	/* Shift in the bit one less than the frame size in position, so that the start bit will eventually
-	 * be discarded leaving the data to be byte-aligned for quick access (subtract 9 as we are ORing to the MSB) */
-	if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
-	  ((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9));
+		/* Shift in the bit one less than the frame size in position, so that the start bit will eventually
+		 * be discarded leaving the data to be byte-aligned for quick access (subtract 9 as we are ORing to the MSB) */
+		if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
+		  ((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9));
 
-	SoftUSART_Data >>= 1;
-	SoftUSART_BitCount--;
-}
-
-/** ISR to manage the falling edge of the PDI/TPI software USART when bit-banged USART mode is selected. */
-ISR(TIMER1_COMPB_vect, ISR_BLOCK)
-{
-	/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
-	BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
-	TIFR1 |= (1 << OCF1A);
-	TIMSK1 = (1 << OCIE1A);
-
-	/* If not sending or receiving, just exit */
-	if (!(SoftUSART_BitCount))
-	  return;
-
-	/* If at falling clock edge and we are in receive mode, abort */
-	if (!IsSending)
-	  return;
-
-	/* Set the data line to the next bit value */
-	if (((uint8_t*)&SoftUSART_Data)[0] & 0x01)
-	  BITBANG_PDIDATA_PORT |=  BITBANG_PDIDATA_MASK;
+		SoftUSART_Data >>= 1;
+		SoftUSART_BitCount--;
+	}
 	else
-	  BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;		  
+	{
+		/* If not sending or receiving, just exit */
+		if (!(SoftUSART_BitCount))
+		  return;
 
-	SoftUSART_Data >>= 1;
-	SoftUSART_BitCount--;
+		/* If at falling clock edge and we are in receive mode, abort */
+		if (!IsSending)
+		  return;
+
+		/* Set the data line to the next bit value */
+		if (((uint8_t*)&SoftUSART_Data)[0] & 0x01)
+		  BITBANG_PDIDATA_PORT |=  BITBANG_PDIDATA_MASK;
+		else
+		  BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;		  
+
+		SoftUSART_Data >>= 1;
+		SoftUSART_BitCount--;	
+	}
 }
 
 /** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */
@@ -183,7 +177,6 @@ void XPROGTarget_EnableTargetPDI(void)
 	OCR1A   = BITS_BETWEEN_USART_CLOCKS;
 	OCR1B   = BITS_BETWEEN_USART_CLOCKS;
 	TCCR1B  = (1 << WGM12) | (1 << CS10);
-	TCCR1C  = (1 << FOC1B);
 	TIMSK1  = (1 << OCIE1A);
 #endif
 
@@ -253,7 +246,6 @@ void XPROGTarget_DisableTargetPDI(void)
 #else
 	/* Turn off software USART management timer */
 	TCCR1B = 0;
-	TCCR1C = 0;
 
 	/* Set /RESET high for a one millisecond to ensure target device is restarted */
 	BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK;
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index 0c54ad4cf3..7ebed129c7 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -57,7 +57,27 @@
 
 	/* Defines: */
 		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
-			#define XPROG_VIA_HARDWARE_USART
+//			#define XPROG_VIA_HARDWARE_USART
+
+			#define BITBANG_PDIDATA_PORT     PORTD
+			#define BITBANG_PDIDATA_DDR      DDRD
+			#define BITBANG_PDIDATA_PIN      PIND
+			#define BITBANG_PDIDATA_MASK     (1 << 3)
+			
+			#define BITBANG_PDICLOCK_PORT    PORTD
+			#define BITBANG_PDICLOCK_DDR     DDRD
+			#define BITBANG_PDICLOCK_PIN     PIND
+			#define BITBANG_PDICLOCK_MASK    (1 << 5)
+
+			#define BITBANG_TPIDATA_PORT     PORTB
+			#define BITBANG_TPIDATA_DDR      DDRB
+			#define BITBANG_TPIDATA_PIN      PINB
+			#define BITBANG_TPIDATA_MASK     (1 << 3)
+				
+			#define BITBANG_TPICLOCK_PORT    PORTB
+			#define BITBANG_TPICLOCK_DDR     DDRB
+			#define BITBANG_TPICLOCK_PIN     PINB
+			#define BITBANG_TPICLOCK_MASK    (1 << 1)
 		#else
 			#define BITBANG_PDIDATA_PORT     PORTB
 			#define BITBANG_PDIDATA_DDR      DDRB
diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile
index b0b26c24c1..b2c139cec8 100644
--- a/Projects/AVRISP-MKII/makefile
+++ b/Projects/AVRISP-MKII/makefile
@@ -66,7 +66,7 @@ MCU = at90usb1287
 # Target board (see library "Board Types" documentation, NONE for projects not requiring
 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called 
 # "Board" inside the application directory.
-BOARD = USBKEY
+BOARD = XPLAIN
 
 
 # Processor frequency.