ReactOS  0.4.15-dev-1397-g19779b3
kdb_keyboard.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS kernel
4  * FILE: ntoskrnl/kdbg/kdb_keyboard.c
5  * PURPOSE: Keyboard driver
6  *
7  * PROGRAMMERS: Victor Kirhenshtein (sauros@iname.com)
8  * Jason Filby (jasonfilby@yahoo.com)
9  */
10 
11 /* INCLUDES ****************************************************************/
12 
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <debug.h>
16 
17 
18 #define KBD_STATUS_REG 0x64
19 #define KBD_CNTL_REG 0x64
20 #define KBD_DATA_REG 0x60
21 
22 #define KBD_STAT_OBF 0x01
23 #define KBD_STAT_IBF 0x02
24 
25 #define CTRL_WRITE_MOUSE 0xD4
26 #define MOU_ENAB 0xF4
27 #define MOU_DISAB 0xF5
28 #define MOUSE_ACK 0xFA
29 
30 #define KBD_DISABLE_MOUSE 0xA7
31 #define KBD_ENABLE_MOUSE 0xA8
32 
33 #define kbd_write_command(cmd) WRITE_PORT_UCHAR((PUCHAR)KBD_CNTL_REG,cmd)
34 #define kbd_write_data(cmd) WRITE_PORT_UCHAR((PUCHAR)KBD_DATA_REG,cmd)
35 #define kbd_read_input() READ_PORT_UCHAR((PUCHAR)KBD_DATA_REG)
36 #define kbd_read_status() READ_PORT_UCHAR((PUCHAR)KBD_STATUS_REG)
37 
38 static unsigned char keyb_layout[2][128] =
39 {
40  "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */
41  "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */
42  "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */
43  "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
44  "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
45  "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
46  "\r\000/" /* 0x60 - 0x6f */
47  ,
48  "\000\033!@#$%^&*()_+\177\t" /* 0x00 - 0x0f */
49  "QWERTYUIOP{}\r\000AS" /* 0x10 - 0x1f */
50  "DFGHJKL:\"`\000\\ZXCV" /* 0x20 - 0x2f */
51  "BNM<>?\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
52  "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
53  "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
54  "\r\000/" /* 0x60 - 0x6f */
55 };
56 
57 typedef UCHAR byte_t;
58 
59 /* FUNCTIONS *****************************************************************/
60 
61 static VOID
63 {
64  ULONG Retry = 20000;
65 
66  while (kbd_read_status() & KBD_STAT_OBF && Retry--)
67  {
70  }
71 
72  Retry = 20000;
73  while (kbd_read_status() & KBD_STAT_IBF && Retry--)
75 
77 
78  Retry = 20000;
79  while (kbd_read_status() & KBD_STAT_IBF && Retry--)
81 
83 
84  Retry = 20000;
85  while (!(kbd_read_status() & KBD_STAT_OBF) && Retry--)
87 
88  if (kbd_read_input() != MOUSE_ACK) { ; }
89 
90  return;
91 }
92 
94 {
96 }
97 
99 {
101 }
102 
103 CHAR
105 {
106  static byte_t last_key = 0;
107  static byte_t shift = 0;
108  char c;
109  BOOLEAN KeepRetrying = (Retry == 0);
110 
111  while (KeepRetrying || Retry-- > 0)
112  {
113  while (kbd_read_status() & KBD_STAT_OBF)
114  {
115  byte_t scancode;
116 
117  scancode = kbd_read_input();
118 
119  /* check for SHIFT-keys */
120  if (((scancode & 0x7F) == 42) || ((scancode & 0x7F) == 54))
121  {
122  shift = !(scancode & 0x80);
123  continue;
124  }
125 
126  /* ignore all other RELEASED-codes */
127  if (scancode & 0x80)
128  {
129  last_key = 0;
130  }
131  else if (last_key != scancode)
132  {
133  //printf("kbd: %d, %d, %c\n", scancode, last_key, keyb_layout[shift][scancode]);
134  last_key = scancode;
135  c = keyb_layout[shift][scancode];
136  *ScanCode = scancode;
137 
138  if (c > 0)
139  return c;
140  }
141  }
142  }
143 
144  return -1;
145 }
146 
147 /* EOF */
#define MOU_ENAB
Definition: kdb_keyboard.c:26
#define shift
Definition: input.c:1756
ULONG ScanCode
Definition: api.c:39
#define MOUSE_ACK
Definition: kdb_keyboard.c:28
char CHAR
Definition: xmlstorage.h:175
static VOID KbdSendCommandToMouse(UCHAR Command)
Definition: kdb_keyboard.c:62
Definition: shell.h:41
VOID KbdEnableMouse()
Definition: kdb_keyboard.c:93
#define CTRL_WRITE_MOUSE
Definition: kdb_keyboard.c:25
unsigned char BOOLEAN
#define MOU_DISAB
Definition: kdb_keyboard.c:27
IN PSCSI_REQUEST_BLOCK IN OUT NTSTATUS IN OUT BOOLEAN * Retry
Definition: class2.h:49
static unsigned char keyb_layout[2][128]
Definition: kdb_keyboard.c:38
#define KBD_STAT_OBF
Definition: kdb_keyboard.c:22
#define kbd_read_input()
Definition: kdb_keyboard.c:35
const GLubyte * c
Definition: glext.h:8905
#define kbd_read_status()
Definition: kdb_keyboard.c:36
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID KbdDisableMouse()
Definition: kdb_keyboard.c:98
#define KBD_STAT_IBF
Definition: kdb_keyboard.c:23
UCHAR byte_t
Definition: kdb_keyboard.c:57
#define kbd_write_command(cmd)
Definition: kdb_keyboard.c:33
unsigned int * PULONG
Definition: retypes.h:1
#define kbd_write_data(cmd)
Definition: kdb_keyboard.c:34
#define c
Definition: ke_i.h:80
unsigned int ULONG
Definition: retypes.h:1
CHAR KdbpTryGetCharKeyboard(PULONG ScanCode, ULONG Retry)
Definition: kdb_keyboard.c:104
VOID NTAPI KeStallExecutionProcessor(IN ULONG MicroSeconds)
Definition: ntoskrnl.c:95