aboutsummaryrefslogtreecommitdiff
path: root/keyboard/hhkb_rn42/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard/hhkb_rn42/matrix.c')
-rw-r--r--keyboard/hhkb_rn42/matrix.c133
1 files changed, 6 insertions, 127 deletions
diff --git a/keyboard/hhkb_rn42/matrix.c b/keyboard/hhkb_rn42/matrix.c
index d0731ef1f..b0af4baa5 100644
--- a/keyboard/hhkb_rn42/matrix.c
+++ b/keyboard/hhkb_rn42/matrix.c
@@ -20,20 +20,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */ 20 */
21#include <stdint.h> 21#include <stdint.h>
22#include <stdbool.h> 22#include <stdbool.h>
23#include <avr/io.h>
24#include <avr/interrupt.h>
25#include <util/delay.h> 23#include <util/delay.h>
26#include "print.h" 24#include "print.h"
27#include "debug.h" 25#include "debug.h"
28#include "util.h" 26#include "util.h"
29#include "timer.h" 27#include "timer.h"
30#include "matrix.h" 28#include "matrix.h"
31 29#include "hhkb_avr.h"
32
33// Timer resolution check
34#if (1000000/TIMER_RAW_FREQ > 20)
35# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
36#endif
37 30
38 31
39// matrix state buffer(1:on, 0:off) 32// matrix state buffer(1:on, 0:off)
@@ -43,122 +36,6 @@ static matrix_row_t _matrix0[MATRIX_ROWS];
43static matrix_row_t _matrix1[MATRIX_ROWS]; 36static matrix_row_t _matrix1[MATRIX_ROWS];
44 37
45 38
46// Matrix I/O ports
47//
48// row: HC4051[A,B,C] selects scan row0-7
49// col: LS145[A,B,C,D] selects scan col0-7 and enable(D)
50// key: on: 0/off: 1
51// prev: unknown: output previous key state(negated)?
52
53#if defined(__AVR_AT90USB1286__)
54// Ports for Teensy++
55// row: PB0-2
56// col: PB3-5,6
57// key: PE6(pull-uped)
58// prev: PE7
59#define KEY_INIT() do { \
60 DDRB |= 0x7F; \
61 DDRE |= (1<<7); \
62 DDRE &= ~(1<<6); \
63 PORTE |= (1<<6); \
64} while (0)
65#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
66 (((COL) & 0x07)<<3) | \
67 ((ROW) & 0x07))
68#define KEY_ENABLE() (PORTB &= ~(1<<6))
69#define KEY_UNABLE() (PORTB |= (1<<6))
70#define KEY_STATE() (PINE & (1<<6))
71#define KEY_PREV_ON() (PORTE |= (1<<7))
72#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
73#define KEY_POWER_ON()
74#define KEY_POWER_OFF()
75
76#elif defined(__AVR_ATmega32U4__)
77// Ports for my designed Alt Controller PCB
78// row: PB0-2
79// col: PB3-5,6
80// key: PD7(pull-uped)
81// prev: PB7
82// power: PD4(L:off/H:on)
83#define KEY_INIT() do { \
84 DDRB = 0xFF; \
85 PORTB = 0x00; \
86 DDRD &= ~0x80; \
87 PORTD |= 0x80; \
88 /* keyswitch board power on */ \
89 DDRD |= (1<<4); \
90 PORTD |= (1<<4); \
91 KEY_UNABLE(); \
92 KEY_PREV_OFF(); \
93} while (0)
94#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
95 (((COL) & 0x07)<<3) | \
96 ((ROW) & 0x07))
97#define KEY_ENABLE() (PORTB &= ~(1<<6))
98#define KEY_UNABLE() (PORTB |= (1<<6))
99#define KEY_STATE() (PIND & (1<<7))
100#define KEY_PREV_ON() (PORTB |= (1<<7))
101#define KEY_PREV_OFF() (PORTB &= ~(1<<7))
102#define KEY_POWER_ON()
103#define KEY_POWER_OFF()
104/*
105#define KEY_POWER_ON() do { \
106 KEY_INIT(); \
107 PORTD |= (1<<4); \
108 _delay_ms(1); \
109} while (0)
110#define KEY_POWER_OFF() do { \
111 PORTD &= ~(1<<4); \
112 DDRB &= ~0xFF; \
113 PORTB &= ~0xFF; \
114 DDRB &= ~0x80; \
115 PORTB &= ~0x80; \
116} while (0)
117*/
118
119
120#elif defined(__AVR_ATmega328P__)
121// Ports for V-USB
122// key: PB0(pull-uped)
123// prev: PB1
124// row: PB2-4
125// col: PC0-2,3
126// power: PB5(Low:on/Hi-z:off)
127#define KEY_INIT() do { \
128 DDRB |= 0x3E; \
129 DDRB &= ~(1<<0); \
130 PORTB |= 1<<0; \
131 DDRC |= 0x0F; \
132 KEY_UNABLE(); \
133 KEY_PREV_OFF(); \
134} while (0)
135#define KEY_SELECT(ROW, COL) do { \
136 PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
137 PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \
138} while (0)
139#define KEY_ENABLE() (PORTC &= ~(1<<3))
140#define KEY_UNABLE() (PORTC |= (1<<3))
141#define KEY_STATE() (PINB & (1<<0))
142#define KEY_PREV_ON() (PORTB |= (1<<1))
143#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
144// Power supply switching
145#define KEY_POWER_ON() do { \
146 KEY_INIT(); \
147 PORTB &= ~(1<<5); \
148 _delay_ms(1); \
149} while (0)
150#define KEY_POWER_OFF() do { \
151 DDRB &= ~0x3F; \
152 PORTB &= ~0x3F; \
153 DDRC &= ~0x0F; \
154 PORTC &= ~0x0F; \
155} while (0)
156
157#else
158# error "define code for matrix scan"
159#endif
160
161
162inline 39inline
163uint8_t matrix_rows(void) 40uint8_t matrix_rows(void)
164{ 41{
@@ -199,13 +76,13 @@ uint8_t matrix_scan(void)
199 for (uint8_t row = 0; row < MATRIX_ROWS; row++) { 76 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
200 for (uint8_t col = 0; col < MATRIX_COLS; col++) { 77 for (uint8_t col = 0; col < MATRIX_COLS; col++) {
201 KEY_SELECT(row, col); 78 KEY_SELECT(row, col);
202 _delay_us(40); 79 _delay_us(5);
203 80
204 // Not sure this is needed. This just emulates HHKB controller's behaviour. 81 // Not sure this is needed. This just emulates HHKB controller's behaviour.
205 if (matrix_prev[row] & (1<<col)) { 82 if (matrix_prev[row] & (1<<col)) {
206 KEY_PREV_ON(); 83 KEY_PREV_ON();
207 } 84 }
208 _delay_us(7); 85 _delay_us(10);
209 86
210 // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE. 87 // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE.
211 // If V-USB interrupts in this section we could lose 40us or so 88 // If V-USB interrupts in this section we could lose 40us or so
@@ -241,11 +118,13 @@ uint8_t matrix_scan(void)
241 matrix[row] = matrix_prev[row]; 118 matrix[row] = matrix_prev[row];
242 } 119 }
243 120
121 _delay_us(5);
244 KEY_PREV_OFF(); 122 KEY_PREV_OFF();
245 KEY_UNABLE(); 123 KEY_UNABLE();
124
246 // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE. 125 // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE.
247 // This takes 25us or more to make sure KEY_STATE returns to idle state. 126 // This takes 25us or more to make sure KEY_STATE returns to idle state.
248 _delay_us(150); 127 _delay_us(75);
249 } 128 }
250 } 129 }
251 KEY_POWER_OFF(); 130 KEY_POWER_OFF();