~ruther/qmk_firmware

92004d67869a371f1a8ff4d67ffb49f52141b768 — tmk 11 years ago 6013483
Fix document on HHKB internal
1 files changed, 20 insertions(+), 59 deletions(-)

M keyboard/hhkb/doc/HHKB.txt
M keyboard/hhkb/doc/HHKB.txt => keyboard/hhkb/doc/HHKB.txt +20 -59
@@ 162,7 162,7 @@ Matrix diagram:

Signals charts
--------------
    While pressing space bar, watched HHKB original controller signals by logic analyzer.
    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.



@@ 171,71 171,32 @@ Signals charts
    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
    Signal of JP:

            _delay_us(10);
    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)

            if (KEY == 0) {     // read TP1684(KEY)
                // key pressed
            } else {
                // not pressed
            }
    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

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

            _delay_us(150);
        }
    }
    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.