Remove dual ISR for software PDI mode, use a single ISR instead to reduce code complexity.

pull/1469/head
Dean Camera 15 years ago
parent e322f14620
commit 5e12d436fa

@ -49,18 +49,18 @@ volatile uint16_t SoftUSART_Data;
#define SoftUSART_BitCount GPIOR2 #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) ISR(TIMER1_COMPA_vect, ISR_BLOCK)
{ {
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK; BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
TIFR1 |= (1 << OCF1B);
TIMSK1 = (1 << OCIE1B);
/* If not sending or receiving, just exit */ /* If not sending or receiving, just exit */
if (!(SoftUSART_BitCount)) if (!(SoftUSART_BitCount))
return; return;
if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK)
{
/* If at rising clock edge and we are in send mode, abort */ /* If at rising clock edge and we are in send mode, abort */
if (IsSending) if (IsSending)
return; return;
@ -77,15 +77,8 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
SoftUSART_Data >>= 1; SoftUSART_Data >>= 1;
SoftUSART_BitCount--; SoftUSART_BitCount--;
} }
else
/** 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 not sending or receiving, just exit */
if (!(SoftUSART_BitCount)) if (!(SoftUSART_BitCount))
return; return;
@ -103,6 +96,7 @@ ISR(TIMER1_COMPB_vect, ISR_BLOCK)
SoftUSART_Data >>= 1; SoftUSART_Data >>= 1;
SoftUSART_BitCount--; SoftUSART_BitCount--;
} }
}
/** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */ /** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */
ISR(TIMER1_CAPT_vect, ISR_BLOCK) ISR(TIMER1_CAPT_vect, ISR_BLOCK)
@ -183,7 +177,6 @@ void XPROGTarget_EnableTargetPDI(void)
OCR1A = BITS_BETWEEN_USART_CLOCKS; OCR1A = BITS_BETWEEN_USART_CLOCKS;
OCR1B = BITS_BETWEEN_USART_CLOCKS; OCR1B = BITS_BETWEEN_USART_CLOCKS;
TCCR1B = (1 << WGM12) | (1 << CS10); TCCR1B = (1 << WGM12) | (1 << CS10);
TCCR1C = (1 << FOC1B);
TIMSK1 = (1 << OCIE1A); TIMSK1 = (1 << OCIE1A);
#endif #endif
@ -253,7 +246,6 @@ void XPROGTarget_DisableTargetPDI(void)
#else #else
/* Turn off software USART management timer */ /* Turn off software USART management timer */
TCCR1B = 0; TCCR1B = 0;
TCCR1C = 0;
/* Set /RESET high for a one millisecond to ensure target device is restarted */ /* Set /RESET high for a one millisecond to ensure target device is restarted */
BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK; BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK;

@ -57,7 +57,27 @@
/* Defines: */ /* Defines: */
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) #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 #else
#define BITBANG_PDIDATA_PORT PORTB #define BITBANG_PDIDATA_PORT PORTB
#define BITBANG_PDIDATA_DDR DDRB #define BITBANG_PDIDATA_DDR DDRB

@ -66,7 +66,7 @@ MCU = at90usb1287
# Target board (see library "Board Types" documentation, NONE for projects not requiring # 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 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory. # "Board" inside the application directory.
BOARD = USBKEY BOARD = XPLAIN
# Processor frequency. # Processor frequency.

Loading…
Cancel
Save