parent
c17f07819f
commit
3b31337cd8
@ -0,0 +1,60 @@ |
||||
Keyboard Firmware |
||||
================= |
||||
2010/08/23 noname |
||||
|
||||
|
||||
VERSION |
||||
------- |
||||
0.1 2010/08/23 |
||||
implemented for macway modified. |
||||
It works as normal keyboard now. |
||||
|
||||
|
||||
TODO |
||||
---- |
||||
modulization |
||||
clean source |
||||
debouncing |
||||
anti-ghost |
||||
keymap layer |
||||
key combination switch |
||||
toggle siwtch |
||||
HHKB like cursor etc. |
||||
setting menu(wizard) |
||||
debug console |
||||
keymap setting |
||||
matrix display |
||||
HHKB support |
||||
Trackpoint(PS/2) support |
||||
Thinkpad keyboard support |
||||
|
||||
|
||||
target board |
||||
------------ |
||||
Teensy 2.0 |
||||
http://www.pjrc.com/teensy |
||||
|
||||
|
||||
projects based on/related to |
||||
---------------------------- |
||||
PJRC USB Keyboard Example |
||||
http://www.pjrc.com/teensy/usb_keyboard.html |
||||
kbupgrade |
||||
http://github.com/rhomann/kbupgrade |
||||
http://geekhack.org/showwiki.php?title=Island:8406 |
||||
c64key |
||||
http://symlink.dk/projects/c64key/ |
||||
rump |
||||
http://mg8.org/rump/ |
||||
http://github.com/clee/rump |
||||
dulcimer |
||||
http://www.schatenseite.de/dulcimer.html |
||||
humblehacker-keyboard |
||||
http://github.com/humblehacker |
||||
http://www.humblehacker.com/keyboard/ |
||||
http://geekhack.org/showwiki.php?title=Island:6292 |
||||
ps2avr |
||||
http://sourceforge.net/projects/ps2avr/ |
||||
|
||||
|
||||
EOF |
@ -1,28 +1,27 @@ |
||||
/*
|
||||
* keymap for modified macway keyboard |
||||
* keymap for modified macway keyboarq |
||||
*/ |
||||
#include <avr/pgmspace.h> |
||||
#include "keymap.h" |
||||
|
||||
#define MATRIX_ROWS 9 |
||||
#define MATRIX_COLS 8 |
||||
|
||||
static const uint8_t PROGMEM Keymap[MATRIX_COLS][MATRIX_ROWS] = { |
||||
{ KB_LALT, KB_1, KB_2, KB_3, KB_4, KB_7, KB_8, KB_9, KB_0 }, |
||||
{ KB_NO, KB_ESCAPE, KB_RALT, KB_NO, KB_5, KB_6, KB_EQUAL, KB_NO, KB_MINUS }, |
||||
{ KB_BSPACE, KB_TAB, KB_LGUI, KB_RSHIFT, KB_T, KB_Y, KB_RBRACKET, KB_NO, KB_LBRACKET }, |
||||
{ KB_NO, KB_Q, KB_W, KB_E, KB_R, KB_U, KB_I, KB_O, KB_P }, |
||||
{ KB_BSLASH, KB_A, KB_S, KB_D, KB_F, KB_J, KB_K, KB_L, KB_SCOLON }, |
||||
{ KB_NO, KB_LCTRL, KB_NO, KB_UP, KB_G, KB_H, KB_NO, KB_GRAVE, KB_QUOTE }, |
||||
{ KB_ENTER, KB_Z, KB_X, KB_C, KB_V, KB_M, KB_COMMA, KB_DOWN, KB_NO }, |
||||
{ KB_SPACE, KB_DOWN, KB_RIGHT, KB_LEFT, KB_B, KB_N, KB_LSHIFT, KB_NO, KB_SLASH } |
||||
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, KB_RALT, KB_LGUI, KB_W, KB_S, KB_NO, KB_X, KB_UP }, |
||||
{ KB_3, KB_NO, KB_RSHIFT, KB_E, KB_D, KB_BSLASH, 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, KB_GRAVE, KB_DOT, KB_NO }, |
||||
{ KB_0, KB_MINUS, KB_LBRACKET, KB_P, KB_SCOLON, KB_QUOTE, KB_NO, KB_SLASH } |
||||
}; |
||||
|
||||
|
||||
uint8_t get_keycode(uint8_t row, uint8_t col) |
||||
{ |
||||
if (row >= MATRIX_ROWS) |
||||
return KB_NO; |
||||
if (col >= MATRIX_COLS) |
||||
return KB_NO; |
||||
return pgm_read_byte(&Keymap[col][row]); |
||||
return pgm_read_byte(&Keymap[row][col]); |
||||
} |
||||
|
@ -0,0 +1,144 @@ |
||||
/*
|
||||
* scan matrix |
||||
*/ |
||||
#include <avr/io.h> |
||||
#include <util/delay.h> |
||||
#include "keymap.h" |
||||
#include "matrix.h" |
||||
#include "print.h" |
||||
|
||||
uint8_t *matrix; |
||||
uint8_t *prev_matrix; |
||||
static uint8_t _matrix0[MATRIX_ROWS]; |
||||
static uint8_t _matrix1[MATRIX_ROWS]; |
||||
|
||||
static uint8_t read_col(void); |
||||
static void select_row(uint8_t row); |
||||
|
||||
|
||||
void matrix_init(void) |
||||
{ |
||||
// Column: input w/pullup
|
||||
DDRB = 0x00; |
||||
PORTB = 0xFF; |
||||
|
||||
// Row: Hi-Z(unselected)
|
||||
// PD:0,1,2,3,6,7
|
||||
// PC:6,7
|
||||
// PF:7
|
||||
DDRD = 0x00; |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
|
||||
for (int i=0; i < MATRIX_ROWS; i++) { |
||||
_matrix0[i] = 0xFF; |
||||
_matrix1[i] = 0xFF; |
||||
} |
||||
matrix = _matrix0; |
||||
prev_matrix = _matrix1; |
||||
} |
||||
|
||||
uint8_t matrix_scan(void) |
||||
{ |
||||
uint8_t row, state; |
||||
uint8_t *tmp; |
||||
|
||||
tmp = prev_matrix; |
||||
prev_matrix = matrix; |
||||
matrix = tmp; |
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++) { |
||||
select_row(row); |
||||
_delay_us(30); // without this wait read unstable value.
|
||||
state = read_col(); |
||||
|
||||
matrix[row] = state; |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
static uint8_t read_col(void) |
||||
{ |
||||
return PINB; |
||||
} |
||||
|
||||
static void select_row(uint8_t row) |
||||
{ |
||||
switch (row) { |
||||
case 0: |
||||
DDRD = (1<<0); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 1: |
||||
DDRD = (1<<1); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 2: |
||||
DDRD = (1<<2); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 3: |
||||
DDRD = (1<<3); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 4: |
||||
DDRD = (1<<6); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 5: |
||||
DDRD = (1<<7); |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 6: |
||||
DDRD = 0x00; |
||||
PORTD = 0x00; |
||||
DDRC = (1<<6); |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 7: |
||||
DDRD = 0x00; |
||||
PORTD = 0x00; |
||||
DDRC = (1<<7); |
||||
PORTC = 0x00; |
||||
DDRF = 0x00; |
||||
PORTF = 0x00; |
||||
break; |
||||
case 8: |
||||
DDRD = 0x00; |
||||
PORTD = 0x00; |
||||
DDRC = 0x00; |
||||
PORTC = 0x00; |
||||
DDRF = (1<<7); |
||||
PORTF = 0x00; |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,6 @@ |
||||
|
||||
extern uint8_t *matrix; |
||||
extern uint8_t *prev_matrix; |
||||
|
||||
void matrix_init(void); |
||||
uint8_t matrix_scan(void); |
Loading…
Reference in new issue