~ruther/qmk_firmware

1de02c1f15ca1c04aae0bde818b01ea40cf32120 — tmk 15 years ago 7fd9003
add jump_bootloader.
5 files changed, 63 insertions(+), 3 deletions(-)

M Makefile
A jump_bootloader.c
A jump_bootloader.h
M mykey.c
M usb_keyboard.h
M Makefile => Makefile +2 -1
@@ 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

A jump_bootloader.c => jump_bootloader.c +35 -0
@@ 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 
}

A jump_bootloader.h => jump_bootloader.h +6 -0
@@ 0,0 1,6 @@
#ifndef JUMP_BOOTLOADER_H
#define JUMP_BOOTLOADER_H 1

void jump_bootloader(void);

#endif

M mykey.c => mykey.c +10 -2
@@ 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(".");
    }
}

M usb_keyboard.h => usb_keyboard.h +10 -0
@@ 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];