@ -65,6 +65,13 @@
# define BOOT_SIZE_1024 0b010
# define BOOT_SIZE_1024 0b010
# define BOOT_SIZE_2048 0b000
# define BOOT_SIZE_2048 0b000
//compatibility between ATMega8 and ATMega88
# if !defined (MCUCSR)
# if defined (MCUSR)
# define MCUCSR MCUSR
# endif
# endif
/** \brief Entering the Bootloader via Software
/** \brief Entering the Bootloader via Software
*
*
* http : //www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
* http : //www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
@ -149,6 +156,39 @@ void bootloader_jump(void) {
while ( 1 ) { } // wait for watchdog timer to trigger
while ( 1 ) { } // wait for watchdog timer to trigger
# elif defined(BOOTLOADER_USBASP)
// Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c
wdt_enable ( WDTO_15MS ) ;
wdt_reset ( ) ;
asm volatile (
" cli \n \t "
" ldi r29 , %[ramendhi] \n \t "
" ldi r28 , %[ramendlo] \n \t "
# if (FLASHEND>131071)
" ldi r18 , %[bootaddrhi] \n \t "
" st Y+, r18 \n \t "
# endif
" ldi r18 , %[bootaddrme] \n \t "
" st Y+, r18 \n \t "
" ldi r18 , %[bootaddrlo] \n \t "
" st Y+, r18 \n \t "
" out %[mcucsrio], __zero_reg__ \n \t "
" bootloader_startup_loop%=: \n \t "
" rjmp bootloader_startup_loop%= \n \t "
:
: [ mcucsrio ] " I " ( _SFR_IO_ADDR ( MCUCSR ) ) ,
# if (FLASHEND>131071)
[ ramendhi ] " M " ( ( ( RAMEND - 2 ) > > 8 ) & 0xff ) ,
[ ramendlo ] " M " ( ( ( RAMEND - 2 ) > > 0 ) & 0xff ) ,
[ bootaddrhi ] " M " ( ( ( ( FLASH_SIZE - BOOTLOADER_SIZE ) > > 1 ) > > 16 ) & 0xff ) ,
# else
[ ramendhi ] " M " ( ( ( RAMEND - 1 ) > > 8 ) & 0xff ) ,
[ ramendlo ] " M " ( ( ( RAMEND - 1 ) > > 0 ) & 0xff ) ,
# endif
[ bootaddrme ] " M " ( ( ( ( FLASH_SIZE - BOOTLOADER_SIZE ) > > 1 ) > > 8 ) & 0xff ) ,
[ bootaddrlo ] " M " ( ( ( ( FLASH_SIZE - BOOTLOADER_SIZE ) > > 1 ) > > 0 ) & 0xff )
) ;
# else // Assume remaining boards are DFU, even if the flag isn't set
# else // Assume remaining boards are DFU, even if the flag isn't set
# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
@ -172,24 +212,19 @@ void bootloader_jump(void) {
}
}
# ifdef __AVR_ATmega32A__
// MCUSR is actually called MCUCSR in ATmega32A
# define MCUSR MCUCSR
# endif
/* this runs before main() */
/* this runs before main() */
void bootloader_jump_after_watchdog_reset ( void ) __attribute__ ( ( used , naked , section ( " .init3 " ) ) ) ;
void bootloader_jump_after_watchdog_reset ( void ) __attribute__ ( ( used , naked , section ( " .init3 " ) ) ) ;
void bootloader_jump_after_watchdog_reset ( void )
void bootloader_jump_after_watchdog_reset ( void )
{
{
# ifndef BOOTLOADER_HALFKAY
# ifndef BOOTLOADER_HALFKAY
if ( ( MCU SR & ( 1 < < WDRF ) ) & & reset_key = = BOOTLOADER_RESET_KEY ) {
if ( ( MCU C SR & ( 1 < < WDRF ) ) & & reset_key = = BOOTLOADER_RESET_KEY ) {
reset_key = 0 ;
reset_key = 0 ;
// My custom USBasploader requires this to come up.
// My custom USBasploader requires this to come up.
MCU SR = 0 ;
MCU C SR = 0 ;
// Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
// Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
MCU SR & = ~ ( 1 < < WDRF ) ;
MCU C SR & = ~ ( 1 < < WDRF ) ;
wdt_disable ( ) ;
wdt_disable ( ) ;
@ -202,29 +237,3 @@ void bootloader_jump_after_watchdog_reset(void)
}
}
# endif
# endif
}
}
#if 0
/*
* USBaspLoader - I ' m not sure if this is used at all in any projects
* would love to support it if it is - Jack
*/
# if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
// This makes custom USBasploader come up.
MCUSR = 0 ;
// initialize ports
PORTB = 0 ; PORTC = 0 ; PORTD = 0 ;
DDRB = 0 ; DDRC = 0 ; DDRD = 0 ;
// disable interrupts
EIMSK = 0 ; EECR = 0 ; SPCR = 0 ;
ACSR = 0 ; SPMCSR = 0 ; WDTCSR = 0 ; PCICR = 0 ;
TIMSK0 = 0 ; TIMSK1 = 0 ; TIMSK2 = 0 ;
ADCSRA = 0 ; TWCR = 0 ; UCSR0B = 0 ;
# endif
// This is compled into 'icall', address should be in word unit, not byte.
( ( void ( * ) ( void ) ) ( BOOTLOADER_START / 2 ) ) ( ) ;
}
# endif