1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Chromium OS Matrix Keyboard
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (c) 2012 The Chromium OS Authors.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <cros_ec.h>
11*4882a593Smuzhiyun #include <dm.h>
12*4882a593Smuzhiyun #include <errno.h>
13*4882a593Smuzhiyun #include <input.h>
14*4882a593Smuzhiyun #include <keyboard.h>
15*4882a593Smuzhiyun #include <key_matrix.h>
16*4882a593Smuzhiyun #include <stdio_dev.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun enum {
21*4882a593Smuzhiyun KBC_MAX_KEYS = 8, /* Maximum keys held down at once */
22*4882a593Smuzhiyun KBC_REPEAT_RATE_MS = 30,
23*4882a593Smuzhiyun KBC_REPEAT_DELAY_MS = 240,
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun struct cros_ec_keyb_priv {
27*4882a593Smuzhiyun struct input_config *input; /* The input layer */
28*4882a593Smuzhiyun struct key_matrix matrix; /* The key matrix layer */
29*4882a593Smuzhiyun int key_rows; /* Number of keyboard rows */
30*4882a593Smuzhiyun int key_cols; /* Number of keyboard columns */
31*4882a593Smuzhiyun int ghost_filter; /* 1 to enable ghost filter, else 0 */
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /**
36*4882a593Smuzhiyun * Check the keyboard controller and return a list of key matrix positions
37*4882a593Smuzhiyun * for which a key is pressed
38*4882a593Smuzhiyun *
39*4882a593Smuzhiyun * @param dev Keyboard device
40*4882a593Smuzhiyun * @param keys List of keys that we have detected
41*4882a593Smuzhiyun * @param max_count Maximum number of keys to return
42*4882a593Smuzhiyun * @param samep Set to true if this scan repeats the last, else false
43*4882a593Smuzhiyun * @return number of pressed keys, 0 for none, -EIO on error
44*4882a593Smuzhiyun */
check_for_keys(struct udevice * dev,struct key_matrix_key * keys,int max_count,bool * samep)45*4882a593Smuzhiyun static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys,
46*4882a593Smuzhiyun int max_count, bool *samep)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
49*4882a593Smuzhiyun struct key_matrix_key *key;
50*4882a593Smuzhiyun static struct mbkp_keyscan last_scan;
51*4882a593Smuzhiyun static bool last_scan_valid;
52*4882a593Smuzhiyun struct mbkp_keyscan scan;
53*4882a593Smuzhiyun unsigned int row, col, bit, data;
54*4882a593Smuzhiyun int num_keys;
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun if (cros_ec_scan_keyboard(dev->parent, &scan)) {
57*4882a593Smuzhiyun debug("%s: keyboard scan failed\n", __func__);
58*4882a593Smuzhiyun return -EIO;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun *samep = last_scan_valid && !memcmp(&last_scan, &scan, sizeof(scan));
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun * This is a bit odd. The EC has no way to tell us that it has run
64*4882a593Smuzhiyun * out of key scans. It just returns the same scan over and over
65*4882a593Smuzhiyun * again. So the only way to detect that we have run out is to detect
66*4882a593Smuzhiyun * that this scan is the same as the last.
67*4882a593Smuzhiyun */
68*4882a593Smuzhiyun last_scan_valid = true;
69*4882a593Smuzhiyun memcpy(&last_scan, &scan, sizeof(last_scan));
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun for (col = num_keys = bit = 0; col < priv->matrix.num_cols;
72*4882a593Smuzhiyun col++) {
73*4882a593Smuzhiyun for (row = 0; row < priv->matrix.num_rows; row++) {
74*4882a593Smuzhiyun unsigned int mask = 1 << (bit & 7);
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun data = scan.data[bit / 8];
77*4882a593Smuzhiyun if ((data & mask) && num_keys < max_count) {
78*4882a593Smuzhiyun key = keys + num_keys++;
79*4882a593Smuzhiyun key->row = row;
80*4882a593Smuzhiyun key->col = col;
81*4882a593Smuzhiyun key->valid = 1;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun bit++;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun return num_keys;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun * Check the keyboard, and send any keys that are pressed.
92*4882a593Smuzhiyun *
93*4882a593Smuzhiyun * This is called by input_tstc() and input_getc() when they need more
94*4882a593Smuzhiyun * characters
95*4882a593Smuzhiyun *
96*4882a593Smuzhiyun * @param input Input configuration
97*4882a593Smuzhiyun * @return 1, to indicate that we have something to look at
98*4882a593Smuzhiyun */
cros_ec_kbc_check(struct input_config * input)99*4882a593Smuzhiyun int cros_ec_kbc_check(struct input_config *input)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun struct udevice *dev = input->dev;
102*4882a593Smuzhiyun struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
103*4882a593Smuzhiyun static struct key_matrix_key last_keys[KBC_MAX_KEYS];
104*4882a593Smuzhiyun static int last_num_keys;
105*4882a593Smuzhiyun struct key_matrix_key keys[KBC_MAX_KEYS];
106*4882a593Smuzhiyun int keycodes[KBC_MAX_KEYS];
107*4882a593Smuzhiyun int num_keys, num_keycodes;
108*4882a593Smuzhiyun int irq_pending, sent;
109*4882a593Smuzhiyun bool same = false;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /*
112*4882a593Smuzhiyun * Loop until the EC has no more keyscan records, or we have
113*4882a593Smuzhiyun * received at least one character. This means we know that tstc()
114*4882a593Smuzhiyun * will always return non-zero if keys have been pressed.
115*4882a593Smuzhiyun *
116*4882a593Smuzhiyun * Without this loop, a key release (which generates no new ascii
117*4882a593Smuzhiyun * characters) will cause us to exit this function, and just tstc()
118*4882a593Smuzhiyun * may return 0 before all keys have been read from the EC.
119*4882a593Smuzhiyun */
120*4882a593Smuzhiyun do {
121*4882a593Smuzhiyun irq_pending = cros_ec_interrupt_pending(dev->parent);
122*4882a593Smuzhiyun if (irq_pending) {
123*4882a593Smuzhiyun num_keys = check_for_keys(dev, keys, KBC_MAX_KEYS,
124*4882a593Smuzhiyun &same);
125*4882a593Smuzhiyun if (num_keys < 0)
126*4882a593Smuzhiyun return 0;
127*4882a593Smuzhiyun last_num_keys = num_keys;
128*4882a593Smuzhiyun memcpy(last_keys, keys, sizeof(keys));
129*4882a593Smuzhiyun } else {
130*4882a593Smuzhiyun /*
131*4882a593Smuzhiyun * EC doesn't want to be asked, so use keys from last
132*4882a593Smuzhiyun * time.
133*4882a593Smuzhiyun */
134*4882a593Smuzhiyun num_keys = last_num_keys;
135*4882a593Smuzhiyun memcpy(keys, last_keys, sizeof(keys));
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun if (num_keys < 0)
139*4882a593Smuzhiyun return -1;
140*4882a593Smuzhiyun num_keycodes = key_matrix_decode(&priv->matrix, keys,
141*4882a593Smuzhiyun num_keys, keycodes, KBC_MAX_KEYS);
142*4882a593Smuzhiyun sent = input_send_keycodes(input, keycodes, num_keycodes);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /*
145*4882a593Smuzhiyun * For those ECs without an interrupt, stop scanning when we
146*4882a593Smuzhiyun * see that the scan is the same as last time.
147*4882a593Smuzhiyun */
148*4882a593Smuzhiyun if ((irq_pending < 0) && same)
149*4882a593Smuzhiyun break;
150*4882a593Smuzhiyun } while (irq_pending && !sent);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun return 1;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /**
156*4882a593Smuzhiyun * Decode MBKP keyboard details from the device tree
157*4882a593Smuzhiyun *
158*4882a593Smuzhiyun * @param blob Device tree blob
159*4882a593Smuzhiyun * @param node Node to decode from
160*4882a593Smuzhiyun * @param config Configuration data read from fdt
161*4882a593Smuzhiyun * @return 0 if ok, -1 on error
162*4882a593Smuzhiyun */
cros_ec_keyb_decode_fdt(struct udevice * dev,struct cros_ec_keyb_priv * config)163*4882a593Smuzhiyun static int cros_ec_keyb_decode_fdt(struct udevice *dev,
164*4882a593Smuzhiyun struct cros_ec_keyb_priv *config)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun /*
167*4882a593Smuzhiyun * Get keyboard rows and columns - at present we are limited to
168*4882a593Smuzhiyun * 8 columns by the protocol (one byte per row scan)
169*4882a593Smuzhiyun */
170*4882a593Smuzhiyun config->key_rows = dev_read_u32_default(dev, "keypad,num-rows", 0);
171*4882a593Smuzhiyun config->key_cols = dev_read_u32_default(dev, "keypad,num-columns", 0);
172*4882a593Smuzhiyun if (!config->key_rows || !config->key_cols ||
173*4882a593Smuzhiyun config->key_rows * config->key_cols / 8
174*4882a593Smuzhiyun > CROS_EC_KEYSCAN_COLS) {
175*4882a593Smuzhiyun debug("%s: Invalid key matrix size %d x %d\n", __func__,
176*4882a593Smuzhiyun config->key_rows, config->key_cols);
177*4882a593Smuzhiyun return -1;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun config->ghost_filter = dev_read_bool(dev, "google,needs-ghost-filter");
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
cros_ec_kbd_probe(struct udevice * dev)184*4882a593Smuzhiyun static int cros_ec_kbd_probe(struct udevice *dev)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
187*4882a593Smuzhiyun struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev);
188*4882a593Smuzhiyun struct stdio_dev *sdev = &uc_priv->sdev;
189*4882a593Smuzhiyun struct input_config *input = &uc_priv->input;
190*4882a593Smuzhiyun int ret;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun ret = cros_ec_keyb_decode_fdt(dev, priv);
193*4882a593Smuzhiyun if (ret) {
194*4882a593Smuzhiyun debug("%s: Cannot decode node (ret=%d)\n", __func__, ret);
195*4882a593Smuzhiyun return -EINVAL;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun input_set_delays(input, KBC_REPEAT_DELAY_MS, KBC_REPEAT_RATE_MS);
198*4882a593Smuzhiyun ret = key_matrix_init(&priv->matrix, priv->key_rows, priv->key_cols,
199*4882a593Smuzhiyun priv->ghost_filter);
200*4882a593Smuzhiyun if (ret) {
201*4882a593Smuzhiyun debug("%s: cannot init key matrix\n", __func__);
202*4882a593Smuzhiyun return ret;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun ret = key_matrix_decode_fdt(dev, &priv->matrix);
205*4882a593Smuzhiyun if (ret) {
206*4882a593Smuzhiyun debug("%s: Could not decode key matrix from fdt\n", __func__);
207*4882a593Smuzhiyun return ret;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun debug("%s: Matrix keyboard %dx%d ready\n", __func__, priv->key_rows,
210*4882a593Smuzhiyun priv->key_cols);
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun priv->input = input;
213*4882a593Smuzhiyun input->dev = dev;
214*4882a593Smuzhiyun input_add_tables(input, false);
215*4882a593Smuzhiyun input->read_keys = cros_ec_kbc_check;
216*4882a593Smuzhiyun strcpy(sdev->name, "cros-ec-keyb");
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* Register the device. cros_ec_init_keyboard() will be called soon */
219*4882a593Smuzhiyun return input_stdio_register(sdev);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun static const struct keyboard_ops cros_ec_kbd_ops = {
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun static const struct udevice_id cros_ec_kbd_ids[] = {
226*4882a593Smuzhiyun { .compatible = "google,cros-ec-keyb" },
227*4882a593Smuzhiyun { }
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun U_BOOT_DRIVER(cros_ec_kbd) = {
231*4882a593Smuzhiyun .name = "cros_ec_kbd",
232*4882a593Smuzhiyun .id = UCLASS_KEYBOARD,
233*4882a593Smuzhiyun .of_match = cros_ec_kbd_ids,
234*4882a593Smuzhiyun .probe = cros_ec_kbd_probe,
235*4882a593Smuzhiyun .ops = &cros_ec_kbd_ops,
236*4882a593Smuzhiyun .priv_auto_alloc_size = sizeof(struct cros_ec_keyb_priv),
237*4882a593Smuzhiyun };
238