X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/7e74bd3ea2f8de6c6a78fc8e2527c806b2dd8476..73801c73a1684a88bff33aefe3c5aa89bc66c414:/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c?ds=inline diff --git a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c index 7bcf0bea4..e23885bb3 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c +++ b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c @@ -36,24 +36,22 @@ #include "V2ProtocolTarget.h" /** Current memory address for FLASH/EEPROM memory read/write commands */ -uint32_t CurrentAddress; +uint32_t CurrentAddress; -/** Table of masks for SPI_Init() from a given PARAM_SCK_DURATION value */ -static const uint8_t SPIMaskFromSCKDuration[] = +uint8_t V2Protocol_GetSPIPrescalerMask(void) +{ + static const uint8_t SPIMaskFromSCKDuration[TOTAL_PROGRAMMING_SPEEDS] = { #if (F_CPU == 8000000) SPI_SPEED_FCPU_DIV_2, #endif SPI_SPEED_FCPU_DIV_2, SPI_SPEED_FCPU_DIV_4, SPI_SPEED_FCPU_DIV_8, SPI_SPEED_FCPU_DIV_16, SPI_SPEED_FCPU_DIV_32, SPI_SPEED_FCPU_DIV_64 - #if (F_CPU == 16000000) + #if (F_CPU == 16000000) , SPI_SPEED_FCPU_DIV_128 #endif }; - -uint8_t V2Protocol_GetSPIPrescalerMask(void) -{ uint8_t SCKDuration = V2Params_GetParameterValue(PARAM_SCK_DURATION); if (SCKDuration >= sizeof(SPIMaskFromSCKDuration)) @@ -73,36 +71,63 @@ void V2Protocol_ChangeTargetResetLine(bool ResetTarget) } else { - RESET_LINE_PORT &= ~RESET_LINE_MASK; + RESET_LINE_PORT &= ~RESET_LINE_MASK; RESET_LINE_DDR &= ~RESET_LINE_MASK; } } -void V2Protocol_DelayMS(uint8_t MS) +uint8_t V2Protocol_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddress, uint8_t PollValue, + uint8_t DelayMS, uint8_t ReadMemCommand) { - while (MS--) - _delay_ms(1); + uint8_t ProgrammingStatus = STATUS_CMD_OK; + + /* Determine method of Programming Complete check */ + switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK)) + { + case PROG_MODE_WORD_TIMEDELAY_MASK: + case PROG_MODE_PAGED_TIMEDELAY_MASK: + V2Protocol_DelayMS(DelayMS); + break; + case PROG_MODE_WORD_VALUE_MASK: + case PROG_MODE_PAGED_VALUE_MASK: + TCNT0 = 0; + + do + { + SPI_SendByte(ReadMemCommand); + SPI_SendByte(PollAddress >> 8); + SPI_SendByte(PollAddress & 0xFF); + } + while ((SPI_TransferByte(0x00) != PollValue) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS)); + + if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS) + ProgrammingStatus = STATUS_RDY_BSY_TOUT; + + break; + case PROG_MODE_WORD_READYBUSY_MASK: + case PROG_MODE_PAGED_READYBUSY_MASK: + ProgrammingStatus = V2Protocol_WaitWhileTargetBusy(); + break; + } + + return ProgrammingStatus; } uint8_t V2Protocol_WaitWhileTargetBusy(void) { - uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS; - uint8_t ResponseByte; + TCNT0 = 0; do { - V2Protocol_DelayMS(1); - SPI_SendByte(0xF0); SPI_SendByte(0x00); SPI_SendByte(0x00); - ResponseByte = SPI_ReceiveByte(); } - while ((ResponseByte & 0x01) && (TimeoutMS--)); + while ((SPI_ReceiveByte() & 0x01) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS)); - if (!(TimeoutMS)) - return STATUS_CMD_TOUT; + if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS) + return STATUS_RDY_BSY_TOUT; else return STATUS_CMD_OK; }