Fixed AVRISP PDI race condition where the guard time between direction changes could...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 29 Dec 2009 14:43:03 +0000 (14:43 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 29 Dec 2009 14:43:03 +0000 (14:43 +0000)
LUFA/ManPages/ChangeLog.txt
Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h

index 52c78f0..c206ad0 100644 (file)
   *  <b>Changed:</b>\r
   *  - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors\r
   *  - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion\r
   *  <b>Changed:</b>\r
   *  - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors\r
   *  - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion\r
+  *  - Renamed the RESET_LINE_* makefile tokens in the AVRISP MKII Project to AUX_LINE_*, as they are not always used for target\r
+  *    reset\r
   *\r
   *  <b>Fixed:</b>\r
   *  - Fixed AVRISP project not able to enter programming mode when ISP protocol is used\r
   *\r
   *  <b>Fixed:</b>\r
   *  - Fixed AVRISP project not able to enter programming mode when ISP protocol is used\r
+  *  - Fixed AVRISP PDI race condition where the guard time between direction changes could be interpreted as a start bit\r
   *\r
   *  \section Sec_ChangeLog091223 Version 091223\r
   *\r
   *\r
   *  \section Sec_ChangeLog091223 Version 091223\r
   *\r
index 608f5ab..d2e2a25 100644 (file)
@@ -33,7 +33,7 @@
  *  Header file for XMEGANVM.c.\r
  */\r
 \r
  *  Header file for XMEGANVM.c.\r
  */\r
 \r
-#ifndef _XMEGA_NVM__\r
+#ifndef _XMEGA_NVM_\r
 #define _XMEGA_NVM_\r
 \r
        /* Includes: */\r
 #define _XMEGA_NVM_\r
 \r
        /* Includes: */\r
index 4bb6009..7dc6af5 100644 (file)
                extern uint16_t XPROG_Param_EEPageSize;\r
                extern uint8_t  XPROG_Param_NVMCSRRegAddr;\r
                extern uint8_t  XPROG_Param_NVMCMDRegAddr;\r
                extern uint16_t XPROG_Param_EEPageSize;\r
                extern uint8_t  XPROG_Param_NVMCSRRegAddr;\r
                extern uint8_t  XPROG_Param_NVMCMDRegAddr;\r
+               extern uint8_t  XPROG_SelectedProtocol;\r
                \r
        /* Function Prototypes: */\r
                void XPROGProtocol_SetMode(void);\r
                \r
        /* Function Prototypes: */\r
                void XPROGProtocol_SetMode(void);\r
index 856b489..c1f1a63 100644 (file)
@@ -279,33 +279,16 @@ void XPROGTarget_DisableTargetTPI(void)
  */\r
 void XPROGTarget_SendByte(const uint8_t Byte)\r
 {\r
  */\r
 void XPROGTarget_SendByte(const uint8_t Byte)\r
 {\r
-#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Switch to Tx mode if currently in Rx mode */\r
        if (!(IsSending))\r
        /* Switch to Tx mode if currently in Rx mode */\r
        if (!(IsSending))\r
-       {\r
-               PORTD  |=  (1 << 3);\r
-               DDRD   |=  (1 << 3);\r
-\r
-               UCSR1B |=  (1 << TXEN1);\r
-               UCSR1B &= ~(1 << RXEN1);\r
-               \r
-               IsSending = true;\r
-       }\r
-       \r
+         XPROGTarget_SetTxMode();\r
+         \r
+#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Wait until there is space in the hardware Tx buffer before writing */\r
        while (!(UCSR1A & (1 << UDRE1)));\r
        UCSR1A |= (1 << TXC1);\r
        UDR1    = Byte;\r
 #else\r
        /* Wait until there is space in the hardware Tx buffer before writing */\r
        while (!(UCSR1A & (1 << UDRE1)));\r
        UCSR1A |= (1 << TXC1);\r
        UDR1    = Byte;\r
 #else\r
-       /* Switch to Tx mode if currently in Rx mode */\r
-       if (!(IsSending))\r
-       {\r
-               BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;\r
-               BITBANG_PDIDATA_DDR  |= BITBANG_PDIDATA_MASK;\r
-\r
-               IsSending = true;\r
-       }\r
-\r
        /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */\r
        uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0));\r
 \r
        /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */\r
        uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0));\r
 \r
@@ -332,37 +315,15 @@ void XPROGTarget_SendByte(const uint8_t Byte)
  */\r
 uint8_t XPROGTarget_ReceiveByte(void)\r
 {\r
  */\r
 uint8_t XPROGTarget_ReceiveByte(void)\r
 {\r
-#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Switch to Rx mode if currently in Tx mode */\r
        if (IsSending)\r
        /* Switch to Rx mode if currently in Tx mode */\r
        if (IsSending)\r
-       {\r
-               while (!(UCSR1A & (1 << TXC1)));\r
-               UCSR1A |=  (1 << TXC1);\r
-\r
-               UCSR1B &= ~(1 << TXEN1);\r
-               UCSR1B |=  (1 << RXEN1);\r
-\r
-               DDRD   &= ~(1 << 3);\r
-               PORTD  &= ~(1 << 3);\r
-               \r
-               IsSending = false;\r
-       }\r
+         XPROGTarget_SetRxMode();\r
 \r
 \r
+#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Wait until a byte has been received before reading */\r
        while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);\r
        return UDR1;\r
 #else\r
        /* Wait until a byte has been received before reading */\r
        while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);\r
        return UDR1;\r
 #else\r
-       /* Switch to Rx mode if currently in Tx mode */\r
-       if (IsSending)\r
-       {\r
-               while (SoftUSART_BitCount);\r
-\r
-               BITBANG_PDIDATA_DDR  &= ~BITBANG_PDIDATA_MASK;\r
-               BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;\r
-\r
-               IsSending = false;\r
-       }\r
-\r
        /* Wait until a byte has been received before reading */\r
        SoftUSART_BitCount = BITS_IN_USART_FRAME;\r
        while (SoftUSART_BitCount && TimeoutMSRemaining);\r
        /* Wait until a byte has been received before reading */\r
        SoftUSART_BitCount = BITS_IN_USART_FRAME;\r
        while (SoftUSART_BitCount && TimeoutMSRemaining);\r
@@ -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. */\r
 void XPROGTarget_SendBreak(void)\r
 {\r
 /** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */\r
 void XPROGTarget_SendBreak(void)\r
 {\r
-#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Switch to Tx mode if currently in Rx mode */\r
        if (!(IsSending))\r
        /* Switch to Tx mode if currently in Rx mode */\r
        if (!(IsSending))\r
-       {\r
-               PORTD  |=  (1 << 3);\r
-               DDRD   |=  (1 << 3);\r
-\r
-               UCSR1B &= ~(1 << RXEN1);\r
-               UCSR1B |=  (1 << TXEN1);\r
-               \r
-               IsSending = true;\r
-       }\r
+         XPROGTarget_SetTxMode();\r
 \r
 \r
+#if defined(XPROG_VIA_HARDWARE_USART)\r
        /* Need to do nothing for a full frame to send a BREAK */\r
        for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)\r
        {\r
        /* Need to do nothing for a full frame to send a BREAK */\r
        for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)\r
        {\r
@@ -396,21 +349,81 @@ void XPROGTarget_SendBreak(void)
                while (!(PIND & (1 << 5)));\r
        }\r
 #else\r
                while (!(PIND & (1 << 5)));\r
        }\r
 #else\r
-       /* Switch to Tx mode if currently in Rx mode */\r
-       if (!(IsSending))\r
+       while (SoftUSART_BitCount);\r
+\r
+       /* Need to do nothing for a full frame to send a BREAK */\r
+       SoftUSART_Data     = 0x0FFF;\r
+       SoftUSART_BitCount = BITS_IN_USART_FRAME;\r
+#endif\r
+}\r
+\r
+static void XPROGTarget_SetTxMode(void)\r
+{\r
+#if defined(XPROG_VIA_HARDWARE_USART)\r
+       /* Wait for a full cycle of the clock */\r
+       while (PIND & (1 << 5));\r
+       while (!(PIND & (1 << 5)));\r
+\r
+       PORTD  |=  (1 << 3);\r
+       DDRD   |=  (1 << 3);\r
+\r
+       UCSR1B &= ~(1 << RXEN1);\r
+       UCSR1B |=  (1 << TXEN1);\r
+               \r
+       IsSending = true;\r
+#else\r
+       while (SoftUSART_BitCount);\r
+\r
+       /* Wait for a full cycle of the clock */\r
+       SoftUSART_Data     = 0x0001;\r
+       SoftUSART_BitCount = 1;\r
+       while (SoftUSART_BitCount);\r
+\r
+       if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)\r
        {\r
                BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;\r
                BITBANG_PDIDATA_DDR  |= BITBANG_PDIDATA_MASK;\r
        {\r
                BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;\r
                BITBANG_PDIDATA_DDR  |= BITBANG_PDIDATA_MASK;\r
-\r
-               IsSending = true;\r
        }\r
        }\r
-       \r
+       else\r
+       {\r
+               BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK;\r
+               BITBANG_TPIDATA_DDR  |= BITBANG_TPIDATA_MASK;   \r
+       }\r
+#endif\r
+\r
+       IsSending = true;\r
+}\r
+\r
+static void XPROGTarget_SetRxMode(void)\r
+{\r
+#if defined(XPROG_VIA_HARDWARE_USART)\r
+       while (!(UCSR1A & (1 << TXC1)));\r
+       UCSR1A |=  (1 << TXC1);\r
+\r
+       UCSR1B &= ~(1 << TXEN1);\r
+       UCSR1B |=  (1 << RXEN1);\r
+\r
+       DDRD   &= ~(1 << 3);\r
+       PORTD  &= ~(1 << 3);\r
+#else\r
        while (SoftUSART_BitCount);\r
 \r
        while (SoftUSART_BitCount);\r
 \r
-       /* Need to do nothing for a full frame to send a BREAK */\r
-       SoftUSART_Data     = 0x0FFF;\r
-       SoftUSART_BitCount = BITS_IN_USART_FRAME;\r
+       if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)\r
+       {\r
+               BITBANG_PDIDATA_DDR  &= ~BITBANG_PDIDATA_MASK;\r
+               BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;\r
+       }\r
+       else\r
+       {\r
+               BITBANG_TPIDATA_DDR  &= ~BITBANG_TPIDATA_MASK;\r
+               BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK;  \r
+       }\r
+       \r
+       /* Wait until DATA line has been pulled up to idle by the target */\r
+       while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK));\r
 #endif\r
 #endif\r
+\r
+       IsSending = false;\r
 }\r
 \r
 #endif\r
 }\r
 \r
 #endif\r
index 3bbf454..dab41f3 100644 (file)
@@ -44,6 +44,7 @@
                #include <LUFA/Common/Common.h>\r
                \r
                #include "../V2Protocol.h"\r
                #include <LUFA/Common/Common.h>\r
                \r
                #include "../V2Protocol.h"\r
+               #include "XPROGProtocol.h"\r
        \r
        /* Preprocessor Checks: */\r
                #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))\r
        \r
        /* Preprocessor Checks: */\r
                #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))\r
                uint8_t XPROGTarget_ReceiveByte(void);\r
                void    XPROGTarget_SendBreak(void);\r
                bool    XPROGTarget_WaitWhileNVMBusBusy(void);\r
                uint8_t XPROGTarget_ReceiveByte(void);\r
                void    XPROGTarget_SendBreak(void);\r
                bool    XPROGTarget_WaitWhileNVMBusBusy(void);\r
+               \r
+               #if defined(INCLUDE_FROM_XPROGTARGET_C)\r
+                       static void XPROGTarget_SetTxMode(void);\r
+                       static void XPROGTarget_SetRxMode(void);\r
+               #endif\r
 \r
 #endif\r
 \r
 #endif\r