diff --git a/bootloader.c b/bootloader.c new file mode 100644 index 00000000..5cbfc72e --- /dev/null +++ b/bootloader.c @@ -0,0 +1,22 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#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 00000000..44775039 --- /dev/null +++ b/bootloader.h @@ -0,0 +1,25 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#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 22f25e99..e325a5d8 100644 --- a/command.c +++ b/command.c @@ -25,10 +25,10 @@ along with this program. If not, see . #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 17c6816f..03cbc296 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 0bc47ac9..e13a809a 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/jump_bootloader.c b/pjrc/bootloader_teensy.c similarity index 96% rename from pjrc/jump_bootloader.c rename to pjrc/bootloader_teensy.c index 27066a1e..9d34852f 100644 --- a/pjrc/jump_bootloader.c +++ b/pjrc/bootloader_teensy.c @@ -2,8 +2,9 @@ #include #include #include +#include "bootloader.h" -void jump_bootloader(void) { +void bootloader_jump(void) { cli(); // disable watchdog, if enabled // disable all peripherals diff --git a/pjrc/jump_bootloader.h b/pjrc/jump_bootloader.h deleted file mode 100644 index e858e3e1..00000000 --- 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 f84925d7..15f14920 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 7fd5dc05..9426efb2 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 00000000..6ec99cbf --- /dev/null +++ b/vusb/bootloader_usbasp.c @@ -0,0 +1,47 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#include +#include +#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"); +}