@@ -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 |
@@ -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 | |||
} |
@@ -0,0 +1,6 @@ | |||
#ifndef JUMP_BOOTLOADER_H | |||
#define JUMP_BOOTLOADER_H 1 | |||
void jump_bootloader(void); | |||
#endif |
@@ -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]; |