Make sure that long reads are aborted early if the connection times out while waiting on more bytes in the AVRISP MKII clone project.

pull/1469/head
Dean Camera 15 years ago
parent ceb16ee24f
commit 9a1560dc05

@ -164,14 +164,14 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_
/* Send the address of the location to read from */ /* Send the address of the location to read from */
TINYNVM_SendPointerAddress(ReadAddress); TINYNVM_SendPointerAddress(ReadAddress);
while (ReadSize--) while (ReadSize-- && TimeoutMSRemaining)
{ {
/* Read the byte of data from the target */ /* Read the byte of data from the target */
XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI); XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI);
*(ReadBuffer++) = XPROGTarget_ReceiveByte(); *(ReadBuffer++) = XPROGTarget_ReceiveByte();
} }
return true; return (TimeoutMSRemaining != 0);
} }
/** Writes word addressed memory to the target's memory spaces. /** Writes word addressed memory to the target's memory spaces.

@ -183,7 +183,7 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
for (uint8_t i = 0; i < XMEGA_CRC_LENGTH; i++) for (uint8_t i = 0; i < XMEGA_CRC_LENGTH; i++)
((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte(); ((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte();
return true; return (TimeoutMSRemaining != 0);
} }
/** Reads memory from the target's memory spaces. /** Reads memory from the target's memory spaces.
@ -215,10 +215,10 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16
/* Send a LD command with indirect access and postincrement to read out the bytes */ /* Send a LD command with indirect access and postincrement to read out the bytes */
XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE); XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
while (ReadSize--) while (ReadSize-- && TimeoutMSRemaining)
*(ReadBuffer++) = XPROGTarget_ReceiveByte(); *(ReadBuffer++) = XPROGTarget_ReceiveByte();
return true; return (TimeoutMSRemaining != 0);
} }
/** Writes byte addressed memory to the target's memory spaces. /** Writes byte addressed memory to the target's memory spaces.

@ -338,6 +338,9 @@ uint8_t XPROGTarget_ReceiveByte(void)
} }
} }
if (TimeoutMSRemaining)
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
return UDR1; return UDR1;
#else #else
/* Wait until a byte has been received before reading */ /* Wait until a byte has been received before reading */

Loading…
Cancel
Save