I wanted to add vi cursor keys and mouse keys to HHKB. Original HHKB controller is not programmable and
firmware source code is not open. So, customizing HHKB needs to replace original controller with programmable one.
I used Teensy++ as alternative controller. Though a Teensy has enough ports to drive HHKB,
Teensy++ has clean pinout and it makes programing and wiring easier.
My firmware is now mature enough for my daily job.
I'm happy to use this HHKB every day, in particular I can't live without mouse keys!
Any suggestions or ideas are welcome.
NOTE My HHKB is just "Professional". This means followings may not be applied to "Professional2".
DISCLAIMER I'm not a professional for electronics and MCU programming. This may damage your HHKB.
And my English writing is poor, I'm not sure I can convey my notions accurately.
UPDATE2011/05/25- added V-USB support: (You can use a plain ATMega168(328) as a controller now.)
Features * customizable keymap layers
* mouse keys
* USB NKRO
* audio & system controllUSB NKRO demonstration:coming soon
Mouse keys demonstration:[youtube]PFMwqdtmNnA[/youtube]
Resoucesfirmware source code: github(
http://github.com/tmk/tmk_keyboard)
Teensy: PJRC(
http://www.pjrc.com/teensy/)
V-USB:Objective Development(
http://www.obdev.at/products/vusb/index.html)
Controller InstallationTeensy++ is installed on one HHKB and ATMega168 on other.
[ Attachment Invalid Or Does Not Exist ] 18574[/ATTACH] [ Attachment Invalid Or Does Not Exist ] 18575[/ATTACH] [ Attachment Invalid Or Does Not Exist ] 18572[/ATTACH]
Angled USB mini B adapter is used to install Teensy++ laterally. Bread board wires are used to connect Teensy++.


HHKB internal
HHKB pro has some chips on separate two PCBs.
Controller PCB: M38K07M4 Renesas MCU with USB function
http://documentation.renesas.com/eng...192_38k0ds.pdf (HHKB_controller.jpg)
Keyswitch PCB: HC4051 Analog Multiplexer: select a row line.
http://www.alldatasheet.com/datashee...74HC4051A.html LS145 BCD Decoder: select a column line.
http://www.alldatasheet.com/datashee...N74LS145D.html BU9831 Non-volatile electronic potentiometer: for calibration?
http://www.alldatasheet.com/datashee...HM/BU9831.html TP1684 Capacitive Sensing controller: no datasheet available.
(HHKB_keyswitch.jpg)

Topre original chip?
(HHKB_TP1684.jpg)
Connector:Two PCBs are connected with 15(13) lines. Vcc and GND uses 3(2) lines each, other 9 lines are used for keyboard control signaling.
HHKB Pro:
Keyswitch PCB connector Teensy++ pins
-------------------------------------------------------------------------------
1 Vcc(5V) 5V
2 Vcc(5V)
3 Vcc(5V)
4 TP1684 KEY: Low(0) when key pressed PE6 input(pulluped)
5 TP1684 KEY_PREV: assert previous key state??? PE7 output
6 HC4051 A(bit0) select 8 rows(0 to 7) PB0 output
7 HC4051 B(bit1) PB1 output
8 HC4051 C(bit2) PB2 output
9 LS145 A(bit0) select 8 columns(0 to 7) PB3 output
10 LS145 B(bit1) PB4 output
11 LS145 C(bit2) PB5 output
12 LS145 D(enable) Low(0) enable selected column PB6 output
13 GND
14 GND
15 GND GND
HHKB Pro2:
Keyswitch PCB connector Teensy++ pins
-------------------------------------------------------------------------------
1 Vcc(5V) 5V
2 Vcc(5V)
3 TP1684 KEY: Low(0) when key pressed PE6 input(pulluped)
4 TP1684 KEY_PREV: assert previous key state??? PE7 output
5 HC4051 A(bit0) select 8 rows(0 to 7) PB0 output
6 HC4051 B(bit1) PB1 output
7 HC4051 C(bit2) PB2 output
8 LS145 A(bit0) select 8 columns(0 to 7) PB3 output
9 LS145 B(bit1) PB4 output
10 LS145 C(bit2) PB5 output
11 LS145 D(enable) Low(0) enable selected column PB6 output
12 GND
13 GND GND
(HHKB_connector.jpg)

Keyswitch matrix
60 keyswitches in 8*8 matrix. It's ghost free and bounce free.
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_Matrix diagram: +-------------------------+-+-+-+-+-+-+-+ Vcc
|bias control? - - - - - - - - ---
| 3.9K*8 R R R R R R R R |
+--------^+ +--------+ - - - - - - - - |
| TP 1684 | | HC4051 <0-------|-|-|-|-|-|-|-|--|R|-+
| |capa. | <1-------|-|-|-|-|-|-|-|--|R|-+
| |sense | <2-------|-|-|-|-|-|-|-|--|R|-+
| <------| <3-------|-|-|-|-|-|-|-|--|R|-+
| | | <4-------|-|-|-|-|-|-|-|--|R|-+
| | | <5-------|-|-|-|-|-|-|-|--|R|-+
| |calib.| <6-------|-|-|-|-|-|-|-|--|R|-+
| <-+? | <7-------|-|-|-|-|-|-|-|--|R|-+
+---V-----+ | +-^-^-^--+ 0 1 2 3 4 5 6 7 33K*8
KEY
| A B C +-----------------+
| | +-^----+ | | | | LS145 |
Vcc | | |BU9831| | | | +-^--^--^--^------+
--- | | +------+ | | | A B C D +------+
| | | | | | | | | | | |
1-3 4 5 6 7 8 9 10 11 12 13-15 |
+--------------------------------------------------+ |
| connector | ---
+--------------------------------------------------+ GND
to controllerSignals charts: While pressing space bar, watched HHKB 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. Key are 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).
Usage of TP1684(5) is not clear. Original controller seemed to output previous key state on this line.
However key state can be read without using this signal.
(HHKB_chart2.jpg)
Matrix scan pseudo code: for (row: 0-7) {
SELECT_ROW(row); // set HC4051(A,B,C)
for (col: 0-7) {
SELECT_COL(col); // set LS145(A,B,C)
_delay_us(40);
if (prev_key_state(row, col) {
KEY_PREV_ON;
}
_delay_us(7);
ENALBLE_COL(); // set LS145(D) to low
_Delay_us(10);
if (KEY == 0) { // read TP1684(KEY)
// key pressed
} else {
// not pressed
}
KEY_PREV_OFF;
UNABLE_COL(); // set LS145(D) to high
_delay_us(150);
}
}
Keymap layers
Followings are added layers with additional Fn keys.
Layer 0: Default Layer
,-----------------------------------------------------------.
|Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
|-----------------------------------------------------------|
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|
|-----------------------------------------------------------|
|Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return |
|-----------------------------------------------------------|
|Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1|
`-----------------------------------------------------------'
|Gui|Alt |Space |Alt |Gui|
`-------------------------------------------'
Layer 1: HHKB mode (HHKB Fn)
,-----------------------------------------------------------.
|Pow| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
|-----------------------------------------------------------|
|Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
|-----------------------------------------------------------|
|Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
|-----------------------------------------------------------|
|Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx|
`-----------------------------------------------------------'
|Gui |Alt |Space |Alt |Gui|
`--------------------------------------------'
Layer 2: Vi mode (Slash)
,-----------------------------------------------------------.
|Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
|-----------------------------------------------------------|
|Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs|
|-----------------------------------------------------------|
|Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return |
|-----------------------------------------------------------|
|Shift | | | | | |Hom|PgD|PgU|End|xxx|Shift | |
`-----------------------------------------------------------'
|Gui|Alt |Space |Alt |Gui|
`-------------------------------------------'
Layer 3: Mouse mode (Semicolon)
,-----------------------------------------------------------.
|Esc| | | | | | | | | | | | | | |
|-----------------------------------------------------------|
|Tab |MwL|MwU|McU|MwD|MwL|MwR|MwD|MwU|MwR| | | |Backs|
|-----------------------------------------------------------|
|Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| |Return |
|-----------------------------------------------------------|
|Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
`-----------------------------------------------------------'
|Gui |Alt |Mb1 |Alt |Gui|
`--------------------------------------------'
Layer 4: Matias half keyboard style (Space)
,-----------------------------------------------------------.
| -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc|
|-----------------------------------------------------------|
|Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab |
|-----------------------------------------------------------|
|Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control |
|-----------------------------------------------------------|
|Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
`-----------------------------------------------------------'
|Gui |Alt |xxxxxxxxxxxxxxxxxxxxxxx|Alt |Gui|
`--------------------------------------------'i
Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
Goodies for HHKB
silencing
plungers with rings made from kitchen melamine foam.
[ Attachment Invalid Or Does Not Exist ] 18577[/ATTACH]
Typed 1. silencing HHKB pro 2. original HHKB pro 3. ThinkPad X201s in this video.
[youtube]Km2G8vdLXmw[/youtube]
This have effect in a way. But I have not sufficient result yet.
My goal is the quietness tolerable to use in library:)
and see this post:
http://geekhack.org/showthread.php?5...628#post246628http://geekhack.org/showthread.php?18935-New-HHKB-The-HHKB-Pro-Type-S&p=364477&viewfull=1#post364477
case modUSB connector on left side.
[ Attachment Invalid Or Does Not Exist ] 18571[/ATTACH] [ Attachment Invalid Or Does Not Exist ] 18573[/ATTACH] [ Attachment Invalid Or Does Not Exist ] 18576[/ATTACH]
This is the result: happy hacking on laptop!
[ Attachment Invalid Or Does Not Exist ] 18580[/ATTACH]