summaryrefslogtreecommitdiff
path: root/src/drivers/ao_ps2.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/ao_ps2.h')
-rw-r--r--src/drivers/ao_ps2.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/drivers/ao_ps2.h b/src/drivers/ao_ps2.h
new file mode 100644
index 00000000..f1f05ee5
--- /dev/null
+++ b/src/drivers/ao_ps2.h
@@ -0,0 +1,220 @@
+/*
+ * Copyright © 2016 Keith Packard <keithp@keithp.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
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#ifndef _AO_PS2_H_
+#define _AO_PS2_H_
+
+extern uint8_t ao_ps2_stdin;
+
+int
+ao_ps2_poll(void);
+
+uint8_t
+ao_ps2_get(void);
+
+void
+ao_ps2_put(uint8_t b);
+
+uint8_t
+ao_ps2_is_down(uint8_t code);
+
+int
+ao_ps2_poll_key(void);
+
+uint8_t
+ao_ps2_get_key(void);
+
+int
+ao_ps2_ascii(uint8_t key);
+
+int
+_ao_ps2_pollchar(void);
+
+char
+ao_ps2_getchar(void);
+
+void
+ao_ps2_init(void);
+
+/* From http://computer-engineering.org/ps2keyboard/ */
+
+/* Device responds with ACK and then resets */
+#define AO_PS2_RESET 0xff
+
+/* Device retransmits last byte */
+#define AO_PS2_RESEND 0xfe
+
+/* Setting key report only works in mode 3 */
+
+/* Disable break and typematic for specified mode 3 keys. Terminate with invalid key */
+#define AO_PS2_SET_KEY_MAKE 0xfd
+
+/* Disable typematic for keys */
+#define AO_PS2_SET_KEY_MAKE_BREAK 0xfc
+
+/* Disable break code for keys */
+#define AO_PS2_SET_KEY_TYPEMATIC 0xfb
+
+/* Enable make, break and typematic */
+#define AO_PS2_SET_KEY_TYPEMATIC_MAKE_BREAK 0xfa
+
+/* Disable break and typematic for all */
+#define AO_PS2_SET_ALL_MAKE 0xf9
+
+/* Disable typematic for all */
+#define AO_PS2_SET_ALL_MAKE_BREAK 0xf8
+
+/* Disable break for all */
+#define AO_PS2_SET_ALL_TYPEMATIC 0xf7
+
+/* Set keyboard to default (repeat, report and scan code set 2) */
+#define AO_PS2_SET_DEFAULT 0xf6
+
+/* Disable and reset to default */
+#define AO_PS2_DISABLE 0xf5
+
+/* Enable */
+#define AO_PS2_ENABLE 0xf4
+
+/* Set repeat rate. Bytes 5-6 are the start delay, bits 0-4 are the rate */
+#define AO_PS2_SET_REPEAT_RATE 0xf3
+
+/* Read keyboard id. Returns two bytes */
+#define AO_PS2_GETID 0xf2
+
+/* Set scan code (1, 2, or 3) */
+#define AO_PS2_SET_SCAN_CODE_SET 0xf0
+
+/* Echo. Keyboard replies with Echo */
+#define AO_PS2_ECHO 0xee
+
+/* Set LEDs */
+#define AO_PS2_SET_LEDS 0xed
+# define AO_PS2_SET_LEDS_SCROLL 0x01
+# define AO_PS2_SET_LEDS_NUM 0x02
+# define AO_PS2_SET_LEDS_CAPS 0x04
+
+#define AO_PS2_BREAK 0xf0
+#define AO_PS2_ACK 0xfa
+#define AO_PS2_ERROR 0xfc
+#define AO_PS2_NAK 0xfe
+
+/* Scan code set 3 */
+
+#define AO_PS2_A 0x1c
+#define AO_PS2_B 0x32
+#define AO_PS2_C 0x21
+#define AO_PS2_D 0x23
+#define AO_PS2_E 0x24
+#define AO_PS2_F 0x2b
+#define AO_PS2_G 0x34
+#define AO_PS2_H 0x33
+#define AO_PS2_I 0x43
+#define AO_PS2_J 0x3b
+#define AO_PS2_K 0x42
+#define AO_PS2_L 0x4b
+#define AO_PS2_M 0x3a
+#define AO_PS2_N 0x31
+#define AO_PS2_O 0x44
+#define AO_PS2_P 0x4d
+#define AO_PS2_Q 0x15
+#define AO_PS2_R 0x2d
+#define AO_PS2_S 0x1b
+#define AO_PS2_T 0x2c
+#define AO_PS2_U 0x3c
+#define AO_PS2_V 0x2a
+#define AO_PS2_W 0x1d
+#define AO_PS2_X 0x22
+#define AO_PS2_Y 0x35
+#define AO_PS2_Z 0x1a
+#define AO_PS2_0 0x45
+#define AO_PS2_1 0x16
+#define AO_PS2_2 0x1e
+#define AO_PS2_3 0x26
+#define AO_PS2_4 0x25
+#define AO_PS2_5 0x2e
+#define AO_PS2_6 0x36
+#define AO_PS2_7 0x3d
+#define AO_PS2_8 0x3e
+#define AO_PS2_9 0x46
+#define AO_PS2_GRAVE 0x0e
+#define AO_PS2_HYPHEN 0x4e
+#define AO_PS2_EQUAL 0x55
+#define AO_PS2_BACKSLASH 0x5c
+#define AO_PS2_BACKSPACE 0x66
+#define AO_PS2_SPACE 0x29
+#define AO_PS2_TAB 0x0d
+#define AO_PS2_CAPS_LOCK 0x14
+#define AO_PS2_L_SHIFT 0x12
+#define AO_PS2_L_CTRL 0x11
+#define AO_PS2_L_WIN 0x8b
+#define AO_PS2_L_ALT 0x19
+#define AO_PS2_R_SHIFT 0x59
+#define AO_PS2_R_CTRL 0x58
+#define AO_PS2_R_WIN 0x8c
+#define AO_PS2_R_ALT 0x39
+#define AO_PS2_APPS 0x8d
+#define AO_PS2_ENTER 0x5a
+#define AO_PS2_ESC 0x08
+#define AO_PS2_F1 0x07
+#define AO_PS2_F2 0x0f
+#define AO_PS2_F3 0x17
+#define AO_PS2_F4 0x1f
+#define AO_PS2_F5 0x27
+#define AO_PS2_F6 0x2f
+#define AO_PS2_F7 0x37
+#define AO_PS2_F8 0x3f
+#define AO_PS2_F9 0x47
+#define AO_PS2_F10 0x4f
+#define AO_PS2_F11 0x56
+#define AO_PS2_F12 0x5e
+#define AO_PS2_PRNT_SCRN 0x57
+#define AO_PS2_SCROLL_LOCK 0x5f
+#define AO_PS2_PAUSE 0x62
+#define AO_PS2_OPEN_SQ 0x54
+#define AO_PS2_INSERT 0x67
+#define AO_PS2_HOME 0x6e
+#define AO_PS2_PG_UP 0x6f
+#define AO_PS2_DELETE 0x64
+#define AO_PS2_END 0x65
+#define AO_PS2_PG_DN 0x6d
+#define AO_PS2_UP 0x63
+#define AO_PS2_LEFT 0x61
+#define AO_PS2_DOWN 0x60
+#define AO_PS2_RIGHT 0x6a
+#define AO_PS2_NUM_LOCK 0x76
+#define AO_PS2_KP_TIMES 0x7e
+#define AO_PS2_KP_PLUS 0x7c
+#define AO_PS2_KP_ENTER 0x79
+#define AO_PS2_KP_DECIMAL 0x71
+#define AO_PS2_KP_0 0x70
+#define AO_PS2_KP_1 0x69
+#define AO_PS2_KP_2 0x72
+#define AO_PS2_KP_3 0x7a
+#define AO_PS2_KP_4 0x6b
+#define AO_PS2_KP_5 0x73
+#define AO_PS2_KP_6 0x74
+#define AO_PS2_KP_7 0x6c
+#define AO_PS2_KP_8 0x75
+#define AO_PS2_KP_9 0x7d
+#define AO_PS2_CLOSE_SQ 0x5b
+#define AO_PS2_SEMICOLON 0x4c
+#define AO_PS2_ACUTE 0x52
+#define AO_PS2_COMMA 0x41
+#define AO_PS2_PERIOD 0x49
+#define AO_PS2_SLASH 0x4a
+
+#define AO_PS2_RELEASE_FLAG 0x80
+
+#endif /* _AO_PS2_H_ */