Remove the timeout period extension code from the AVRISP project, as no single comman...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 13 Jul 2010 11:26:03 +0000 (11:26 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 13 Jul 2010 11:26:03 +0000 (11:26 +0000)
LUFA/ManPages/ChangeLog.txt
Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
Projects/AVRISP-MKII/Lib/V2Protocol.c
Projects/AVRISP-MKII/Lib/V2Protocol.h
Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c

index 6f1bc3a..b75798d 100644 (file)
@@ -44,6 +44,8 @@
   *  - Fixed void pointer arithmetic in ConfigDescriptor.h breaking C++ compatibility (thanks to Michael Hennebry)
   *  - Fixed broken PDI EEPROM Section Erase functionality in the AVRISP-MKII project
   *  - Fixed USB_Device_SendRemoteWakeup() not working when the USB clock was frozen during USB bus suspend (thanks to Brian Dickman)
+  *  - Fixed occasional lockup of the AVRISP project due to the timeout extension code incorrectly extending the timeout in
+  *    PDI and TPI programming modes infinitely
   *
   *  \section Sec_ChangeLog100513 Version 100513
   *  <b>New:</b>
index 2ce11a8..d6e02fa 100644 (file)
@@ -76,7 +76,7 @@ void ISPProtocol_EnterISPMode(void)
 
        /* Continuously attempt to synchronize with the target until either the number of attempts specified
         * by the host has exceeded, or the the device sends back the expected response values */
-       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED) && TimeoutMSRemaining)
+       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED) && TimeoutTicksRemaining)
        {
                uint8_t ResponseBytes[4];
 
@@ -552,13 +552,8 @@ void ISPProtocol_SPIMulti(void)
  */
 void ISPProtocol_DelayMS(uint8_t DelayMS)
 {
-       while (DelayMS-- && TimeoutMSRemaining)
-       {
-               if (TimeoutMSRemaining)
-                 TimeoutMSRemaining--;
-                 
-               _delay_ms(1);
-       }
+       while (DelayMS-- && TimeoutTicksRemaining)
+         _delay_ms(1);
 }
 
 #endif
\ No newline at end of file
index 9a74aab..430c915 100644 (file)
@@ -129,9 +129,9 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
                                SPI_SendByte(PollAddress >> 8);
                                SPI_SendByte(PollAddress & 0xFF);
                        }
-                       while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining);
+                       while ((SPI_TransferByte(0x00) == PollValue) && TimeoutTicksRemaining);
 
-                       if (!(TimeoutMSRemaining))
+                       if (!(TimeoutTicksRemaining))
                         ProgrammingStatus = STATUS_CMD_TOUT;
                        
                        break;          
@@ -141,9 +141,6 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
                        break;
        }
 
-       if (ProgrammingStatus == STATUS_CMD_OK)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-
        return ProgrammingStatus;
 }
 
@@ -160,17 +157,9 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void)
                SPI_SendByte(0x00);
                SPI_SendByte(0x00);
        }
-       while ((SPI_ReceiveByte() & 0x01) && TimeoutMSRemaining);
+       while ((SPI_ReceiveByte() & 0x01) && TimeoutTicksRemaining);
 
-       if (TimeoutMSRemaining)
-       {
-               TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-               return STATUS_CMD_OK;
-       }
-       else
-       {
-               return STATUS_RDY_BSY_TOUT;
-       }
+       return TimeoutTicksRemaining ? STATUS_CMD_OK : STATUS_RDY_BSY_TOUT;
 }
 
 /** Sends a low-level LOAD EXTENDED ADDRESS command to the target, for addressing of memory beyond the
index d6bb32a..9e210c2 100644 (file)
@@ -46,8 +46,8 @@ bool MustLoadExtendedAddress;
 /** ISR to manage timeouts whilst processing a V2Protocol command */
 ISR(TIMER0_COMPA_vect, ISR_NOBLOCK)
 {
-       if (TimeoutMSRemaining)
-         TimeoutMSRemaining--;
+       if (TimeoutTicksRemaining)
+         TimeoutTicksRemaining--;
 }
 
 /** Initializes the hardware and software associated with the V2 protocol command handling. */
@@ -60,8 +60,8 @@ void V2Protocol_Init(void)
        ADC_StartReading(VTARGET_ADC_CHANNEL_MASK | ADC_RIGHT_ADJUSTED | ADC_REFERENCE_AVCC);
        #endif
        
-       /* Millisecond timer initialization for managing the command timeout counter */
-       OCR0A  = ((F_CPU / 64) / 1000);
+       /* Timeout timer initialization (10ms period) */
+       OCR0A  = ((F_CPU / 1024) / 100);
        TCCR0A = (1 << WGM01);
        TIMSK0 = (1 << OCIE0A);
        
@@ -77,8 +77,8 @@ void V2Protocol_ProcessCommand(void)
        uint8_t V2Command = Endpoint_Read_Byte();
        
        /* Start the timeout management timer */
-       TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-       TCCR0B = ((1 << CS01) | (1 << CS00));
+       TimeoutTicksRemaining = COMMAND_TIMEOUT_TICKS;
+       TCCR0B = ((1 << CS02) | (1 << CS00));
        
        switch (V2Command)
        {
index 5b85892..12ab599 100644 (file)
                /** Programmer ID string, returned to the host during the CMD_SIGN_ON command processing. */
                #define PROGRAMMER_ID              "AVRISP_MK2"
                
-               /** Timeout period for each issued command from the host before it is aborted. */
-               #define COMMAND_TIMEOUT_MS         200
+               /** Timeout period for each issued command from the host before it is aborted (in 10ms ticks). */
+               #define COMMAND_TIMEOUT_TICKS      100
                
                /** Command timeout counter register, GPIOR for speed. */
-               #define TimeoutMSRemaining         GPIOR0
+               #define TimeoutTicksRemaining      GPIOR0
 
                /** MUX mask for the VTARGET ADC channel number. */
                #define VTARGET_ADC_CHANNEL_MASK   _GETADCMUXMASK(ADC_CHANNEL, VTARGET_ADC_CHANNEL)
index e0e2479..150f642 100644 (file)
@@ -85,15 +85,12 @@ bool TINYNVM_WaitWhileNVMBusBusy(void)
                uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
                /* We might have timed out waiting for the status register read response, check here */
-               if (!(TimeoutMSRemaining))
+               if (!(TimeoutTicksRemaining))
                  return false;
 
                /* Check the status register read response to see if the NVM bus is enabled */
                if (StatusRegister & TPI_STATUS_NVM)
-               {
-                       TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-                       return true;
-               }
+                 return true;
        }
 }
 
@@ -113,15 +110,12 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void)
                uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
                /* We might have timed out waiting for the status register read response, check here */
-               if (!(TimeoutMSRemaining))
+               if (!(TimeoutTicksRemaining))
                  return false;
 
                /* Check to see if the BUSY flag is still set */
                if (!(StatusRegister & (1 << 7)))
-               {
-                       TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-                       return true;
-               }
+                 return true;
        }
 }
 
@@ -146,14 +140,14 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_
        /* Send the address of the location to read from */
        TINYNVM_SendPointerAddress(ReadAddress);
        
-       while (ReadSize-- && TimeoutMSRemaining)
+       while (ReadSize-- && TimeoutTicksRemaining)
        {
                /* Read the byte of data from the target */
                XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI);
                *(ReadBuffer++) = XPROGTarget_ReceiveByte();
        }
        
-       return (TimeoutMSRemaining != 0);
+       return (TimeoutTicksRemaining != 0);
 }
 
 /** Writes word addressed memory to the target's memory spaces.
index 2caee6a..93419d0 100644 (file)
@@ -80,15 +80,12 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void)
                uint8_t StatusRegister = XPROGTarget_ReceiveByte();
                
                /* We might have timed out waiting for the status register read response, check here */
-               if (!(TimeoutMSRemaining))
+               if (!(TimeoutTicksRemaining))
                  return false;
                
                /* Check the status register read response to see if the NVM bus is enabled */
                if (StatusRegister & PDI_STATUS_NVM)
-               {
-                       TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-                       return true;
-               }
+                 return true;
        }
 }
 
@@ -109,15 +106,12 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
                uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
                /* We might have timed out waiting for the status register read response, check here */
-               if (!(TimeoutMSRemaining))
+               if (!(TimeoutTicksRemaining))
                  return false;
 
                /* Check to see if the BUSY flag is still set */
                if (!(StatusRegister & (1 << 7)))
-               {
-                       TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-                       return true;
-               }
+                 return true;
        }
 }
 
@@ -165,7 +159,7 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
        for (uint8_t i = 0; i < XMEGA_CRC_LENGTH; i++)
          ((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte();
        
-       return (TimeoutMSRemaining != 0);
+       return (TimeoutTicksRemaining != 0);
 }
 
 /** Reads memory from the target's memory spaces.
@@ -197,10 +191,10 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16
                
        /* Send a LD command with indirect access and post-increment to read out the bytes */
        XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
-       while (ReadSize-- && TimeoutMSRemaining)
+       while (ReadSize-- && TimeoutTicksRemaining)
          *(ReadBuffer++) = XPROGTarget_ReceiveByte();
        
-       return (TimeoutMSRemaining != 0);
+       return (TimeoutTicksRemaining != 0);
 }
 
 /** Writes byte addressed memory to the target's memory spaces.
index f2c2674..84d82bc 100644 (file)
@@ -131,7 +131,7 @@ static void XPROGProtocol_EnterXPROGMode(void)
                XPROGTarget_SendByte(0x07);
 
                /* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
-               XPROGTarget_SendByte(PDI_CMD_KEY);      
+               XPROGTarget_SendByte(PDI_CMD_KEY);
                for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)
                  XPROGTarget_SendByte(PDI_NVMENABLE_KEY[i - 1]);
 
index 07efbb1..2e52005 100644 (file)
@@ -138,9 +138,6 @@ void XPROGTarget_SendByte(const uint8_t Byte)
        while (!(UCSR1A & (1 << UDRE1)));
        UCSR1A |= (1 << TXC1);
        UDR1    = Byte;
-
-    if (TimeoutMSRemaining)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
 }
 
 /** Receives a byte via the software USART, blocking until data is received.
@@ -154,10 +151,7 @@ uint8_t XPROGTarget_ReceiveByte(void)
          XPROGTarget_SetRxMode();
 
        /* Wait until a byte has been received before reading */
-       while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);
-       
-       if (TimeoutMSRemaining)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
+       while (!(UCSR1A & (1 << RXC1)) && TimeoutTicksRemaining);
 
        return UDR1;
 }
@@ -176,9 +170,6 @@ void XPROGTarget_SendBreak(void)
                while (PIND & (1 << 5));
                while (!(PIND & (1 << 5)));
        }
-
-    if (TimeoutMSRemaining)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
 }
 
 static void XPROGTarget_SetTxMode(void)
@@ -193,9 +184,6 @@ static void XPROGTarget_SetTxMode(void)
        UCSR1B &= ~(1 << RXEN1);
        UCSR1B |=  (1 << TXEN1);
 
-    if (TimeoutMSRemaining)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-
        IsSending = true;
 }
 
@@ -210,9 +198,6 @@ static void XPROGTarget_SetRxMode(void)
        DDRD   &= ~(1 << 3);
        PORTD  &= ~(1 << 3);
 
-    if (TimeoutMSRemaining)
-         TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
-
        IsSending = false;
 }