X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/002cd6df49981ad75b2092f2ae6b3efc4e2dd364..8e20e8697ff88d38ac01d62198dbdd552449e4aa:/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index f6fff1cf7..b50ffbd1b 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, 2010. + Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2012 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 @@ -39,7 +39,7 @@ #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__) /** Flag to indicate if the USART is currently in Tx or Rx mode. */ -volatile bool IsSending; +bool IsSending; /** Enables the target's PDI interface, holding the target in reset until PDI mode is exited. */ void XPROGTarget_EnableTargetPDI(void) @@ -59,9 +59,9 @@ void XPROGTarget_EnableTargetPDI(void) UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); - /* Send two BREAKs of 12 bits each to enable PDI interface (need at least 16 idle bits) */ - XPROGTarget_SendBreak(); - XPROGTarget_SendBreak(); + /* Send two IDLEs of 12 bits each to enable PDI interface (need at least 16 idle bits) */ + XPROGTarget_SendIdle(); + XPROGTarget_SendIdle(); } /** Enables the target's TPI interface, holding the target in reset until TPI mode is exited. */ @@ -83,16 +83,17 @@ void XPROGTarget_EnableTargetTPI(void) UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); - /* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */ - XPROGTarget_SendBreak(); - XPROGTarget_SendBreak(); + /* Send two IDLEs of 12 bits each to enable TPI interface (need at least 16 idle bits) */ + XPROGTarget_SendIdle(); + XPROGTarget_SendIdle(); } /** 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 (IsSending) + XPROGTarget_SetRxMode(); /* Turn off receiver and transmitter of the USART, clear settings */ UCSR1A = ((1 << TXC1) | (1 << RXC1)); @@ -108,17 +109,18 @@ void XPROGTarget_DisableTargetPDI(void) void XPROGTarget_DisableTargetTPI(void) { /* Switch to Rx mode to ensure that all pending transmissions are complete */ - XPROGTarget_SetRxMode(); + if (IsSending) + XPROGTarget_SetRxMode(); /* Turn off receiver and transmitter of the USART, clear settings */ UCSR1A |= (1 << TXC1) | (1 << RXC1); UCSR1B = 0; UCSR1C = 0; - /* Set all USART lines as input, tristate */ + /* Set all USART lines as inputs, tristate */ DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); - + /* Tristate target /RESET line */ AUX_LINE_DDR &= ~AUX_LINE_MASK; AUX_LINE_PORT &= ~AUX_LINE_MASK; @@ -140,7 +142,7 @@ void XPROGTarget_SendByte(const uint8_t Byte) UDR1 = Byte; } -/** Receives a byte via the software USART, blocking until data is received. +/** Receives a byte via the hardware USART, blocking until data is received or timeout expired. * * \return Received byte from the USART */ @@ -151,24 +153,25 @@ uint8_t XPROGTarget_ReceiveByte(void) XPROGTarget_SetRxMode(); /* Wait until a byte has been received before reading */ - while (!(UCSR1A & (1 << RXC1)) && TimeoutTicksRemaining); + while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired)); return UDR1; } -/** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */ -void XPROGTarget_SendBreak(void) +/** Sends an IDLE via the USART to the attached target, consisting of a full frame of idle bits. */ +void XPROGTarget_SendIdle(void) { /* Switch to Tx mode if currently in Rx mode */ if (!(IsSending)) XPROGTarget_SetTxMode(); - /* Need to do nothing for a full frame to send a BREAK */ + /* Need to do nothing for a full frame to send an IDLE */ for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++) { /* Wait for a full cycle of the clock */ while (PIND & (1 << 5)); while (!(PIND & (1 << 5))); + while (PIND & (1 << 5)); } } @@ -177,6 +180,7 @@ static void XPROGTarget_SetTxMode(void) /* Wait for a full cycle of the clock */ while (PIND & (1 << 5)); while (!(PIND & (1 << 5))); + while (PIND & (1 << 5)); PORTD |= (1 << 3); DDRD |= (1 << 3);