1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
Internal of HHKB pro
=====================
HHKB pro has MCU and some chips on separate two PCBs.
Controller PCB
--------------
M38K07M4 Renesas MCU with USB function
http://documentation.renesas.com/eng/products/mpumcu/rej03b0192_38k0ds.pdf
(HHKB_controller.jpg)
Keyswitch PCB
-------------
HC4051 Analog Multiplexer: select a row line.
http://www.ti.com/lit/ds/schs122j/schs122j.pdf
LS145 BCD Decoder: select a column line.
http://www.ti.com/lit/ds/symlink/sn74ls145.pdf
BU9831 Non-volatile electronic potentiometer: for calibration?
https://www.spezial.com/doc/rohm-a/bu9831.pdf
TP1683/4 Capacitive Sensing controller: no datasheet available.
(HHKB_keyswitch.jpg)
Topre original chip?
(HHKB_TP1684.jpg)
Connector Cable
---------------
Two PCBs are connected by 15 lines(13 in case of Pro2).
Vcc and GND use 3(2) lines each, other lines are for keyboard signaling.
HHKB connector lines:
JP Pro2 Pro Function Description Teensy++ pins
--------------------------------------------------------------------------------------------
1 Vcc(5V) 5V
1 1 2 Vcc(5V) 5V
2 2 3 Vcc(5V) 5V
3 3 4 TP1684 KEY: Low(0) when key pressed PE6 input(with pullup)
4 4 5 TP1684 KEY_PREV: make threshold PE7 output
5 5 6 HC4051 A(bit0)\ PB0 output
6 6 7 HC4051 B(bit1) > select row 0-7 PB1 output
7 7 8 HC4051 C(bit2)/ PB2 output
8 8 9 LS145 A(bit0)\ PB3 output
9 9 10 LS145 B(bit1) > select column 0-7 PB4 output
10 10 11 LS145 C(bit2)/ PB5 output
11 11 12 LS145 D(enable) Low(0) enables selected column PB6 output
12 12 13 GND GND
13 13 14 GND GND
15 GND
14 HC4051(Z2) ~Enable of Z2 row0-7
15 HC4051(Z3) ~Enable of Z3 row8-15
NOTE: guessing pin5(KEY_PREV) may work for hysteresis of capacitive sensing.
NOTE: 1KOhm didn't work as pullup resistor on KEY. AVR internal pullup or 10KOhm resistor was OK.
NOTE: JP has two HC4051(Z2,Z3) and line 5, 6 and 7 are connected to both of them.
(HHKB_connector.jpg)
Keyswitch matrix
----------------
HHKB switch matrix is ghost-free and bounce-free.
Pro/Pro2(8x8):
COL 0 1 2 3 4 5 6 7
ROW ---------------------------------------------------------------
0| 2 q w s a z x c
1| 3 4 r e d f v b
2| 5 6 y t g h n _NONE_
3| 1 Esc Tab Control LShift LAlt LMeta Space
4| 7 8 u i k j m _NONE_
5| \ ` Delete Return Fn RShift RAlt RMeta
6| 9 0 o p ; l , _NONE_
7| - + ] [ ' / . _NONE_
JP(16x8):
COL 0 1 2 3 4 5 6 7
ROW ---------------------------------------------------------------
0| ESC TAB LFn LShift LCtrl
1| 4 E MuHKN C D
2| 3 W LAlt X S
3| 1 HHK
4|
5| 5 R V F
6| 2 Q LGui Z A
7| 6 T Space B G
8| 9 I Kana , K
9| 8 U Henkan M J
A| 7 Y N H
B| 0 O RAlt . L
C| BS Right RShift Enter
D| \ [ Down Up ]
E| - P RFn / ;
F| ~ @ Left Ro :
Matrix diagram:
Pro/Pro2:
+-------------------------+-+-+-+-+-+-+-+ Vcc
|bias control? - - - - - - - - ---
| 3.9K*8 R R R R R R R R |
+--------^+ +--------+ - - - - - - - - |
| 2| | HC4051 <0-------|-|-|-|-|-|-|-|--|R|-+
| |capa. | <1-------|-|-|-|-|-|-|-|--|R|-+
| TP1684 |sense | <2-------|-|-|-|-|-|-|-|--|R|-+
| 11<------| <3-------|-|-|-|-|-|-|-|--|R|-+
| | | <4-------|-|-|-|-|-|-|-|--|R|-+
| | | <5-------|-|-|-|-|-|-|-|--|R|-+
| <-+ | <6-------|-|-|-|-|-|-|-|--|R|-+
| 1 4 | | | <7-------|-|-|-|-|-|-|-|--|R|-+
+---V---^-+ | +-^-^-^--+ 0 1 2 3 4 5 6 7 33K*8
KEY PREV | A B C +-----------------+
| | +-^----+ | | | | LS145 |
Vcc | | |BU9831| | | | +-^--^--^--^------+
--- | | +------+ | | | A B C D +-------+
| | | | | | | | | | | |
1-3 4 5 6 7 8 9 10 11 12 13-15 Pro |
1-2 3 4 5 6 7 8 9 10 11 12-13 Pro2|
+--------------------------------------------------+ |
| connector | ---
+--------------------------------------------------+ GND
JP:
+-----------------------------+-+-+-+-+ Vcc
|bias control? - - - - - ---
| 3.9K*5 R R R R R |
+--------^+ +--------+ - - - - - |
| | | HC4051 <0-----------|-|-|-|-|----|R|-+
| |capa. | Z2 <1-----------|-|-|-|-|----|R|-+
| TP1684 |sense | <2-----------|-|-|-|-|----|R|-+
| <---+--| <3-----------|-|-|-|-|----|R|-+
| | | | <4-----------|-|-|-|-|----|R|-+
| | ~En| <5-----------|-|-|-|-|----|R|-+
| | +----> <6-----------|-|-|-|-|----|R|-+
| | | | | A B C <7-----------|-|-|-|-|----|R|-+
+---V---^-+ | | +-^-^-^--+ | | | | | |
KEY PREV | | | | | | | | | | |
| | | | +--------+ | | | | | |
| | | | | HC4051 <8-----------|-|-|-|-|----|R|-+
| | | | | Z3 <9-----------|-|-|-|-|----|R|-+
| | | +--| <A-----------|-|-|-|-|----|R|-+
| | | | <B-----------|-|-|-|-|----|R|-+
| | | | <C-----------|-|-|-|-|----|R|-+
| | | ~En| <D-----------|-|-|-|-|----|R|-+
| | | +-> <E-----------|-|-|-|-|----|R|-+
| | | | | A B C <F-----------|-|-|-|-|----|R|-+
| | | | +-^-^-^--+ 0 1 2 3 4 5 6 7 33K*8
| | | | | | | +-----------------+
| | | | | | | | LS145 |
Vcc | | | | | | | +-^--^--^--^------+
--- | | | | | | | A B C D +-------+
| | | | | | | | | | | | | |
1-2 3 4 14 15 5 6 7 8 9 10 11 12-13 |
+--------------------------------------------------+ |
| connector | ---
+--------------------------------------------------+ GND
Signals charts
--------------
While pressing space bar, watched HHKB Pro original controller signals by logic analyzer.
Row and column is looping between 0-7 each for selecting a key.
A key is scaned every about 15ms, so scan rate is 66Hz.
(HHKB_chart1.jpg)
Space bar locate at ROW:3 COL:7. A key is selected by HC4051(C,B,A) and LS145(C,B,A).
Key state can be read on TP1684(4/KEY) while asserting low on LS145(D).
(HHKB_chart2.jpg)
Signal of JP:
1) Select row
rowC ____~~~~____~~~~ 3.8/3.8ms(JP) 7.7/7.7ms(Pro) S2 of HC4051
rowB __~~__~~__~~__~~ 1.9/1.9ms(JP) 3.8/3.8ms(Pro) S1 of HC4051
rowA _~_~_~_~_~_~_~_~ 1.0/1.0ms(JP) 1.9/1.9ms(Pro) S0 of HC4051
0123456701234567 selected row(Pro)
0123456789ABCDEF selected row(JP)
rowEn0 ________~~~~~~~~ 7.7/7.7ms(JP only) ~Enable of Z2 HC4051(JP only)
rowEn1 ~~~~~~~~________ 7.7/7.7ms(JP only) ~Enable of Z3 HC4051(JP only)
2) Select column
colC ____~~~~____~~~~ 550/410us(JP) / us(Pro)
colB __~~__~~__~~__~~ 200/210us(JP) 450/460us(Pro)
colA _~_~_~_~_~_~_~_~ 100/110us(JP) 220/230us(Pro)
0123456701234567 selected column
3) Wait 5us after column select, then set prev, strobe colD to spit out key status and read it.
prev _~~~~_____ 20us if previous key state is low
colD ~~~__~~~~~ 10us strobe
key ~~~____~~~ 22us indicates current state of the key
NOTE: JP scans twice fast as Pro/Pro2 does. So Pro/Pro2 scans 8x8 matrix in 15.4ms while JP scans 16x8 in that time.
EOF
|