X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/8ecdc2b1441417bf97661a3d3edd17a5afd707bf..55db57e1ede3c44a3b027cb442fa12e969b37f4b:/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c index 29cb18e62..94f1c3d74 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2009. + Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, and distribute this software - and its documentation for any purpose and without fee is hereby - granted, provided that the above copyright notice appear in all - copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -53,14 +53,14 @@ uint8_t ISPTarget_GetSPIPrescalerMask(void) SPI_SPEED_FCPU_DIV_8, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI SPI_SPEED_FCPU_DIV_16, // AVRStudio = 500KHz SPI, Actual = 500KHz SPI SPI_SPEED_FCPU_DIV_32, // AVRStudio = 250KHz SPI, Actual = 250KHz SPI - SPI_SPEED_FCPU_DIV_64 // AVRStudio = 125KHz SPI, Actual = 125KHz SPI + SPI_SPEED_FCPU_DIV_64, // AVRStudio = 125KHz SPI, Actual = 125KHz SPI #elif (F_CPU == 16000000) SPI_SPEED_FCPU_DIV_2, // AVRStudio = 8MHz SPI, Actual = 8MHz SPI SPI_SPEED_FCPU_DIV_4, // AVRStudio = 4MHz SPI, Actual = 4MHz SPI SPI_SPEED_FCPU_DIV_8, // AVRStudio = 2MHz SPI, Actual = 2MHz SPI SPI_SPEED_FCPU_DIV_16, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI SPI_SPEED_FCPU_DIV_32, // AVRStudio = 500KHz SPI, Actual = 500KHz SPI - SPI_SPEED_FCPU_DIV_64, // AVRStudio = 250KHz SPI, Actual = 250KHz SPI + SPI_SPEED_FCPU_DIV_64, // AVRStudio = 250KHz SPI, Actual = 250KHz SPI SPI_SPEED_FCPU_DIV_128 // AVRStudio = 125KHz SPI, Actual = 125KHz SPI #else #error No SPI prescaler masks for chosen F_CPU speed. @@ -84,15 +84,15 @@ void ISPTarget_ChangeTargetResetLine(const bool ResetTarget) { if (ResetTarget) { - RESET_LINE_DDR |= RESET_LINE_MASK; + AUX_LINE_DDR |= AUX_LINE_MASK; if (!(V2Params_GetParameterValue(PARAM_RESET_POLARITY))) - RESET_LINE_PORT |= RESET_LINE_MASK; + AUX_LINE_PORT |= AUX_LINE_MASK; } else { - RESET_LINE_DDR &= ~RESET_LINE_MASK; - RESET_LINE_PORT &= ~RESET_LINE_MASK; + AUX_LINE_DDR &= ~AUX_LINE_MASK; + AUX_LINE_PORT &= ~AUX_LINE_MASK; } } @@ -111,7 +111,7 @@ void ISPTarget_ChangeTargetResetLine(const bool ResetTarget) uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint16_t PollAddress, const uint8_t PollValue, const uint8_t DelayMS, const uint8_t ReadMemCommand) { - uint8_t ProgrammingStatus = STATUS_CMD_OK; + uint8_t ProgrammingStatus = STATUS_CMD_OK; /* Determine method of Programming Complete check */ switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK)) @@ -124,11 +124,18 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1 case PROG_MODE_PAGED_VALUE_MASK: do { + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + SPI_SendByte(ReadMemCommand); SPI_SendByte(PollAddress >> 8); SPI_SendByte(PollAddress & 0xFF); } - while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMSRemaining); + while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining); if (!(TimeoutMSRemaining)) ProgrammingStatus = STATUS_CMD_TOUT; @@ -140,11 +147,14 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1 break; } + if (ProgrammingStatus == STATUS_CMD_OK) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return ProgrammingStatus; } /** Waits until the target has completed the last operation, by continuously polling the device's - * BUSY flag until it is cleared, or until the \ref TARGET_BUSY_TIMEOUT_MS timeout period has expired. + * BUSY flag until it is cleared, or until the command timeout period has expired. * * \return V2 Protocol status \ref STATUS_CMD_OK if the no timeout occurred, \ref STATUS_RDY_BSY_TOUT otherwise */ @@ -152,17 +162,28 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void) { do { + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + SPI_SendByte(0xF0); SPI_SendByte(0x00); - SPI_SendByte(0x00); } while ((SPI_ReceiveByte() & 0x01) && TimeoutMSRemaining); - if (!(TimeoutMSRemaining)) - return STATUS_RDY_BSY_TOUT; + if (TimeoutMSRemaining) + { + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return STATUS_CMD_OK; + } else - return STATUS_CMD_OK; + { + return STATUS_RDY_BSY_TOUT; + } } /** Sends a low-level LOAD EXTENDED ADDRESS command to the target, for addressing of memory beyond the @@ -171,7 +192,7 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void) */ void ISPTarget_LoadExtendedAddress(void) { - SPI_SendByte(0x4D); + SPI_SendByte(LOAD_EXTENDED_ADDRESS_CMD); SPI_SendByte(0x00); SPI_SendByte((CurrentAddress & 0x00FF0000) >> 16); SPI_SendByte(0x00);