Power key support

debounce issue exists
This commit is contained in:
Jeffrey Sung 2012-10-08 22:44:12 +09:00
parent 3830de7839
commit d1117dca32
3 changed files with 160 additions and 151 deletions

View File

@ -1,4 +1,4 @@
Alternative Controller for Apple IIgs/Standard(M0116) Replacable USB Controller for Apple IIgs/Standard(M0116)
JeffreySung(nattyman@gmail.com) JeffreySung(nattyman@gmail.com)
=============================== ===============================
@ -8,14 +8,14 @@ Feature
- Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116) - Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116)
- Teensy++ 2.0 required - Teensy++ 2.0 required
- Some signal bypass required - Some signal bypass required
- ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys, these keys are merged into key matrix. - ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys,
- Power key couldn't be used because power key is not connected to controller. these keys are merged into key matrix using virtual row.
History History
======= =======
- 2012.09.17 First Release - 2012.09.17 First Release
- 2012.09.17 CapsLock support - 2012.09.17 CapsLock support
- 2012.09.19 Power button added
Build Build
===== =====
0. Just Type "Make" and return. 0. Just Type "Make" and return.
@ -29,9 +29,9 @@ PJRC Teensy
-7,26(in keyboard PCB, these pins are VDD,GND) -7,26(in keyboard PCB, these pins are VDD,GND)
-30,31(in Teensy++, these pins are Ref,GND respectively) -30,31(in Teensy++, these pins are Ref,GND respectively)
-5,6(D2,D3 for bluetooth in future) -5,6(D2,D3 for bluetooth in future)
1. Bypass 31 pin(from board) to E4(Teensy) 1. Bypass #31 pin(from board) to E4(Teensy)
2. Bypass 30 pin(from board) to F2(Teensy) 2. Bypass #30 pin(from board) to F2(Teensy)
3. Bypass 6 pin(from board) to A0(Teensy) 3. Bypass #6 pin(from board) to A0(Teensy)
4. Refer doc directory 4. Refer doc directory
To Do To Do

View File

@ -1,136 +1,142 @@
/* /*
Copyright 2012 Jeffrey Sung <nattyman@gmail.com> Copyright 2012 Jeffrey Sung <nattyman@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* /*
* Keymap for Apple IIgs/Standard Keyboard * Keymap for Apple IIgs/Standard Keyboard
*/ */
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include "usb_keycodes.h" #include "usb_keycodes.h"
#include "print.h" #include "print.h"
#include "debug.h" #include "debug.h"
#include "util.h" #include "util.h"
#include "keymap.h" #include "keymap.h"
// Convert physical keyboard layout to matrix array. // Convert physical keyboard layout to matrix array.
// This is a macro to define keymap easily in keyboard layout form. // This is a macro to define keymap easily in keyboard layout form.
#define KEYMAP( \ #define KEYMAP( R10C5, \
R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \ R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \
R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \ R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \
R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \ R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \
R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \ R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \
R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \ R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \
) { \ ) { \
{ R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \ { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \
{ R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \ { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \
{ R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \ { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \
{ R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \ { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \
{ R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \ { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \
{ R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \ { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \
{ R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \ { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \
{ R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \ { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \
{ R8C0, R8C1, KB_NO, KB_NO, KB_NO,KB_NO, KB_NO, KB_NO }, \ { R8C0, R8C1, KB_NO, KB_NO, KB_NO,KB_NO, KB_NO, KB_NO }, \
{ R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \ { R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \
{ R10C0,R10C1, R10C2, R10C3, R10C4,KB_NO, KB_NO, KB_NO} \ { R10C0,R10C1, R10C2, R10C3, R10C4,R10C5, KB_NO, KB_NO} \
} }
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
static const uint8_t PROGMEM fn_layer[] = { static const uint8_t PROGMEM fn_layer[] = {
0, // Fn0 0, // Fn0
1, // Fn1 1, // Fn1
2, // Fn2 2, // Fn2
3, // Fn3 3, // Fn3
4, // Fn4 4, // Fn4
0, // Fn5 0, // Fn5
3, // Fn6 3, // Fn6
3 // Fn7 3 // Fn7
}; };
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
// See layer.c for details. // See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = { static const uint8_t PROGMEM fn_keycode[] = {
KB_NO, // Fn0 KB_NO, // Fn0
KB_NO, // Fn1 KB_NO, // Fn1
KB_SLSH, // Fn2 KB_SLSH, // Fn2
KB_SCLN, // Fn3 KB_SCLN, // Fn3
KB_SPC, // Fn4 KB_SPC, // Fn4
KB_NO, // Fn5 KB_NO, // Fn5
KB_NO, // Fn6 KB_NO, // Fn6
KB_NO // Fn7 KB_NO // Fn7
}; };
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer /* Layer 0: Default Layer
* ,-----------------------------------------------------------. ,---------------, * ,-----------------------------------------------------------. ,---------------,
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * | * | POWER | | |
* |-----------------------------------------------------------| |---------------| * |-----------------------------------------------------------| |---------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + | * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * |
* |-----------------------------------------------------' | |---------------| * |-----------------------------------------------------------| |---------------|
* |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - | * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + |
* |-----------------------------------------------------------| |---------------| * |-----------------------------------------------------' | |---------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E | * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - |
* |-----------------------------------------------------------| |-----------| N | * |-----------------------------------------------------------| |---------------|
* |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E |
* `-----------------------------------------------------------' |---------------' * |-----------------------------------------------------------| |-----------| N |
*/ * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |
KEYMAP(KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSPC, KB_FN1, KB_PEQL, KB_PSLS, KB_PAST, \ * `-----------------------------------------------------------' |---------------'
KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC, KB_P7, KB_P8, KB_P9, KB_PPLS, \ */
KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, KB_SCLN, KB_QUOT,KB_ENT, KB_P4, KB_P5, KB_P6, KB_PMNS, \ KEYMAP( KB_PWR,
KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH, KB_P1, KB_P2, KB_P3, \ KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSPC, KB_FN1, KB_PEQL, KB_PSLS, KB_PAST, \
KB_CAPS,KB_LALT,KB_LGUI,KB_GRV, KB_SPC, KB_BSLS,KB_LEFT,KB_RGHT,KB_DOWN,KB_UP, KB_P0, KB_PDOT, KB_PENT), KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC, KB_P7, KB_P8, KB_P9, KB_PPLS, \
KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, KB_SCLN, KB_QUOT,KB_ENT, KB_P4, KB_P5, KB_P6, KB_PMNS, \
KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH, KB_P1, KB_P2, KB_P3, \
/* Layer 1: Tenkey use Layer KB_CAPS,KB_LALT,KB_LGUI,KB_GRV, KB_SPC, KB_BSLS,KB_LEFT,KB_RGHT,KB_DOWN,KB_UP, KB_P0, KB_PDOT, KB_PENT),
* ,-----------------------------------------------------------. ,---------------,
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * |
* |-----------------------------------------------------------| |---------------| /* Layer 1: Tenkey use Layer
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ | * ,-----------------------------------------------------------. ,---------------,
* |-----------------------------------------------------' | |---------------| * | POWER | | |
* |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- | * |-----------------------------------------------------------| |---------------|
* |-----------------------------------------------------------| |---------------| * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * |
* |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E | * |-----------------------------------------------------------| |---------------|
* |-----------------------------------------------------------| |-----------| N | * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ |
* |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T | * |-----------------------------------------------------' | |---------------|
* `-----------------------------------------------------------' `---------------' * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- |
*/ * |-----------------------------------------------------------| |---------------|
KEYMAP(KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSPC, KB_FN0, KB_PEQL, KB_PSLS, KB_MUTE, \ * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E |
KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC, KB_INS, KB_P8, KB_PGUP, KB_VOLU, \ * |-----------------------------------------------------------| |-----------| N |
KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, KB_SCLN, KB_QUOT,KB_ENT, KB_DEL, KB_UP, KB_PGDN, KB_VOLD, \ * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |
KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH, KB_LEFT, KB_DOWN, KB_RIGHT, \ * `-----------------------------------------------------------' `---------------'
KB_CAPS,KB_LALT,KB_LGUI,KB_GRV, KB_SPC, KB_BSLS,KB_LEFT,KB_RGHT,KB_DOWN,KB_UP, KB_P0, KB_PDOT, KB_PENT), */
}; KEYMAP( KB_PWR, \
KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSPC, KB_FN1, KB_PEQL, KB_PSLS, KB_MUTE, \
KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC, KB_INS, KB_P8, KB_PGUP, KB_VOLU, \
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, KB_SCLN, KB_QUOT,KB_ENT, KB_DEL, KB_UP, KB_PGDN, KB_VOLD, \
{ KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH, KB_LEFT, KB_DOWN, KB_RIGHT, \
return KEYCODE(layer, row, col); KB_CAPS,KB_LALT,KB_LGUI,KB_GRV, KB_SPC, KB_BSLS,KB_LEFT,KB_RGHT,KB_DOWN,KB_UP, KB_P0, KB_PDOT, KB_PENT),
} };
uint8_t keymap_fn_layer(uint8_t fn_bits)
{ uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
return pgm_read_byte(&fn_layer[biton(fn_bits)]); {
} return KEYCODE(layer, row, col);
}
uint8_t keymap_fn_keycode(uint8_t fn_bits)
{ uint8_t keymap_fn_layer(uint8_t fn_bits)
return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); {
} return pgm_read_byte(&fn_layer[biton(fn_bits)]);
}
uint8_t keymap_fn_keycode(uint8_t fn_bits)
{
return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
}

View File

@ -86,6 +86,8 @@ void matrix_init(void)
PORTC |= 0b01111111; PORTC |= 0b01111111;
DDRE &= ~0b00000010; DDRE &= ~0b00000010;
PORTE |= 0b00000010; PORTE |= 0b00000010;
//DDRB &= ~0b00000100;
//PORTB |= 0b00000100;
// modifier B3/4,F4/5,E4 always input // modifier B3/4,F4/5,E4 always input
// A0 // A0
//DDRA |= 0b00000001; //DDRA |= 0b00000001;
@ -255,12 +257,13 @@ static uint8_t read_col(uint8_t row)
// Modifier would be copied to report->mods except E4(CAPSLOCK) // Modifier would be copied to report->mods except E4(CAPSLOCK)
uint8_t tmp; uint8_t tmp;
if ( row == 10 ) { if ( row == 10 ) {
tmp = 0xE0; tmp = 0xC0;
tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec) tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec)
// LEFT SHIFT is 1bit in modifier (HID Spec) // LEFT SHIFT is 1bit in modifier (HID Spec)
tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec) tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec)
tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec) tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec)
tmp |= (PINA << 4 ) & 0b00010000; // tmp |= (PINA << 4 ) & 0b00010000; // CAPSLOCK
tmp |= (PINB << 3 ) & 0b00100000; // POWER
//tmp |= (PINE << 1 ) & 0b00010000; // Caps Lock(Should not be in modifier //tmp |= (PINE << 1 ) & 0b00010000; // Caps Lock(Should not be in modifier
} else { } else {
tmp = 0x00; tmp = 0x00;
@ -284,10 +287,10 @@ static void unselect_rows(void)
DDRF &= ~0b11000111; // PF: 7,6,2,1,0 DDRF &= ~0b11000111; // PF: 7,6,2,1,0
PORTF &= ~0b11000111; PORTF &= ~0b11000111;
// to unselect virtual row(modifier), set port to output with low // to unselect virtual row(modifier), set port to output with low
DDRA |= 0b00000001; // PA: 0 DDRA |= 0b00000001; // PA: 0 for CAPSLOCK
PORTA &= ~0b00000001; PORTA &= ~0b00000001;
DDRB |= 0b00011000; // PB: 3,4 for modifier(row10) DDRB |= 0b00011100; // PB: 3,4 for modifier(row10)
PORTB &= ~0b00011000; PORTB &= ~0b00011100; // PB: 2 for power
DDRF |= 0b00110000; // PF: 4,5 for modifier DDRF |= 0b00110000; // PF: 4,5 for modifier
PORTF &= ~0b00110000; PORTF &= ~0b00110000;
} }
@ -345,8 +348,8 @@ static void select_row(uint8_t row)
// to select virtual row, set port as input // to select virtual row, set port as input
DDRA &= ~0b00000001; DDRA &= ~0b00000001;
PORTA |= 0b00000001; PORTA |= 0b00000001;
DDRB &= ~0b00011000; DDRB &= ~0b00011100;
PORTB |= 0b00011000; PORTB |= 0b00011100;
DDRF &= ~0b00110000; DDRF &= ~0b00110000;
PORTF |= 0b00110000; PORTF |= 0b00110000;
break; break;