From: tmk <nobody@nowhere> Date: Thu, 22 Sep 2011 07:56:36 +0000 (+0900) Subject: Refactored bootloader jumping. Added USBaspLoader support. X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e65575d4a5f03a90adfa9850cb71a5d0448098cd;p=tmk_firmware.git Refactored bootloader jumping. Added USBaspLoader support. --- diff --git a/bootloader.c b/bootloader.c new file mode 100644 index 0000000..5cbfc72 --- /dev/null +++ b/bootloader.c @@ -0,0 +1,22 @@ +/* +Copyright 2011 Jun Wako <wakojun@gmail.com> + +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. + +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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "bootloader.h" + + +void bootloader_jump(void) __attribute__ ((weak)); +void bootloader_jump(void) {} diff --git a/bootloader.h b/bootloader.h new file mode 100644 index 0000000..4477503 --- /dev/null +++ b/bootloader.h @@ -0,0 +1,25 @@ +/* +Copyright 2011 Jun Wako <wakojun@gmail.com> + +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. + +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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BOOTLOADER_H +#define BOOTLOADER_H + + +/* give code for your bootloader to come up if needed */ +void bootloader_jump(void); + +#endif diff --git a/command.c b/command.c index 22f25e9..e325a5d 100644 --- a/command.c +++ b/command.c @@ -25,10 +25,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "timer.h" #include "layer.h" #include "matrix.h" +#include "bootloader.h" #include "command.h" #ifdef HOST_PJRC -# include "jump_bootloader.h" # include "usb_keyboard.h" # ifdef EXTRAKEY_ENABLE # include "usb_extra.h" @@ -78,13 +78,12 @@ static uint8_t command_common(void) help(); break; case KB_B: -#ifdef HOST_PJRC host_clear_keyboard_report(); host_send_keyboard_report(); - print("jump to bootloader...\n"); + print("jump to bootloader... "); _delay_ms(1000); - jump_bootloader(); // not return -#endif + bootloader_jump(); // not return + print("not supported.\n"); break; case KB_D: debug_enable = !debug_enable; diff --git a/common.mk b/common.mk index 17c6816..03cbc29 100644 --- a/common.mk +++ b/common.mk @@ -4,6 +4,7 @@ SRC += host.c \ layer.c \ timer.c \ print.c \ + bootloader.c \ util.c diff --git a/pjrc.mk b/pjrc.mk index 0bc47ac..e13a809 100644 --- a/pjrc.mk +++ b/pjrc.mk @@ -4,7 +4,7 @@ SRC += pjrc.c \ usb_keyboard.c \ usb_debug.c \ usb.c \ - jump_bootloader.c + bootloader_teensy.c # Search Path diff --git a/pjrc/bootloader_teensy.c b/pjrc/bootloader_teensy.c new file mode 100644 index 0000000..9d34852 --- /dev/null +++ b/pjrc/bootloader_teensy.c @@ -0,0 +1,40 @@ +/* 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 +} diff --git a/pjrc/jump_bootloader.c b/pjrc/jump_bootloader.c deleted file mode 100644 index 27066a1..0000000 --- a/pjrc/jump_bootloader.c +++ /dev/null @@ -1,39 +0,0 @@ -/* See http://www.pjrc.com/teensy/jump_to_bootloader.html */ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <util/delay.h> - -void jump_bootloader(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 -} diff --git a/pjrc/jump_bootloader.h b/pjrc/jump_bootloader.h deleted file mode 100644 index e858e3e..0000000 --- a/pjrc/jump_bootloader.h +++ /dev/null @@ -1,7 +0,0 @@ -/* See http://www.pjrc.com/teensy/jump_to_bootloader.html */ -#ifndef JUMP_BOOTLOADER_H -#define JUMP_BOOTLOADER_H 1 - -void jump_bootloader(void); - -#endif diff --git a/pjrc/main.c b/pjrc/main.c index f84925d..15f1492 100644 --- a/pjrc/main.c +++ b/pjrc/main.c @@ -31,7 +31,7 @@ #include "print.h" #include "debug.h" #include "util.h" -#include "jump_bootloader.h" +#include "bootloader.h" #ifdef PS2_MOUSE_ENABLE # include "ps2_mouse.h" #endif @@ -86,7 +86,7 @@ int main(void) if (matrix_key_count() >= 4) { print("jump to bootloader...\n"); _delay_ms(1000); - jump_bootloader(); // not return + bootloader_jump(); // not return } diff --git a/vusb.mk b/vusb.mk index 7fd5dc0..9426efb 100644 --- a/vusb.mk +++ b/vusb.mk @@ -3,7 +3,9 @@ OPT_DEFS += -DHOST_VUSB SRC += vusb.c \ usbdrv.c \ usbdrvasm.S \ - oddebug.c + oddebug.c \ + bootloader_usbasp.c \ + ifdef NO_UART SRC += sendchar_null.c diff --git a/vusb/bootloader_usbasp.c b/vusb/bootloader_usbasp.c new file mode 100644 index 0000000..6ec99cb --- /dev/null +++ b/vusb/bootloader_usbasp.c @@ -0,0 +1,47 @@ +/* +Copyright 2011 Jun Wako <wakojun@gmail.com> + +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. + +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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include <avr/interrupt.h> +#include "bootloader.h" + + +void bootloader_jump(void) { + cli(); + // This makes custom USBasploader come up. + MCUSR = 0; + + // ATmega168PA + // 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; + + // Boot Loader Section Start Address: + // BOOTSZ Size Address + // (lock bit) (word) (word) (byte) + // '11' 128 0x1F80 0x3F00 + // '10' 256 0x1F00 0x3E00 + // '01' 512 0x1E00 0x3C00 + // '00' 1024 0x1C00 0x3800 + asm volatile("jmp 0x3800"); +}