/*
 * (C) Copyright 2002 ELTEC Elektronik AG
 * Frank Gottschling <fgottschling@eltec.de>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

/* i8042.h - Intel 8042 keyboard driver header */

#ifndef _I8042_H_
#define _I8042_H_

/* defines */

#define I8042_DATA_REG	0x60	/* keyboard i/o buffer */
#define I8042_STS_REG	0x64	/* keyboard status read */
#define I8042_CMD_REG	0x64	/* keyboard ctrl write */

/* Status register bit defines */
#define STATUS_OBF	(1 << 0)
#define STATUS_IBF	(1 << 1)

/* Configuration byte bit defines */
#define CONFIG_KIRQ_EN	(1 << 0)
#define CONFIG_MIRQ_EN	(1 << 1)
#define CONFIG_SET_BIST	(1 << 2)
#define CONFIG_KCLK_DIS	(1 << 4)
#define CONFIG_MCLK_DIS	(1 << 5)
#define CONFIG_AT_TRANS	(1 << 6)

/* i8042 commands */
#define CMD_RD_CONFIG	0x20	/* read configuration byte */
#define CMD_WR_CONFIG	0x60	/* write configuration byte */
#define CMD_SELF_TEST	0xaa	/* controller self-test */
#define CMD_KBD_DIS	0xad	/* keyboard disable */
#define CMD_KBD_EN	0xae	/* keyboard enable */
#define CMD_SET_KBD_LED	0xed	/* set keyboard led */
#define CMD_RESET_KBD	0xff	/* reset keyboard */

/* i8042 command result */
#define KBC_TEST_OK	0x55
#define KBD_ACK		0xfa
#define KBD_POR		0xaa

/* keyboard scan codes */

#define KBD_US		0	/* default US layout */
#define KBD_GER		1	/* german layout */

#define KBD_TIMEOUT	1000	/* 1 sec */
#define KBD_RESET_TRIES	3

#define AS		0	/* normal character index */
#define SH		1	/* shift index */
#define CN		2	/* control index */
#define NM		3	/* numeric lock index */
#define AK		4	/* right alt key */
#define CP		5	/* capslock index */
#define ST		6	/* stop output index */
#define EX		7	/* extended code index */
#define ES		8	/* escape and extended code index */

#define NORMAL		0x0000	/* normal key */
#define STP		0x0001	/* scroll lock stop output*/
#define NUM		0x0002	/* numeric lock */
#define CAPS		0x0004	/* capslock */
#define SHIFT		0x0008	/* shift */
#define CTRL		0x0010	/* control*/
#define EXT		0x0020	/* extended scan code 0xe0 */
#define ESC		0x0040	/* escape key press */
#define E1		0x0080	/* extended scan code 0xe1 */
#define BRK		0x0100	/* make break flag for keyboard */
#define ALT		0x0200	/* right alt */

/* exports */

/**
 * Flush all buffer from keyboard controller to host.
 */
void i8042_flush(void);

/**
 * Disables the keyboard so that key strokes no longer generate scancodes to
 * the host.
 *
 * @return 0 if ok, -1 if keyboard input was found while disabling
 */
int i8042_disable(void);

struct stdio_dev;

int i8042_kbd_init(void);
int i8042_tstc(struct stdio_dev *dev);
int i8042_getc(struct stdio_dev *dev);

#endif /* _I8042_H_ */
