Fixed AVRISP project timeouts not checking for the correct timeout period (thanks...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 20 Dec 2009 22:33:48 +0000 (22:33 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 20 Dec 2009 22:33:48 +0000 (22:33 +0000)
LUFA/ManPages/ChangeLog.txt
Projects/AVRISP/Lib/ISPTarget.c
Projects/AVRISP/Lib/NVMTarget.c
Projects/AVRISP/Lib/PDITarget.c
Projects/AVRISP/Lib/V2Protocol.h
Projects/AVRISP/makefile

index f28ed47..f046a1f 100644 (file)
@@ -68,6 +68,7 @@
   *  - Fixed USB_CurrentMode not being reset to USB_MODE_NONE when the USB interface is shut down and both Host and Device modes can be\r
   *    used (thanks to Daniel Levy)\r
   *  - Fixed TeensyHID bootloader not enumerating to the host correctly\r
+  *  - Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott)\r
   *\r
   *  \section Sec_ChangeLog091122 Version 091122\r
   *\r
index fbe8ad3..ce364c6 100644 (file)
@@ -123,16 +123,25 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
                case PROG_MODE_WORD_VALUE_MASK:\r
                case PROG_MODE_PAGED_VALUE_MASK:\r
                        TCNT0 = 0;\r
+                       TIFR0 = (1 << OCF1A);\r
+                       \r
+                       uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;\r
 \r
                        do\r
                        {\r
                                SPI_SendByte(ReadMemCommand);\r
                                SPI_SendByte(PollAddress >> 8);\r
-                               SPI_SendByte(PollAddress & 0xFF);                               \r
+                               SPI_SendByte(PollAddress & 0xFF);\r
+\r
+                               if (TIFR0 & (1 << OCF1A))\r
+                               {\r
+                                       TIFR0 = (1 << OCF1A);\r
+                                       TimeoutMS--;\r
+                               }\r
                        }\r
-                       while ((SPI_TransferByte(0x00) != PollValue) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
+                       while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMS);\r
 \r
-                       if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)\r
+                       if (!(TimeoutMS))\r
                         ProgrammingStatus = STATUS_CMD_TOUT;\r
                        \r
                        break;          \r
@@ -153,6 +162,9 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
 uint8_t ISPTarget_WaitWhileTargetBusy(void)\r
 {\r
        TCNT0 = 0;\r
+       TIFR0 = (1 << OCF1A);\r
+                       \r
+       uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;\r
        \r
        do\r
        {\r
@@ -160,10 +172,16 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void)
                SPI_SendByte(0x00);\r
 \r
                SPI_SendByte(0x00);\r
+\r
+               if (TIFR0 & (1 << OCF1A))\r
+               {\r
+                       TIFR0 = (1 << OCF1A);\r
+                       TimeoutMS--;\r
+               }\r
        }\r
-       while ((SPI_ReceiveByte() & 0x01) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
+       while ((SPI_ReceiveByte() & 0x01) && TimeoutMS);\r
 \r
-       if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)\r
+       if (!(TimeoutMS))\r
          return STATUS_RDY_BSY_TOUT;\r
        else\r
          return STATUS_CMD_OK;\r
index 00312d5..adf213b 100644 (file)
@@ -72,9 +72,12 @@ void NVMTarget_SendAddress(const uint32_t AbsoluteAddress)
 bool NVMTarget_WaitWhileNVMControllerBusy(void)\r
 {\r
        TCNT0 = 0;\r
-\r
+       TIFR0 = (1 << OCF1A);\r
+                       \r
+       uint8_t TimeoutMS = PDI_NVM_TIMEOUT_MS;\r
+       \r
        /* Poll the NVM STATUS register while the NVM controller is busy */\r
-       while (TCNT0 < NVM_BUSY_TIMEOUT_MS)\r
+       while (TimeoutMS)\r
        {\r
                /* Send a LDS command to read the NVM STATUS register to check the BUSY flag */\r
                PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));\r
@@ -83,6 +86,12 @@ bool NVMTarget_WaitWhileNVMControllerBusy(void)
                /* Check to see if the BUSY flag is still set */\r
                if (!(PDITarget_ReceiveByte() & (1 << 7)))\r
                  return true;\r
+\r
+               if (TIFR0 & (1 << OCF1A))\r
+               {\r
+                       TIFR0 = (1 << OCF1A);\r
+                       TimeoutMS--;\r
+               }\r
        }\r
        \r
        return false;\r
index df01497..29bb339 100644 (file)
@@ -311,14 +311,23 @@ void PDITarget_SendBreak(void)
 bool PDITarget_WaitWhileNVMBusBusy(void)\r
 {\r
        TCNT0 = 0;\r
-\r
+       TIFR0 = (1 << OCF1A);\r
+                       \r
+       uint8_t TimeoutMS = PDI_NVM_TIMEOUT_MS;\r
+       \r
        /* Poll the STATUS register to check to see if NVM access has been enabled */\r
-       while (TCNT0 < PDI_NVM_TIMEOUT_MS)\r
+       while (TimeoutMS)\r
        {\r
                /* Send the LDCS command to read the PDI STATUS register to see the NVM bus is active */\r
                PDITarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG);\r
                if (PDITarget_ReceiveByte() & PDI_STATUS_NVM)\r
                  return true;\r
+\r
+               if (TIFR0 & (1 << OCF1A))\r
+               {\r
+                       TIFR0 = (1 << OCF1A);\r
+                       TimeoutMS--;\r
+               }\r
        }\r
        \r
        return false;\r
index 5f996ea..1777e0f 100644 (file)
                static inline void V2Protocol_DelayMS(uint8_t DelayMS)\r
                {\r
                        TCNT0 = 0;\r
-                       while (TCNT0 < DelayMS);\r
+                       TIFR0 = (1 << OCF1A);\r
+\r
+                       while (DelayMS)\r
+                       {\r
+                               if (TIFR0 & (1 << OCF1A))\r
+                               {\r
+                                       TIFR0 = (1 << OCF1A);\r
+                                       DelayMS--;\r
+                               }\r
+                       }\r
                }
 \r
        /* External Variables: */\r
index 23e27c5..2b6a1e8 100644 (file)
@@ -66,7 +66,7 @@ MCU = at90usb1287
 # Target board (see library "Board Types" documentation, USER or blank for projects not requiring\r
 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called \r
 # "Board" inside the application directory.\r
-BOARD = XPLAIN\r
+BOARD = USBKEY\r
 \r
 \r
 # Processor frequency.\r