forked from mfulz_github/qmk_firmware
Fixed AVRISP PDI race condition where the guard time between direction changes could be interpreted as a start bit. Fixed TPI interface lines not being changed correctly when in bit-banged TPI mode.
This commit is contained in:
parent
e1c1c25619
commit
b1dbd92c32
|
@ -16,9 +16,12 @@
|
||||||
* <b>Changed:</b>
|
* <b>Changed:</b>
|
||||||
* - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors
|
* - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors
|
||||||
* - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion
|
* - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion
|
||||||
|
* - Renamed the RESET_LINE_* makefile tokens in the AVRISP MKII Project to AUX_LINE_*, as they are not always used for target
|
||||||
|
* reset
|
||||||
*
|
*
|
||||||
* <b>Fixed:</b>
|
* <b>Fixed:</b>
|
||||||
* - Fixed AVRISP project not able to enter programming mode when ISP protocol is used
|
* - Fixed AVRISP project not able to enter programming mode when ISP protocol is used
|
||||||
|
* - Fixed AVRISP PDI race condition where the guard time between direction changes could be interpreted as a start bit
|
||||||
*
|
*
|
||||||
* \section Sec_ChangeLog091223 Version 091223
|
* \section Sec_ChangeLog091223 Version 091223
|
||||||
*
|
*
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
* Header file for XMEGANVM.c.
|
* Header file for XMEGANVM.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XMEGA_NVM__
|
#ifndef _XMEGA_NVM_
|
||||||
#define _XMEGA_NVM_
|
#define _XMEGA_NVM_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
|
|
|
@ -113,6 +113,7 @@
|
||||||
extern uint16_t XPROG_Param_EEPageSize;
|
extern uint16_t XPROG_Param_EEPageSize;
|
||||||
extern uint8_t XPROG_Param_NVMCSRRegAddr;
|
extern uint8_t XPROG_Param_NVMCSRRegAddr;
|
||||||
extern uint8_t XPROG_Param_NVMCMDRegAddr;
|
extern uint8_t XPROG_Param_NVMCMDRegAddr;
|
||||||
|
extern uint8_t XPROG_SelectedProtocol;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void XPROGProtocol_SetMode(void);
|
void XPROGProtocol_SetMode(void);
|
||||||
|
|
|
@ -279,33 +279,16 @@ void XPROGTarget_DisableTargetTPI(void)
|
||||||
*/
|
*/
|
||||||
void XPROGTarget_SendByte(const uint8_t Byte)
|
void XPROGTarget_SendByte(const uint8_t Byte)
|
||||||
{
|
{
|
||||||
#if defined(XPROG_VIA_HARDWARE_USART)
|
|
||||||
/* Switch to Tx mode if currently in Rx mode */
|
/* Switch to Tx mode if currently in Rx mode */
|
||||||
if (!(IsSending))
|
if (!(IsSending))
|
||||||
{
|
XPROGTarget_SetTxMode();
|
||||||
PORTD |= (1 << 3);
|
|
||||||
DDRD |= (1 << 3);
|
|
||||||
|
|
||||||
UCSR1B |= (1 << TXEN1);
|
|
||||||
UCSR1B &= ~(1 << RXEN1);
|
|
||||||
|
|
||||||
IsSending = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#if defined(XPROG_VIA_HARDWARE_USART)
|
||||||
/* Wait until there is space in the hardware Tx buffer before writing */
|
/* Wait until there is space in the hardware Tx buffer before writing */
|
||||||
while (!(UCSR1A & (1 << UDRE1)));
|
while (!(UCSR1A & (1 << UDRE1)));
|
||||||
UCSR1A |= (1 << TXC1);
|
UCSR1A |= (1 << TXC1);
|
||||||
UDR1 = Byte;
|
UDR1 = Byte;
|
||||||
#else
|
#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 */
|
/* 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));
|
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)
|
uint8_t XPROGTarget_ReceiveByte(void)
|
||||||
{
|
{
|
||||||
#if defined(XPROG_VIA_HARDWARE_USART)
|
|
||||||
/* Switch to Rx mode if currently in Tx mode */
|
/* Switch to Rx mode if currently in Tx mode */
|
||||||
if (IsSending)
|
if (IsSending)
|
||||||
{
|
XPROGTarget_SetRxMode();
|
||||||
while (!(UCSR1A & (1 << TXC1)));
|
|
||||||
UCSR1A |= (1 << TXC1);
|
|
||||||
|
|
||||||
UCSR1B &= ~(1 << TXEN1);
|
|
||||||
UCSR1B |= (1 << RXEN1);
|
|
||||||
|
|
||||||
DDRD &= ~(1 << 3);
|
|
||||||
PORTD &= ~(1 << 3);
|
|
||||||
|
|
||||||
IsSending = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#if defined(XPROG_VIA_HARDWARE_USART)
|
||||||
/* Wait until a byte has been received before reading */
|
/* Wait until a byte has been received before reading */
|
||||||
while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);
|
while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);
|
||||||
return UDR1;
|
return UDR1;
|
||||||
#else
|
#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 */
|
/* Wait until a byte has been received before reading */
|
||||||
SoftUSART_BitCount = BITS_IN_USART_FRAME;
|
SoftUSART_BitCount = BITS_IN_USART_FRAME;
|
||||||
while (SoftUSART_BitCount && TimeoutMSRemaining);
|
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. */
|
/** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */
|
||||||
void XPROGTarget_SendBreak(void)
|
void XPROGTarget_SendBreak(void)
|
||||||
{
|
{
|
||||||
#if defined(XPROG_VIA_HARDWARE_USART)
|
|
||||||
/* Switch to Tx mode if currently in Rx mode */
|
/* Switch to Tx mode if currently in Rx mode */
|
||||||
if (!(IsSending))
|
if (!(IsSending))
|
||||||
{
|
XPROGTarget_SetTxMode();
|
||||||
PORTD |= (1 << 3);
|
|
||||||
DDRD |= (1 << 3);
|
|
||||||
|
|
||||||
UCSR1B &= ~(1 << RXEN1);
|
|
||||||
UCSR1B |= (1 << TXEN1);
|
|
||||||
|
|
||||||
IsSending = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#if defined(XPROG_VIA_HARDWARE_USART)
|
||||||
/* Need to do nothing for a full frame to send a BREAK */
|
/* Need to do nothing for a full frame to send a BREAK */
|
||||||
for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
|
for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
|
||||||
{
|
{
|
||||||
|
@ -396,15 +349,6 @@ void XPROGTarget_SendBreak(void)
|
||||||
while (!(PIND & (1 << 5)));
|
while (!(PIND & (1 << 5)));
|
||||||
}
|
}
|
||||||
#else
|
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (SoftUSART_BitCount);
|
while (SoftUSART_BitCount);
|
||||||
|
|
||||||
/* Need to do nothing for a full frame to send a BREAK */
|
/* Need to do nothing for a full frame to send a BREAK */
|
||||||
|
@ -413,4 +357,73 @@ void XPROGTarget_SendBreak(void)
|
||||||
#endif
|
#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;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
|
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));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
IsSending = false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <LUFA/Common/Common.h>
|
#include <LUFA/Common/Common.h>
|
||||||
|
|
||||||
#include "../V2Protocol.h"
|
#include "../V2Protocol.h"
|
||||||
|
#include "XPROGProtocol.h"
|
||||||
|
|
||||||
/* Preprocessor Checks: */
|
/* Preprocessor Checks: */
|
||||||
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
||||||
|
@ -142,4 +143,9 @@
|
||||||
void XPROGTarget_SendBreak(void);
|
void XPROGTarget_SendBreak(void);
|
||||||
bool XPROGTarget_WaitWhileNVMBusBusy(void);
|
bool XPROGTarget_WaitWhileNVMBusBusy(void);
|
||||||
|
|
||||||
|
#if defined(INCLUDE_FROM_XPROGTARGET_C)
|
||||||
|
static void XPROGTarget_SetTxMode(void);
|
||||||
|
static void XPROGTarget_SetRxMode(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue