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 <avr/pgmspace.h> |
||||||
#include "keymap.h" |
#include "keymap.h" |
||||||
|
|
||||||
#define MATRIX_ROWS 9 |
static const uint8_t PROGMEM Keymap[MATRIX_ROWS][MATRIX_COLS] = { |
||||||
#define MATRIX_COLS 8 |
{ 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 }, |
||||||
static const uint8_t PROGMEM Keymap[MATRIX_COLS][MATRIX_ROWS] = { |
{ KB_2, KB_RALT, KB_LGUI, KB_W, KB_S, KB_NO, KB_X, KB_UP }, |
||||||
{ KB_LALT, KB_1, KB_2, KB_3, KB_4, KB_7, KB_8, KB_9, KB_0 }, |
{ KB_3, KB_NO, KB_RSHIFT, KB_E, KB_D, KB_BSLASH, KB_C, KB_DOWN }, |
||||||
{ KB_NO, KB_ESCAPE, KB_RALT, KB_NO, KB_5, KB_6, KB_EQUAL, KB_NO, KB_MINUS }, |
{ KB_4, KB_5, KB_T, KB_R, KB_F, KB_G, KB_V, KB_B }, |
||||||
{ KB_BSPACE, KB_TAB, KB_LGUI, KB_RSHIFT, KB_T, KB_Y, KB_RBRACKET, KB_NO, KB_LBRACKET }, |
{ KB_7, KB_6, KB_Y, KB_U, KB_J, KB_H, KB_M, KB_N }, |
||||||
{ KB_NO, KB_Q, KB_W, KB_E, KB_R, KB_U, KB_I, KB_O, KB_P }, |
{ KB_8, KB_EQUAL, KB_RBRACKET, KB_I, KB_K, KB_NO, KB_COMMA, KB_LSHIFT }, |
||||||
{ KB_BSLASH, KB_A, KB_S, KB_D, KB_F, KB_J, KB_K, KB_L, KB_SCOLON }, |
{ KB_9, KB_NO, KB_NO, KB_O, KB_L, KB_GRAVE, KB_DOT, KB_NO }, |
||||||
{ KB_NO, KB_LCTRL, KB_NO, KB_UP, KB_G, KB_H, KB_NO, KB_GRAVE, KB_QUOTE }, |
{ KB_0, KB_MINUS, KB_LBRACKET, KB_P, KB_SCOLON, KB_QUOTE, KB_NO, KB_SLASH } |
||||||
{ 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 } |
|
||||||
}; |
}; |
||||||
|
|
||||||
|
|
||||||
uint8_t get_keycode(uint8_t row, uint8_t col) |
uint8_t get_keycode(uint8_t row, uint8_t col) |
||||||
{ |
{ |
||||||
if (row >= MATRIX_ROWS) |
if (row >= MATRIX_ROWS) |
||||||
return KB_NO; |
return KB_NO; |
||||||
if (col >= MATRIX_COLS) |
if (col >= MATRIX_COLS) |
||||||
return KB_NO; |
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