From: tmk Date: Sat, 2 Oct 2010 02:51:42 +0000 (+0900) Subject: version 1.0. X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=479af4bdcd08560a3400426b30c247c620f6204e;p=tmk_firmware.git version 1.0. --- diff --git a/Makefile b/Makefile index 1fe3ffa..d259fd2 100644 --- 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 15eb28f..c8d81a9 100644 --- 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 diff --git a/keymap.c b/keymap.c index d208ad2..2d92e18 100644 --- 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< -#include -#include -#include -#include -#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<= 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(" +#include +#include +#include +#include +#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<= 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("