123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include <stdint.h>
- #include <stdbool.h>
- #include <avr/io.h>
- #include <avr/eeprom.h>
- #include <avr/interrupt.h>
- #include <avr/wdt.h>
- #include <util/delay.h>
- #include "bootloader.h"
- #include <avr/boot.h>
- #ifdef PROTOCOL_LUFA
- #include <LUFA/Drivers/USB/USB.h>
- #endif
- #define FLASH_SIZE (FLASHEND + 1L)
- #if !defined(BOOTLOADER_SIZE)
- uint16_t bootloader_start;
- #endif
- #define BOOT_SIZE_256 0b110
- #define BOOT_SIZE_512 0b100
- #define BOOT_SIZE_1024 0b010
- #define BOOT_SIZE_2048 0b000
- #define BOOTLOADER_RESET_KEY 0xB007B007
- uint32_t reset_key __attribute__ ((section (".noinit")));
- void bootloader_jump(void) {
- #if !defined(BOOTLOADER_SIZE)
- uint8_t high_fuse = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS);
- if (high_fuse & BOOT_SIZE_256) {
- bootloader_start = (FLASH_SIZE - 512) >> 1;
- } else if (high_fuse & BOOT_SIZE_512) {
- bootloader_start = (FLASH_SIZE - 1024) >> 1;
- } else if (high_fuse & BOOT_SIZE_1024) {
- bootloader_start = (FLASH_SIZE - 2048) >> 1;
- } else {
- bootloader_start = (FLASH_SIZE - 4096) >> 1;
- }
- #endif
-
-
- #if defined(BOOTLOADER_HALFKAY)
-
- cli();
-
-
-
- UDCON = 1;
- USBCON = (1<<FRZCLK);
- UCSR1B = 0;
- _delay_ms(5);
- #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;
- asm volatile("jmp 0x3E00");
- #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;
- asm volatile("jmp 0x7E00");
- #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;
- asm volatile("jmp 0xFC00");
- #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;
- asm volatile("jmp 0x1FC00");
- #endif
- #elif defined(BOOTLOADER_CATERINA)
-
-
- uint16_t *const bootKeyPtr = (uint16_t *)0x0800;
-
-
- uint16_t bootKey = 0x7777;
- *bootKeyPtr = bootKey;
-
- wdt_enable(WDTO_60MS);
- while(1) {}
- #else
- #ifndef __AVR_ATmega32A__
- UDCON = 1;
- USBCON = (1<<FRZCLK);
- UCSR1B = 0;
- _delay_ms(5);
- #endif
- #ifdef BOOTLOADER_BOOTLOADHID
-
-
- eeprom_write_byte((uint8_t *)1, 0x00);
- #endif
-
- reset_key = BOOTLOADER_RESET_KEY;
- wdt_enable(WDTO_250MS);
- for (;;);
- #endif
- }
- #ifdef __AVR_ATmega32A__
-
- #define MCUSR MCUCSR
- #endif
- 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) {
- reset_key = 0;
-
- MCUSR = 0;
-
- MCUSR &= ~(1<<WDRF);
- wdt_disable();
-
- #ifdef BOOTLOADER_SIZE
- ((void (*)(void))( (FLASH_SIZE - BOOTLOADER_SIZE) >> 1))();
- #else
- asm("ijmp" :: "z" (bootloader_start));
- #endif
- }
- #endif
- }
- #if 0
-
- #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
-
- MCUSR = 0;
-
- PORTB = 0; PORTC= 0; PORTD = 0;
- DDRB = 0; DDRC= 0; DDRD = 0;
-
- 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
-
- ((void (*)(void))(BOOTLOADER_START/2))();
- }
- #endif
|