X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/b1dbd92c32022c2ec1601f6a6e51c5714a69c56c..75d27f8ef0873157c4ca14dc41d1eb4139e0180d:/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 c1f1a6316..843bf5a7d 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2009. + Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -71,7 +71,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) 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 */ + * 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)); @@ -96,7 +96,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) } /** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */ -ISR(TIMER1_COMPB_vect, ISR_BLOCK) +ISR(TIMER1_CAPT_vect, ISR_BLOCK) { /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ BITBANG_TPICLOCK_PIN |= BITBANG_TPICLOCK_MASK; @@ -117,7 +117,7 @@ ISR(TIMER1_COMPB_vect, ISR_BLOCK) 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 */ + * be discarded leaving the data to be byte-aligned for quick access (subtract 9 as we are ORing to the MSB) */ if (BITBANG_TPIDATA_PIN & BITBANG_TPIDATA_MASK) ((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9)); @@ -152,14 +152,15 @@ void XPROGTarget_EnableTargetPDI(void) DDRD |= (1 << 5) | (1 << 3); DDRD &= ~(1 << 2); - /* Set DATA line high for at least 90ns to disable /RESET functionality */ + /* Set DATA line high for at least 90ns to disable /RESET functionality (note: too long will enable it again, + * so a fixed number of NOPs are used here */ PORTD |= (1 << 3); asm volatile ("NOP"::); asm volatile ("NOP"::); /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 1000000UL); + UBRR1 = (F_CPU / 500000UL); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -167,7 +168,8 @@ void XPROGTarget_EnableTargetPDI(void) BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK; BITBANG_PDICLOCK_DDR |= BITBANG_PDICLOCK_MASK; - /* Set DATA line high for at least 90ns to disable /RESET functionality */ + /* Set DATA line high for at least 90ns to disable /RESET functionality (note: too long will enable it again, + * so a fixed number of NOPs are used here */ BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; asm volatile ("NOP"::); asm volatile ("NOP"::); @@ -188,20 +190,19 @@ void XPROGTarget_EnableTargetTPI(void) { IsSending = false; - /* Set /RESET line low for at least 90ns to enable TPI functionality */ + /* Set /RESET line low for at least 400ns to enable TPI functionality */ AUX_LINE_DDR |= AUX_LINE_MASK; AUX_LINE_PORT &= ~AUX_LINE_MASK; - asm volatile ("NOP"::); - asm volatile ("NOP"::); + _delay_ms(1); #if defined(XPROG_VIA_HARDWARE_USART) /* Set Tx and XCK as outputs, Rx as input */ DDRD |= (1 << 5) | (1 << 3); DDRD &= ~(1 << 2); - /* Set up the synchronous USART for XMEGA communications - + /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 1000000UL); + UBRR1 = (F_CPU / 500000UL); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -212,10 +213,10 @@ void XPROGTarget_EnableTargetTPI(void) /* Set DATA line high for idle state */ BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK; - /* Fire timer capture channel B ISR to manage the software USART */ - OCR1B = BITS_BETWEEN_USART_CLOCKS; - TCCR1B = (1 << WGM12) | (1 << CS10); - TIMSK1 = (1 << OCIE1B); + /* Fire timer capture channel ISR to manage the software USART */ + ICR1 = BITS_BETWEEN_USART_CLOCKS; + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); + TIMSK1 = (1 << ICIE1); #endif /* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */ @@ -226,7 +227,14 @@ void XPROGTarget_EnableTargetTPI(void) /** Disables the target's PDI interface, exits programming mode and starts the target's application. */ void XPROGTarget_DisableTargetPDI(void) { + /* Switch to Rx mode to ensure that all pending transmissions are complete */ + 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); UCSR1B = 0; @@ -236,6 +244,10 @@ void XPROGTarget_DisableTargetPDI(void) DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); #else + /* 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; BITBANG_PDICLOCK_DDR &= ~BITBANG_PDICLOCK_MASK; @@ -249,6 +261,9 @@ void XPROGTarget_DisableTargetPDI(void) /** Disables the target's TPI interface, exits programming mode and starts the target's application. */ void XPROGTarget_DisableTargetTPI(void) { + /* Switch to Rx mode to ensure that all pending transmissions are complete */ + XPROGTarget_SetRxMode(); + #if defined(XPROG_VIA_HARDWARE_USART) /* Turn off receiver and transmitter of the USART, clear settings */ UCSR1A |= (1 << TXC1) | (1 << RXC1); @@ -293,7 +308,7 @@ void XPROGTarget_SendByte(const uint8_t Byte) uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0)); /* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */ - uint8_t ParityData = Byte; + uint8_t ParityData = Byte; while (ParityData) { NewUSARTData ^= (1 << 9); @@ -420,7 +435,7 @@ static void XPROGTarget_SetRxMode(void) } /* Wait until DATA line has been pulled up to idle by the target */ - while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)); + while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining); #endif IsSending = false;