]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
version 1.0.
authortmk <nobody@nowhere>
Sat, 2 Oct 2010 02:51:42 +0000 (11:51 +0900)
committertmk <nobody@nowhere>
Sat, 2 Oct 2010 16:30:56 +0000 (01:30 +0900)
Makefile
README
keymap.c
mykey.c [deleted file]
tmk.c [new file with mode: 0644]
usb_keycodes.h

index 1fe3ffa2b10ac859da10260ce27b93838494f07d..d259fd2dbfd31e2c6fe016341775927055990a9c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -41,7 +41,7 @@
 
 
 # Target file name (without extension).
-TARGET = mykey
+TARGET = tmk
 
 
 # List C source files here. (C dependencies are automatically generated.)
diff --git a/README b/README
index 15eb28ff0db8126a573477fcccddffc262f15bcf..c8d81a9c38d496c4879bae872db6ea694fce4ed6 100644 (file)
--- a/README
+++ b/README
@@ -1,40 +1,29 @@
-Keyboard Firmware
-=================
-2010/08/23 noname
+t.m.k. Keyboard Firmware
+========================
+This is keyboard firmware for PFU HHKB style keyboard and teensy 2.0.
+OS see this as composite device which has keyboard and mouse.
+
+The project is heavily based on PJRC USB Keyboard/Mouse Example and
+owes a debt to preceding keyboard firmware projects.
 
 
 VERSION
 -------
 0.1     2010/08/23
-        implemented for macway modified.
-        It works as normal keyboard now.
-
+        It works as normal keyboard.
+        It is for modified Macway keyboard(TP-999KB-E).
 
-TODO
-----
-modulization
-    clean source
-debouncing
-    will be coded when bouncing occurs.
-    bouncing doesnt occur on my alps switch so far.
-    scan rate is too slow?(to be measure)
-anti-ghost
-    2010/09/13 done
-sleep&wakeup
-boot keyboard support
-mouse key
-keymap layer
-    2010/09/16 simple layer(HHKB/vi cursor)
-    key combination switch
-    toggle siwtch
-setting menu(wizard)
-    debug console
-    keymap setting
-    matrix display
-PS/2 keyboard mode
-HHKB support
-Trackpoint(PS/2) support
-    Thinkpad keyboard support
+1.0     2010/10/02
+        keyboard has mouse key now.
+        keyboard with layers.(see keymap.c)
+            FN_1(right cmd):
+                vi style layer
+            FN_2(next to right shift):
+                HHKB style layer
+            FN_3(left bottom):
+                h j k l:   mouse move
+                a s d spc: mouse buttons
+                m ,:       mouse wheel
 
 
 target board
@@ -43,10 +32,11 @@ Teensy 2.0
 http://www.pjrc.com/teensy
 
 
-projects based on/related to
-----------------------------
-PJRC USB Keyboard Example
+projects related
+----------------
+PJRC USB Keyboard/Mouse Example
     http://www.pjrc.com/teensy/usb_keyboard.html
+    http://www.pjrc.com/teensy/usb_mouse.html
 kbupgrade
     http://github.com/rhomann/kbupgrade
     http://geekhack.org/showwiki.php?title=Island:8406
@@ -65,4 +55,25 @@ ps2avr
     http://sourceforge.net/projects/ps2avr/
 
 
+TODO
+----
+licensing notes(GPL)
+    I think GPL is not infringement of PJRC license.
+souce code cleaning
+sleep&wakeup
+debouncing
+    will be coded when bouncing occurs.
+    bouncing doesnt occur on my ALPS switch so far.
+    scan rate is too slow?(to be measure)
+setting menu(wizard)
+    debug console
+    keymap setting
+    matrix display
+PS/2 keyboard mode
+support for HHKB pro matrix signal
+Trackpoint(PS/2) support
+Thinkpad keyboard support
+mouse horizontal wheel
+
+
 EOF
index d208ad2427677c7bc92edef864fe684f12abf20c..2d92e18725f44406c2c38329b4cd5843814cc51a 100644 (file)
--- a/keymap.c
+++ b/keymap.c
@@ -12,15 +12,15 @@ static const uint8_t PROGMEM Keymap[][MATRIX_ROWS][MATRIX_COLS] = {
     {
         { KB_LALT, KB_NO,     KB_BSPACE,  KB_NO, KB_LEFT,   KB_NO,      KB_ENTER, KB_SPACE },
         { KB_1,    KB_ESCAPE, KB_TAB,     KB_Q,  KB_A,      KB_LCTRL,   KB_Z,     KB_RIGHT },
-        { KB_2,    FN_0,      KB_LGUI,    KB_W,  KB_S,      KB_NO,      KB_X,     KB_UP },
-        { KB_3,    KB_NO,     KB_RSHIFT,  KB_E,  KB_D,      FN_1,       KB_C,     KB_DOWN },
+        { KB_2,    FN_1,      KB_LGUI,    KB_W,  KB_S,      KB_NO,      KB_X,     KB_UP },
+        { KB_3,    KB_NO,     KB_RSHIFT,  KB_E,  KB_D,      FN_2,       KB_C,     KB_DOWN },
         { KB_4,    KB_5,      KB_T,       KB_R,  KB_F,      KB_G,       KB_V,     KB_B },
         { KB_7,    KB_6,      KB_Y,       KB_U,  KB_J,      KB_H,       KB_M,     KB_N },
         { KB_8,    KB_EQUAL,  KB_RBRACKET,KB_I,  KB_K,      KB_NO,      KB_COMMA, KB_LSHIFT },
-        { KB_9,    KB_NO,     KB_NO,      KB_O,  KB_L,      FN_2,       KB_DOT,   KB_NO },
+        { KB_9,    KB_NO,     KB_NO,      KB_O,  KB_L,      FN_3,       KB_DOT,   KB_NO },
         { KB_0,    KB_MINUS,  KB_LBRACKET,KB_P,  KB_SCOLON, KB_QUOTE,   KB_NO,    KB_SLASH }
     },
-    // 1: FN_0(RIGHT ALT)
+    // 1: FN_1(RIGHT ALT)
     {
         { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, KB_NO,     KB_NO,      KB_BSLASH,KB_NO },
         { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, KB_NO,     KB_LCTRL,   KB_NO,    KB_NO },
@@ -32,7 +32,7 @@ static const uint8_t PROGMEM Keymap[][MATRIX_ROWS][MATRIX_COLS] = {
         { KB_F9,   KB_NO,     KB_NO,      KB_NO, KB_RIGHT,  KB_NO,      KB_END,   KB_NO },
         { KB_F10,  KB_F11,    KB_NO,      KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO }
     },
-    // 2: FN_1(HHKB Fn)
+    // 2: FN_2(HHKB Fn)
     {
         { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, KB_NO,     KB_NO,      KB_BSLASH,KB_NO },
         { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, KB_VOLDOWN,KB_LCTRL,   KB_NO,    KB_NO },
@@ -44,7 +44,7 @@ static const uint8_t PROGMEM Keymap[][MATRIX_ROWS][MATRIX_COLS] = {
         { KB_F9,   KB_NO,     KB_NO,      KB_NO, KB_PGUP,   KB_NO,      KB_PGDOWN,KB_NO },
         { KB_F10,  KB_F11,    KB_UP,      KB_NO, KB_LEFT,   KB_RIGHT,   KB_NO,    KB_DOWN }
     },
-    // 3: FN_2(LEFT Bottom)
+    // 3: FN_3(LEFT Bottom)
     {
         { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, MS_LEFT,   KB_NO,      KB_BSLASH,  MS_BTN1 },
         { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, MS_BTN1,   KB_LCTRL,   KB_NO,      MS_RIGHT },
@@ -73,9 +73,9 @@ int get_layer(void) {
     for (int row = 0; row < MATRIX_ROWS; row++) {
         for (int col = 0; col < MATRIX_ROWS; col++) {
             if (matrix[row] & 1<<col) continue;
-            if (get_keycode(0, row, col) == FN_0) layer = 1;
-            if (get_keycode(0, row, col) == FN_1) layer = 2;
-            if (get_keycode(0, row, col) == FN_2) layer = 3;
+            if (get_keycode(0, row, col) == FN_1) layer = 1;
+            if (get_keycode(0, row, col) == FN_2) layer = 2;
+            if (get_keycode(0, row, col) == FN_3) layer = 3;
         }
     }
     current_layer = layer;
diff --git a/mykey.c b/mykey.c
deleted file mode 100644 (file)
index 52d06d6..0000000
--- a/mykey.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* 2010/08/23 noname
- * keyboard firmware based on PJRC USB keyboard example
- */
-/* Keyboard example with debug channel, for Teensy USB Development Board
- * http://www.pjrc.com/teensy/usb_keyboard.html
- * Copyright (c) 2008 PJRC.COM, LLC
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/pgmspace.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "usb.h"
-#include "usb_keyboard.h"
-#include "usb_mouse.h"
-#include "print.h"
-#include "matrix.h"
-#include "keymap.h"
-#include "jump_bootloader.h"
-
-
-// for teensy 2.0
-#define LED_CONFIG    (DDRD |= (1<<6))
-#define LED_ON        (PORTD |= (1<<6))
-#define LED_OFF       (PORTD &= ~(1<<6))
-#define CPU_PRESCALE(n)    (CLKPR = 0x80, CLKPR = (n))
-
-#define MOUSE_MOVE_UNIT 10
-#define MOUSE_DELAY_MS 200
-#define MOUSE_DELAY_ACC 4
-
-
-static void print_matrix(void);
-
-
-uint16_t idle_count=0;
-
-
-int main(void)
-{
-    // set for 16 MHz clock
-    CPU_PRESCALE(0);
-
-    // Initialize the USB, and then wait for the host to set configuration.
-    // If the Teensy is powered without a PC connected to the USB port,
-    // this will wait forever.
-    usb_init();
-    while (!usb_configured()) /* wait */ ;
-
-    // Wait an extra second for the PC's operating system to load drivers
-    // and do whatever it does to actually be ready for input
-    // needs such long time in my PC.
-    for (int i =0; i < 6; i++) {
-        LED_CONFIG;
-        LED_ON;
-        _delay_ms(500);
-        LED_OFF;
-        _delay_ms(500);
-    }
-
-    // Configure timer 0 to generate a timer overflow interrupt every
-    // 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock
-    // This demonstrates how to use interrupts to implement a simple
-    // inactivity timeout.
-    TCCR0A = 0x00;
-    TCCR0B = 0x05;
-    TIMSK0 = (1<<TOIE0);
-
-
-    matrix_init();
-
-    bool modified = false;
-    bool has_ghost = false;
-    int layer = 0;
-    int key_index = 0;
-    uint8_t mouse_x = 0;
-    uint8_t mouse_y = 0;
-    uint8_t mouse_btn = 0;
-    int8_t mouse_wheel = 0;
-    int8_t mouse_hwheel = 0;
-    int mouse_repeat = 0;
-
-    print("\nt.m.k. keyboard 1.0\n");
-    while (1) {
-        matrix_scan();
-        modified = matrix_is_modified();
-        has_ghost = matrix_has_ghost();
-        layer = get_layer();
-
-        // print matrix state for debug
-        if (modified) {
-            print_matrix();
-
-            LED_CONFIG;
-            LED_ON;
-        }
-
-        keyboard_modifier_keys = 0;
-        for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
-        key_index = 0;
-        mouse_x = 0;
-        mouse_y = 0;
-        mouse_btn = 0;
-        mouse_wheel = 0;
-        mouse_hwheel = 0;
-
-        // convert matrix state to HID report
-        for (int row = 0; row < MATRIX_ROWS; row++) {
-            for (int col = 0; col < MATRIX_COLS; col++) {
-                if (matrix[row] & 1<<col) continue;
-
-                uint8_t code = get_keycode(layer, row, col);
-                if (code == KB_NO) {
-                    continue;
-                } else if (KB_LCTRL <= code && code <= KB_RGUI) {
-                    // modifier keys(0xE0-0xE7)
-                    keyboard_modifier_keys |= 1<<(code & 0x07);
-                } else if (code >= MS_UP) {
-                    // mouse
-                    if (code == MS_UP)    mouse_y -= MOUSE_MOVE_UNIT;
-                    if (code == MS_DOWN)  mouse_y += MOUSE_MOVE_UNIT;
-                    if (code == MS_LEFT)  mouse_x -= MOUSE_MOVE_UNIT;
-                    if (code == MS_RIGHT) mouse_x += MOUSE_MOVE_UNIT;
-                    if (code == MS_BTN1)  mouse_btn |= 1<<0;
-                    if (code == MS_BTN2)  mouse_btn |= 1<<1;
-                    if (code == MS_BTN3)  mouse_btn |= 1<<2;
-                    if (code == MS_BTN4)  mouse_btn |= 1<<3;
-                    if (code == MS_BTN5)  mouse_btn |= 1<<4;
-                    if (code == MS_WH_UP)  mouse_wheel -= 1;
-                    if (code == MS_WH_DOWN)  mouse_wheel += 1;
-                    if (code == MS_WH_LEFT)  mouse_hwheel -= 1;
-                    if (code == MS_WH_RIGHT) mouse_hwheel += 1;
-                } else {
-                    // normal keys
-                    if (key_index < 6)
-                        keyboard_keys[key_index] = code;
-                    key_index++;
-                }
-            }
-        }
-
-        if (!has_ghost)  {
-            // when 4 left modifier keys down
-            if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
-                // cancel all keys
-                keyboard_modifier_keys = 0;
-                for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
-                usb_keyboard_send();
-
-                print("jump to bootloader...\n");
-                _delay_ms(100);
-                jump_bootloader(); // not return
-            }
-
-            if (mouse_x || mouse_y || mouse_wheel || mouse_hwheel || mouse_btn != mouse_buttons) {
-                mouse_buttons = mouse_btn;
-                usb_mouse_move(mouse_x, mouse_y, mouse_wheel, mouse_hwheel);
-
-                // acceleration
-                _delay_ms(MOUSE_DELAY_MS >> (mouse_repeat < MOUSE_DELAY_ACC ? mouse_repeat : MOUSE_DELAY_ACC));
-                mouse_repeat++;
-            } else {
-                mouse_repeat = 0;
-            }
-
-
-            // send keys to host
-            if (modified) {
-                if (key_index > 6) {
-                    //Rollover
-                }
-                usb_keyboard_send();
-            }
-        }
-        _delay_ms(2);
-    }
-}
-
-static void print_matrix(void) {
-            print("\nr/c 01234567\n");
-            for (int row = 0; row < MATRIX_ROWS; row++) {
-                phex(row); print(": ");
-                pbin_reverse(matrix[row]);
-                if (matrix_has_ghost_in_row(row)) {
-                    print(" <ghost");
-                }
-                print("\n");
-            }
-            print("keys: ");
-            for (int i = 0; i < 6; i++) { phex(keyboard_keys[i]); print(" "); }
-            print("\n");
-            print("mod: "); phex(keyboard_modifier_keys); print("\n");
-}
-
-// This interrupt routine is run approx 61 times per second.
-// A very simple inactivity timeout is implemented, where we
-// will send a space character and print a message to the
-// hid_listen debug message window.
-ISR(TIMER0_OVF_vect)
-{
-    idle_count++;
-}
diff --git a/tmk.c b/tmk.c
new file mode 100644 (file)
index 0000000..52d06d6
--- /dev/null
+++ b/tmk.c
@@ -0,0 +1,221 @@
+/* 2010/08/23 noname
+ * keyboard firmware based on PJRC USB keyboard example
+ */
+/* Keyboard example with debug channel, for Teensy USB Development Board
+ * http://www.pjrc.com/teensy/usb_keyboard.html
+ * Copyright (c) 2008 PJRC.COM, LLC
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/pgmspace.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "usb.h"
+#include "usb_keyboard.h"
+#include "usb_mouse.h"
+#include "print.h"
+#include "matrix.h"
+#include "keymap.h"
+#include "jump_bootloader.h"
+
+
+// for teensy 2.0
+#define LED_CONFIG    (DDRD |= (1<<6))
+#define LED_ON        (PORTD |= (1<<6))
+#define LED_OFF       (PORTD &= ~(1<<6))
+#define CPU_PRESCALE(n)    (CLKPR = 0x80, CLKPR = (n))
+
+#define MOUSE_MOVE_UNIT 10
+#define MOUSE_DELAY_MS 200
+#define MOUSE_DELAY_ACC 4
+
+
+static void print_matrix(void);
+
+
+uint16_t idle_count=0;
+
+
+int main(void)
+{
+    // set for 16 MHz clock
+    CPU_PRESCALE(0);
+
+    // Initialize the USB, and then wait for the host to set configuration.
+    // If the Teensy is powered without a PC connected to the USB port,
+    // this will wait forever.
+    usb_init();
+    while (!usb_configured()) /* wait */ ;
+
+    // Wait an extra second for the PC's operating system to load drivers
+    // and do whatever it does to actually be ready for input
+    // needs such long time in my PC.
+    for (int i =0; i < 6; i++) {
+        LED_CONFIG;
+        LED_ON;
+        _delay_ms(500);
+        LED_OFF;
+        _delay_ms(500);
+    }
+
+    // Configure timer 0 to generate a timer overflow interrupt every
+    // 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock
+    // This demonstrates how to use interrupts to implement a simple
+    // inactivity timeout.
+    TCCR0A = 0x00;
+    TCCR0B = 0x05;
+    TIMSK0 = (1<<TOIE0);
+
+
+    matrix_init();
+
+    bool modified = false;
+    bool has_ghost = false;
+    int layer = 0;
+    int key_index = 0;
+    uint8_t mouse_x = 0;
+    uint8_t mouse_y = 0;
+    uint8_t mouse_btn = 0;
+    int8_t mouse_wheel = 0;
+    int8_t mouse_hwheel = 0;
+    int mouse_repeat = 0;
+
+    print("\nt.m.k. keyboard 1.0\n");
+    while (1) {
+        matrix_scan();
+        modified = matrix_is_modified();
+        has_ghost = matrix_has_ghost();
+        layer = get_layer();
+
+        // print matrix state for debug
+        if (modified) {
+            print_matrix();
+
+            LED_CONFIG;
+            LED_ON;
+        }
+
+        keyboard_modifier_keys = 0;
+        for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
+        key_index = 0;
+        mouse_x = 0;
+        mouse_y = 0;
+        mouse_btn = 0;
+        mouse_wheel = 0;
+        mouse_hwheel = 0;
+
+        // convert matrix state to HID report
+        for (int row = 0; row < MATRIX_ROWS; row++) {
+            for (int col = 0; col < MATRIX_COLS; col++) {
+                if (matrix[row] & 1<<col) continue;
+
+                uint8_t code = get_keycode(layer, row, col);
+                if (code == KB_NO) {
+                    continue;
+                } else if (KB_LCTRL <= code && code <= KB_RGUI) {
+                    // modifier keys(0xE0-0xE7)
+                    keyboard_modifier_keys |= 1<<(code & 0x07);
+                } else if (code >= MS_UP) {
+                    // mouse
+                    if (code == MS_UP)    mouse_y -= MOUSE_MOVE_UNIT;
+                    if (code == MS_DOWN)  mouse_y += MOUSE_MOVE_UNIT;
+                    if (code == MS_LEFT)  mouse_x -= MOUSE_MOVE_UNIT;
+                    if (code == MS_RIGHT) mouse_x += MOUSE_MOVE_UNIT;
+                    if (code == MS_BTN1)  mouse_btn |= 1<<0;
+                    if (code == MS_BTN2)  mouse_btn |= 1<<1;
+                    if (code == MS_BTN3)  mouse_btn |= 1<<2;
+                    if (code == MS_BTN4)  mouse_btn |= 1<<3;
+                    if (code == MS_BTN5)  mouse_btn |= 1<<4;
+                    if (code == MS_WH_UP)  mouse_wheel -= 1;
+                    if (code == MS_WH_DOWN)  mouse_wheel += 1;
+                    if (code == MS_WH_LEFT)  mouse_hwheel -= 1;
+                    if (code == MS_WH_RIGHT) mouse_hwheel += 1;
+                } else {
+                    // normal keys
+                    if (key_index < 6)
+                        keyboard_keys[key_index] = code;
+                    key_index++;
+                }
+            }
+        }
+
+        if (!has_ghost)  {
+            // when 4 left modifier keys down
+            if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
+                // cancel all keys
+                keyboard_modifier_keys = 0;
+                for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
+                usb_keyboard_send();
+
+                print("jump to bootloader...\n");
+                _delay_ms(100);
+                jump_bootloader(); // not return
+            }
+
+            if (mouse_x || mouse_y || mouse_wheel || mouse_hwheel || mouse_btn != mouse_buttons) {
+                mouse_buttons = mouse_btn;
+                usb_mouse_move(mouse_x, mouse_y, mouse_wheel, mouse_hwheel);
+
+                // acceleration
+                _delay_ms(MOUSE_DELAY_MS >> (mouse_repeat < MOUSE_DELAY_ACC ? mouse_repeat : MOUSE_DELAY_ACC));
+                mouse_repeat++;
+            } else {
+                mouse_repeat = 0;
+            }
+
+
+            // send keys to host
+            if (modified) {
+                if (key_index > 6) {
+                    //Rollover
+                }
+                usb_keyboard_send();
+            }
+        }
+        _delay_ms(2);
+    }
+}
+
+static void print_matrix(void) {
+            print("\nr/c 01234567\n");
+            for (int row = 0; row < MATRIX_ROWS; row++) {
+                phex(row); print(": ");
+                pbin_reverse(matrix[row]);
+                if (matrix_has_ghost_in_row(row)) {
+                    print(" <ghost");
+                }
+                print("\n");
+            }
+            print("keys: ");
+            for (int i = 0; i < 6; i++) { phex(keyboard_keys[i]); print(" "); }
+            print("\n");
+            print("mod: "); phex(keyboard_modifier_keys); print("\n");
+}
+
+// This interrupt routine is run approx 61 times per second.
+// A very simple inactivity timeout is implemented, where we
+// will send a space character and print a message to the
+// hid_listen debug message window.
+ISR(TIMER0_OVF_vect)
+{
+    idle_count++;
+}
index 10d4d19d2451a0544762cfe9fd8185e98c0268e6..9573344c456bc8bdcac01baaa4b30b5767737a56 100644 (file)
@@ -262,10 +262,10 @@ enum keycodes {
     KB_RGUI,            /* 0x80 */
 
     /* extensions for internal use */
-    FN_0 = 0xE8,
-    FN_1,
+    FN_1 = 0xE8,
     FN_2,
     FN_3,
+    FN_4,
     MS_UP = 0xF0,
     MS_DOWN,
     MS_LEFT,