/* | |||||
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. | |||||
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) {} |
/* | |||||
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. | |||||
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 |
#include "timer.h" | #include "timer.h" | ||||
#include "layer.h" | #include "layer.h" | ||||
#include "matrix.h" | #include "matrix.h" | ||||
#include "bootloader.h" | |||||
#include "command.h" | #include "command.h" | ||||
#ifdef HOST_PJRC | #ifdef HOST_PJRC | ||||
# include "jump_bootloader.h" | |||||
# include "usb_keyboard.h" | # include "usb_keyboard.h" | ||||
# ifdef EXTRAKEY_ENABLE | # ifdef EXTRAKEY_ENABLE | ||||
# include "usb_extra.h" | # include "usb_extra.h" | ||||
help(); | help(); | ||||
break; | break; | ||||
case KB_B: | case KB_B: | ||||
#ifdef HOST_PJRC | |||||
host_clear_keyboard_report(); | host_clear_keyboard_report(); | ||||
host_send_keyboard_report(); | host_send_keyboard_report(); | ||||
print("jump to bootloader...\n"); | |||||
print("jump to bootloader... "); | |||||
_delay_ms(1000); | _delay_ms(1000); | ||||
jump_bootloader(); // not return | |||||
#endif | |||||
bootloader_jump(); // not return | |||||
print("not supported.\n"); | |||||
break; | break; | ||||
case KB_D: | case KB_D: | ||||
debug_enable = !debug_enable; | debug_enable = !debug_enable; |
layer.c \ | layer.c \ | ||||
timer.c \ | timer.c \ | ||||
print.c \ | print.c \ | ||||
bootloader.c \ | |||||
util.c | util.c | ||||
usb_keyboard.c \ | usb_keyboard.c \ | ||||
usb_debug.c \ | usb_debug.c \ | ||||
usb.c \ | usb.c \ | ||||
jump_bootloader.c | |||||
bootloader_teensy.c | |||||
# Search Path | # Search Path |
#include <avr/io.h> | #include <avr/io.h> | ||||
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||||
#include <util/delay.h> | #include <util/delay.h> | ||||
#include "bootloader.h" | |||||
void jump_bootloader(void) { | |||||
void bootloader_jump(void) { | |||||
cli(); | cli(); | ||||
// disable watchdog, if enabled | // disable watchdog, if enabled | ||||
// disable all peripherals | // disable all peripherals |
/* See http://www.pjrc.com/teensy/jump_to_bootloader.html */ | |||||
#ifndef JUMP_BOOTLOADER_H | |||||
#define JUMP_BOOTLOADER_H 1 | |||||
void jump_bootloader(void); | |||||
#endif |
#include "print.h" | #include "print.h" | ||||
#include "debug.h" | #include "debug.h" | ||||
#include "util.h" | #include "util.h" | ||||
#include "jump_bootloader.h" | |||||
#include "bootloader.h" | |||||
#ifdef PS2_MOUSE_ENABLE | #ifdef PS2_MOUSE_ENABLE | ||||
# include "ps2_mouse.h" | # include "ps2_mouse.h" | ||||
#endif | #endif | ||||
if (matrix_key_count() >= 4) { | if (matrix_key_count() >= 4) { | ||||
print("jump to bootloader...\n"); | print("jump to bootloader...\n"); | ||||
_delay_ms(1000); | _delay_ms(1000); | ||||
jump_bootloader(); // not return | |||||
bootloader_jump(); // not return | |||||
} | } | ||||
SRC += vusb.c \ | SRC += vusb.c \ | ||||
usbdrv.c \ | usbdrv.c \ | ||||
usbdrvasm.S \ | usbdrvasm.S \ | ||||
oddebug.c | |||||
oddebug.c \ | |||||
bootloader_usbasp.c \ | |||||
ifdef NO_UART | ifdef NO_UART | ||||
SRC += sendchar_null.c | SRC += sendchar_null.c |
/* | |||||
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. | |||||
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"); | |||||
} |