aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-04-30 08:27:21 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-04-30 08:27:21 +0000
commitceb16ee24f1e6add5e2ad0398369c24d2d868cd8 (patch)
treee8a588f50420aa51ac15e08f67eee1af23ea6ccf
parent9cad677ebbd2fc4ea069f98335f8467b16dbb2cb (diff)
downloadlufa-ceb16ee24f1e6add5e2ad0398369c24d2d868cd8.tar.gz
lufa-ceb16ee24f1e6add5e2ad0398369c24d2d868cd8.tar.bz2
lufa-ceb16ee24f1e6add5e2ad0398369c24d2d868cd8.zip
Make sure that the NVM bus/controller busy waits in the AVRISP MKII clone project abort properly if a timeout occurs while waiting for a response.
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c18
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c18
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c33
3 files changed, 54 insertions, 15 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index c0f04c6bd..7b9ff0914 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -81,7 +81,15 @@ bool TINYNVM_WaitWhileNVMBusBusy(void)
{
/* Send the SLDCS command to read the TPI STATUS register to see the NVM bus is active */
XPROGTarget_SendByte(TPI_CMD_SLDCS | TPI_STATUS_REG);
- if (XPROGTarget_ReceiveByte() & TPI_STATUS_NVM)
+
+ uint8_t StatusRegister = XPROGTarget_ReceiveByte();
+
+ /* We might have timed out waiting for the status register read response, check here */
+ if (!(TimeoutMSRemaining))
+ 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;
@@ -111,8 +119,14 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void)
/* Send the SIN command to read the TPI STATUS register to see the NVM bus is busy */
TINYNVM_SendReadNVMRegister(XPROG_Param_NVMCSRRegAddr);
+ uint8_t StatusRegister = XPROGTarget_ReceiveByte();
+
+ /* We might have timed out waiting for the status register read response, check here */
+ if (!(TimeoutMSRemaining))
+ return false;
+
/* Check to see if the BUSY flag is still set */
- if (!(XPROGTarget_ReceiveByte() & (1 << 7)))
+ if (!(StatusRegister & (1 << 7)))
{
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
return true;
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
index f63f13a97..7ca0c5e8a 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
@@ -76,7 +76,15 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void)
{
/* Send the LDCS command to read the PDI STATUS register to see the NVM bus is active */
XPROGTarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG);
- if (XPROGTarget_ReceiveByte() & PDI_STATUS_NVM)
+
+ uint8_t StatusRegister = XPROGTarget_ReceiveByte();
+
+ /* We might have timed out waiting for the status register read response, check here */
+ if (!(TimeoutMSRemaining))
+ 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;
@@ -107,8 +115,14 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_STATUS);
+ uint8_t StatusRegister = XPROGTarget_ReceiveByte();
+
+ /* We might have timed out waiting for the status register read response, check here */
+ if (!(TimeoutMSRemaining))
+ return false;
+
/* Check to see if the BUSY flag is still set */
- if (!(XPROGTarget_ReceiveByte() & (1 << 7)))
+ if (!(StatusRegister & (1 << 7)))
{
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
return true;
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index bd269edd7..6f0d87add 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -453,22 +453,33 @@ static void XPROGTarget_SetRxMode(void)
{
BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK;
BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
+
+ /* Wait until DATA line has been pulled up to idle by the target */
+ while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining)
+ {
+ /* Manage software timeout */
+ if (TIFR0 & (1 << OCF0A))
+ {
+ TIFR0 |= (1 << OCF0A);
+ TimeoutMSRemaining--;
+ }
+ }
}
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) && TimeoutMSRemaining)
- {
- /* Manage software timeout */
- if (TIFR0 & (1 << OCF0A))
+ BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK;
+
+ /* Wait until DATA line has been pulled up to idle by the target */
+ while (!(BITBANG_TPIDATA_PIN & BITBANG_TPIDATA_MASK) && TimeoutMSRemaining)
{
- TIFR0 |= (1 << OCF0A);
- TimeoutMSRemaining--;
- }
+ /* Manage software timeout */
+ if (TIFR0 & (1 << OCF0A))
+ {
+ TIFR0 |= (1 << OCF0A);
+ TimeoutMSRemaining--;
+ }
+ }
}
#endif