Browse Source

x86: keyboad input bug fix

most of the code copy from tinix, just make it run, code quality is not good.

Signed-off-by: parai <parai@foxmail.com>
parai 7 years ago
parent
commit
08d13e033c
6 changed files with 735 additions and 129 deletions
  1. 1 0
      bsp/x86/Makefile
  2. 37 41
      bsp/x86/drivers/console.c
  3. 10 0
      bsp/x86/drivers/include/bsp.h
  4. 316 88
      bsp/x86/drivers/keyboard.c
  5. 132 0
      bsp/x86/drivers/keyboard.h
  6. 239 0
      bsp/x86/drivers/keymap.h

+ 1 - 0
bsp/x86/Makefile

@@ -8,6 +8,7 @@ all:floppy.img
 
 clean:
 	scons -c clean
+	rm -fr build rtthread*
 
 floppy.img:
 	wget https://github.com/bajdcc/tinix/raw/master/floppy.img

+ 37 - 41
bsp/x86/drivers/console.c

@@ -17,16 +17,13 @@
 
 #include <bsp.h>
 
-
-//#include "serial.h"
-
 static unsigned addr_6845;
 static rt_uint16_t *crt_buf;
 static rt_int16_t  crt_pos;
 
-//extern void rt_serial_init(void);
-extern char rt_keyboard_getc(void);
-//extern char rt_serial_getc(void);
+extern void init_keyboard();
+extern void rt_keyboard_isr(void);
+extern rt_bool_t rt_keyboard_getc(char* c);
 
 static void rt_console_putc(int c);
 
@@ -217,39 +214,38 @@ static rt_size_t rt_console_read(rt_device_t dev, rt_off_t pos, void* buffer, rt
 static void rt_console_isr(int vector, void* param)
 {
     char c;
+	rt_bool_t ret;
     rt_base_t level;
 
-    while(1)
-    {
-        c = rt_keyboard_getc();
-
-        if(c == 0)
-        {
-            break;
-        }
-        else if(c > 0)
-        {
-            /* disable interrupt */
-            level = rt_hw_interrupt_disable();
-
-            /* save character */
-            rx_buffer[save_index] = c;
-            save_index ++;
-            if (save_index >= CONSOLE_RX_BUFFER_SIZE)
-                save_index = 0;
-
-            /* if the next position is read index, discard this 'read char' */
-            if (save_index == read_index)
-            {
-                read_index ++;
-                if (read_index >= CONSOLE_RX_BUFFER_SIZE)
-                    read_index = 0;
-            }
-
-            /* enable interrupt */
-            rt_hw_interrupt_enable(level);
-        }
-    }
+	rt_keyboard_isr();
+
+	ret = rt_keyboard_getc(&c);
+	if(ret == RT_FALSE)
+	{
+		/* do nothing */
+	}
+	else
+	{
+		/* disable interrupt */
+		level = rt_hw_interrupt_disable();
+
+		/* save character */
+		rx_buffer[save_index] = c;
+		save_index ++;
+		if (save_index >= CONSOLE_RX_BUFFER_SIZE)
+			save_index = 0;
+
+		/* if the next position is read index, discard this 'read char' */
+		if (save_index == read_index)
+		{
+			read_index ++;
+			if (read_index >= CONSOLE_RX_BUFFER_SIZE)
+				read_index = 0;
+		}
+
+		/* enable interrupt */
+		rt_hw_interrupt_enable(level);
+	}
 
     /* invoke callback */
     if (console_device.rx_indicate != RT_NULL)
@@ -258,10 +254,9 @@ static void rt_console_isr(int vector, void* param)
 
         /* get rx length */
         rx_length = read_index > save_index ?
-                    CONSOLE_RX_BUFFER_SIZE - read_index + save_index :
-                    save_index - read_index;
+			CONSOLE_RX_BUFFER_SIZE - read_index + save_index :
+			save_index - read_index;
 
-//        rt_kprintf("\r\nrx_length %d\r\n", rx_length);
         if(rx_length > 0)
         {
             console_device.rx_indicate(&console_device, rx_length);
@@ -269,7 +264,7 @@ static void rt_console_isr(int vector, void* param)
     }
     else
     {
-//        rt_kprintf("\r\nconsole_device.rx_indicate == RT_NULL\r\n");
+
     }
 }
 
@@ -280,6 +275,7 @@ static void rt_console_isr(int vector, void* param)
 void rt_hw_console_init(void)
 {
     rt_cga_init();
+	init_keyboard();
 
     /* install  keyboard isr */
     rt_hw_interrupt_install(INTKEYBOARD, rt_console_isr, RT_NULL, "kbd");

+ 10 - 0
bsp/x86/drivers/include/bsp.h

@@ -101,6 +101,16 @@ extern "C" {
 #define	KBSTATP				0x64	/* kbd controller status port(I) */
 #define	KBS_DIB				0x01	/* kbd data in buffer */
 #define	KBDATAP				0x60	/* kbd data port(I) */
+/* AT keyboard */
+/* 8042 ports */
+#define	KB_DATA		0x60	/* I/O port for keyboard data
+					Read : Read Output Buffer 
+					Write: Write Input Buffer(8042 Data&8048 Command) */
+#define	KB_CMD		0x64	/* I/O port for keyboard command
+					Read : Read Status Register
+					Write: Write Input Buffer(8042 Command) */
+#define	LED_CODE	0xED
+#define	KB_ACK		0xFA
 
 /*******************************************************************/
 /* Serial Register */

+ 316 - 88
bsp/x86/drivers/keyboard.c

@@ -10,129 +10,357 @@
  * Change Logs:
  * Date           Author       Notes
  * 2006-09-15     QiuYi        the first version
+ * 2017-08-16     Parai        the 2nd version
  */
 
 #include <rtthread.h>
 #include <rthw.h>
 
 #include <bsp.h>
+#include "keyboard.h"
+#include "keymap.h"
 
-#define NO			0
+#define FALSE RT_FALSE
+#define TRUE  RT_TRUE
+#define PRIVATE static
+#define PUBLIC 
+#define t_bool  rt_bool_t
+#define t_8     rt_uint8_t
+#define t_32    rt_uint32_t
 
-#define SHIFT		(1 << 0)
-#define CTL			(1 << 1)
-#define ALT			(1 << 2)
+PRIVATE	KB_INPUT	kb_in;
+PRIVATE	t_bool		code_with_E0	= FALSE;
+PRIVATE	t_bool		shift_l;		/* l shift state	*/
+PRIVATE	t_bool		shift_r;		/* r shift state	*/
+PRIVATE	t_bool		alt_l;			/* l alt state		*/
+PRIVATE	t_bool		alt_r;			/* r left state		*/
+PRIVATE	t_bool		ctrl_l;			/* l ctrl state		*/
+PRIVATE	t_bool		ctrl_r;			/* l ctrl state		*/
+PRIVATE	t_bool		caps_lock;		/* Caps Lock		*/
+PRIVATE	t_bool		num_lock;		/* Num Lock		*/
+PRIVATE	t_bool		scroll_lock;		/* Scroll Lock		*/
+PRIVATE	int		column		= 0;	/* keyrow[column] is one value of keymap */
 
-#define CAPSLOCK	(1<<3)
-#define NUMLOCK		(1<<4)
-#define SCROLLOCK	(1<<5)
+PRIVATE t_8	get_byte_from_kb_buf();
+PRIVATE void	set_leds();
+PRIVATE void	kb_wait();
+PRIVATE void	kb_ack();
 
-static int shiftcode[256] = 
+PUBLIC void init_keyboard()
 {
-	[29] CTL,
-	[42] SHIFT,
-	[54] SHIFT,
-	[56] ALT,
-};
+	kb_in.count = 0;
+	kb_in.p_head = kb_in.p_tail = kb_in.buf;
 
-static int togglecode[256] = 
+	caps_lock	= 0;
+	num_lock	= 1;
+	scroll_lock	= 0;
+
+	set_leds();
+}
+PUBLIC rt_bool_t keyboard_read(rt_uint32_t *pkey)
 {
-	[58] CAPSLOCK,
-	[69] NUMLOCK,
-	[70] SCROLLOCK,
-};
+	t_8	scan_code;
+	t_bool	make;	/* TRUE : make  */
+			/* FALSE: break */
+	t_32	key = 0;
+	t_32*	keyrow;
+
+	if(kb_in.count > 0){
+		code_with_E0 = FALSE;
+		scan_code = get_byte_from_kb_buf();
+
+		/* start scan */
+		if (scan_code == 0xE1) {
+			int i;
+			static const t_8 pausebreak_scan_code[] = {0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5};
+			t_bool is_pausebreak = TRUE;
+			for(i=1;i<6;i++){
+				if (get_byte_from_kb_buf() != pausebreak_scan_code[i]) {
+					is_pausebreak = FALSE;
+					break;
+				}
+			}
+			if (is_pausebreak) {
+				key = PAUSEBREAK;
+			}
+		}
+		else if (scan_code == 0xE0) {
+			code_with_E0 = TRUE;
+			scan_code = get_byte_from_kb_buf();
+
+			/* PrintScreen pressed */
+			if (scan_code == 0x2A) {
+				code_with_E0 = FALSE;
+				if ((scan_code = get_byte_from_kb_buf()) == 0xE0) {
+					code_with_E0 = TRUE;
+					if ((scan_code = get_byte_from_kb_buf()) == 0x37) {
+						key = PRINTSCREEN;
+						make = TRUE;
+					}
+				}
+			}
+			/* PrintScreen released */
+			else if (scan_code == 0xB7) {
+				code_with_E0 = FALSE;
+				if ((scan_code = get_byte_from_kb_buf()) == 0xE0) {
+					code_with_E0 = TRUE;
+					if ((scan_code = get_byte_from_kb_buf()) == 0xAA) {
+						key = PRINTSCREEN;
+						make = FALSE;
+					}
+				}
+			}
+		} /* if is not PrintScreen, scan_code is the one after 0xE0 */
+		if ((key != PAUSEBREAK) && (key != PRINTSCREEN)) {
+			/* is Make Code or Break Code */
+			make = (scan_code & FLAG_BREAK ? FALSE : TRUE);
+			
+			keyrow = &keymap[(scan_code & 0x7F) * MAP_COLS];
+
+			column = 0;
+
+			t_bool caps = shift_l || shift_r;
+			if (caps_lock) {
+				if ((keyrow[0] >= 'a') && (keyrow[0] <= 'z')){
+					caps = !caps;
+				}
+			}
+			if (caps) {
+				column = 1;
+			}
+
+			if (code_with_E0) {
+				column = 2;
+			}
+
+			key = keyrow[column];
+
+			switch(key) {
+			case SHIFT_L:
+				shift_l	= make;
+				break;
+			case SHIFT_R:
+				shift_r	= make;
+				break;
+			case CTRL_L:
+				ctrl_l	= make;
+				break;
+			case CTRL_R:
+				ctrl_r	= make;
+				break;
+			case ALT_L:
+				alt_l	= make;
+				break;
+			case ALT_R:
+				alt_l	= make;
+				break;
+			case CAPS_LOCK:
+				if (make) {
+					caps_lock   = !caps_lock;
+					set_leds();
+				}
+				break;
+			case NUM_LOCK:
+				if (make) {
+					num_lock    = !num_lock;
+					set_leds();
+				}
+				break;
+			case SCROLL_LOCK:
+				if (make) {
+					scroll_lock = !scroll_lock;
+					set_leds();
+				}
+				break;
+			default:
+				break;
+			}
+		}
 
-static char normalmap[256] =
+		if(make){ /* ignore Break Code */
+			t_bool pad = FALSE;
+
+			/* handle the small pad first */
+			if ((key >= PAD_SLASH) && (key <= PAD_9)) {
+				pad = TRUE;
+				switch(key) {	/* '/', '*', '-', '+', and 'Enter' in num pad  */
+				case PAD_SLASH:
+					key = '/';
+					break;
+				case PAD_STAR:
+					key = '*';
+					break;
+				case PAD_MINUS:
+					key = '-';
+					break;
+				case PAD_PLUS:
+					key = '+';
+					break;
+				case PAD_ENTER:
+					key = ENTER;
+					break;
+				default:	/* keys whose value depends on the NumLock */
+					if (num_lock) {	/* '0' ~ '9' and '.' in num pad */
+						if ((key >= PAD_0) && (key <= PAD_9)) {
+							key = key - PAD_0 + '0';
+						}
+						else if (key == PAD_DOT) {
+							key = '.';
+						}
+					}
+					else{
+						switch(key) {
+						case PAD_HOME:
+							key = HOME;
+							break;
+						case PAD_END:
+							key = END;
+							break;
+						case PAD_PAGEUP:
+							key = PAGEUP;
+							break;
+						case PAD_PAGEDOWN:
+							key = PAGEDOWN;
+							break;
+						case PAD_INS:
+							key = INSERT;
+							break;
+						case PAD_UP:
+							key = UP;
+							break;
+						case PAD_DOWN:
+							key = DOWN;
+							break;
+						case PAD_LEFT:
+							key = LEFT;
+							break;
+						case PAD_RIGHT:
+							key = RIGHT;
+							break;
+						case PAD_DOT:
+							key = DELETE;
+							break;
+						default:
+							break;
+						}
+					}
+					break;
+				}
+			}
+			key |= shift_l	? FLAG_SHIFT_L	: 0;
+			key |= shift_r	? FLAG_SHIFT_R	: 0;
+			key |= ctrl_l	? FLAG_CTRL_L	: 0;
+			key |= ctrl_r	? FLAG_CTRL_R	: 0;
+			key |= alt_l	? FLAG_ALT_L	: 0;
+			key |= alt_r	? FLAG_ALT_R	: 0;
+			key |= pad	? FLAG_PAD	: 0;
+
+			*pkey = key;
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+PRIVATE t_8 get_byte_from_kb_buf()
 {
-	NO,    033,  '1',  '2',  '3',  '4',  '5',  '6',
-	'7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
-	'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',
-	'o',  'p',  '[',  ']',  '\n', NO,   'a',  's',
-	'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',
-	'\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v',
-	'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',
-	NO,   ' ',   NO,   NO,   NO,   NO,   NO,   NO,
-	NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',
-	'8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
-	'2',  '3',  '0',  '.',  
-};
-
-static char shiftmap[256] = 
+	t_8	scan_code;
+
+	RT_ASSERT(kb_in.count>0);
+	scan_code = *(kb_in.p_tail);
+	kb_in.p_tail++;
+	if (kb_in.p_tail == kb_in.buf + KB_IN_BYTES) {
+		kb_in.p_tail = kb_in.buf;
+	}
+	kb_in.count--;
+
+	return scan_code;
+}
+
+PRIVATE void kb_wait() /* wait inpit cache of 8042 */
 {
-	NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',
-	'&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
-	'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',
-	'O',  'P',  '{',  '}',  '\n', NO,   'A',  'S',
-	'D',  'F',  'G',  'H',  'J',  'K',  'L',  ';',
-	'"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',
-	'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',
-	NO,   ' ',   NO,   NO,   NO,   NO,   NO,   NO,
-	NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',
-	'8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
-	'2',  '3',  '0',  '.',  
-};
-
-#define C(x) (x-'@')
-
-static char ctlmap[256] = 
+	t_8 kb_stat;
+
+	do {
+		kb_stat = inb(KB_CMD);
+	} while (kb_stat & 0x02);
+}
+
+PRIVATE void kb_ack()
 {
-	NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
-	NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
-	C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'),
-	C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'),
-	C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO, 
-	NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'),
-	C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO, 
-};
-
-static char *charcode[4] = 
+	t_8 kb_read;
+
+	do {
+		kb_read = inb(KB_DATA);
+	} while (kb_read != KB_ACK);
+}
+
+PRIVATE void set_leds()
 {
-	normalmap,
-	shiftmap,
-	ctlmap,
-	ctlmap,
-};
+	t_8 leds = (caps_lock << 2) | (num_lock << 1) | scroll_lock;
+
+	kb_wait();
+	outb(KB_DATA, LED_CODE);
+	kb_ack();
+
+	kb_wait();
+	outb(KB_DATA, leds);
+	kb_ack();
+}
 
 /**
  * @addtogroup QEMU
  */
 /*@{*/
 
-/**
- * This function get a char from the keyboard
- */
-char rt_keyboard_getc(void)
+void rt_keyboard_isr(void)
 {
-	int c;
 	rt_uint8_t data;
-	static rt_uint32_t shift;
 
 	if ((inb(KBSTATP) & KBS_DIB) == 0)
-		return -1;
+		return ;
 
 	data = inb(KBDATAP);
 
-	if (data & 0x80) 
-	{
-		/* key up */
-		shift &= ~shiftcode[data&~0x80];
-		return 0;
+	if (kb_in.count < KB_IN_BYTES) {
+		*(kb_in.p_head) = data;
+		kb_in.p_head++;
+		if (kb_in.p_head == kb_in.buf + KB_IN_BYTES) {
+			kb_in.p_head = kb_in.buf;
+		}
+		kb_in.count++;
 	}
+}
+/* generally, this should be called in task level for all key inpit support,
+but here only support a key that is composed of 2 bytes */
+rt_bool_t rt_keyboard_getc(char* c)
+{
+	if(kb_in.count>=2)
+	{
+		rt_uint32_t key = 0;
+		rt_bool_t rv=keyboard_read(&key);
 
-	/* key down */
-	shift |= shiftcode[data];
-	shift ^= togglecode[data];
-	c = charcode[shift&(CTL|SHIFT)][data];
+		switch(key)
+		{
+			case TAB:
+				*c = '\t';
+				break;
+			case ENTER:
+				*c = '\n';
+				break;
+			case BACKSPACE:
+				*c = '\b';
+				break;
+			default:
+				*c = key;
+				break;
+		}
 
-	if (shift&CAPSLOCK) 
-	{
-		if ('a' <= c && c <= 'z')
-			c += 'A' - 'a';
-		else if ('A' <= c && c <= 'Z')
-			c += 'a' - 'A';
+		return rv;
 	}
-	
-	return c;
+
+	return RT_FALSE;
 }
 
 /*@}*/

+ 132 - 0
bsp/x86/drivers/keyboard.h

@@ -0,0 +1,132 @@
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                              keyboard.h
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                    Forrest Yu, 2005
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+#ifndef	_TINIX_KEYBOARD_H_
+#define	_TINIX_KEYBOARD_H_
+
+
+/************************************************************************/
+/*                          Macros Declaration                          */
+/************************************************************************/
+#define	KB_IN_BYTES	32	/* size of keyboard input buffer */
+#define MAP_COLS	3	/* Number of columns in keymap */
+#define NR_SCAN_CODES	0x80	/* Number of scan codes (rows in keymap) */
+
+#define FLAG_BREAK	0x0080		/* Break Code			*/
+#define FLAG_EXT	0x0100		/* Normal function keys		*/
+#define FLAG_SHIFT_L	0x0200		/* Shift key			*/
+#define FLAG_SHIFT_R	0x0400		/* Shift key			*/
+#define FLAG_CTRL_L	0x0800		/* Control key			*/
+#define FLAG_CTRL_R	0x1000		/* Control key			*/
+#define FLAG_ALT_L	0x2000		/* Alternate key		*/
+#define FLAG_ALT_R	0x4000		/* Alternate key		*/
+#define FLAG_PAD	0x8000		/* keys in num pad		*/
+
+#define MASK_RAW	0x01FF		/* raw key value = code passed to tty & MASK_RAW
+					   the value can be found either in the keymap column 0
+					   or in the list below */
+
+/* Special keys */
+#define ESC		(0x01 + FLAG_EXT)	/* Esc		*/
+#define TAB		(0x02 + FLAG_EXT)	/* Tab		*/
+#define ENTER		(0x03 + FLAG_EXT)	/* Enter	*/
+#define BACKSPACE	(0x04 + FLAG_EXT)	/* BackSpace	*/
+
+#define GUI_L		(0x05 + FLAG_EXT)	/* L GUI	*/
+#define GUI_R		(0x06 + FLAG_EXT)	/* R GUI	*/
+#define APPS		(0x07 + FLAG_EXT)	/* APPS	*/
+
+/* Shift, Ctrl, Alt */
+#define SHIFT_L		(0x08 + FLAG_EXT)	/* L Shift	*/
+#define SHIFT_R		(0x09 + FLAG_EXT)	/* R Shift	*/
+#define CTRL_L		(0x0A + FLAG_EXT)	/* L Ctrl	*/
+#define CTRL_R		(0x0B + FLAG_EXT)	/* R Ctrl	*/
+#define ALT_L		(0x0C + FLAG_EXT)	/* L Alt	*/
+#define ALT_R		(0x0D + FLAG_EXT)	/* R Alt	*/
+
+/* Lock keys */
+#define CAPS_LOCK	(0x0E + FLAG_EXT)	/* Caps Lock	*/
+#define	NUM_LOCK	(0x0F + FLAG_EXT)	/* Number Lock	*/
+#define SCROLL_LOCK	(0x10 + FLAG_EXT)	/* Scroll Lock	*/
+
+/* Function keys */
+#define F1		(0x11 + FLAG_EXT)	/* F1		*/
+#define F2		(0x12 + FLAG_EXT)	/* F2		*/
+#define F3		(0x13 + FLAG_EXT)	/* F3		*/
+#define F4		(0x14 + FLAG_EXT)	/* F4		*/
+#define F5		(0x15 + FLAG_EXT)	/* F5		*/
+#define F6		(0x16 + FLAG_EXT)	/* F6		*/
+#define F7		(0x17 + FLAG_EXT)	/* F7		*/
+#define F8		(0x18 + FLAG_EXT)	/* F8		*/
+#define F9		(0x19 + FLAG_EXT)	/* F9		*/
+#define F10		(0x1A + FLAG_EXT)	/* F10		*/
+#define F11		(0x1B + FLAG_EXT)	/* F11		*/
+#define F12		(0x1C + FLAG_EXT)	/* F12		*/
+
+/* Control Pad */
+#define PRINTSCREEN	(0x1D + FLAG_EXT)	/* Print Screen	*/
+#define PAUSEBREAK	(0x1E + FLAG_EXT)	/* Pause/Break	*/
+#define INSERT		(0x1F + FLAG_EXT)	/* Insert	*/
+#define DELETE		(0x20 + FLAG_EXT)	/* Delete	*/
+#define HOME		(0x21 + FLAG_EXT)	/* Home		*/
+#define END		(0x22 + FLAG_EXT)	/* End		*/
+#define PAGEUP		(0x23 + FLAG_EXT)	/* Page Up	*/
+#define PAGEDOWN	(0x24 + FLAG_EXT)	/* Page Down	*/
+#define UP		(0x25 + FLAG_EXT)	/* Up		*/
+#define DOWN		(0x26 + FLAG_EXT)	/* Down		*/
+#define LEFT		(0x27 + FLAG_EXT)	/* Left		*/
+#define RIGHT		(0x28 + FLAG_EXT)	/* Right	*/
+
+/* ACPI keys */
+#define POWER		(0x29 + FLAG_EXT)	/* Power	*/
+#define SLEEP		(0x2A + FLAG_EXT)	/* Sleep	*/
+#define WAKE		(0x2B + FLAG_EXT)	/* Wake Up	*/
+
+/* Num Pad */
+#define PAD_SLASH	(0x2C + FLAG_EXT)	/* /		*/
+#define PAD_STAR	(0x2D + FLAG_EXT)	/* *		*/
+#define PAD_MINUS	(0x2E + FLAG_EXT)	/* -		*/
+#define PAD_PLUS	(0x2F + FLAG_EXT)	/* +		*/
+#define PAD_ENTER	(0x30 + FLAG_EXT)	/* Enter	*/
+#define PAD_DOT		(0x31 + FLAG_EXT)	/* .		*/
+#define PAD_0		(0x32 + FLAG_EXT)	/* 0		*/
+#define PAD_1		(0x33 + FLAG_EXT)	/* 1		*/
+#define PAD_2		(0x34 + FLAG_EXT)	/* 2		*/
+#define PAD_3		(0x35 + FLAG_EXT)	/* 3		*/
+#define PAD_4		(0x36 + FLAG_EXT)	/* 4		*/
+#define PAD_5		(0x37 + FLAG_EXT)	/* 5		*/
+#define PAD_6		(0x38 + FLAG_EXT)	/* 6		*/
+#define PAD_7		(0x39 + FLAG_EXT)	/* 7		*/
+#define PAD_8		(0x3A + FLAG_EXT)	/* 8		*/
+#define PAD_9		(0x3B + FLAG_EXT)	/* 9		*/
+#define PAD_UP		PAD_8			/* Up		*/
+#define PAD_DOWN	PAD_2			/* Down		*/
+#define PAD_LEFT	PAD_4			/* Left		*/
+#define PAD_RIGHT	PAD_6			/* Right	*/
+#define PAD_HOME	PAD_7			/* Home		*/
+#define PAD_END		PAD_1			/* End		*/
+#define PAD_PAGEUP	PAD_9			/* Page Up	*/
+#define PAD_PAGEDOWN	PAD_3			/* Page Down	*/
+#define PAD_INS		PAD_0			/* Ins		*/
+#define PAD_MID		PAD_5			/* Middle key	*/
+#define PAD_DEL		PAD_DOT			/* Del		*/
+
+
+/************************************************************************/
+/*                         Stucture Definition                          */
+/************************************************************************/
+/* Keyboard structure, 1 per console. */
+typedef struct s_kb {
+	char*	p_head;			/* input cache pointer */
+	char*	p_tail;			/* read cache pointer */
+	int	count;
+	char	buf[KB_IN_BYTES];
+}KB_INPUT;
+
+
+
+#endif /* _TINIX_KEYBOARD_H_ */

+ 239 - 0
bsp/x86/drivers/keymap.h

@@ -0,0 +1,239 @@
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                              keymap.h
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                    Forrest Yu, 2005
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+/********************************************************************/
+/*    "scan code" <--> "key" map.                                     */
+/*    It should be and can only be included by keyboard.c!          */
+/********************************************************************/
+
+#ifndef	_TINIX_KEYMAP_H_
+#define	_TINIX_KEYMAP_H_
+
+
+/* Keymap for US MF-2 keyboard. */
+
+rt_uint32_t keymap[NR_SCAN_CODES * MAP_COLS] = {
+
+/* scan-code			!Shift		Shift		E0 XX		*/
+/* ==================================================================== */
+/* 0x00 - none		*/	0,		0,		0,
+/* 0x01 - ESC		*/	ESC,		ESC,		0,
+/* 0x02 - '1'		*/	'1',		'!',		0,
+/* 0x03 - '2'		*/	'2',		'@',		0,
+/* 0x04 - '3'		*/	'3',		'#',		0,
+/* 0x05 - '4'		*/	'4',		'$',		0,
+/* 0x06 - '5'		*/	'5',		'%',		0,
+/* 0x07 - '6'		*/	'6',		'^',		0,
+/* 0x08 - '7'		*/	'7',		'&',		0,
+/* 0x09 - '8'		*/	'8',		'*',		0,
+/* 0x0A - '9'		*/	'9',		'(',		0,
+/* 0x0B - '0'		*/	'0',		')',		0,
+/* 0x0C - '-'		*/	'-',		'_',		0,
+/* 0x0D - '='		*/	'=',		'+',		0,
+/* 0x0E - BS		*/	BACKSPACE,	BACKSPACE,	0,
+/* 0x0F - TAB		*/	TAB,		TAB,		0,
+/* 0x10 - 'q'		*/	'q',		'Q',		0,
+/* 0x11 - 'w'		*/	'w',		'W',		0,
+/* 0x12 - 'e'		*/	'e',		'E',		0,
+/* 0x13 - 'r'		*/	'r',		'R',		0,
+/* 0x14 - 't'		*/	't',		'T',		0,
+/* 0x15 - 'y'		*/	'y',		'Y',		0,
+/* 0x16 - 'u'		*/	'u',		'U',		0,
+/* 0x17 - 'i'		*/	'i',		'I',		0,
+/* 0x18 - 'o'		*/	'o',		'O',		0,
+/* 0x19 - 'p'		*/	'p',		'P',		0,
+/* 0x1A - '['		*/	'[',		'{',		0,
+/* 0x1B - ']'		*/	']',		'}',		0,
+/* 0x1C - CR/LF		*/	ENTER,		ENTER,		PAD_ENTER,
+/* 0x1D - l. Ctrl	*/	CTRL_L,		CTRL_L,		CTRL_R,
+/* 0x1E - 'a'		*/	'a',		'A',		0,
+/* 0x1F - 's'		*/	's',		'S',		0,
+/* 0x20 - 'd'		*/	'd',		'D',		0,
+/* 0x21 - 'f'		*/	'f',		'F',		0,
+/* 0x22 - 'g'		*/	'g',		'G',		0,
+/* 0x23 - 'h'		*/	'h',		'H',		0,
+/* 0x24 - 'j'		*/	'j',		'J',		0,
+/* 0x25 - 'k'		*/	'k',		'K',		0,
+/* 0x26 - 'l'		*/	'l',		'L',		0,
+/* 0x27 - ';'		*/	';',		':',		0,
+/* 0x28 - '\''		*/	'\'',		'"',		0,
+/* 0x29 - '`'		*/	'`',		'~',		0,
+/* 0x2A - l. SHIFT	*/	SHIFT_L,	SHIFT_L,	0,
+/* 0x2B - '\'		*/	'\\',		'|',		0,
+/* 0x2C - 'z'		*/	'z',		'Z',		0,
+/* 0x2D - 'x'		*/	'x',		'X',		0,
+/* 0x2E - 'c'		*/	'c',		'C',		0,
+/* 0x2F - 'v'		*/	'v',		'V',		0,
+/* 0x30 - 'b'		*/	'b',		'B',		0,
+/* 0x31 - 'n'		*/	'n',		'N',		0,
+/* 0x32 - 'm'		*/	'm',		'M',		0,
+/* 0x33 - ','		*/	',',		'<',		0,
+/* 0x34 - '.'		*/	'.',		'>',		0,
+/* 0x35 - '/'		*/	'/',		'?',		PAD_SLASH,
+/* 0x36 - r. SHIFT	*/	SHIFT_R,	SHIFT_R,	0,
+/* 0x37 - '*'		*/	'*',		'*',    	0,
+/* 0x38 - ALT		*/	ALT_L,		ALT_L,  	ALT_R,
+/* 0x39 - ' '		*/	' ',		' ',		0,
+/* 0x3A - CapsLock	*/	CAPS_LOCK,	CAPS_LOCK,	0,
+/* 0x3B - F1		*/	F1,		F1,		0,
+/* 0x3C - F2		*/	F2,		F2,		0,
+/* 0x3D - F3		*/	F3,		F3,		0,
+/* 0x3E - F4		*/	F4,		F4,		0,
+/* 0x3F - F5		*/	F5,		F5,		0,
+/* 0x40 - F6		*/	F6,		F6,		0,
+/* 0x41 - F7		*/	F7,		F7,		0,
+/* 0x42 - F8		*/	F8,		F8,		0,
+/* 0x43 - F9		*/	F9,		F9,		0,
+/* 0x44 - F10		*/	F10,		F10,		0,
+/* 0x45 - NumLock	*/	NUM_LOCK,	NUM_LOCK,	0,
+/* 0x46 - ScrLock	*/	SCROLL_LOCK,	SCROLL_LOCK,	0,
+/* 0x47 - Home		*/	PAD_HOME,	'7',		HOME,
+/* 0x48 - CurUp		*/	PAD_UP,		'8',		UP,
+/* 0x49 - PgUp		*/	PAD_PAGEUP,	'9',		PAGEUP,
+/* 0x4A - '-'		*/	PAD_MINUS,	'-',		0,
+/* 0x4B - Left		*/	PAD_LEFT,	'4',		LEFT,
+/* 0x4C - MID		*/	PAD_MID,	'5',		0,
+/* 0x4D - Right		*/	PAD_RIGHT,	'6',		RIGHT,
+/* 0x4E - '+'		*/	PAD_PLUS,	'+',		0,
+/* 0x4F - End		*/	PAD_END,	'1',		END,
+/* 0x50 - Down		*/	PAD_DOWN,	'2',		DOWN,
+/* 0x51 - PgDown	*/	PAD_PAGEDOWN,	'3',		PAGEDOWN,
+/* 0x52 - Insert	*/	PAD_INS,	'0',		INSERT,
+/* 0x53 - Delete	*/	PAD_DOT,	'.',		DELETE,
+/* 0x54 - Enter		*/	0,		0,		0,
+/* 0x55 - ???		*/	0,		0,		0,
+/* 0x56 - ???		*/	0,		0,		0,
+/* 0x57 - F11		*/	F11,		F11,		0,	
+/* 0x58 - F12		*/	F12,		F12,		0,	
+/* 0x59 - ???		*/	0,		0,		0,	
+/* 0x5A - ???		*/	0,		0,		0,	
+/* 0x5B - ???		*/	0,		0,		GUI_L,	
+/* 0x5C - ???		*/	0,		0,		GUI_R,	
+/* 0x5D - ???		*/	0,		0,		APPS,	
+/* 0x5E - ???		*/	0,		0,		0,	
+/* 0x5F - ???		*/	0,		0,		0,	
+/* 0x60 - ???		*/	0,		0,		0,
+/* 0x61 - ???		*/	0,		0,		0,	
+/* 0x62 - ???		*/	0,		0,		0,	
+/* 0x63 - ???		*/	0,		0,		0,	
+/* 0x64 - ???		*/	0,		0,		0,	
+/* 0x65 - ???		*/	0,		0,		0,	
+/* 0x66 - ???		*/	0,		0,		0,	
+/* 0x67 - ???		*/	0,		0,		0,	
+/* 0x68 - ???		*/	0,		0,		0,	
+/* 0x69 - ???		*/	0,		0,		0,	
+/* 0x6A - ???		*/	0,		0,		0,	
+/* 0x6B - ???		*/	0,		0,		0,	
+/* 0x6C - ???		*/	0,		0,		0,	
+/* 0x6D - ???		*/	0,		0,		0,	
+/* 0x6E - ???		*/	0,		0,		0,	
+/* 0x6F - ???		*/	0,		0,		0,	
+/* 0x70 - ???		*/	0,		0,		0,	
+/* 0x71 - ???		*/	0,		0,		0,	
+/* 0x72 - ???		*/	0,		0,		0,	
+/* 0x73 - ???		*/	0,		0,		0,	
+/* 0x74 - ???		*/	0,		0,		0,	
+/* 0x75 - ???		*/	0,		0,		0,	
+/* 0x76 - ???		*/	0,		0,		0,	
+/* 0x77 - ???		*/	0,		0,		0,	
+/* 0x78 - ???		*/	0,		0,		0,	
+/* 0x78 - ???		*/	0,		0,		0,	
+/* 0x7A - ???		*/	0,		0,		0,	
+/* 0x7B - ???		*/	0,		0,		0,	
+/* 0x7C - ???		*/	0,		0,		0,	
+/* 0x7D - ???		*/	0,		0,		0,	
+/* 0x7E - ???		*/	0,		0,		0,	
+/* 0x7F - ???		*/	0,		0,		0
+};
+
+/*====================================================================================*
+				Appendix: Scan code set 1
+ *====================================================================================*
+
+KEY	MAKE	BREAK	-----	KEY	MAKE	BREAK	-----	KEY	MAKE	BREAK
+--------------------------------------------------------------------------------------
+A	1E	9E		9	0A	8A		[	1A	9A
+B	30	B0		`	29	89		INSERT	E0,52	E0,D2
+C	2E	AE		-	0C	8C		HOME	E0,47	E0,C7
+D	20	A0		=	0D	8D		PG UP	E0,49	E0,C9
+E	12	92		\	2B	AB		DELETE	E0,53	E0,D3
+F	21	A1		BKSP	0E	8E		END	E0,4F	E0,CF
+G	22	A2		SPACE	39	B9		PG DN	E0,51	E0,D1
+H	23	A3		TAB	0F	8F		U ARROW	E0,48	E0,C8
+I	17	97		CAPS	3A	BA		L ARROW	E0,4B	E0,CB
+J	24	A4		L SHFT	2A	AA		D ARROW	E0,50	E0,D0
+K	25	A5		L CTRL	1D	9D		R ARROW	E0,4D	E0,CD
+L	26	A6		L GUI	E0,5B	E0,DB		NUM	45	C5
+M	32	B2		L ALT	38	B8		KP /	E0,35	E0,B5
+N	31	B1		R SHFT	36	B6		KP *	37	B7
+O	18	98		R CTRL	E0,1D	E0,9D		KP -	4A	CA
+P	19	99		R GUI	E0,5C	E0,DC		KP +	4E	CE
+Q	10	19		R ALT	E0,38	E0,B8		KP EN	E0,1C	E0,9C
+R	13	93		APPS	E0,5D	E0,DD		KP .	53	D3
+S	1F	9F		ENTER	1C	9C		KP 0	52	D2
+T	14	94		ESC	01	81		KP 1	4F	CF
+U	16	96		F1	3B	BB		KP 2	50	D0
+V	2F	AF		F2	3C	BC		KP 3	51	D1
+W	11	91		F3	3D	BD		KP 4	4B	CB
+X	2D	AD		F4	3E	BE		KP 5	4C	CC
+Y	15	95		F5	3F	BF		KP 6	4D	CD
+Z	2C	AC		F6	40	C0		KP 7	47	C7
+0	0B	8B		F7	41	C1		KP 8	48	C8
+1	02	82		F8	42	C2		KP 9	49	C9
+2	03	83		F9	43	C3		]	1B	9B
+3	04	84		F10	44	C4		;	27	A7
+4	05	85		F11	57	D7		'	28	A8
+5	06	86		F12	58	D8		,	33	B3
+
+6	07	87		PRTSCRN	E0,2A	E0,B7		.	34	B4
+					E0,37	E0,AA
+
+7	08	88		SCROLL	46	C6		/	35	B5
+
+8	09	89		PAUSE E1,1D,45	-NONE-				
+				      E1,9D,C5
+
+
+-----------------
+ACPI Scan Codes:
+-------------------------------------------
+Key		Make Code	Break Code
+-------------------------------------------
+Power		E0, 5E		E0, DE
+Sleep		E0, 5F		E0, DF
+Wake		E0, 63		E0, E3
+
+
+-------------------------------
+Windows Multimedia Scan Codes:
+-------------------------------------------
+Key		Make Code	Break Code
+-------------------------------------------
+Next Track	E0, 19		E0, 99
+Previous Track	E0, 10		E0, 90
+Stop		E0, 24		E0, A4
+Play/Pause	E0, 22		E0, A2
+Mute		E0, 20		E0, A0
+Volume Up	E0, 30		E0, B0
+Volume Down	E0, 2E		E0, AE
+Media Select	E0, 6D		E0, ED
+E-Mail		E0, 6C		E0, EC
+Calculator	E0, 21		E0, A1
+My Computer	E0, 6B		E0, EB
+WWW Search	E0, 65		E0, E5
+WWW Home	E0, 32		E0, B2
+WWW Back	E0, 6A		E0, EA
+WWW Forward	E0, 69		E0, E9
+WWW Stop	E0, 68		E0, E8
+WWW Refresh	E0, 67		E0, E7
+WWW Favorites	E0, 66		E0, E6
+
+*=====================================================================================*/
+
+
+
+#endif /* _TINIX_KEYMAP_H_ */