Browse Source

add jump_bootloader.

tmk 14 years ago
parent
commit
1de02c1f15
5 changed files with 63 additions and 3 deletions
  1. 2 1
      Makefile
  2. 35 0
      jump_bootloader.c
  3. 6 0
      jump_bootloader.h
  4. 10 2
      mykey.c
  5. 10 0
      usb_keyboard.h

+ 2 - 1
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 - 0
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 
+}

+ 6 - 0
jump_bootloader.h

@@ -0,0 +1,6 @@
+#ifndef JUMP_BOOTLOADER_H
+#define JUMP_BOOTLOADER_H 1
+
+void jump_bootloader(void);
+
+#endif

+ 10 - 2
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 - 0
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];