/* | |||||
Copyright 2011 Jun Wako <[email protected]> | |||||
This program is free software: you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation, either version 2 of the License, or | |||||
(at your option) any later version. | |||||
#include <avr/io.h> | |||||
#include <avr/interrupt.h> | |||||
#include <util/delay.h> | |||||
#include "bootloader.h" | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
/* 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 | |||||
*/ | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
/* Boot Section Size in bytes | |||||
* Teensy halfKay 512 | |||||
* Atmel DFU loader 4096 | |||||
* LUFA bootloader 4096 | |||||
*/ | |||||
#ifndef BOOT_SIZE | |||||
#define BOOT_SIZE 512 | |||||
#endif | |||||
#include "bootloader.h" | |||||
#define FLASH_SIZE (FLASHEND + 1) | |||||
#define BOOTLOADER_START (FLASHEND - BOOT_SIZE) | |||||
void bootloader_jump(void) { | |||||
cli(); | |||||
// disable watchdog, if enabled | |||||
// disable all peripherals | |||||
UDCON = 1; | |||||
USBCON = (1<<FRZCLK); // disable USB | |||||
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; | |||||
#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 | |||||
void bootloader_jump(void) __attribute__ ((weak)); | |||||
void bootloader_jump(void) {} | |||||
// start Bootloader | |||||
((void (*)(void))BOOTLOADER_START)(); | |||||
} |
# List C source files here. (C dependencies are automatically generated.) | # List C source files here. (C dependencies are automatically generated.) | ||||
SRC += keymap.c \ | SRC += keymap.c \ | ||||
matrix.c \ | matrix.c \ | ||||
led.c \ | |||||
protocol/pjrc/bootloader_teensy.c | |||||
led.c | |||||
CONFIG_H = config.h | CONFIG_H = config.h | ||||
F_USB = $(F_CPU) | F_USB = $(F_CPU) | ||||
# Build Options | # Build Options | ||||
# comment out to disable the options. | # comment out to disable the options. | ||||
# | # | ||||
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support | #PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support | ||||
# Boot Section Size in bytes | |||||
# Teensy halfKay 512 | |||||
# Atmel DFU loader 4096 | |||||
# LUFA bootloader 4096 | |||||
#ifndef BOOT_SIZE | |||||
#define BOOT_SIZE 512 | |||||
#endif | |||||
# Search Path | # Search Path | ||||
VPATH += $(TARGET_DIR) | VPATH += $(TARGET_DIR) | ||||
VPATH += $(TOP_DIR) | VPATH += $(TOP_DIR) |
SRC += $(PJRC_DIR)/pjrc.c \ | SRC += $(PJRC_DIR)/pjrc.c \ | ||||
$(PJRC_DIR)/usb_keyboard.c \ | $(PJRC_DIR)/usb_keyboard.c \ | ||||
$(PJRC_DIR)/usb_debug.c \ | $(PJRC_DIR)/usb_debug.c \ | ||||
$(PJRC_DIR)/usb.c \ | |||||
$(PJRC_DIR)/bootloader_teensy.c | |||||
$(PJRC_DIR)/usb.c | |||||
# Option modules | # Option modules | ||||
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE) | ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE) |
/* See http://www.pjrc.com/teensy/jump_to_bootloader.html */ | |||||
#include <avr/io.h> | |||||
#include <avr/interrupt.h> | |||||
#include <util/delay.h> | |||||
#include "bootloader.h" | |||||
void bootloader_jump(void) { | |||||
cli(); | |||||
// disable watchdog, if enabled | |||||
// disable all peripherals | |||||
UDCON = 1; | |||||
USBCON = (1<<FRZCLK); // disable USB | |||||
UCSR1B = 0; | |||||
_delay_ms(5); | |||||
#if defined(__AVR_AT90USB162__) // Teensy 1.0 | |||||
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__) // Teensy 2.0 | |||||
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__) // Teensy++ 1.0 | |||||
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__) // Teensy++ 2.0 | |||||
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 | |||||
} |