mirror of
https://github.com/reactos/reactos.git
synced 2024-11-16 20:07:14 +00:00
242 lines
5.3 KiB
C
242 lines
5.3 KiB
C
/*
|
|
* PROJECT: ReactOS Boot Loader
|
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
* FILE: boot/armllb/hw/keyboard.c
|
|
* PURPOSE: LLB Keyboard Routines
|
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
#define E0_KPENTER 96
|
|
#define E0_RCTRL 97
|
|
#define E0_KPSLASH 98
|
|
#define E0_PRSCR 99
|
|
#define E0_RALT 100
|
|
#define E0_BREAK 101
|
|
#define E0_HOME 102
|
|
#define E0_UP 103
|
|
#define E0_PGUP 104
|
|
#define E0_LEFT 105
|
|
#define E0_RIGHT 106
|
|
#define E0_END 107
|
|
#define E0_DOWN 108
|
|
#define E0_PGDN 109
|
|
#define E0_INS 110
|
|
#define E0_DEL 111
|
|
#define E1_PAUSE 119
|
|
#define E0_MACRO 112
|
|
#define E0_F13 113
|
|
#define E0_F14 114
|
|
#define E0_HELP 115
|
|
#define E0_DO 116
|
|
#define E0_F17 117
|
|
#define E0_KPMINPLUS 118
|
|
#define E0_OK 124
|
|
#define E0_MSLW 125
|
|
#define E0_MSRW 126
|
|
#define E0_MSTM 127
|
|
|
|
/* US 101 KEYBOARD LAYOUT *****************************************************/
|
|
|
|
CHAR LlbHwScanCodeToAsciiTable[58][2] =
|
|
{
|
|
{ 0,0 } ,
|
|
{ 27, 27 } ,
|
|
{ '1','!' } ,
|
|
{ '2','@' } ,
|
|
{ '3','#' } ,
|
|
{ '4','$' } ,
|
|
{ '5','%' } ,
|
|
{ '6','^' } ,
|
|
{ '7','&' } ,
|
|
{ '8','*' } ,
|
|
{ '9','(' } ,
|
|
{ '0',')' } ,
|
|
{ '-','_' } ,
|
|
{ '=','+' } ,
|
|
{ 8,8 } ,
|
|
{ 9,9 } ,
|
|
{ 'q','Q' } ,
|
|
{ 'w','W' } ,
|
|
{ 'e','E' } ,
|
|
{ 'r','R' } ,
|
|
{ 't','T' } ,
|
|
{ 'y','Y' } ,
|
|
{ 'u','U' } ,
|
|
{ 'i','I' } ,
|
|
{ 'o','O' } ,
|
|
{ 'p','P' } ,
|
|
{ '[','{' } ,
|
|
{ ']','}' } ,
|
|
{ 13,13 } ,
|
|
{ 0,0 } ,
|
|
{ 'a','A' } ,
|
|
{ 's','S' } ,
|
|
{ 'd','D' } ,
|
|
{ 'f','F' } ,
|
|
{ 'g','G' } ,
|
|
{ 'h','H' } ,
|
|
{ 'j','J' } ,
|
|
{ 'k','K' } ,
|
|
{ 'l','L' } ,
|
|
{ ';',':' } ,
|
|
{ 39,34 } ,
|
|
{ '`','~' } ,
|
|
{ 0,0 } ,
|
|
{ '\\','|'} ,
|
|
{ 'z','Z' } ,
|
|
{ 'x','X' } ,
|
|
{ 'c','C' } ,
|
|
{ 'v','V' } ,
|
|
{ 'b','B' } ,
|
|
{ 'n','N' } ,
|
|
{ 'm','M' } ,
|
|
{ ',','<' } ,
|
|
{ '.','>' } ,
|
|
{ '/','?' } ,
|
|
{ 0,0 } ,
|
|
{ 0,0 } ,
|
|
{ 0,0 } ,
|
|
{ ' ',' ' } ,
|
|
};
|
|
|
|
/* EXTENDED KEY TABLE *********************************************************/
|
|
|
|
UCHAR LlbHwExtendedScanCodeTable[128] =
|
|
{
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
E0_KPENTER, E0_RCTRL, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, E0_KPSLASH, 0, E0_PRSCR,
|
|
E0_RALT, 0, 0, 0,
|
|
0, E0_F13, E0_F14, E0_HELP,
|
|
E0_DO, E0_F17, 0, 0,
|
|
0, 0, E0_BREAK, E0_HOME,
|
|
E0_UP, E0_PGUP, 0, E0_LEFT,
|
|
E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,
|
|
E0_DOWN, E0_PGDN, E0_INS, E0_DEL,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, E0_MSLW,
|
|
E0_MSRW, E0_MSTM, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, E0_MACRO,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0,
|
|
0, 0, 0, 0
|
|
};
|
|
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
USHORT LlbKbdLastScanCode;
|
|
|
|
UCHAR
|
|
NTAPI
|
|
LlbKbdTranslateScanCode(IN USHORT ScanCode,
|
|
IN PUCHAR KeyCode)
|
|
{
|
|
ULONG LastScanCode;
|
|
|
|
/* Check for extended scan codes */
|
|
if ((ScanCode == 0xE0) || (ScanCode == 0xE1))
|
|
{
|
|
/* We'll get these on the next scan */
|
|
LlbKbdLastScanCode = ScanCode;
|
|
return 0;
|
|
}
|
|
|
|
/* Check for bogus scan codes */
|
|
if ((ScanCode == 0x00) || (ScanCode == 0xFF))
|
|
{
|
|
/* Reset */
|
|
LlbKbdLastScanCode = 0;
|
|
return 0;
|
|
}
|
|
|
|
/* Only act on the break, not the make */
|
|
if (ScanCode > 0x80) return 0;
|
|
|
|
/* Keep only simple scan codes */
|
|
ScanCode &= 0x7F;
|
|
|
|
/* Check if this was part of an extended sequence */
|
|
if (LlbKbdLastScanCode)
|
|
{
|
|
/* Save the last scan code and clear it, since we've consumed it now */
|
|
LastScanCode = LlbKbdLastScanCode;
|
|
LlbKbdLastScanCode = 0;
|
|
switch (LastScanCode)
|
|
{
|
|
/* E0 extended codes */
|
|
case 0xE0:
|
|
|
|
/* Skip bogus codes */
|
|
if ((ScanCode == 0x2A) || (ScanCode == 0x36)) return 0;
|
|
|
|
/* Lookup the code for it */
|
|
if (!LlbHwExtendedScanCodeTable[ScanCode]) return 0;
|
|
*KeyCode = LlbHwExtendedScanCodeTable[ScanCode];
|
|
break;
|
|
|
|
/* E1 extended codes */
|
|
case 0xE1:
|
|
|
|
/* Only recognize one (the SYSREQ/PAUSE sequence) */
|
|
if (ScanCode != 0x1D) return 0;
|
|
LlbKbdLastScanCode = 0x100;
|
|
break;
|
|
|
|
/* PAUSE sequence */
|
|
case 0x100:
|
|
|
|
/* Make sure it's the one */
|
|
if (ScanCode != 0x45) return 0;
|
|
*KeyCode = E1_PAUSE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Otherwise, the scancode is the key code */
|
|
LlbKbdLastScanCode = 0;
|
|
*KeyCode = ScanCode;
|
|
}
|
|
|
|
/* Translation success */
|
|
return 1;
|
|
}
|
|
|
|
CHAR
|
|
NTAPI
|
|
LlbKeyboardGetChar(VOID)
|
|
{
|
|
UCHAR ScanCode, KeyCode;
|
|
|
|
do
|
|
{
|
|
/* Read the scan code and convert it to a virtual key code */
|
|
ScanCode = LlbHwKbdRead();
|
|
} while (!LlbKbdTranslateScanCode(ScanCode, &KeyCode));
|
|
|
|
/* Is this ASCII? */
|
|
if (KeyCode > 96) return ScanCode;
|
|
|
|
/* Return the ASCII character */
|
|
return LlbHwScanCodeToAsciiTable[KeyCode][0];
|
|
}
|
|
|
|
/* EOF */
|