X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/d15cbdd4905cf56d592ae8c559beab1e481139d8..7f9f97c792dee6875fbca9806422bdd7d6c5a657:/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c?ds=sidebyside diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 29397a6d2..9889ab694 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -1,21 +1,21 @@ /* 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) - - Permission to use, copy, modify, and distribute this software - and its documentation for any purpose and without fee is hereby - granted, provided that the above copyright notice appear in all - copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + 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 + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -189,8 +189,8 @@ void XPROGTarget_EnableTargetTPI(void) IsSending = false; /* Set /RESET line low for at least 90ns to enable TPI functionality */ - RESET_LINE_DDR |= RESET_LINE_MASK; - RESET_LINE_PORT &= ~RESET_LINE_MASK; + AUX_LINE_DDR |= AUX_LINE_MASK; + AUX_LINE_PORT &= ~AUX_LINE_MASK; asm volatile ("NOP"::); asm volatile ("NOP"::); @@ -269,8 +269,8 @@ void XPROGTarget_DisableTargetTPI(void) #endif /* Tristate target /RESET line */ - RESET_LINE_DDR &= ~RESET_LINE_MASK; - RESET_LINE_PORT &= ~RESET_LINE_MASK; + AUX_LINE_DDR &= ~AUX_LINE_MASK; + AUX_LINE_PORT &= ~AUX_LINE_MASK; } /** Sends a byte via the USART. @@ -279,33 +279,16 @@ void XPROGTarget_DisableTargetTPI(void) */ void XPROGTarget_SendByte(const uint8_t Byte) { -#if defined(XPROG_VIA_HARDWARE_USART) /* Switch to Tx mode if currently in Rx mode */ if (!(IsSending)) - { - PORTD |= (1 << 3); - DDRD |= (1 << 3); - - UCSR1B |= (1 << TXEN1); - UCSR1B &= ~(1 << RXEN1); - - IsSending = true; - } - + XPROGTarget_SetTxMode(); + +#if defined(XPROG_VIA_HARDWARE_USART) /* Wait until there is space in the hardware Tx buffer before writing */ while (!(UCSR1A & (1 << UDRE1))); UCSR1A |= (1 << TXC1); UDR1 = Byte; #else - /* Switch to Tx mode if currently in Rx mode */ - if (!(IsSending)) - { - BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; - BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK; - - IsSending = true; - } - /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */ uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0)); @@ -332,37 +315,15 @@ void XPROGTarget_SendByte(const uint8_t Byte) */ uint8_t XPROGTarget_ReceiveByte(void) { -#if defined(XPROG_VIA_HARDWARE_USART) /* Switch to Rx mode if currently in Tx mode */ if (IsSending) - { - while (!(UCSR1A & (1 << TXC1))); - UCSR1A |= (1 << TXC1); - - UCSR1B &= ~(1 << TXEN1); - UCSR1B |= (1 << RXEN1); - - DDRD &= ~(1 << 3); - PORTD &= ~(1 << 3); - - IsSending = false; - } + XPROGTarget_SetRxMode(); +#if defined(XPROG_VIA_HARDWARE_USART) /* Wait until a byte has been received before reading */ while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining); return UDR1; #else - /* Switch to Rx mode if currently in Tx mode */ - if (IsSending) - { - while (SoftUSART_BitCount); - - BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; - BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; - - IsSending = false; - } - /* Wait until a byte has been received before reading */ SoftUSART_BitCount = BITS_IN_USART_FRAME; while (SoftUSART_BitCount && TimeoutMSRemaining); @@ -375,19 +336,11 @@ uint8_t XPROGTarget_ReceiveByte(void) /** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */ void XPROGTarget_SendBreak(void) { -#if defined(XPROG_VIA_HARDWARE_USART) /* Switch to Tx mode if currently in Rx mode */ if (!(IsSending)) - { - PORTD |= (1 << 3); - DDRD |= (1 << 3); - - UCSR1B &= ~(1 << RXEN1); - UCSR1B |= (1 << TXEN1); - - IsSending = true; - } + XPROGTarget_SetTxMode(); +#if defined(XPROG_VIA_HARDWARE_USART) /* Need to do nothing for a full frame to send a BREAK */ for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++) { @@ -396,21 +349,81 @@ void XPROGTarget_SendBreak(void) while (!(PIND & (1 << 5))); } #else - /* Switch to Tx mode if currently in Rx mode */ - if (!(IsSending)) + while (SoftUSART_BitCount); + + /* Need to do nothing for a full frame to send a BREAK */ + SoftUSART_Data = 0x0FFF; + SoftUSART_BitCount = BITS_IN_USART_FRAME; +#endif +} + +static void XPROGTarget_SetTxMode(void) +{ +#if defined(XPROG_VIA_HARDWARE_USART) + /* Wait for a full cycle of the clock */ + while (PIND & (1 << 5)); + while (!(PIND & (1 << 5))); + + PORTD |= (1 << 3); + DDRD |= (1 << 3); + + UCSR1B &= ~(1 << RXEN1); + UCSR1B |= (1 << TXEN1); + + IsSending = true; +#else + while (SoftUSART_BitCount); + + /* Wait for a full cycle of the clock */ + SoftUSART_Data = 0x0001; + SoftUSART_BitCount = 1; + while (SoftUSART_BitCount); + + if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) { BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK; - - IsSending = true; } - + else + { + BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK; + BITBANG_TPIDATA_DDR |= BITBANG_TPIDATA_MASK; + } +#endif + + IsSending = true; +} + +static void XPROGTarget_SetRxMode(void) +{ +#if defined(XPROG_VIA_HARDWARE_USART) + while (!(UCSR1A & (1 << TXC1))); + UCSR1A |= (1 << TXC1); + + UCSR1B &= ~(1 << TXEN1); + UCSR1B |= (1 << RXEN1); + + DDRD &= ~(1 << 3); + PORTD &= ~(1 << 3); +#else while (SoftUSART_BitCount); - /* Need to do nothing for a full frame to send a BREAK */ - SoftUSART_Data = 0x0FFF; - SoftUSART_BitCount = BITS_IN_USART_FRAME; + if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) + { + BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; + BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; + } + else + { + BITBANG_TPIDATA_DDR &= ~BITBANG_TPIDATA_MASK; + BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK; + } + + /* Wait until DATA line has been pulled up to idle by the target */ + while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining); #endif + + IsSending = false; } #endif