X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/ce8d0424b1a59bb2b0bd3ab8f69f4e4cf8c9930b..c58c53dba90fdc19d38f5e5d6957f2ede2a740f3:/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c?ds=inline diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 45c1d225d..bfc2e824d 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -49,66 +49,57 @@ 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); + BITBANG_PDICLOCK_PIN = BITBANG_PDICLOCK_MASK; /* 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--; -} - -/** 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; + /* Check to see if we are at a rising or falling edge of the clock */ + 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; - /* If at falling clock edge and we are in receive mode, abort */ - if (!IsSending) - 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)); - /* 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 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--; + SoftUSART_Data >>= 1; + SoftUSART_BitCount--; + } } /** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */ ISR(TIMER1_CAPT_vect, ISR_BLOCK) { /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ - BITBANG_TPICLOCK_PIN |= BITBANG_TPICLOCK_MASK; + BITBANG_TPICLOCK_PIN = BITBANG_TPICLOCK_MASK; /* If not sending or receiving, just exit */ if (!(SoftUSART_BitCount)) @@ -167,7 +158,7 @@ void XPROGTarget_EnableTargetPDI(void) /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 500000UL); + UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -183,7 +174,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 @@ -209,7 +199,7 @@ void XPROGTarget_EnableTargetTPI(void) /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 500000UL); + UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -238,26 +228,17 @@ void XPROGTarget_DisableTargetPDI(void) XPROGTarget_SetRxMode(); #if defined(XPROG_VIA_HARDWARE_USART) - /* Set /RESET high for a one millisecond to ensure target device is restarted */ - PORTD |= (1 << 5); - _delay_ms(1); - /* Turn off receiver and transmitter of the USART, clear settings */ - UCSR1A |= (1 << TXC1) | (1 << RXC1); + UCSR1A = ((1 << TXC1) | (1 << RXC1)); UCSR1B = 0; UCSR1C = 0; - /* Set all USART lines as input, tristate */ + /* Tristate all pins */ DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); #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; - _delay_ms(1); /* Set DATA and CLOCK lines to inputs */ BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; @@ -350,7 +331,6 @@ uint8_t XPROGTarget_ReceiveByte(void) #if defined(XPROG_VIA_HARDWARE_USART) /* Wait until a byte has been received before reading */ - uint8_t TimeoutMSRemaining = 100; while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining) { /* Manage software timeout */ @@ -365,7 +345,6 @@ uint8_t XPROGTarget_ReceiveByte(void) #else /* Wait until a byte has been received before reading */ SoftUSART_BitCount = BITS_IN_USART_FRAME; - uint8_t TimeoutMSRemaining = 100; while (SoftUSART_BitCount && TimeoutMSRemaining) { /* Manage software timeout */ @@ -376,6 +355,9 @@ uint8_t XPROGTarget_ReceiveByte(void) } } + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + /* Throw away the parity and stop bits to leave only the data (start bit is already discarded) */ return (uint8_t)SoftUSART_Data; #endif @@ -468,7 +450,6 @@ static void XPROGTarget_SetRxMode(void) } /* Wait until DATA line has been pulled up to idle by the target */ - uint8_t TimeoutMSRemaining = 100; while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining) { /* Manage software timeout */ @@ -480,6 +461,9 @@ static void XPROGTarget_SetRxMode(void) } #endif + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + IsSending = false; }