Usbasploader bootloader option addition (#6304)
* Added USBasp bootloader option for USBasploader * author comment * ifdef fix :) * Add usbasp target * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update docs/flashing.md Co-Authored-By: fauxpark <fauxpark@gmail.com>
This commit is contained in:
		
							parent
							
								
									7d557a0514
								
							
						
					
					
						commit
						3538955778
					
				
					 6 changed files with 78 additions and 37 deletions
				
			
		| 
						 | 
				
			
			@ -65,6 +65,13 @@
 | 
			
		|||
#define BOOT_SIZE_1024 0b010
 | 
			
		||||
#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
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
    #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
 | 
			
		||||
 | 
			
		||||
        #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() */
 | 
			
		||||
void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
 | 
			
		||||
void bootloader_jump_after_watchdog_reset(void)
 | 
			
		||||
{
 | 
			
		||||
    #ifndef BOOTLOADER_HALFKAY
 | 
			
		||||
        if ((MCUSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
 | 
			
		||||
        if ((MCUCSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
 | 
			
		||||
            reset_key = 0;
 | 
			
		||||
 | 
			
		||||
            // My custom USBasploader requires this to come up.
 | 
			
		||||
            MCUSR = 0;
 | 
			
		||||
            MCUCSR = 0;
 | 
			
		||||
 | 
			
		||||
            // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
 | 
			
		||||
            MCUSR &= ~(1<<WDRF);
 | 
			
		||||
            MCUCSR &= ~(1<<WDRF);
 | 
			
		||||
            wdt_disable();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -202,29 +237,3 @@ void bootloader_jump_after_watchdog_reset(void)
 | 
			
		|||
        }
 | 
			
		||||
    #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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue