@@ -1,22 +1,56 @@ | |||
/* | |||
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)(); | |||
} |
@@ -51,8 +51,7 @@ TARGET_DIR = . | |||
# List C source files here. (C dependencies are automatically generated.) | |||
SRC += keymap.c \ | |||
matrix.c \ | |||
led.c \ | |||
protocol/pjrc/bootloader_teensy.c | |||
led.c | |||
CONFIG_H = config.h | |||
@@ -95,7 +94,6 @@ ARCH = AVR8 | |||
F_USB = $(F_CPU) | |||
# Build Options | |||
# comment out to disable the options. | |||
# | |||
@@ -105,6 +103,15 @@ EXTRAKEY_ENABLE = yes # Audio control and System control | |||
#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 | |||
VPATH += $(TARGET_DIR) | |||
VPATH += $(TOP_DIR) |
@@ -5,8 +5,7 @@ OPT_DEFS += -DHOST_PJRC | |||
SRC += $(PJRC_DIR)/pjrc.c \ | |||
$(PJRC_DIR)/usb_keyboard.c \ | |||
$(PJRC_DIR)/usb_debug.c \ | |||
$(PJRC_DIR)/usb.c \ | |||
$(PJRC_DIR)/bootloader_teensy.c | |||
$(PJRC_DIR)/usb.c | |||
# Option modules | |||
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE) |
@@ -1,40 +0,0 @@ | |||
/* 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 | |||
} |