#include #include #include #include #include #include #include "bootloader.h" #ifdef PROTOCOL_LUFA #include #endif /* Bootloader Size in *bytes* * * AVR Boot section size are defined by setting BOOTSZ fuse in fact. Consult with your MCU datasheet. * Note that 'Word'(2 bytes) size and address are used in datasheet while TMK uses 'Byte'. * * Size of Bootloaders in bytes: * Atmel DFU loader(ATmega32U2) 4096 * Atmel DFU loader(ATmega32U4) 4096 * Atmel DFU loader(AT90USB128) 8192 * LUFA bootloader(ATmega32U4) 4096 * Arduino Caterina(ATmega32U4) 4096 * USBaspLoader(ATmega***) 2048 * Teensy halfKay(ATmega32U4) 512 * Teensy++ halfKay(AT90USB128) 1024 * * * AVR Boot section is located at the end of Flash memory. * * byte ATMega32u4 with 4096-byte Boot section * 0x0000 +---------------+ * | | * | | * | Application | 28KB * | | * = = * | | * 0x7000 +---------------+ <---- BOOTLOADER_START * | Bootloader | 4KB BOOTLOADER_SIZE * 0x7FFF +---------------+ <---- FLASHEND */ #ifndef BOOTLOADER_SIZE #warning To use bootloader_jump() you need to define BOOTLOADER_SIZE in config.h. #define BOOTLOADER_SIZE 4096 #endif #define FLASH_SIZE (FLASHEND + 1L) #define BOOTLOADER_START (FLASH_SIZE - BOOTLOADER_SIZE) /* * Entering the Bootloader via Software * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html */ #define BOOTLOADER_RESET_KEY 0xB007B007 uint32_t reset_key __attribute__ ((section (".noinit"))); /* initialize MCU status by watchdog reset */ void bootloader_jump(void) { #ifdef PROTOCOL_LUFA USB_Disable(); cli(); _delay_ms(2000); #endif #ifdef PROTOCOL_PJRC cli(); UDCON = 1; USBCON = (1<