diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2010-02-21 22:11:49 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2010-02-21 22:11:49 +0000 |
commit | 5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7 (patch) | |
tree | 602738b696574d19f2a7e0d46cc26d120c0d0166 | |
parent | e322f14620a1064efc4b3a98cf701efc48da81cc (diff) | |
download | lufa-5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7.tar.gz lufa-5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7.tar.bz2 lufa-5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7.zip |
Remove dual ISR for software PDI mode, use a single ISR instead to reduce code complexity.
-rw-r--r-- | Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 74 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h | 22 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/makefile | 2 |
3 files changed, 55 insertions, 43 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 7bef25e6e..85a750454 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;
-
- /* 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--;
-}
+ 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;
-/** 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);
+ /* 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));
- /* If not sending or receiving, just exit */
- if (!(SoftUSART_BitCount))
- return;
+ SoftUSART_Data >>= 1;
+ SoftUSART_BitCount--;
+ }
+ else
+ {
+ /* 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;
+ /* 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;
+ /* 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--;
+ 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 0c54ad4cf..7ebed129c 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 b0b26c24c..b2c139cec 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.
|