forked from mfulz_github/qmk_firmware
Remove dual ISR for software PDI mode, use a single ISR instead to reduce code complexity.
This commit is contained in:
parent
e322f14620
commit
5e12d436fa
|
@ -49,59 +49,53 @@ 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 at rising clock edge and we are in send mode, abort */
|
if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK)
|
||||||
if (IsSending)
|
{
|
||||||
return;
|
/* If at rising clock edge and we are in send mode, abort */
|
||||||
|
if (IsSending)
|
||||||
/* Wait for the start bit when receiving */
|
return;
|
||||||
if ((SoftUSART_BitCount == BITS_IN_USART_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
|
|
||||||
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
|
/* 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) */
|
* 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)
|
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
|
||||||
((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9));
|
((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9));
|
||||||
|
|
||||||
SoftUSART_Data >>= 1;
|
SoftUSART_Data >>= 1;
|
||||||
SoftUSART_BitCount--;
|
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;
|
|
||||||
else
|
else
|
||||||
BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
|
{
|
||||||
|
/* If not sending or receiving, just exit */
|
||||||
|
if (!(SoftUSART_BitCount))
|
||||||
|
return;
|
||||||
|
|
||||||
SoftUSART_Data >>= 1;
|
/* If at falling clock edge and we are in receive mode, abort */
|
||||||
SoftUSART_BitCount--;
|
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. */
|
/** 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;
|
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…
Reference in New Issue