diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 1eda701abbafc1d6b7a0ee1ebd024d2c4135f85f..0afdd4abaa5a3905ddc26c799f01bf47d1fb35d5 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -35,6 +35,7 @@ * - Added new Pipe_GetBusyBanks(), Endpoint_GetBusyBanks() and Endpoint_AbortPendingIN() functions * - Added new NO_BLOCK_SUPPORT, NO_EEPROM_BYTE_SUPPORT, NO_FLASH_BYTE_SUPPORT and NO_LOCK_BYTE_WRITE_SUPPORT compile time options to the * CDC class bootloader + * - Added new XCK_RESCUE_CLOCK_ENABLE compile time option to the AVRISP-MKII clone programmer project (thanks to Tom Light) * * <b>Changed:</b> * - Removed complicated logic for the Endpoint_ConfigureEndpoint() function to use inlined or function called versions diff --git a/Projects/AVRISP-MKII/AVRISP-MKII.txt b/Projects/AVRISP-MKII/AVRISP-MKII.txt index d569e7e3e83c653e007ac5f335a213ee4463bb91..7489cf6a0f180787d31edc5366359c1fd61856f6 100644 --- a/Projects/AVRISP-MKII/AVRISP-MKII.txt +++ b/Projects/AVRISP-MKII/AVRISP-MKII.txt @@ -280,6 +280,12 @@ * <td>Define to switch to a non-standard endpoint scheme, breaking compatibility with AVRStudio under Windows but making * the code compatible with software such as avrdude (all platforms) that use the libUSB driver. * </tr> + * <tr> + * <td>XCK_RESCUE_CLOCK_ENABLE</td> + * <td>Makefile LUFA_OPTS</td> + * <td>Define to move the ISP rescue clock to the AVR's XCK pin instead of the OCR1A output pin. This is useful for existing programming + * hardware that does not expose the OCR1A pin of the AVR, but *may* cause some issues with PDI programming mode. + * </tr> * </table> */ diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c index 66a1c25606d76c197a16fb54e992767d6be66c69..657c2c99932e6aed8f6ad28ecdb607a84cfa7f7f 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c @@ -189,19 +189,29 @@ void ISPTarget_DisableTargetISP(void) */ void ISPTarget_ConfigureRescueClock(void) { - /* Configure OCR1A as an output for the specified AVR model */ - #if defined(USB_SERIES_2_AVR) - DDRC |= (1 << 6); + #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); + UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else - DDRB |= (1 << 5); + /* Configure OCR1A as an output for the specified AVR model */ + #if defined(USB_SERIES_2_AVR) + DDRC |= (1 << 6); + #else + DDRB |= (1 << 5); + #endif + + /* Start Timer 1 to generate a 4MHz clock on the OCR1A pin */ + TIMSK1 = 0; + TCNT1 = 0; + OCR1A = ((F_CPU / 2 / ISP_RESCUE_CLOCK_SPEED) - 1); + TCCR1A = (1 << COM1A0); + TCCR1B = ((1 << WGM12) | (1 << CS10)); #endif - - /* Start Timer 1 to generate a 4MHz clock on the OCR1A pin */ - TIMSK1 = 0; - TCNT1 = 0; - OCR1A = ((F_CPU / 2 / ISP_RESCUE_CLOCK_SPEED) - 1); - TCCR1A = (1 << COM1A0); - TCCR1B = ((1 << WGM12) | (1 << CS10)); } /** Configures the AVR's timer ready to produce software ISP for the slower ISP speeds that diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 02fbbf44db4b80a25d9c1a8fe2a15227732fccad..276f63e0ea7a788776fb1b63828b57e166a23a1f 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -196,6 +196,10 @@ static void XPROGProtocol_LeaveXPROGMode(void) XPROGTarget_DisableTargetTPI(); } + #if defined(XCK_RESCUE_CLOCK_ENABLE) && defined(ENABLE_ISP_PROTOCOL) + ISPTarget_ConfigureRescueClock(); + #endif + Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_LEAVE_PROGMODE); Endpoint_Write_Byte(XPRG_ERR_OK); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 8760e62cbd894094c82dc5be745a34e700471f51..f6fff1cf7749f4e38fb2e3219976549667af987a 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -118,7 +118,7 @@ void XPROGTarget_DisableTargetTPI(void) /* Set all USART lines as input, tristate */ DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); - + /* Tristate target /RESET line */ AUX_LINE_DDR &= ~AUX_LINE_MASK; AUX_LINE_PORT &= ~AUX_LINE_MASK; diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile index 6c6e11708ba7cadb60e6de9123c30e153a6af562..5135722fd5a5979c43710ae2adb1506a7ba5cad0 100644 --- a/Projects/AVRISP-MKII/makefile +++ b/Projects/AVRISP-MKII/makefile @@ -137,6 +137,7 @@ LUFA_OPTS += -D VTARGET_REF_VOLTS=5 LUFA_OPTS += -D VTARGET_SCALE_FACTOR=1 #LUFA_OPTS += -D NO_VTARGET_DETECT #LUFA_OPTS += -D LIBUSB_DRIVER_COMPAT +#LUFA_OPTS += -D XCK_RESCUE_CLOCK_ENABLE # Create the LUFA source path variables by including the LUFA root makefile