2012-06-30 02:19:07 +00:00
# include <avr/io.h>
# include <avr/interrupt.h>
# include <util/delay.h>
# include "bootloader.h"
2011-09-22 07:56:36 +00:00
2012-06-30 02:19:07 +00:00
/* 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
*/
2011-09-22 07:56:36 +00:00
2012-06-30 04:26:09 +00:00
// TODO: support usbasp
2012-06-30 02:19:07 +00:00
/* Boot Section Size in bytes
* Teensy halfKay 512
* Atmel DFU loader 4096
* LUFA bootloader 4096
*/
# ifndef BOOT_SIZE
# define BOOT_SIZE 512
# endif
2011-09-22 07:56:36 +00:00
2012-06-30 02:19:07 +00:00
# define FLASH_SIZE (FLASHEND + 1)
# define BOOTLOADER_START (FLASHEND - BOOT_SIZE)
2011-09-22 07:56:36 +00:00
2012-06-30 02:19:07 +00:00
void bootloader_jump ( void ) {
cli ( ) ;
2012-06-30 05:44:14 +00:00
//
//Teensy
//
# if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
2012-06-30 02:19:07 +00:00
// disable watchdog, if enabled
// disable all peripherals
UDCON = 1 ;
USBCON = ( 1 < < FRZCLK ) ; // disable USB
UCSR1B = 0 ;
_delay_ms ( 5 ) ;
2012-06-30 05:44:14 +00:00
# else
// This makes custom USBasploader come up.
MCUSR = 0 ;
# endif
2012-06-30 02:19:07 +00:00
# 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
2011-09-22 07:56:36 +00:00
2012-06-30 05:44:14 +00:00
//
//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
2012-06-30 02:19:07 +00:00
// start Bootloader
( ( void ( * ) ( void ) ) BOOTLOADER_START ) ( ) ;
}