X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/f01a05415c03b0dd61297849ece2cfcce7f8d3e8..7a1033025bbf0dcf4e4dc770fccb4edea86144a4:/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c?ds=sidebyside diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c index f08ee6a0e..ac6831611 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2011. + Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2012 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 @@ -41,7 +41,7 @@ * * \hideinitializer */ -static uint8_t SPIMaskFromSCKDuration[] PROGMEM = +static const uint8_t SPIMaskFromSCKDuration[] PROGMEM = { #if (F_CPU == 8000000) SPI_SPEED_FCPU_DIV_2, // AVRStudio = 8MHz SPI, Actual = 4MHz SPI @@ -68,7 +68,7 @@ static uint8_t SPIMaskFromSCKDuration[] PROGMEM = * * \hideinitializer */ -static uint16_t TimerCompareFromSCKDuration[] PROGMEM = +static const uint16_t TimerCompareFromSCKDuration[] PROGMEM = { TIMER_COMP(96386), TIMER_COMP(89888), TIMER_COMP(84211), TIMER_COMP(79208), TIMER_COMP(74767), TIMER_COMP(70797), TIMER_COMP(67227), TIMER_COMP(64000), TIMER_COMP(61069), TIMER_COMP(58395), @@ -161,7 +161,7 @@ void ISPTarget_EnableTargetISP(void) DDRB |= ((1 << 1) | (1 << 2)); PORTB |= ((1 << 0) | (1 << 3)); - ISPTarget_ConfigureSoftwareISP(SCKDuration); + ISPTarget_ConfigureSoftwareSPI(SCKDuration); } } @@ -178,14 +178,14 @@ void ISPTarget_DisableTargetISP(void) { DDRB &= ~((1 << 1) | (1 << 2)); PORTB &= ~((1 << 0) | (1 << 3)); - + /* Must re-enable rescue clock once software ISP has exited, as the timer for the rescue clock is * re-purposed for software SPI */ ISPTarget_ConfigureRescueClock(); } } -/** Configures the AVR to produce a .5MHz rescue clock out of the OCR1A pin of the AVR, so +/** Configures the AVR to produce a 4MHz rescue clock out of the OCR1A pin of the AVR, so * that it can be fed into the XTAL1 pin of an AVR whose fuses have been mis-configured for * an external clock rather than a crystal. When used, the ISP speed must be 125KHz for this * functionality to work correctly. @@ -195,7 +195,7 @@ void ISPTarget_ConfigureRescueClock(void) #if defined(XCK_RESCUE_CLOCK_ENABLE) /* Configure XCK as an output for the specified AVR model */ DDRD |= (1 << 5); - + /* Start USART to generate a 4MHz clock on the XCK pin */ UBRR1 = ((F_CPU / 2 / ISP_RESCUE_CLOCK_SPEED) - 1); UCSR1B = (1 << TXEN1); @@ -217,14 +217,14 @@ void ISPTarget_ConfigureRescueClock(void) #endif } -/** Configures the AVR's timer ready to produce software ISP for the slower ISP speeds that +/** Configures the AVR's timer ready to produce software SPI for the slower ISP speeds that * cannot be obtained when using the AVR's hardware SPI module. * * \param[in] SCKDuration Duration of the desired software ISP SCK clock */ -void ISPTarget_ConfigureSoftwareISP(const uint8_t SCKDuration) +void ISPTarget_ConfigureSoftwareSPI(const uint8_t SCKDuration) { - /* Configure Timer 1 for software ISP using the specified SCK duration */ + /* Configure Timer 1 for software SPI using the specified SCK duration */ TIMSK1 = (1 << OCIE1A); TCNT1 = 0; OCR1A = pgm_read_word(&TimerCompareFromSCKDuration[SCKDuration - sizeof(SPIMaskFromSCKDuration)]); @@ -243,7 +243,8 @@ uint8_t ISPTarget_TransferSoftSPIByte(const uint8_t Byte) SoftSPI_Data = Byte; SoftSPI_BitsRemaining = 8; - if (SoftSPI_Data & 0x01) + /* Set initial MOSI pin state according to the byte to be transferred */ + if (SoftSPI_Data & (1 << 7)) PORTB |= (1 << 2); else PORTB &= ~(1 << 2); @@ -312,7 +313,7 @@ void ISPTarget_LoadExtendedAddress(void) /** Waits until the last issued target memory programming command has completed, via the check mode given and using * the given parameters. * - * \param[in] ProgrammingMode Programming mode used and completion check to use, a mask of PROG_MODE_* constants + * \param[in] ProgrammingMode Programming mode used and completion check to use, a mask of \c PROG_MODE_* constants * \param[in] PollAddress Memory address to poll for completion if polling check mode used * \param[in] PollValue Poll value to check against if polling check mode used * \param[in] DelayMS Milliseconds to delay before returning if delay check mode used @@ -356,6 +357,9 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, break; } + /* Program complete - reset timeout */ + wdt_reset(); + return ProgrammingStatus; }