1 /* 2 * (C) Copyright 2002 ELTEC Elektronik AG 3 * Frank Gottschling <fgottschling@eltec.de> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 /* i8042.c - Intel 8042 keyboard driver routines */ 9 10 #include <common.h> 11 #include <dm.h> 12 #include <errno.h> 13 #include <i8042.h> 14 #include <input.h> 15 #include <keyboard.h> 16 #include <asm/io.h> 17 18 DECLARE_GLOBAL_DATA_PTR; 19 20 /* defines */ 21 #define in8(p) inb(p) 22 #define out8(p, v) outb(v, p) 23 24 enum { 25 QUIRK_DUP_POR = 1 << 0, 26 }; 27 28 /* locals */ 29 struct i8042_kbd_priv { 30 bool extended; /* true if an extended keycode is expected next */ 31 int quirks; /* quirks that we support */ 32 }; 33 34 static unsigned char ext_key_map[] = { 35 0x1c, /* keypad enter */ 36 0x1d, /* right control */ 37 0x35, /* keypad slash */ 38 0x37, /* print screen */ 39 0x38, /* right alt */ 40 0x46, /* break */ 41 0x47, /* editpad home */ 42 0x48, /* editpad up */ 43 0x49, /* editpad pgup */ 44 0x4b, /* editpad left */ 45 0x4d, /* editpad right */ 46 0x4f, /* editpad end */ 47 0x50, /* editpad dn */ 48 0x51, /* editpad pgdn */ 49 0x52, /* editpad ins */ 50 0x53, /* editpad del */ 51 0x00 /* map end */ 52 }; 53 54 static int kbd_input_empty(void) 55 { 56 int kbd_timeout = KBD_TIMEOUT * 1000; 57 58 while ((in8(I8042_STS_REG) & STATUS_IBF) && kbd_timeout--) 59 udelay(1); 60 61 return kbd_timeout != -1; 62 } 63 64 static int kbd_output_full(void) 65 { 66 int kbd_timeout = KBD_TIMEOUT * 1000; 67 68 while (((in8(I8042_STS_REG) & STATUS_OBF) == 0) && kbd_timeout--) 69 udelay(1); 70 71 return kbd_timeout != -1; 72 } 73 74 /** 75 * check_leds() - Check the keyboard LEDs and update them it needed 76 * 77 * @ret: Value to return 78 * @return value of @ret 79 */ 80 static int i8042_kbd_update_leds(struct udevice *dev, int leds) 81 { 82 kbd_input_empty(); 83 out8(I8042_DATA_REG, CMD_SET_KBD_LED); 84 kbd_input_empty(); 85 out8(I8042_DATA_REG, leds & 0x7); 86 87 return 0; 88 } 89 90 static int kbd_write(int reg, int value) 91 { 92 if (!kbd_input_empty()) 93 return -1; 94 out8(reg, value); 95 96 return 0; 97 } 98 99 static int kbd_read(int reg) 100 { 101 if (!kbd_output_full()) 102 return -1; 103 104 return in8(reg); 105 } 106 107 static int kbd_cmd_read(int cmd) 108 { 109 if (kbd_write(I8042_CMD_REG, cmd)) 110 return -1; 111 112 return kbd_read(I8042_DATA_REG); 113 } 114 115 static int kbd_cmd_write(int cmd, int data) 116 { 117 if (kbd_write(I8042_CMD_REG, cmd)) 118 return -1; 119 120 return kbd_write(I8042_DATA_REG, data); 121 } 122 123 static int kbd_reset(int quirk) 124 { 125 int config; 126 127 /* controller self test */ 128 if (kbd_cmd_read(CMD_SELF_TEST) != KBC_TEST_OK) 129 goto err; 130 131 /* keyboard reset */ 132 if (kbd_write(I8042_DATA_REG, CMD_RESET_KBD) || 133 kbd_read(I8042_DATA_REG) != KBD_ACK || 134 kbd_read(I8042_DATA_REG) != KBD_POR) 135 goto err; 136 137 /* set AT translation and disable irq */ 138 config = kbd_cmd_read(CMD_RD_CONFIG); 139 if (config == -1) 140 goto err; 141 142 /* Sometimes get a second byte */ 143 else if ((quirk & QUIRK_DUP_POR) && config == KBD_POR) 144 config = kbd_cmd_read(CMD_RD_CONFIG); 145 146 config |= CONFIG_AT_TRANS; 147 config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN); 148 if (kbd_cmd_write(CMD_WR_CONFIG, config)) 149 goto err; 150 151 /* enable keyboard */ 152 if (kbd_write(I8042_CMD_REG, CMD_KBD_EN) || 153 !kbd_input_empty()) 154 goto err; 155 156 return 0; 157 err: 158 debug("%s: Keyboard failure\n", __func__); 159 return -1; 160 } 161 162 static int kbd_controller_present(void) 163 { 164 return in8(I8042_STS_REG) != 0xff; 165 } 166 167 /* 168 * Implement a weak default function for boards that optionally 169 * need to skip the i8042 initialization. 170 * 171 * TODO(sjg@chromium.org): Use device tree for this? 172 */ 173 int __weak board_i8042_skip(void) 174 { 175 /* As default, don't skip */ 176 return 0; 177 } 178 179 void i8042_flush(void) 180 { 181 int timeout; 182 183 /* 184 * The delay is to give the keyboard controller some time 185 * to fill the next byte. 186 */ 187 while (1) { 188 timeout = 100; /* wait for no longer than 100us */ 189 while (timeout > 0 && !(in8(I8042_STS_REG) & STATUS_OBF)) { 190 udelay(1); 191 timeout--; 192 } 193 194 /* Try to pull next byte if not timeout */ 195 if (in8(I8042_STS_REG) & STATUS_OBF) 196 in8(I8042_DATA_REG); 197 else 198 break; 199 } 200 } 201 202 int i8042_disable(void) 203 { 204 if (kbd_input_empty() == 0) 205 return -1; 206 207 /* Disable keyboard */ 208 out8(I8042_CMD_REG, CMD_KBD_DIS); 209 210 if (kbd_input_empty() == 0) 211 return -1; 212 213 return 0; 214 } 215 216 static int i8042_kbd_check(struct input_config *input) 217 { 218 struct i8042_kbd_priv *priv = dev_get_priv(input->dev); 219 220 if ((in8(I8042_STS_REG) & STATUS_OBF) == 0) { 221 return 0; 222 } else { 223 bool release = false; 224 int scan_code; 225 int i; 226 227 scan_code = in8(I8042_DATA_REG); 228 if (scan_code == 0xfa) { 229 return 0; 230 } else if (scan_code == 0xe0) { 231 priv->extended = true; 232 return 0; 233 } 234 if (scan_code & 0x80) { 235 scan_code &= 0x7f; 236 release = true; 237 } 238 if (priv->extended) { 239 priv->extended = false; 240 for (i = 0; ext_key_map[i]; i++) { 241 if (ext_key_map[i] == scan_code) { 242 scan_code = 0x60 + i; 243 break; 244 } 245 } 246 /* not found ? */ 247 if (!ext_key_map[i]) 248 return 0; 249 } 250 251 input_add_keycode(input, scan_code, release); 252 return 1; 253 } 254 } 255 256 /* i8042_kbd_init - reset keyboard and init state flags */ 257 static int i8042_start(struct udevice *dev) 258 { 259 struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); 260 struct i8042_kbd_priv *priv = dev_get_priv(dev); 261 struct input_config *input = &uc_priv->input; 262 int keymap, try; 263 char *penv; 264 int ret; 265 266 if (!kbd_controller_present() || board_i8042_skip()) { 267 debug("i8042 keyboard controller is not present\n"); 268 return -ENOENT; 269 } 270 271 /* Init keyboard device (default US layout) */ 272 keymap = KBD_US; 273 penv = getenv("keymap"); 274 if (penv != NULL) { 275 if (strncmp(penv, "de", 3) == 0) 276 keymap = KBD_GER; 277 } 278 279 for (try = 0; kbd_reset(priv->quirks) != 0; try++) { 280 if (try >= KBD_RESET_TRIES) 281 return -1; 282 } 283 284 ret = input_add_tables(input, keymap == KBD_GER); 285 if (ret) 286 return ret; 287 288 i8042_kbd_update_leds(dev, NORMAL); 289 debug("%s: started\n", __func__); 290 291 return 0; 292 } 293 294 /** 295 * Set up the i8042 keyboard. This is called by the stdio device handler 296 * 297 * We want to do this init when the keyboard is actually used rather than 298 * at start-up, since keyboard input may not currently be selected. 299 * 300 * Once the keyboard starts there will be a period during which we must 301 * wait for the keyboard to init. We do this only when a key is first 302 * read - see kbd_wait_for_fifo_init(). 303 * 304 * @return 0 if ok, -ve on error 305 */ 306 static int i8042_kbd_probe(struct udevice *dev) 307 { 308 struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); 309 struct i8042_kbd_priv *priv = dev_get_priv(dev); 310 struct stdio_dev *sdev = &uc_priv->sdev; 311 struct input_config *input = &uc_priv->input; 312 int ret; 313 314 if (fdtdec_get_bool(gd->fdt_blob, dev->of_offset, 315 "intel,duplicate-por")) 316 priv->quirks |= QUIRK_DUP_POR; 317 318 /* Register the device. i8042_start() will be called soon */ 319 input->dev = dev; 320 input->read_keys = i8042_kbd_check; 321 input_allow_repeats(input, true); 322 strcpy(sdev->name, "i8042-kbd"); 323 ret = input_stdio_register(sdev); 324 if (ret) { 325 debug("%s: input_stdio_register() failed\n", __func__); 326 return ret; 327 } 328 debug("%s: ready\n", __func__); 329 330 return 0; 331 } 332 333 static const struct keyboard_ops i8042_kbd_ops = { 334 .start = i8042_start, 335 .update_leds = i8042_kbd_update_leds, 336 }; 337 338 static const struct udevice_id i8042_kbd_ids[] = { 339 { .compatible = "intel,i8042-keyboard" }, 340 { } 341 }; 342 343 U_BOOT_DRIVER(i8042_kbd) = { 344 .name = "i8042_kbd", 345 .id = UCLASS_KEYBOARD, 346 .of_match = i8042_kbd_ids, 347 .probe = i8042_kbd_probe, 348 .ops = &i8042_kbd_ops, 349 .priv_auto_alloc_size = sizeof(struct i8042_kbd_priv), 350 }; 351