Ooops - TeensyHID bootloader makefile should use a 16MHz FCPU, not 8MHz.
[pub/USBasp.git] / Projects / AVRISP / Lib / ISPTarget.c
index 8715846..ce364c6 100644 (file)
@@ -35,6 +35,8 @@
 \r
 #include "ISPTarget.h"\r
 \r
 \r
 #include "ISPTarget.h"\r
 \r
+#if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__)\r
+\r
 /** Converts the given AVR Studio SCK duration parameter (set by a SET PARAM command from the host) to the nearest\r
  *  possible SPI clock prescaler mask for passing to the SPI_Init() routine.\r
  *\r
 /** Converts the given AVR Studio SCK duration parameter (set by a SET PARAM command from the host) to the nearest\r
  *  possible SPI clock prescaler mask for passing to the SPI_Init() routine.\r
  *\r
@@ -78,7 +80,7 @@ uint8_t ISPTarget_GetSPIPrescalerMask(void)
  *\r
  *  \param[in] ResetTarget Boolean true when the target should be held in reset, false otherwise\r
  */\r
  *\r
  *  \param[in] ResetTarget Boolean true when the target should be held in reset, false otherwise\r
  */\r
-void ISPTarget_ChangeTargetResetLine(bool ResetTarget)\r
+void ISPTarget_ChangeTargetResetLine(const bool ResetTarget)\r
 {\r
        if (ResetTarget)\r
        {\r
 {\r
        if (ResetTarget)\r
        {\r
@@ -106,8 +108,8 @@ void ISPTarget_ChangeTargetResetLine(bool ResetTarget)
  *  \return V2 Protocol status \ref STATUS_CMD_OK if the no timeout occurred, \ref STATUS_RDY_BSY_TOUT or\r
  *          \ref STATUS_CMD_TOUT otherwise\r
  */\r
  *  \return V2 Protocol status \ref STATUS_CMD_OK if the no timeout occurred, \ref STATUS_RDY_BSY_TOUT or\r
  *          \ref STATUS_CMD_TOUT otherwise\r
  */\r
-uint8_t ISPTarget_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddress, uint8_t PollValue,\r
-                                      uint8_t DelayMS, uint8_t ReadMemCommand)\r
+uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint16_t PollAddress, const uint8_t PollValue,\r
+                                      const uint8_t DelayMS, const uint8_t ReadMemCommand)\r
 {\r
        uint8_t ProgrammingStatus = STATUS_CMD_OK;\r
 \r
 {\r
        uint8_t ProgrammingStatus = STATUS_CMD_OK;\r
 \r
@@ -121,16 +123,25 @@ uint8_t ISPTarget_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddr
                case PROG_MODE_WORD_VALUE_MASK:\r
                case PROG_MODE_PAGED_VALUE_MASK:\r
                        TCNT0 = 0;\r
                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
 \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
                        }\r
-                       while ((SPI_TransferByte(0x00) != PollValue) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
+                       while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMS);\r
 \r
 \r
-                       if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)\r
+                       if (!(TimeoutMS))\r
                         ProgrammingStatus = STATUS_CMD_TOUT;\r
                        \r
                        break;          \r
                         ProgrammingStatus = STATUS_CMD_TOUT;\r
                        \r
                        break;          \r
@@ -151,6 +162,9 @@ uint8_t ISPTarget_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddr
 uint8_t ISPTarget_WaitWhileTargetBusy(void)\r
 {\r
        TCNT0 = 0;\r
 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
        \r
        do\r
        {\r
@@ -158,10 +172,16 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void)
                SPI_SendByte(0x00);\r
 \r
                SPI_SendByte(0x00);\r
                SPI_SendByte(0x00);\r
 \r
                SPI_SendByte(0x00);\r
+\r
+               if (TIFR0 & (1 << OCF1A))\r
+               {\r
+                       TIFR0 = (1 << OCF1A);\r
+                       TimeoutMS--;\r
+               }\r
        }\r
        }\r
-       while ((SPI_ReceiveByte() & 0x01) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
+       while ((SPI_ReceiveByte() & 0x01) && TimeoutMS);\r
 \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
          return STATUS_RDY_BSY_TOUT;\r
        else\r
          return STATUS_CMD_OK;\r
@@ -178,3 +198,5 @@ void ISPTarget_LoadExtendedAddress(void)
        SPI_SendByte((CurrentAddress & 0x00FF0000) >> 16);\r
        SPI_SendByte(0x00);     \r
 }\r
        SPI_SendByte((CurrentAddress & 0x00FF0000) >> 16);\r
        SPI_SendByte(0x00);     \r
 }\r
+\r
+#endif\r