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 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). 

    Usage of TP1684(5) is not clear. Controller seemed to output previous key state on this line.
    However key state can be read without using this signal.

    (HHKB_chart2.jpg)

5us after setting colA-C
colA   _~~~~~~~~~~~~~~~~~~
prev    _~~~~_____          20us if previous key state is low
colD    ~~~__~~~~~          10us column enabled
key     ~~~____~~~          22us hold state of the key

prev    ____~~~~__________  20us(JP)/17us(Pro2)
key     ~~~~~~_____~~~~~~~  22us
colD    ~~~~~~__~~~~~~~~~~  10us(LS175)

colC    ____~~~~____~~~~    550/410us(JP)
colB    __~~__~~__~~__~~    200/210us(JP)
colA    _~_~_~_~_~_~_~_~    100/110us(JP)   200/210us(Pro2)
        0123456701234567    selected column

rowC    ____~~~~____~~~~    3.8/3.8ms(JP)   S2 of HC4051
rowB    __~~__~~__~~__~~    1.9/1.9ms(JP)   S1 of HC4051
rowA    _~_~_~_~_~_~_~_~    1.0/1.0ms(JP)   S0 of HC4051
        0123456701234567    selected row(Pro/Pro2)
        0123456789ABCDEF    selected row(JP)
rowEn0  ________~~~~~~~~    7.7/7.7ms   ~Enable of Z2 HC4051(JP only)
rowEn1  ~~~~~~~~________    7.7/7.7ms   ~Enable of Z3 HC4051(JP only)

NOTE: JP scans twice fast as Pro2 does. So Pro2 scan 8x8 matrix in 15.4ms while JP can 16x8 in that time.




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;
            UNALBLE_COL();      // set LS145(D) to high

            _delay_us(150);
        }
    }



EOF
