X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/bff4dbe1897d8c19b4bb9807e76350465ca1f1c4..73801c73a1684a88bff33aefe3c5aa89bc66c414:/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c?ds=sidebyside diff --git a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c index caa7010ba..e23885bb3 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c +++ b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c @@ -40,7 +40,7 @@ uint32_t CurrentAddress; uint8_t V2Protocol_GetSPIPrescalerMask(void) { - static const uint8_t SPIMaskFromSCKDuration[] = + static const uint8_t SPIMaskFromSCKDuration[TOTAL_PROGRAMMING_SPEEDS] = { #if (F_CPU == 8000000) SPI_SPEED_FCPU_DIV_2, @@ -76,16 +76,46 @@ void V2Protocol_ChangeTargetResetLine(bool ResetTarget) } } -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 { @@ -93,14 +123,11 @@ uint8_t V2Protocol_WaitWhileTargetBusy(void) SPI_SendByte(0x00); SPI_SendByte(0x00); - ResponseByte = SPI_ReceiveByte(); - - V2Protocol_DelayMS(1); } - 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; }