]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
add jump_bootloader.
authortmk <nobody@nowhere>
Fri, 24 Sep 2010 06:01:21 +0000 (15:01 +0900)
committertmk <nobody@nowhere>
Fri, 24 Sep 2010 06:16:23 +0000 (15:16 +0900)
Makefile
jump_bootloader.c [new file with mode: 0644]
jump_bootloader.h [new file with mode: 0644]
mykey.c
usb_keyboard.h

index 7473d3c312ea80f0a6933b984a4e409a6b978a71..c9c668d4157ec248ae1cd7c98b97e3f95432c71a 100644 (file)
--- a/Makefile
+++ b/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
diff --git a/jump_bootloader.c b/jump_bootloader.c
new file mode 100644 (file)
index 0000000..f60c359
--- /dev/null
@@ -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 
+}
diff --git a/jump_bootloader.h b/jump_bootloader.h
new file mode 100644 (file)
index 0000000..9e923e8
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef JUMP_BOOTLOADER_H
+#define JUMP_BOOTLOADER_H 1
+
+void jump_bootloader(void);
+
+#endif
diff --git a/mykey.c b/mykey.c
index 3176298485d3492c08488362ff3249b899350c86..dcb0852ec43d0a6739986268a683c6767bb3c83b 100644 (file)
--- a/mykey.c
+++ b/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(".");
     }
 }
index 3a9e51ce4b482e779fb2158d7b4bc1cfa613034c..cd8ec4a9d19b41753784402d6f3db1aaed15e9c9 100644 (file)
 #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];