add jump_bootloader.
This commit is contained in:
parent
7fd9003f59
commit
1de02c1f15
5 changed files with 63 additions and 3 deletions
3
Makefile
3
Makefile
|
@ -51,7 +51,8 @@ SRC = $(TARGET).c \
|
|||
usb_device.c \
|
||||
usb_keyboard.c \
|
||||
usb_debug.c \
|
||||
print.c
|
||||
print.c \
|
||||
jump_bootloader.c
|
||||
|
||||
|
||||
# MCU name, you MUST set this to match the board you are using
|
||||
|
|
35
jump_bootloader.c
Normal file
35
jump_bootloader.c
Normal file
|
@ -0,0 +1,35 @@
|
|||
// this code from:
|
||||
// http://www.pjrc.com/teensy/jump_to_bootloader.html
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
void jump_bootloader() {
|
||||
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
|
||||
DDRB = 0; DDRC = 0; DDRD = 0;
|
||||
TIMSK0 = 0; TIMSK1 = 0;
|
||||
asm volatile("jmp 0x1F00");
|
||||
#elif defined(__AVR_ATmega32U4__) // Teensy 2.0
|
||||
DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
|
||||
TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0;
|
||||
ADCSRA = 0;
|
||||
asm volatile("jmp 0x3F00");
|
||||
#elif defined(__AVR_AT90USB646__) // Teensy++ 1.0
|
||||
DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
|
||||
TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0;
|
||||
ADCSRA = 0;
|
||||
asm volatile("jmp 0x7E00");
|
||||
#elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0
|
||||
DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
|
||||
TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0;
|
||||
ADCSRA = 0;
|
||||
asm volatile("jmp 0xFE00");
|
||||
#endif
|
||||
}
|
6
jump_bootloader.h
Normal file
6
jump_bootloader.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef JUMP_BOOTLOADER_H
|
||||
#define JUMP_BOOTLOADER_H 1
|
||||
|
||||
void jump_bootloader(void);
|
||||
|
||||
#endif
|
12
mykey.c
12
mykey.c
|
@ -34,6 +34,7 @@
|
|||
#include "print.h"
|
||||
#include "matrix.h"
|
||||
#include "keymap.h"
|
||||
#include "jump_bootloader.h"
|
||||
|
||||
#define LED_CONFIG (DDRD |= (1<<6))
|
||||
#define LED_ON (PORTD &= ~(1<<6))
|
||||
|
@ -111,6 +112,13 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
// run bootloader when 4 left modifier keys down
|
||||
if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
|
||||
print("jump to bootloader...\n");
|
||||
_delay_ms(1000);
|
||||
jump_bootloader();
|
||||
}
|
||||
|
||||
if (key_index > 6) {
|
||||
//Rollover
|
||||
}
|
||||
|
@ -128,7 +136,7 @@ int main(void)
|
|||
|
||||
// print matrix state for debug
|
||||
if (modified) {
|
||||
print("r/c 01234567\n");
|
||||
print("\nr/c 01234567\n");
|
||||
for (row = 0; row < MATRIX_ROWS; row++) {
|
||||
phex(row); print(": ");
|
||||
pbin_reverse(matrix[row]);
|
||||
|
@ -159,6 +167,6 @@ ISR(TIMER0_OVF_vect)
|
|||
idle_count++;
|
||||
if (idle_count > 61 * 8) {
|
||||
idle_count = 0;
|
||||
//print("Timer Event :)\n");
|
||||
print(".");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,16 @@
|
|||
#define KEYBOARD_SIZE 8
|
||||
#define KEYBOARD_BUFFER EP_DOUBLE_BUFFER
|
||||
|
||||
// modifier bits
|
||||
#define MOD_LCTRL (1<<0)
|
||||
#define MOD_LSHIFT (1<<1)
|
||||
#define MOD_LALT (1<<2)
|
||||
#define MOD_LGUI (1<<3)
|
||||
#define MOD_RCTRL (1<<4)
|
||||
#define MOD_RSHIFT (1<<5)
|
||||
#define MOD_RALT (1<<6)
|
||||
#define MOD_RGUI (1<<7)
|
||||
|
||||
|
||||
extern uint8_t keyboard_modifier_keys;
|
||||
extern uint8_t keyboard_keys[6];
|
||||
|
|
Loading…
Reference in a new issue