#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "bootloader.h" /* Start Bootloader from Application * See * http://www.pjrc.com/teensy/jump_to_bootloader.html * http://www.fourwalledcubicle.com/files/LUFA/Doc/120219/html/_page__software_bootloader_start.html */ // TODO: support usbasp /* Boot Section Size in bytes * Teensy halfKay 512 * Atmel DFU loader 4096 * LUFA bootloader 4096 */ #ifndef BOOT_SIZE #define BOOT_SIZE 512 #endif #define FLASH_SIZE (FLASHEND + 1) #define BOOTLOADER_START (FLASHEND - BOOT_SIZE) void bootloader_jump(void) { cli(); // //Teensy // #if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) // disable watchdog, if enabled // disable all peripherals UDCON = 1; USBCON = (1<<FRZCLK); // disable USB UCSR1B = 0; _delay_ms(5); #else // This makes custom USBasploader come up. MCUSR = 0; #endif #if defined(__AVR_AT90USB162__) EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; TIMSK0 = 0; TIMSK1 = 0; UCSR1B = 0; DDRB = 0; DDRC = 0; DDRD = 0; PORTB = 0; PORTC = 0; PORTD = 0; #elif defined(__AVR_ATmega32U4__) EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0; UCSR1B = 0; TWCR = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; TWCR = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; #elif defined(__AVR_AT90USB646__) EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; #elif defined(__AVR_AT90USB1286__) EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; #endif // //USBasp // #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 // start Bootloader ((void (*)(void))BOOTLOADER_START)(); }