summaryrefslogtreecommitdiffstats
path: root/keyboards/handwired/datahand/datahand.h
blob: cb9a4d3e3b628fb04f223169ad85fe559e1189d0 (plain)
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
/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

#pragma once

#include "quantum.h"

/* This a shortcut to help you visually see your layout.
 * The first section contains all of the arguements; the second converts the arguments into a two-dimensional array.
 */

/* Each code is three letters
 * l or r - left or right hand
 * p, r, m, i, t - pinky, ring finger, middle finger, index finger, thumb
 * fingers: n, s, e, w, c - north, south, east, west, and center (manual calls this "well" but we already have "west")
 * thumb:   p, n, c, l, u, k - pad, nail, center, lock (harder center), up, knuckle
 */
#define LAYOUT( \
     lpn,             lrn,             lmn,             lin,                rin,             rmn,             rrn,             rpn,      \
lpw, lpc, lpe,   lrw, lrc, lre,   lmw, lmc, lme,   liw, lic, lie,      riw, ric, rie,   rmw, rmc, rme,   rrw, rrc, rre,   rpw, rpc, rpe, \
     lps,             lrs,             lms,             lis,                ris,             rms,             rrs,             rps,      \
                                                       ltp,    ltn,  rtn,    rtp, \
                                                           ltc,          rtc, \
                                                           ltl,          rtl, \
                                                       ltu,    ltk,  rtk,    rtu) \
{ \
  {riw, rin, lpw, lpn},\
  {ric, rie, lpc, lpe},\
  {ris, rms, lps, lrs},\
  {rmw, rmn, lrw, lrn},\
  {rmc, rme, lrc, lre},\
  {rrw, rrn, lmw, lmn},\
  {rrc, rre, lmc, lme},\
  {rrs, rps, lms, lis},\
  {rpw, rpn, liw, lin},\
  {rpc, rpe, lic, lie},\
  {rtk, rtn, ltk, ltn},\
  {rtc, rtl, ltc, ltl},\
  {rtp, rtu, ltp, ltu},\
}

/* Mode LEDs are active-low on Port B on the Teensy. */
#define LED_MODE_PORT PORTB
#define LED_TENKEY    (1<<3)
#define LED_FN        (1<<4)
#define LED_NORMAL    (1<<5)
#define LED_NAS       (1<<6)

/* Lock LEDs are active-low on Port F on the Teensy. */
#define LED_LOCK_PORT   PORTF
#define LED_CAPS_LOCK   (1<<4)
#define LED_MOUSE_LOCK  (1<<5)
#define LED_NUM_LOCK    (1<<6)
#define LED_SCROLL_LOCK (1<<7)


/* Appendix:
 * Table based on https://geekhack.org/index.php?topic=12212.msg2059319#msg2059319
 * Some pin assignments (e.g. for PS/2 I/O) have been fixed.
 *
 * Teensy    Datahand     8051   pin     pin      8051    Datahand             Teensy
 * ------    --------     ----   ---     ---      ----    --------             ------
 * GND       Mtrx send A  P1.0     1      40      VCC     VCC                  VCC
 * PB7       Mtrx send B  P1.1     2      39      P0.0    LED RH NAS           PB6
 * PD0       Mtrx send C  P1.2     3      38      P0.1    LED RH NORM          PB5
 * PD1       Mtrx send D  P1.3     4      37      P0.2    LED RH FCTN          PB4
 * PD2       RH rcv 0     P1.4     5      36      P0.3    LED RH 10K           PB3
 * PD3       RH rcv 1     P1.5     6      35      P0.4    LED RH unused        PB2
 * PD4       LH rcv 0     P1.6     7      34      P0.5    LED RH unused        PE1
 * PD5       LH rcv 1     P1.7     8      33      P0.6    LED RH unused        PE0
 * PD6       Reset button RST      9      32      P0.7    ?                    PE7
 * PD7       ?            P3.0    10      31      VPP     -                    PE6
 * PE0       ?            P3.1    11      30      ALE     -                    GND
 * PE1       kbd data     P3.2    12      29      PSEN    -                    AREF
 * PC0       ?            P3.3    13      28      P2.7    ?                    PF0
 * PC1       kbd clk      P3.4    14      27      P2.6    ?                    PF1
 * PC2       ?            P3.5    15      26      P2.5    ?                    PF2
 * PC3       RAM          P3.6    16      25      P2.4    ?                    PF3
 * PC4       RAM          P3.7    17      24      P2.3    LED D15 LH (CAPLK)   PF4
 * PC5       XTAL2        XTAL2   18      23      P2.2    LED D13 LH (MSELK)   PF5
 * PC6       XTAL1        XTAL1   19      22      P2.1    LED D6  LH (NUMLK)   PF6
 * PC7       GND          GND     20      21      P2.0    LED D14 LH (SCRLK)   PF7
 *
 * JP3 Pinout
 * 2 - keyboard data
 * 3 - keyboard clock
 *
 * In order to get the Teensy to work, we need to move pin 1 to a different pin. This is
 * because on the Teensy pin 1 is ground, but we need to write to pin 1 in order to read
 * the keyboard matrix. An ideal pin to move it to is VPP (pin 31), because this pin tells
 * the 8051 whether it should read from external or internal memory. The Teensy doesn't
 * care about that.
 *
 * The easiest way to reassign the pin is to use standoffs. You can check out this thread:
 * https://geekhack.org/index.php?topic=12212.msg235382#msg235382 for a picture of what
 * this looks like. Note that in the picture the pin has been reassigned to pin 12. We
 * don't want to do that because we're going to use that pin to send data over PS/2.
 *
 * We could if we wanted also reassign the PS/2 pins to Teensy hardware UART pins, but
 * that's more work. Instead we'll just bit-bang PS/2 because it's an old, slow protocol
 * (and because there's already a bit-banged PS/2 host implementation in QMK - we just
 * need to add the device side).
 *
 * So overall, we want the following inputs and outputs:
 * Outputs:
 *   Matrix:
 *     PB7
 *     PD0
 *     PD1
 *     PE6 (moved from pin1, GND)
 *   LEDs:
 *     PB3-6
 *     PF4-7
 * Inputs:
 *   Matrix:
 *     PD2-5
 * I/Os (start up as inputs):
 *   PS/2:
 *     PC1
 *     PE1
 */