diff options
Diffstat (limited to 'nuttx/arch/x86/src/qemu/qemu_keypad.c')
-rw-r--r-- | nuttx/arch/x86/src/qemu/qemu_keypad.c | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/nuttx/arch/x86/src/qemu/qemu_keypad.c b/nuttx/arch/x86/src/qemu/qemu_keypad.c new file mode 100644 index 000000000..5efd1f5b0 --- /dev/null +++ b/nuttx/arch/x86/src/qemu/qemu_keypad.c @@ -0,0 +1,322 @@ +/**************************************************************************** + * arch/x86/src/qemu_keypad.c + * + * Copyright (C) 2013 Li Zhuoyi. All rights reserved. + * Author: Li Zhuoyi <lzyy.cn@gmail.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <nuttx/arch.h> +#include <nuttx/irq.h> +#include <nuttx/fs/fs.h> + +#include <stdint.h> +#include <semaphore.h> +#include <errno.h> +#include <unistd.h> +#include <sched.h> + +#include <arch/io.h> + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +typedef enum +{ + /* The keyboard syms have been cleverly chosen to map to ASCII */ + + KEY_UNKNOWN = 0, + KEY_NOKEY = 0, + KEY_FIRST = 0, + KEY_BACKSPACE = 8, + KEY_TAB = 9, + KEY_CLEAR = 12, + KEY_RETURN = 13, + KEY_PAUSE = 19, + KEY_ESCAPE = 27, + + KEY_SPACE = 32, + KEY_EXCLAIM = 33, + KEY_QUOTEDBL = 34, + KEY_HASH = 35, + KEY_DOLLAR = 36, + KEY_AMPERSAND = 38, + KEY_QUOTE = 39, + KEY_LEFTPAREN = 40, + KEY_RIGHTPAREN = 41, + KEY_ASTERISK = 42, + KEY_PLUS = 43, + KEY_COMMA = 44, + KEY_MINUS = 45, + KEY_PERIOD = 46, + KEY_SLASH = 47, + KEY_0 = 48, + KEY_1 = 49, + KEY_2 = 50, + KEY_3 = 51, + KEY_4 = 52, + KEY_5 = 53, + KEY_6 = 54, + KEY_7 = 55, + KEY_8 = 56, + KEY_9 = 57, + + KEY_COLON = 58, + KEY_SEMICOLON = 59, + KEY_LESS = 60, + KEY_EQUALS = 61, + KEY_GREATER = 62, + KEY_QUESTION = 63, + KEY_AT = 64, + + KEY_LEFTBRACKET = 91, + KEY_BACKSLASH = 92, + KEY_RIGHTBRACKET = 93, + KEY_CARET = 94, + KEY_UNDERSCORE = 95, + KEY_BACKQUOTE = 96, + KEY_a = 97, + KEY_b = 98, + KEY_c = 99, + KEY_d = 100, + KEY_e = 101, + KEY_f = 102, + KEY_g = 103, + KEY_h = 104, + KEY_i = 105, + KEY_j = 106, + KEY_k = 107, + KEY_l = 108, + KEY_m = 109, + KEY_n = 110, + KEY_o = 111, + KEY_p = 112, + KEY_q = 113, + KEY_r = 114, + KEY_s = 115, + KEY_t = 116, + KEY_u = 117, + KEY_v = 118, + KEY_w = 119, + KEY_x = 120, + KEY_y = 121, + KEY_z = 122, + KEY_DELETE = 127, + KEY_DEBUG = 138, /* 0x80+0x0a */ + + /* Arrows + Home/End pad */ + + KEY_S100 = 173, + KEY_UP = 173, + KEY_DOWN = 174, + KEY_RIGHT = 175, + KEY_LEFT = 176, + KEY_INSERT = 177, + KEY_HOME = 178, + KEY_END = 179, + KEY_PAGEUP = 180, + KEY_PAGEDOWN = 181, + + /* Function keys */ + + KEY_F1 = 182, + KEY_F2 = 183, + KEY_F3 = 184, + KEY_F4 = 185, + KEY_F5 = 186, + KEY_F6 = 187, + KEY_F7 = 188, + KEY_F8 = 189, + KEY_F9 = 190, + KEY_F10 = 191, + KEY_F11 = 192, + KEY_F12 = 193, + KEY_F13 = 194, + KEY_F14 = 195, + KEY_F15 = 196, + + /* Key state modifier keys */ + + KEY_NUMLOCK = 200, + KEY_CAPSLOCK = 201, + KEY_SCROLLOCK = 202, + KEY_RSHIFT = 203, + KEY_LSHIFT = 204, + KEY_RCTRL = 205, + KEY_LCTRL = 206, + KEY_RALT = 207, + KEY_LALT = 208, + KEY_RMETA = 209, + KEY_LMETA = 210, + KEY_LSUPER = 211, /* Left "Windows" key */ + KEY_RSUPER = 212, /* Right "Windows" key */ + KEY_MODE = 213, /* "Alt Gr" key */ + KEY_COMPOSE = 214, /* Multi-key compose key */ + + /* Miscellaneous function keys */ + + KEY_HELP = 215, + KEY_PRINT = 216, + KEY_SYSREQ = 217, + KEY_BREAK = 218, + KEY_QUIT = 250, + + /* Add any other keys here */ + + KEY_LAST +} MDKKey; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int keypad_open(struct file *filep); +static int keypad_close(struct file *filep); +static ssize_t keypad_read(struct file *filep, FAR char *buf, size_t buflen); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const unsigned char g_kdbus[128] = +{ + 0, KEY_QUIT, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */ + '9', '0', '-', '=', '\b', /* Backspace */ + '\t', /* Tab */ + 'q', 'w', 'e', 'r', /* 19 */ + 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter key */ + 0, /* 29 - Control */ + 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */ + '\'', '`', 0, /* Left shift */ + '\\', 'z', 'x', 'c', 'v', 'b', 'n', /* 49 */ + 'm', ',', '.', '/', 0, /* Right shift */ + '*', + 0, /* Alt */ + ' ', /* Space bar */ + 0, /* Caps lock */ + KEY_F1, /* 59 - F1 key ... > */ + KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, + KEY_F10, /* < ... F10 */ + 0, /* 69 - Num lock*/ + 0, /* Scroll Lock */ + KEY_HOME, /* Home key */ + KEY_UP, /* Up Arrow */ + KEY_PAGEUP, /* Page Up */ + '-', + KEY_LEFT, /* Left Arrow */ + 0, + KEY_RIGHT, /* Right Arrow */ + '+', + KEY_END, /* 79 - End key*/ + KEY_DOWN, /* Down Arrow */ + KEY_PAGEDOWN, /* Page Down */ + KEY_INSERT, /* Insert Key */ + KEY_DELETE, /* Delete Key */ + 0, 0, 0, + 0, /* F11 Key */ + 0, /* F12 Key */ + 0, /* All other keys are undefined */ +}; + +static const struct file_operations g_keypadops = +{ + keypad_open, /* open */ + keypad_close, /* close */ + keypad_read, /* read */ + 0, /* write */ + 0, /* seek */ + 0, /* ioctl */ +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static int keypad_open(struct file *filep) +{ + return OK; +} + +static int keypad_close(struct file *filep) +{ + return OK; +} + +static ssize_t keypad_read(struct file *filep, FAR char *buf, size_t buflen) +{ + uint_fast8_t keycode = 0; + uint_fast8_t scancode = 0; + uint_fast8_t keyflags; + + if (buf == NULL || buflen < 1) + { + /* Well... nothing to do */ + + return -EINVAL; + } + + keyflags = inb(0x64); + if (keyflags & 0x01) + { + scancode = inb(0x60); + if ((scancode & 0x80) == 0) + { + keycode = g_kdbus[scancode]; + //printf("%02x ",scancode); + buf[0] = keycode; + return 1; + } + } + + return 0; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ +/**************************************************************************** + * Name: qemu_keypad + * + * Description: + * Registers the QEMU keypad driver + * + ****************************************************************************/ + +void qemu_keypad(void) +{ + (void)register_driver("/dev/keypad", &g_keypadops, 0444, NULL); +} |