From: tmk <nobody@nowhere>
Date: Fri, 24 Sep 2010 06:01:21 +0000 (+0900)
Subject: add jump_bootloader.
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=1de02c1f15ca1c04aae0bde818b01ea40cf32120;p=tmk_firmware.git

add jump_bootloader.
---

diff --git a/Makefile b/Makefile
index 7473d3c..c9c668d 100644
--- 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
index 0000000..f60c359
--- /dev/null
+++ b/jump_bootloader.c
@@ -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
index 0000000..9e923e8
--- /dev/null
+++ b/jump_bootloader.h
@@ -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 3176298..dcb0852 100644
--- 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(".");
     }
 }
diff --git a/usb_keyboard.h b/usb_keyboard.h
index 3a9e51c..cd8ec4a 100644
--- a/usb_keyboard.h
+++ b/usb_keyboard.h
@@ -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];