usb_device.c \ | usb_device.c \ | ||||
usb_keyboard.c \ | usb_keyboard.c \ | ||||
usb_debug.c \ | usb_debug.c \ | ||||
print.c | |||||
print.c \ | |||||
jump_bootloader.c | |||||
# MCU name, you MUST set this to match the board you are using | # MCU name, you MUST set this to match the board you are using |
// 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 | |||||
} |
#ifndef JUMP_BOOTLOADER_H | |||||
#define JUMP_BOOTLOADER_H 1 | |||||
void jump_bootloader(void); | |||||
#endif |
#include "print.h" | #include "print.h" | ||||
#include "matrix.h" | #include "matrix.h" | ||||
#include "keymap.h" | #include "keymap.h" | ||||
#include "jump_bootloader.h" | |||||
#define LED_CONFIG (DDRD |= (1<<6)) | #define LED_CONFIG (DDRD |= (1<<6)) | ||||
#define LED_ON (PORTD &= ~(1<<6)) | #define LED_ON (PORTD &= ~(1<<6)) | ||||
} | } | ||||
} | } | ||||
// 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) { | if (key_index > 6) { | ||||
//Rollover | //Rollover | ||||
} | } | ||||
// print matrix state for debug | // print matrix state for debug | ||||
if (modified) { | if (modified) { | ||||
print("r/c 01234567\n"); | |||||
print("\nr/c 01234567\n"); | |||||
for (row = 0; row < MATRIX_ROWS; row++) { | for (row = 0; row < MATRIX_ROWS; row++) { | ||||
phex(row); print(": "); | phex(row); print(": "); | ||||
pbin_reverse(matrix[row]); | pbin_reverse(matrix[row]); | ||||
idle_count++; | idle_count++; | ||||
if (idle_count > 61 * 8) { | if (idle_count > 61 * 8) { | ||||
idle_count = 0; | idle_count = 0; | ||||
//print("Timer Event :)\n"); | |||||
print("."); | |||||
} | } | ||||
} | } |
#define KEYBOARD_SIZE 8 | #define KEYBOARD_SIZE 8 | ||||
#define KEYBOARD_BUFFER EP_DOUBLE_BUFFER | #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_modifier_keys; | ||||
extern uint8_t keyboard_keys[6]; | extern uint8_t keyboard_keys[6]; |