diff options
| -rw-r--r-- | m0110.c | 488 | ||||
| -rw-r--r-- | m0110.h | 38 | ||||
| -rw-r--r-- | m0110_usb/README | 55 | ||||
| -rw-r--r-- | m0110_usb/README.md | 126 | ||||
| -rw-r--r-- | m0110_usb/config.h | 7 | ||||
| -rw-r--r--[-rwxr-xr-x] | m0110_usb/doc/m0110.jpg | bin | 49360 -> 49360 bytes | |||
| -rw-r--r--[-rwxr-xr-x] | m0110_usb/doc/teensy.jpg | bin | 50081 -> 50081 bytes | |||
| -rw-r--r-- | m0110_usb/keymap.c | 161 | ||||
| -rw-r--r-- | m0110_usb/matrix.c | 40 | ||||
| -rw-r--r-- | rules.mk | 9 | 
10 files changed, 627 insertions, 297 deletions
| @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun WAKO <wakojun@gmail.com> +Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>  This software is licensed with a Modified BSD License.  All of this is supposed to be Free Software, Open Source, DFSG-free, @@ -34,6 +34,7 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  POSSIBILITY OF SUCH DAMAGE.  */ +/* M0110A Support was contributed by skagon@github */  #include <stdbool.h>  #include <avr/io.h> @@ -43,6 +44,9 @@ POSSIBILITY OF SUCH DAMAGE.  #include "debug.h" +static inline uint8_t raw2scan(uint8_t raw); +static inline uint8_t inquiry(void); +static inline uint8_t instant(void);  static inline void clock_lo(void);  static inline void clock_hi(void);  static inline bool clock_in(void); @@ -57,130 +61,6 @@ static inline void idle(void);  static inline void request(void); -/* -Primitive M0110 Library for AVR -============================== - - -Signaling ---------- -CLOCK is always from KEYBOARD. DATA are sent with MSB first. - -1) IDLE: both lines are high. -    CLOCK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -    DATA  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -2) KEYBOARD->HOST: HOST reads bit on rising edge. -    CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~ -    DATA  ~~~~~~~~~~~~X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~ -                      <--> 160us(clock low) -                         <---> 180us(clock high) - -3) HOST->KEYBOARD: HOST asserts bit on falling edge. -    CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~ -    DATA  ~~~~~~|_____X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~ -                <----> 840us(request to send by host)                     <---> 80us(hold DATA) -                      <--> 180us(clock low) -                         <---> 220us(clock high) - - -Protocol --------- -COMMAND: -    Inquiry     0x10    get key event -    Instant     0x12    get key event -    Model       0x14    get model number(M0110 responds with 0x09) -                        bit 7   1 if another device connected(used when keypad exists?) -                        bit4-6  next device model number -                        bit1-3  keyboard model number -                        bit 0   always 1 -    Test        0x16    test(ACK:0x7D/NAK:0x77) - -KEY EVENT: -    bit 7       key state(0:press 1:release) -    bit 6-1     scan code(see below) -    bit 0       always 1 -    To get scan code use this: ((bits&(1<<7)) | ((bits&0x7F))>>1). - -    Note: On the M0110A, the numpad keys and the arrow keys are preceded by 0x79. -          Moreover, the numpad keys =, /, * and + are preceded by shift-down 0x71 on press and shift-up 0xF1 on release. -          So, the data transferred by nupmad 5 is "79 2F" whereas for numpad + it's "71 79 0D". - -SCAN CODE: -    m0111_recv_key() function returns follwing scan codes instead of raw key events. -    Scan codes are 1 byte long and bit7 is set when key is released.  - -    M0110 -    ,---------------------------------------------------------. -    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| -    |---------------------------------------------------------| -    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| -    |---------------------------------------------------------| -    |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| -    |---------------------------------------------------------| -    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|        | -    `---------------------------------------------------------' -         |Opt|Mac |         Space               |Enter|Opt| -         `------------------------------------------------' -    ,---------------------------------------------------------. -    | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| -    |---------------------------------------------------------| -    |   30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| -    |---------------------------------------------------------| -    |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| -    |---------------------------------------------------------| -    |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|      38| -    `---------------------------------------------------------' -         | 3A|  37|             31              |   34| 3A| -         `------------------------------------------------' - -    M0110A -    ,---------------------------------------------------------. ,---------------. -    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *| -    |---------------------------------------------------------| |---------------| -    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| -    |-----------------------------------------------------'   | |---------------| -    |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| -    |---------------------------------------------------------| |---------------| -    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | -    |---------------------------------------------------------' |-----------|Ent| -    |Optio|Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | -    `---------------------------------------------------------' `---------------' -    ,---------------------------------------------------------. ,---------------. -    | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| | 47| 68| 6D| 62| -    |---------------------------------------------------------| |---------------| -    |   30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E|   | | 59| 5B| 5C| 4E| -    |-----------------------------------------------------'   | |---------------| -    |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| | 56| 57| 58| 66| -    |---------------------------------------------------------| |---------------| -    |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|  38| 4D| | 53| 54| 55|   | -    |---------------------------------------------------------' |-----------| 4C| -    |   3A|     37|            31             | 2A| 46| 42| 48| |     52| 41|   | -    `---------------------------------------------------------' `---------------' - - -References ----------- -Technical Info for 128K/512K and Plus -    ftp://ftp.apple.asimov.net/pub/apple_II/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20128K.pdf -    ftp://ftp.apple.asimov.net/pub/apple_II/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20Plus.pdf -Protocol: -    Page 20 of Tech Info for 128K/512K -    http://www.mac.linux-m68k.org/devel/plushw.php -Connector: -    Page 20 of Tech Info for 128K/512K -    http://www.kbdbabel.org/conn/kbd_connector_macplus.png -Signaling: -    http://www.kbdbabel.org/signaling/kbd_signaling_mac.png -    http://typematic.blog.shinobi.jp/Entry/14/ -Scan Codes: -    Page 22 of Tech Info for 128K/512K -    Page 07 of Tech Info for Plus -    http://m0115.web.fc2.com/m0110.jpg -    http://m0115.web.fc2.com/m0110a.jpg -*/ - -  #define WAIT_US(stat, us, err) do { \      if (!wait_##stat(us)) { \          m0110_error = err; \ @@ -202,6 +82,9 @@ Scan Codes:      } \  } while (0) +#define KEY(raw)        ((raw) & 0x7f) +#define IS_BREAK(raw)   (((raw) & 0x80) == 0x80) +  uint8_t m0110_error = 0; @@ -212,10 +95,6 @@ void m0110_init(void)      idle();      _delay_ms(1000); -    // Model Number -    // M0110 : 0x09  00001001 : model number 4 (100) -    // M0110A: 0x0B  00001011 : model number 5 (101) -    // M0110 & M0120: ???      m0110_send(M0110_MODEL);      data = m0110_recv();      print("m0110_init model: "); phex(data); print("\n"); @@ -273,17 +152,179 @@ ERROR:      return 0xFF;  } +/* +Handling for exceptional case of key combinations for M0110A + +Shift and Calc/Arrow key could be operated simultaneously: + +    Case Shift   Arrow   Events          Interpret +    ------------------------------------------------------------------- +    1    Down    Down    71, 79, DD      Calc(d)*a *b +    2    Down    Up      71, 79, UU      Arrow&Calc(u)*a +    3    Up      Down    F1, 79, DD      Shift(u) *c +    4    Up      Up      F1, 79, UU      Shift(u) and Arrow&Calc(u)*a + +    Case Shift   Calc    Events          Interpret +    ------------------------------------------------------------------- +    5(1) Down    Down    71, 71, 79, DD  Shift(d) and Cacl(d) +    6(2) Down    Up      F1, 71, 79, UU  Shift(u) and Arrow&Calc(u)*a +    7(1) Up      Down    F1, 71, 79, DD  Shift(u) and Calc(d) +    8(4) Up      Up      F1, F1, 79, UU  Shift(ux2) and Arrow&Calc(u)*a + +During Calc key is hold: +    Case Shift   Arrow   Events          Interpret +    ------------------------------------------------------------------- +    A(3) ----    Down    F1, 79, DD      Shift(u) *c +    B    ----    Up      79, UU          Arrow&Calc(u)*a +    C    Down    ----    F1, 71          Shift(u) and Shift(d) +    D    Up      ----    F1              Shift(u) +    E    Hold    Down    79, DD          Normal +    F    Hold    Up      79, UU          Arrow&Calc(u)*a +    G(1) Down    Down    F1, 71, 79, DD  Shift(u)*b and Calc(d)*a +    H(2) Down    Up      F1, 71, 79, UU  Shift(u) and Arrow&Calc(u)*a +    I(3) Up      Down    F1, F1, 79, DD  Shift(ux2) *c +    J(4) Up      Up      F1, 79, UU      Shift(u) and Arrow&Calc(u)*a + +    Case Shift   Calc    Events          Interpret +    ------------------------------------------------------------------- +    K(1) ----    Down    71, 79, DD      Calc(d)*a +    L(4) ----    Up      F1, 79, UU      Shift(u) and Arrow&Calc(u)*a +    M(1) Hold    Down    71, 79, DD      Calc(d)*a +    N    Hold    Up      79, UU          Arrow&Calc(u)*a + +    Where DD/UU indicates part of Keypad Down/Up event. +    *a: Impossible to distinguish btween Arrow and Calc event. +    *b: Shift(d) event is ignored. +    *c: Arrow/Calc(d) event is ignored. +*/  uint8_t m0110_recv_key(void)  { -    uint8_t key; +    static uint8_t keybuf = 0x00; +    static uint8_t keybuf2 = 0x00; +    static uint8_t rawbuf = 0x00; +    uint8_t raw, raw2, raw3; + +    if (keybuf) { +        raw = keybuf; +        keybuf = 0x00; +        return raw; +    } +    if (keybuf2) { +        raw = keybuf2; +        keybuf2 = 0x00; +        return raw; +    } + +    if (rawbuf) { +        raw = rawbuf; +        rawbuf = 0x00; +    } else { +        raw = instant();  // Use INSTANT for better response. Should be INQUIRY ? +    } +    switch (KEY(raw)) { +        case M0110_KEYPAD: +            raw2 = instant(); +            switch (KEY(raw2)) { +                case M0110_ARROW_UP: +                case M0110_ARROW_DOWN: +                case M0110_ARROW_LEFT: +                case M0110_ARROW_RIGHT: +                    if (IS_BREAK(raw2)) { +                        // Case B,F,N: +                        keybuf = (raw2scan(raw2) | M0110_CALC_OFFSET); // Calc(u) +                        return (raw2scan(raw2) | M0110_KEYPAD_OFFSET); // Arrow(u) +                    } +                    break; +            } +            // Keypad or Arrow +            return (raw2scan(raw2) | M0110_KEYPAD_OFFSET); +            break; +        case M0110_SHIFT: +            raw2 = instant(); +            switch (KEY(raw2)) { +                case M0110_SHIFT: +                    // Case: 5-8,C,G,H +                    rawbuf = raw2; +                    return raw2scan(raw); // Shift(d/u) +                    break; +                case M0110_KEYPAD: +                    // Shift + Arrow, Calc, or etc. +                    raw3 = instant(); +                    switch (KEY(raw3)) { +                        case M0110_ARROW_UP: +                        case M0110_ARROW_DOWN: +                        case M0110_ARROW_LEFT: +                        case M0110_ARROW_RIGHT: +                            if (IS_BREAK(raw)) { +                                if (IS_BREAK(raw3)) { +                                    // Case 4: +                                    print("(4)\n"); +                                    keybuf2 = raw2scan(raw); // Shift(u) +                                    keybuf  = (raw2scan(raw3) | M0110_CALC_OFFSET); // Calc(u) +                                    return (raw2scan(raw3) | M0110_KEYPAD_OFFSET);  // Arrow(u) +                                } else { +                                    // Case 3: +                                    print("(3)\n"); +                                    return (raw2scan(raw)); // Shift(u) +                                } +                            } else { +                                if (IS_BREAK(raw3)) { +                                    // Case 2: +                                    print("(2)\n"); +                                    keybuf  = (raw2scan(raw3) | M0110_CALC_OFFSET); // Calc(u) +                                    return (raw2scan(raw3) | M0110_KEYPAD_OFFSET);  // Arrow(u) +                                } else { +                                    // Case 1: +                                    print("(1)\n"); +                                    return (raw2scan(raw3) | M0110_CALC_OFFSET); // Calc(d) +                                } +                            } +                            break; +                        default: +                            // Shift + Keypad +                            keybuf = (raw2scan(raw3) | M0110_KEYPAD_OFFSET); +                            return raw2scan(raw);   // Shift(d/u) +                            break; +                    } +                    break; +                default: +                    // Shift + Normal keys +                    keybuf = raw2scan(raw2); +                    return raw2scan(raw);   // Shift(d/u) +                    break; +            } +            break; +        default: +            // Normal keys +            return raw2scan(raw); +            break; +    } +} + + +static inline uint8_t raw2scan(uint8_t raw) { +    return (raw == M0110_NULL) ?  M0110_NULL : ( +                (raw == M0110_ERROR) ?  M0110_ERROR : ( +                    ((raw&0x80) | ((raw&0x7F)>>1)) +                ) +           ); +} + +static inline uint8_t inquiry(void) +{      m0110_send(M0110_INQUIRY); -    key = m0110_recv(); -    if (key == 0xFF || key == M0110_NULL) -        return M0110_NULL; -    else  -        return M0110_RAW2SCAN(key); +    return m0110_recv();  } +static inline uint8_t instant(void) +{ +    m0110_send(M0110_INSTANT); +    uint8_t data = m0110_recv(); +    if (data != M0110_NULL) { +        phex(data); print(" "); +    } +    return data; +}  static inline void clock_lo()  { @@ -354,3 +395,180 @@ static inline void request(void)      clock_hi();      data_lo();  } + + + +/* +Primitive M0110 Library for AVR +============================== + + +Signaling +--------- +CLOCK is always from KEYBOARD. DATA are sent with MSB first. + +1) IDLE: both lines are high. +    CLOCK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +    DATA  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +2) KEYBOARD->HOST: HOST reads bit on rising edge. +    CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~ +    DATA  ~~~~~~~~~~~~X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~ +                      <--> 160us(clock low) +                         <---> 180us(clock high) + +3) HOST->KEYBOARD: HOST asserts bit on falling edge. +    CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~ +    DATA  ~~~~~~|_____X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~ +                <----> 840us(request to send by host)                     <---> 80us(hold DATA) +                      <--> 180us(clock low) +                         <---> 220us(clock high) + + +Protocol +-------- +COMMAND: +    Inquiry     0x10    get key event with block +    Instant     0x12    get key event +    Model       0x14    get model number(M0110 responds with 0x09) +                        bit 7   1 if another device connected(used when keypad exists?) +                        bit4-6  next device model number +                        bit1-3  keyboard model number +                        bit 0   always 1 +    Test        0x16    test(ACK:0x7D/NAK:0x77) + +KEY EVENT: +    bit 7       key state(0:press 1:release) +    bit 6-1     scan code(see below) +    bit 0       always 1 +    To get scan code use this: ((bits&(1<<7)) | ((bits&0x7F))>>1). + +    Note: On the M0110A, Keypad keys and Arrow keys are preceded by 0x79. +          Moreover, some Keypad keys(=, /, * and +) are preceded by 0x71 on press and 0xF1 on release. + +ARROW KEYS: +    Arrow keys and Calc keys(+,*,/,= on keypad) share same byte sequence and preceding byte of +    Calc keys(0x71 and 0xF1) means press and release event of SHIFT. This causes a very confusing situation, +    it is difficult or impossible to tell Calc key from Arrow key plus SHIFT in some cases. + +    Raw key events: +            press               release +            ----------------    ---------------- +    Left:         0x79, 0x0D          0x79, 0x8D +    Right:        0x79, 0x05          0x79, 0x85 +    Up:           0x79, 0x1B          0x79, 0x9B +    Down:         0x79, 0x11          0x79, 0x91 +    Pad+:   0x71, 0x79, 0x0D    0xF1, 0x79, 0x8D +    Pad*:   0x71, 0x79, 0x05    0xF1, 0x79, 0x85 +    Pad/:   0x71, 0x79, 0x1B    0xF1, 0x79, 0x9B +    Pad=:   0x71, 0x79, 0x11    0xF1, 0x79, 0x91 + + +RAW CODE: +    M0110A +    ,---------------------------------------------------------. ,---------------. +    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *| +    |---------------------------------------------------------| |---------------| +    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +    |-----------------------------------------------------'   | |---------------| +    |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +    |---------------------------------------------------------| |---------------| +    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +    |---------------------------------------------------------' |-----------|Ent| +    |Optio|Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | +    `---------------------------------------------------------' `---------------' +    ,---------------------------------------------------------. ,---------------. +    | 65| 25| 27| 29| 2B| 2F| 2D| 35| 39| 33| 3B| 37| 31|   67| |+0F|*11|*1B|*05| +    |---------------------------------------------------------| |---------------| +    |   61| 19| 1B| 1D| 1F| 23| 21| 41| 45| 3F| 47| 43| 3D|   | |+33|+37|+39|+1D| +    |-----------------------------------------------------'   | |---------------| +    |    73| 01| 03| 05| 07| 0B| 09| 4D| 51| 4B| 53| 4F|    49| |+2D|+2F|+31|*0D| +    |---------------------------------------------------------| |---------------| +    |      71| 0D| 0F| 11| 13| 17| 5B| 5D| 27| 5F| 59|  71|+1B| |+27|+29|+2B|   | +    |---------------------------------------------------------' |-----------|+19| +    |   75|     6F|            63             | 55|+0D|+05|+11| |    +25|+03|   | +    `---------------------------------------------------------' `---------------' +    + 0x79, 0xDD / 0xF1, 0xUU +    * 0x71, 0x79,DD / 0xF1, 0x79, 0xUU + + +MODEL NUMBER: +    M0110:           0x09  00001001 : model number 4 (100) +    M0110A:          0x0B  00001011 : model number 5 (101) +    M0110 & M0120:   ??? + + +Scan Code +--------- +    m0110_recv_key() function returns following scan codes instead of raw key events. +    Scan codes are 1 byte long and MSB(bit7) is set when key is released.  + +    M0110 +    ,---------------------------------------------------------. +    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| +    |---------------------------------------------------------| +    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| +    |---------------------------------------------------------| +    |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| +    |---------------------------------------------------------| +    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|        | +    `---------------------------------------------------------' +         |Opt|Mac |         Space               |Enter|Opt| +         `------------------------------------------------' +    ,---------------------------------------------------------. +    | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| +    |---------------------------------------------------------| +    |   30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| +    |---------------------------------------------------------| +    |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| +    |---------------------------------------------------------| +    |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|      38| +    `---------------------------------------------------------' +         | 3A|  37|             31              |   34| 3A| +         `------------------------------------------------' + +    M0110A +    ,---------------------------------------------------------. ,---------------. +    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *| +    |---------------------------------------------------------| |---------------| +    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +    |-----------------------------------------------------'   | |---------------| +    |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +    |---------------------------------------------------------| |---------------| +    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +    |---------------------------------------------------------' |-----------|Ent| +    |Optio|Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   | +    `---------------------------------------------------------' `---------------' +    ,---------------------------------------------------------. ,---------------. +    | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| | 47| 68| 6D| 62| +    |---------------------------------------------------------| |---------------| +    |   30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E|   | | 59| 5B| 5C| 4E| +    |-----------------------------------------------------'   | |---------------| +    |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| | 56| 57| 58| 66| +    |---------------------------------------------------------| |---------------| +    |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|  38| 4D| | 53| 54| 55|   | +    |---------------------------------------------------------' |-----------| 4C| +    |   3A|     37|            31             | 2A| 46| 42| 48| |     52| 41|   | +    `---------------------------------------------------------' `---------------' + + +References +---------- +Technical Info for 128K/512K and Plus +    ftp://ftp.apple.asimov.net/pub/apple_II/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20128K.pdf +    ftp://ftp.apple.asimov.net/pub/apple_II/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20Plus.pdf +Protocol: +    Page 20 of Tech Info for 128K/512K +    http://www.mac.linux-m68k.org/devel/plushw.php +Connector: +    Page 20 of Tech Info for 128K/512K +    http://www.kbdbabel.org/conn/kbd_connector_macplus.png +Signaling: +    http://www.kbdbabel.org/signaling/kbd_signaling_mac.png +    http://typematic.blog.shinobi.jp/Entry/14/ +Scan Codes: +    Page 22 of Tech Info for 128K/512K +    Page 07 of Tech Info for Plus +    http://m0115.web.fc2.com/m0110.jpg +    http://m0115.web.fc2.com/m0110a.jpg +*/ @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun WAKO <wakojun@gmail.com> +Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>  This software is licensed with a Modified BSD License.  All of this is supposed to be Free Software, Open Source, DFSG-free, @@ -54,23 +54,29 @@ POSSIBILITY OF SUCH DAMAGE.  #   error "M0110 data port setting is required in config.h"  #endif -#define M0110_INQUIRY     0x10 -#define M0110_INSTANT     0x14 -#define M0110_MODEL       0x16 -#define M0110_TEST        0x36 - -#define M0110_PAD         0x79 -#define M0110_NULL        0x7B -#define M0110_TEST_ACK    0x7D -#define M0110_TEST_NAK    0x77 - +/* Commands */ +#define M0110_INQUIRY       0x10 +#define M0110_INSTANT       0x14 +#define M0110_MODEL         0x16 +#define M0110_TEST          0x36 + +/* Response(raw byte from M0110) */ +#define M0110_NULL          0x7B +#define M0110_KEYPAD        0x79 +#define M0110_TEST_ACK      0x7D +#define M0110_TEST_NAK      0x77 +#define M0110_SHIFT         0x71 +#define M0110_ARROW_UP      0x1B +#define M0110_ARROW_DOWN    0x11 +#define M0110_ARROW_LEFT    0x0D +#define M0110_ARROW_RIGHT   0x05 + +/* This inidcates no response. */ +#define M0110_ERROR         0xFF  /* scan code offset for keypad and arrow keys */  #define M0110_KEYPAD_OFFSET 0x40 -#define M0110_ARROW_OFFSET  0x60 - -/* convert key event raw response into scan code */ -#define M0110_RAW2SCAN(key) ((key&(1<<7)) | ((key&0x7F)>>1)) +#define M0110_CALC_OFFSET   0x60  extern uint8_t m0110_error; @@ -80,5 +86,7 @@ void m0110_init(void);  uint8_t m0110_send(uint8_t data);  uint8_t m0110_recv(void);  uint8_t m0110_recv_key(void); +uint8_t m0110_inquiry(void); +uint8_t m0110_instant(void);  #endif diff --git a/m0110_usb/README b/m0110_usb/README deleted file mode 100644 index 6ef98757a3..0000000000 --- a/m0110_usb/README +++ /dev/null @@ -1,55 +0,0 @@ -M0110 to USB keyboard converter -=============================== -This firmware converts the protocol of Apple Macintosh keyboard M0110 into USB. - - -Connection ----------- -You need 4P4C plug and cable to connect Teensy into M0110. -Teensy port F0 is assigned for CLOCK line and F1 for DATA by default, you can change pin configuration with editing config.h.. - -Plug: -    http://en.wikipedia.org/wiki/Modular_connector#4P4C - -Pinout: -    http://www.kbdbabel.org/conn/kbd_connector_macplus.png -    1(Black):   GND -    2(Red):     CLOCK -    3(Green):   DATA -    4(Yellow):  +5V - - - -Build Frimware --------------- -Optionally edit Makefile and config.h for build options, pin configuration or MCU. - -$ cd m0110_usb -$ make -and program your Teensy with loader. - - - -Keymap ------- -You can change a keymap by editing code of keymap.c like following. -How to define the keymap is probably obvious. You can find  key symbols in usb_keycodes.h. - -This is a default keymap for M0110. -,---------------------------------------------------------. -|  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bacpa| -|---------------------------------------------------------| -|Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| -|---------------------------------------------------------| -|CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| -|---------------------------------------------------------| -|Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | -`---------------------------------------------------------' -     |Opt|Alt |         Space               |Alt |Opt| -     `-----------------------------------------------' - - -Notes ------ - -EOF diff --git a/m0110_usb/README.md b/m0110_usb/README.md new file mode 100644 index 0000000000..92b58f684a --- /dev/null +++ b/m0110_usb/README.md @@ -0,0 +1,126 @@ +M0110/M0110A to USB keyboard converter +====================================== +This firmware converts the protocol of Apple Macintosh keyboard M0110/M0110A into USB. +Target board of this project is [PJRC Teensy](http://www.pjrc.com/teensy/), though, +you can use other board with USB AVR like `ATmega32U4` and `AT90USB`. + + + +M0110A support was contributed by [skagon@github](https://github.com/skagon). + + + +Connection +---------- +You need 4P4C plug and cable to connect Teensy or other AVR dev board into the keyboard. +Teensy port `PF0` is assigned for `CLOCK` line and `PF1` for `DATA` by default, +you can change pin configuration with editing *config.h*. + +You can find 4P4C plugs on telephone handset cable. Note that it is *crossover* connection +while Macintosh keyboard cable is *straight*. + +[](http://i.imgur.com/vJoVO.jpg) + +In this pic: + +1. `GND`(Black) +2. `CLOCK`(Red) +3. `DATA`(Green) +4. `+5V`(Yellow) + +Not that wire colors may vary in your cable. + + +### Pinout +- <http://pinouts.ru/Inputs/MacKeyboard_pinout.shtml> +- <http://en.wikipedia.org/wiki/Modular_connector#4P4C> + + + + +### Pull-up Registor +You may need pull-up registors on signal lines(`CLOCK`, `DATA`) in particular +when you have long or coiled cable. 1k-10k Ohm will be OK for this purpose. +In some cases MCU can't read signal from keyboard correctly without pull-up resistors. + + + +Building Frimware +----------------- +To compile firmware you need AVR GCC. You can use [WinAVR](http://winavr.sourceforge.net/) on Windows. +You can edit *Makefile* and *config.h* to change compile options and pin configuration. + +    $ git clone ... (or download source) +    $ cd m0110_usb +    $ make + +and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html). + + + +Keymap +------ +You can change keymaps by editing *keymap.c*. + +### M0110 +#### *Default* +    ,---------------------------------------------------------. +    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| +    |---------------------------------------------------------| +    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| +    |---------------------------------------------------------| +    |Fn0   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| +    |---------------------------------------------------------| +    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | +    `---------------------------------------------------------' +         |Ctr|Alt |         Space               |Gui |Ctr| +         `-----------------------------------------------' +    You can register Esc by hitting(press&release) Fn0 quickly. + +#### *HHKB/WASD cursor Layer(Fn0)* +    ,---------------------------------------------------------. +    |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| +    |---------------------------------------------------------| +    |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|  \| +    |---------------------------------------------------------| +    |Fn0   |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Return| +    |---------------------------------------------------------| +    |Shift   |End|   |PgD|   |VoD|VoU|Mut|End|PgD|Dow|Shift   | +    `---------------------------------------------------------' +         |Ctr|Alt |         Space               |Gui |Ctr| +         `-----------------------------------------------' + +### M0110A +#### *Default* +    ,---------------------------------------------------------. ,---------------. +    |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Gui|  =|  /|  *| +    |---------------------------------------------------------| |---------------| +    |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +    |-----------------------------------------------------'   | |---------------| +    |Fn0   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +    |---------------------------------------------------------| |---------------| +    |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +    |---------------------------------------------------------| |-----------|Ent| +    |Ctrl |Alt    |         Space             |  \|Lft|Rgt|Dn | |      0|  .|   | +    `---------------------------------------------------------' `---------------' +#### *HHKB/WASD cursor Layer(Fn0)* +    ,---------------------------------------------------------. ,---------------. +    |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|Mb1|Mb3|Mb2| +    |---------------------------------------------------------| |---------------| +    |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|   | |MwD|McU|MwU|MwU| +    |-----------------------------------------------------'   | |---------------| +    |Fn0   |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Return| |McL|McD|McR|MwD| +    |---------------------------------------------------------| |---------------| +    |Shift   |End|   |PgD|   |VoD|VoU|Mut|End|PgD|Dow|Shif|Up | |MwL|McD|MwR|   | +    |---------------------------------------------------------| |-----------|Mb2| +    |Ctrl |Alt    |         Space        |Gui |  \|Lft|Rgt|Dn | |    Mb1|Mb3|   | +    `---------------------------------------------------------' `---------------' + + + +Debug +----- +You can use [PJRC HID listen](http://www.pjrc.com/teensy/hid_listen.html) to see debug output. + +The converter has some functions for debug, press `Alt+Gui+H` simultaneously to get help. +These function is totally undocumented, tentative, inconsistent and buggy. diff --git a/m0110_usb/config.h b/m0110_usb/config.h index c12e0738da..4563d6da54 100644 --- a/m0110_usb/config.h +++ b/m0110_usb/config.h @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun Wako <wakojun@gmail.com> +Copyright 2011,2012 Jun Wako <wakojun@gmail.com>  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  /* matrix size */ -#define MATRIX_ROWS 8 +#define MATRIX_ROWS 14  #define MATRIX_COLS 8  /* Locking Caps Lock support */ @@ -38,8 +38,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  /* key combination for command */  #define IS_COMMAND() ( \ -    keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_LCTRL) | MOD_BIT(KB_LALT) | MOD_BIT(KB_LGUI)) || \ -    keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)) \ +    keyboard_report->mods == (MOD_BIT(KB_LALT) | MOD_BIT(KB_LGUI)) \  ) diff --git a/m0110_usb/doc/m0110.jpg b/m0110_usb/doc/m0110.jpgBinary files differ index ef9a123abc..ef9a123abc 100755..100644 --- a/m0110_usb/doc/m0110.jpg +++ b/m0110_usb/doc/m0110.jpg diff --git a/m0110_usb/doc/teensy.jpg b/m0110_usb/doc/teensy.jpgBinary files differ index 96e93e7e24..96e93e7e24 100755..100644 --- a/m0110_usb/doc/teensy.jpg +++ b/m0110_usb/doc/teensy.jpg diff --git a/m0110_usb/keymap.c b/m0110_usb/keymap.c index bbb699a9ac..939010c6d0 100644 --- a/m0110_usb/keymap.c +++ b/m0110_usb/keymap.c @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun Wako <wakojun@gmail.com> +Copyright 2011,2012 Jun Wako <wakojun@gmail.com>  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by @@ -14,10 +14,8 @@ GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ +/* M0110A Support was contributed by skagon@github */ -/*  - * Keymap for ADB keyboard - */  #include <stdint.h>  #include <stdbool.h>  #include <avr/pgmspace.h> @@ -31,16 +29,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) -// Convert physical keyboard layout to matrix array. -// This is a macro to define keymap easily in keyboard layout form. -// TODO: layout for M0110A -/* M0110 */  #define KEYMAP( \ -    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, \ -    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, \ -    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24, \ -    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,             \ -        K3A,K37,        K31,                K34              \ +    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \ +    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,      K59,K5B,K5C,K4E, \ +    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,  K56,K57,K58,K66, \ +    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K4D,  K53,K54,K55,K4C, \ +    K3A,K37,            K31,            K34,K2A,K46,K42,K48,  K52,    K41      \  ) { \      { KB_##K00, KB_##K01, KB_##K02, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \      { KB_##K08, KB_##K09, KB_NO,    KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_##K0F }, \ @@ -49,7 +43,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.      { KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_##K27 }, \      { KB_##K28, KB_##K29, KB_##K2A, KB_##K2B, KB_##K2C, KB_##K2D, KB_##K2E, KB_##K2F }, \      { KB_##K30, KB_##K31, KB_##K32, KB_##K33, KB_##K34, KB_NO,    KB_NO,    KB_##K37 }, \ -    { KB_##K38, KB_##K39, KB_##K3A, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }  \ +    { KB_##K38, KB_##K39, KB_##K3A, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ +    { KB_NO,    KB_##K41, KB_##K42, KB_NO,    KB_NO,    KB_NO,    KB_##K46, KB_##K47 }, \ +    { KB_##K48, KB_NO,    KB_NO,    KB_NO,    KB_##K4C, KB_##K4D, KB_##K4E, KB_NO    }, \ +    { KB_NO,    KB_NO,    KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \ +    { KB_##K58, KB_##K59, KB_NO,    KB_##K5B, KB_##K5C, KB_NO,    KB_NO,    KB_NO    }, \ +    { KB_NO,    KB_NO,    KB_##K62, KB_NO,    KB_NO,    KB_NO,    KB_##K66, KB_NO    }, \ +    { KB_##K68, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##K6D, KB_NO,    KB_NO    }, \  } @@ -58,7 +58,7 @@ static const uint8_t PROGMEM fn_layer[] = {      1,              // Fn0      2,              // Fn1      3,              // Fn2 -    0,              // Fn3 +    1,              // Fn3      0,              // Fn4      0,              // Fn5      0,              // Fn6 @@ -68,10 +68,17 @@ static const uint8_t PROGMEM fn_layer[] = {  // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.  // See layer.c for details.  static const uint8_t PROGMEM fn_keycode[] = { -    KB_SCOLON,      // Fn0 -    KB_SLASH,       // Fn1 +#ifndef HASU +    KB_ESC,         // Fn0 +    KB_NO,          // Fn1      KB_NO,          // Fn2      KB_NO,          // Fn3 +#else +    KB_NO,          // Fn0 +    KB_SCOLON,      // Fn1 +    KB_SLASH,       // Fn2 +    KB_UP,          // Fn3 +#endif      KB_NO,          // Fn4      KB_NO,          // Fn5      KB_NO,          // Fn6 @@ -79,52 +86,100 @@ static const uint8_t PROGMEM fn_keycode[] = {  };  static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -    // LShift and RShift are logically same one button. -    // LOption and ROption are logically same one button. -    /* Default Layer: plain keymap -     * ,---------------------------------------------------------. -     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bacpa| -     * |---------------------------------------------------------| -     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| -     * |---------------------------------------------------------| -     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|Fn0|  '|Return| -     * |---------------------------------------------------------| -     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|Fn1|   Shift| -     * `---------------------------------------------------------' -     *      |Fn2|Alt |         Space               |Gui |Fn2| -     *      `-----------------------------------------------' +    /*  +     * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset +     * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist +     * on the M0110A, but since it generates a unique scan code which is not used for some other key in +     * the M0110A, they are totally interchangeable.  In fact, the M0110A is functionally (almost) +     * identical to the combination of the M0110 along with the M0120 keypad. The only difference +     * (which is causing some problems as you will read below) is that the M0110+M0120 don't have +     * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which +     * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has +     * substituted the [comma] key with the [=] key, however its scancode is the same. +     * +     * Default: +     * ,---------------------------------------------------------. ,---------------. +     * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Gui|  =|  /|  *| +     * |---------------------------------------------------------| |---------------| +     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -| +     * |-----------------------------------------------------'   | |---------------| +     * |Fn0   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   | +     * |---------------------------------------------------------| |-----------|Ent| +     * |Ctrl |Alt    |         Space         |Gui|  \|Lft|Rgt|Dn | |      0|  .|   | +     * `---------------------------------------------------------' `---------------' +     * +     * HHKB/WASD/Mouse Layer(Fn0): +     * ,---------------------------------------------------------. ,---------------. +     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|Mb1|Mb3|Mb2| +     * |---------------------------------------------------------| |---------------| +     * |Caps |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |Ins|   | |MwD|McU|MwU|MwU| +     * |-----------------------------------------------------'   | |---------------| +     * |Fn0   |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Return| |McL|McD|McR|MwD| +     * |---------------------------------------------------------| |---------------| +     * |Shift   |End|   |PgD|   |VoD|VoU|Mut|End|PgD|Dow|Shif|Up | |MwL|McD|MwR|   | +     * |---------------------------------------------------------| |-----------|Mb2| +     * |Ctrl |Alt    |         Space        |Gui |  \|Lft|Rgt|Dn | |    Mb1|Mb3|   | +     * `---------------------------------------------------------' `---------------' +     * Mb: Mouse Button / Mc: Mouse Cursor / Mw: Mouse Wheel +     * +     * NOTE: You can register Esc by hitting(press&release) Fn0 quickly. +     * NOTE: Gui between Space and \ is Enter on M0110 not exists on M0110A. +     * NOTE: LShift and RShift are logically same key. (M0110, M0110A) +     * NOTE: LOption and ROption are logically same key. (M0110)       */ +#ifndef HASU      KEYMAP( -    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC, -    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS, -    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN0, QUOT,     ENT, -    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN1,  -         FN2, LALT,          SPC,                     LGUI +    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    LGUI,EQL, PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, +    FN0, A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     ENT,     P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,          UP,      P1,  P2,  P3,  PENT, +    LCTL,LALT,               SPC,                LGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT      ), -    // vi mousekeys +    // HHKB & WASD      KEYMAP( -    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, -    CAPS,NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,  NO, -    LCTL,VOLD,VOLU,MUTE,NO,  NO,  MS_L,MS_D,MS_U,MS_R,FN0, NO,       ENT, -    LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,NO,  NO,  NO,   -         NO,  LALT,          BTN1,                    LGUI +    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,BTN1,BTN3,BTN2, +    CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  INS,          WH_D,MS_U,WH_U,WH_U, +    FN0, LEFT,DOWN,RGHT,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     ENT,     MS_L,MS_D,MS_R,WH_D, +    LSFT,END, NO,  PGDN,NO,  VOLD,VOLU,MUTE,END, PGDN,DOWN,          UP,      WH_L,MS_D,WH_R,BTN2, +    LCTL,LALT,               SPC,                LGUI,BSLS,LEFT,RGHT,DOWN,    BTN1,     BTN3      ), -    // vi cusorkeys +#else +    // hasu's keymap +    // To enable use this 'make' option: make EXTRAFLAGS=-DHASU      KEYMAP( -    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, -    CAPS,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,  NO,  NO,  NO, -    LCTL,NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT, -    LSFT,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, FN1,  -         NO,  LALT,          SPC,                     LGUI +    ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    LGUI,EQL, PSLS,PAST, +    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS, +    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN1, QUOT,     ENT,     P4,  P5,  P6,  PPLS, +    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2,           FN3,     P1,  P2,  P3,  PENT, +    LCTL,LALT,               SPC,                LGUI,BSLS,LEFT,RGHT,DOWN,    LGUI,     PDOT      ),      // HHKB & WASD      KEYMAP( -    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, -    CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NO, -    LCTL,LEFT,DOWN,RGHT,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     ENT, -    LSFT,END, NO,  PGDN,NO,  VOLD,VOLU,MUTE,END, PGDN,DOWN, -         FN2, LALT,          SPC,                     LGUI +    GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  INS,          P7,  P8,  P9,  PMNS, +    LCTL,LEFT,DOWN,RGHT,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,     ENT,     P4,  P5,  P6,  PPLS, +    LSFT,END, NO,  PGDN,NO,  VOLD,VOLU,MUTE,END, PGDN,DOWN,          FN3,     P1,  P2,  P3,  PENT, +    LCTL,LALT,               SPC,                LGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT +    ), +    // vi mousekeys +    KEYMAP( +    GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,           P7,  P8,  P9,  PMNS, +    NO,  VOLD,VOLU,MUTE,NO,  NO,  MS_L,MS_D,MS_U,MS_R,FN1, NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,NO,  NO,  NO,            UP,      P1,  P2,  P3,  PENT, +    LCTL,LALT,               BTN1,               LGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT +    ), +    // vi cusorkeys +    KEYMAP( +    GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST, +    CAPS,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,  NO,  NO,           P7,  P8,  P9,  PMNS, +    NO,  NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT,     P4,  P5,  P6,  PPLS, +    LSFT,NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, FN2,           UP,      P1,  P2,  P3,  PENT, +    LCTL,LALT,               SPC,                LGUI,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT      ), +#endif  }; diff --git a/m0110_usb/matrix.c b/m0110_usb/matrix.c index f045920ccd..1ca6894c44 100644 --- a/m0110_usb/matrix.c +++ b/m0110_usb/matrix.c @@ -1,5 +1,5 @@  /* -Copyright 2011 Jun Wako <wakojun@gmail.com> +Copyright 2011,2012 Jun Wako <wakojun@gmail.com>  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define CAPS        0x39 -#define CAPS_UP     (CAPS | 0x80) +#define CAPS_BREAK  (CAPS | 0x80)  #define ROW(key)    ((key)>>3&0x0F)  #define COL(key)    ((key)&0x07) @@ -43,9 +43,6 @@ static bool is_modified = false;  static uint8_t *matrix;  static uint8_t _matrix0[MATRIX_ROWS]; -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif  static void register_key(uint8_t key); @@ -88,11 +85,13 @@ uint8_t matrix_scan(void)      // Send Caps key up event      if (matrix_is_on(ROW(CAPS), COL(CAPS))) {          is_modified = true; -        register_key(CAPS_UP); +        register_key(CAPS_BREAK);      }  #endif      if (key == M0110_NULL) {          return 0; +    } else if (key == M0110_ERROR) { +        return 0;      } else {  #ifdef MATRIX_HAS_LOCKING_CAPS              if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { @@ -100,11 +99,11 @@ uint8_t matrix_scan(void)              // Ignore LockingCaps key down event              if (key == CAPS) return 0;              // Convert LockingCaps key up event into down event -            if (key == CAPS_UP) key = CAPS; +            if (key == CAPS_BREAK) key = CAPS;          } else {              // CAPS LOCK off:              // Ignore LockingCaps key up event -            if (key == CAPS_UP) return 0; +            if (key == CAPS_BREAK) return 0;          }  #endif                  is_modified = true; @@ -112,7 +111,7 @@ uint8_t matrix_scan(void)      }      if (debug_enable) { -        print("key: "); phex(key); print("\n"); +        print("["); phex(key); print("]\n");      }      return 1;  } @@ -125,12 +124,6 @@ bool matrix_is_modified(void)  inline  bool matrix_has_ghost(void)  { -#ifdef MATRIX_HAS_GHOST -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        if (matrix_has_ghost_in_row(i)) -            return true; -    } -#endif      return false;  } @@ -165,23 +158,6 @@ uint8_t matrix_key_count(void)      return count;  } -#ifdef MATRIX_HAS_GHOST -inline -static bool matrix_has_ghost_in_row(uint8_t row) -{ -    // no ghost exists in case less than 2 keys on -    if (((matrix[row] - 1) & matrix[row]) == 0) -        return false; - -    // ghost exists in case same state as other row -    for (uint8_t i=0; i < MATRIX_ROWS; i++) { -        if (i != row && (matrix[i] & matrix[row]) == matrix[row]) -            return true; -    } -    return false; -} -#endif -  inline  static void register_key(uint8_t key)  { @@ -230,6 +230,8 @@ LDFLAGS += $(EXTMEMOPTS)  LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))  LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)  #LDFLAGS += -T linker_script.x +# You can give EXTRALDFLAGS at 'make' command line. +LDFLAGS += $(EXTRALDFLAGS) @@ -315,9 +317,10 @@ GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d  # Combine all necessary flags and optional flags.  # Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) +# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) | 
