1bcecde140a561c64e297225904afebebd62336cejljusten/** @file
2bcecde140a561c64e297225904afebebd62336cejljusten
3402e4a9d777677296945afa020194bf4123885e2niruiyuCopyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4bcecde140a561c64e297225904afebebd62336cejljusten
5bcecde140a561c64e297225904afebebd62336cejljustenThis program and the accompanying materials
6bcecde140a561c64e297225904afebebd62336cejljustenare licensed and made available under the terms and conditions
7bcecde140a561c64e297225904afebebd62336cejljustenof the BSD License which accompanies this distribution.  The
8bcecde140a561c64e297225904afebebd62336cejljustenfull text of the license may be found at
9bcecde140a561c64e297225904afebebd62336cejljustenhttp://opensource.org/licenses/bsd-license.php
10bcecde140a561c64e297225904afebebd62336cejljusten
11bcecde140a561c64e297225904afebebd62336cejljustenTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12bcecde140a561c64e297225904afebebd62336cejljustenWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13bcecde140a561c64e297225904afebebd62336cejljusten
14bcecde140a561c64e297225904afebebd62336cejljusten**/
15bcecde140a561c64e297225904afebebd62336cejljusten
16bcecde140a561c64e297225904afebebd62336cejljusten#ifndef _BIOS_KEYBOARD_H_
17bcecde140a561c64e297225904afebebd62336cejljusten#define _BIOS_KEYBOARD_H_
18bcecde140a561c64e297225904afebebd62336cejljusten
19bcecde140a561c64e297225904afebebd62336cejljusten
20bcecde140a561c64e297225904afebebd62336cejljusten#include <FrameworkDxe.h>
21bcecde140a561c64e297225904afebebd62336cejljusten
22bcecde140a561c64e297225904afebebd62336cejljusten#include <Guid/StatusCodeDataTypeId.h>
23bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/SimpleTextIn.h>
24bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/SimpleTextInEx.h>
25bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/LegacyBios.h>
26bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/IsaIo.h>
27bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/DevicePath.h>
28bcecde140a561c64e297225904afebebd62336cejljusten#include <Protocol/Ps2Policy.h>
29bcecde140a561c64e297225904afebebd62336cejljusten
30bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/DebugLib.h>
31bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/UefiLib.h>
32bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/BaseMemoryLib.h>
33bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/ReportStatusCodeLib.h>
34bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/UefiDriverEntryPoint.h>
35bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/UefiBootServicesTableLib.h>
36bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/MemoryAllocationLib.h>
37bcecde140a561c64e297225904afebebd62336cejljusten#include <Library/BaseLib.h>
38f6c014fb14b19ebbccfb7725df28178e34602e05li-elvin#include <Library/PcdLib.h>
39bcecde140a561c64e297225904afebebd62336cejljusten
40bcecde140a561c64e297225904afebebd62336cejljusten//
41bcecde140a561c64e297225904afebebd62336cejljusten// Driver Binding Externs
42bcecde140a561c64e297225904afebebd62336cejljusten//
43bcecde140a561c64e297225904afebebd62336cejljustenextern EFI_DRIVER_BINDING_PROTOCOL  gBiosKeyboardDriverBinding;
44bcecde140a561c64e297225904afebebd62336cejljustenextern EFI_COMPONENT_NAME_PROTOCOL  gBiosKeyboardComponentName;
45bcecde140a561c64e297225904afebebd62336cejljustenextern EFI_COMPONENT_NAME2_PROTOCOL gBiosKeyboardComponentName2;
46bcecde140a561c64e297225904afebebd62336cejljusten
47bcecde140a561c64e297225904afebebd62336cejljusten
48bcecde140a561c64e297225904afebebd62336cejljusten#include <IndustryStandard/Pci.h>
49bcecde140a561c64e297225904afebebd62336cejljusten
50bcecde140a561c64e297225904afebebd62336cejljusten//
51bcecde140a561c64e297225904afebebd62336cejljusten// BISO Keyboard Defines
52bcecde140a561c64e297225904afebebd62336cejljusten//
53bcecde140a561c64e297225904afebebd62336cejljusten#define CHAR_SCANCODE                   0xe0
54bcecde140a561c64e297225904afebebd62336cejljusten#define CHAR_ESC                        0x1b
55bcecde140a561c64e297225904afebebd62336cejljusten
56bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_8042_DATA_REGISTER     0x60
57bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_8042_STATUS_REGISTER   0x64
58bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_8042_COMMAND_REGISTER  0x64
59bcecde140a561c64e297225904afebebd62336cejljusten
60bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_TIMEOUT                65536   // 0.07s
61bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_WAITFORVALUE_TIMEOUT   1000000 // 1s
62bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_BAT_TIMEOUT            4000000 // 4s
63bcecde140a561c64e297225904afebebd62336cejljusten#define KEYBOARD_TIMER_INTERVAL         200000  // 0.02s
64bcecde140a561c64e297225904afebebd62336cejljusten//  KEYBOARD COMMAND BYTE -- read by writing command KBC_CMDREG_VIA64_CMDBYTE_R to 64H, then read from 60H
65bcecde140a561c64e297225904afebebd62336cejljusten//                           write by wrting command KBC_CMDREG_VIA64_CMDBYTE_W to 64H, then write to  60H
66bcecde140a561c64e297225904afebebd62336cejljusten//  7: Reserved
67bcecde140a561c64e297225904afebebd62336cejljusten//  6: PC/XT translation mode convert
68bcecde140a561c64e297225904afebebd62336cejljusten//  5: Disable Auxiliary device interface
69bcecde140a561c64e297225904afebebd62336cejljusten//  4: Disable keyboard interface
70bcecde140a561c64e297225904afebebd62336cejljusten//  3: Reserved
71bcecde140a561c64e297225904afebebd62336cejljusten//  2: System Flag: selftest successful
72bcecde140a561c64e297225904afebebd62336cejljusten//  1: Enable Auxiliary device interrupt
73bcecde140a561c64e297225904afebebd62336cejljusten//  0: Enable Keyboard interrupt )
74bcecde140a561c64e297225904afebebd62336cejljusten//
75bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_KSCAN2UNI_COV  (0x1 << 6)
76bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_DISABLE_AUX    (0x1 << 5)
77bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_DISABLE_KB     (0x1 << 4)
78bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_SLFTEST_SUCC   (0x1 << 2)
79bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_ENABLE_AUXINT  (0x1 << 1)
80bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CMMBYTE_ENABLE_KBINT   (0x1 << 0)
81bcecde140a561c64e297225904afebebd62336cejljusten
82bcecde140a561c64e297225904afebebd62336cejljusten//
83bcecde140a561c64e297225904afebebd62336cejljusten//  KEYBOARD CONTROLLER STATUS REGISTER - read from 64h
84bcecde140a561c64e297225904afebebd62336cejljusten//  7: Parity error
85bcecde140a561c64e297225904afebebd62336cejljusten//  6: General time out
86bcecde140a561c64e297225904afebebd62336cejljusten//  5: Output buffer holds data for AUX
87bcecde140a561c64e297225904afebebd62336cejljusten//  4: Keyboard is not locked
88bcecde140a561c64e297225904afebebd62336cejljusten//  3: Command written via 64h  / Data written via 60h
89bcecde140a561c64e297225904afebebd62336cejljusten//  2: KBC self-test successful / Power-on reset
90bcecde140a561c64e297225904afebebd62336cejljusten//  1: Input buffer holds CPU data / empty
91bcecde140a561c64e297225904afebebd62336cejljusten//  0: Output buffer holds keyboard data / empty
92bcecde140a561c64e297225904afebebd62336cejljusten//
93bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_PARE (0x1 << 7)
94bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_TIM  (0x1 << 6)
95bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_AUXB (0x1 << 5)
96bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_KEYL (0x1 << 4)
97bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_C_D  (0x1 << 3)
98bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_SYSF (0x1 << 2)
99bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_INPB (0x1 << 1)
100bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_STSREG_VIA64_OUTB (0x1 << 0)
101bcecde140a561c64e297225904afebebd62336cejljusten
102bcecde140a561c64e297225904afebebd62336cejljusten//
103bcecde140a561c64e297225904afebebd62336cejljusten//  COMMANDs of KEYBOARD CONTROLLER COMMAND REGISTER - write to 64h
104bcecde140a561c64e297225904afebebd62336cejljusten//
105bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_CMDBYTE_R    0x20
106bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_CMDBYTE_W    0x60
107bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_AUX_DISABLE  0xA7
108bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_AUX_ENABLE   0xA8
109bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_KBC_SLFTEST  0xAA
110bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_KB_CKECK     0xAB
111bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_KB_DISABLE   0xAD
112bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_KB_ENABLE    0xAE
113bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_INTP_LOW_R   0xC0
114bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_INTP_HIGH_R  0xC2
115bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_OUTP_R       0xD0
116bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_OUTP_W       0xD1
117bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_OUTB_KB_W    0xD2
118bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_OUTB_AUX_W   0xD3
119bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDREG_VIA64_AUX_W        0xD4
120bcecde140a561c64e297225904afebebd62336cejljusten
121bcecde140a561c64e297225904afebebd62336cejljusten//
122bcecde140a561c64e297225904afebebd62336cejljusten//  echos of KEYBOARD CONTROLLER COMMAND - read from 60h
123bcecde140a561c64e297225904afebebd62336cejljusten//
124bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDECHO_KBCSLFTEST_OK 0x55
125bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDECHO_KBCHECK_OK    0x00
126bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDECHO_ACK           0xFA
127bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDECHO_BATTEST_OK    0xAA
128bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_CMDECHO_BATTEST_FAILE 0xFC
129bcecde140a561c64e297225904afebebd62336cejljusten
130bcecde140a561c64e297225904afebebd62336cejljusten//
131bcecde140a561c64e297225904afebebd62336cejljusten// OUTPUT PORT COMMANDs - write port by writing KBC_CMDREG_VIA64_OUTP_W via 64H, then write the command to 60H
132bcecde140a561c64e297225904afebebd62336cejljusten// drive data and clock of KB to high for at least 500us for BAT needs
133bcecde140a561c64e297225904afebebd62336cejljusten//
134bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_OUTPORT_DCHIGH_BAT  0xC0
135bcecde140a561c64e297225904afebebd62336cejljusten//
136bcecde140a561c64e297225904afebebd62336cejljusten// scan code set type
137bcecde140a561c64e297225904afebebd62336cejljusten//
138bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_SCODESET1  0x01
139bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_SCODESET2  0x02
140bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_SCODESET3  0x03
141bcecde140a561c64e297225904afebebd62336cejljusten
142bcecde140a561c64e297225904afebebd62336cejljusten//
143bcecde140a561c64e297225904afebebd62336cejljusten//  COMMANDs written to INPUT BUFFER - write to 60h
144bcecde140a561c64e297225904afebebd62336cejljusten//
145bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBECHO   0xEE
146bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBSCODE  0xF0
147bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBTYPE   0xF2
148bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBDELAY  0xF3
149bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBEN     0xF4
150bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBSTDDIS 0xF5
151bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBSTDEN  0xF6
152bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBRESEND 0xFE
153bcecde140a561c64e297225904afebebd62336cejljusten#define KBC_INPBUF_VIA60_KBRESET  0xFF
154bcecde140a561c64e297225904afebebd62336cejljusten
155bcecde140a561c64e297225904afebebd62336cejljusten//
156bcecde140a561c64e297225904afebebd62336cejljusten// 0040h:0017h - KEYBOARD - STATUS FLAGS 1
157bcecde140a561c64e297225904afebebd62336cejljusten//   7 INSert active
158bcecde140a561c64e297225904afebebd62336cejljusten//   6 Caps Lock active
159bcecde140a561c64e297225904afebebd62336cejljusten//   5 Num Lock active
160bcecde140a561c64e297225904afebebd62336cejljusten//   4 Scroll Lock active
161bcecde140a561c64e297225904afebebd62336cejljusten//   3 either Alt pressed
162bcecde140a561c64e297225904afebebd62336cejljusten//   2 either Ctrl pressed
163bcecde140a561c64e297225904afebebd62336cejljusten//   1 Left Shift pressed
164bcecde140a561c64e297225904afebebd62336cejljusten//   0 Right Shift pressed
165bcecde140a561c64e297225904afebebd62336cejljusten//
166bcecde140a561c64e297225904afebebd62336cejljusten// 0040h:0018h - KEYBOARD - STATUS FLAGS 2
167bcecde140a561c64e297225904afebebd62336cejljusten//   7: insert key is depressed
168bcecde140a561c64e297225904afebebd62336cejljusten//   6: caps-lock key is depressed (does not work well)
169bcecde140a561c64e297225904afebebd62336cejljusten//   5: num-lock key is depressed (does not work well)
170bcecde140a561c64e297225904afebebd62336cejljusten//   4: scroll lock key is depressed (does not work well)
171bcecde140a561c64e297225904afebebd62336cejljusten//   3: suspend key has been toggled (does not work well)
172bcecde140a561c64e297225904afebebd62336cejljusten//   2: system key is pressed and held (does not work well)
173bcecde140a561c64e297225904afebebd62336cejljusten//   1: left ALT key is pressed
174bcecde140a561c64e297225904afebebd62336cejljusten//   0: left CTRL key is pressed
175bcecde140a561c64e297225904afebebd62336cejljusten//
176bcecde140a561c64e297225904afebebd62336cejljusten#define KB_INSERT_BIT             (0x1 << 7)
177bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CAPS_LOCK_BIT          (0x1 << 6)
178bcecde140a561c64e297225904afebebd62336cejljusten#define KB_NUM_LOCK_BIT           (0x1 << 5)
179bcecde140a561c64e297225904afebebd62336cejljusten#define KB_SCROLL_LOCK_BIT        (0x1 << 4)
180bcecde140a561c64e297225904afebebd62336cejljusten#define KB_ALT_PRESSED            (0x1 << 3)
181bcecde140a561c64e297225904afebebd62336cejljusten#define KB_CTRL_PRESSED           (0x1 << 2)
182bcecde140a561c64e297225904afebebd62336cejljusten#define KB_LEFT_SHIFT_PRESSED     (0x1 << 1)
183bcecde140a561c64e297225904afebebd62336cejljusten#define KB_RIGHT_SHIFT_PRESSED    (0x1 << 0)
184bcecde140a561c64e297225904afebebd62336cejljusten
185bcecde140a561c64e297225904afebebd62336cejljusten#define KB_SUSPEND_PRESSED        (0x1 << 3)
186bcecde140a561c64e297225904afebebd62336cejljusten#define KB_SYSREQ_PRESSED         (0x1 << 2)
187bcecde140a561c64e297225904afebebd62336cejljusten#define KB_LEFT_ALT_PRESSED       (0x1 << 1)
188bcecde140a561c64e297225904afebebd62336cejljusten#define KB_LEFT_CTRL_PRESSED      (0x1 << 0)
189bcecde140a561c64e297225904afebebd62336cejljusten
190bcecde140a561c64e297225904afebebd62336cejljusten//
191bcecde140a561c64e297225904afebebd62336cejljusten// BIOS Keyboard Device Structure
192bcecde140a561c64e297225904afebebd62336cejljusten//
193bcecde140a561c64e297225904afebebd62336cejljusten#define BIOS_KEYBOARD_DEV_SIGNATURE SIGNATURE_32 ('B', 'K', 'B', 'D')
194bcecde140a561c64e297225904afebebd62336cejljusten#define BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('c', 'b', 'k', 'h')
195bcecde140a561c64e297225904afebebd62336cejljusten
196bcecde140a561c64e297225904afebebd62336cejljustentypedef struct _BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY {
197bcecde140a561c64e297225904afebebd62336cejljusten  UINTN                                      Signature;
198bcecde140a561c64e297225904afebebd62336cejljusten  EFI_KEY_DATA                               KeyData;
199bcecde140a561c64e297225904afebebd62336cejljusten  EFI_KEY_NOTIFY_FUNCTION                    KeyNotificationFn;
200bcecde140a561c64e297225904afebebd62336cejljusten  LIST_ENTRY                                 NotifyEntry;
201bcecde140a561c64e297225904afebebd62336cejljusten} BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY;
202bcecde140a561c64e297225904afebebd62336cejljusten
203bcecde140a561c64e297225904afebebd62336cejljusten#define QUEUE_MAX_COUNT         32
204bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
205bcecde140a561c64e297225904afebebd62336cejljusten  UINTN             Front;
206bcecde140a561c64e297225904afebebd62336cejljusten  UINTN             Rear;
207bcecde140a561c64e297225904afebebd62336cejljusten  EFI_KEY_DATA      Buffer[QUEUE_MAX_COUNT];
208bcecde140a561c64e297225904afebebd62336cejljusten} SIMPLE_QUEUE;
209bcecde140a561c64e297225904afebebd62336cejljusten
210bcecde140a561c64e297225904afebebd62336cejljustentypedef struct {
211bcecde140a561c64e297225904afebebd62336cejljusten  UINTN                                       Signature;
212bcecde140a561c64e297225904afebebd62336cejljusten  EFI_HANDLE                                  Handle;
213bcecde140a561c64e297225904afebebd62336cejljusten  EFI_LEGACY_BIOS_PROTOCOL                    *LegacyBios;
214bcecde140a561c64e297225904afebebd62336cejljusten  EFI_ISA_IO_PROTOCOL                         *IsaIo;
215bcecde140a561c64e297225904afebebd62336cejljusten  EFI_SIMPLE_TEXT_INPUT_PROTOCOL              SimpleTextIn;
216bcecde140a561c64e297225904afebebd62336cejljusten  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL           SimpleTextInputEx;
217bcecde140a561c64e297225904afebebd62336cejljusten  UINT16                                      DataRegisterAddress;
218bcecde140a561c64e297225904afebebd62336cejljusten  UINT16                                      StatusRegisterAddress;
219bcecde140a561c64e297225904afebebd62336cejljusten  UINT16                                      CommandRegisterAddress;
220bcecde140a561c64e297225904afebebd62336cejljusten  BOOLEAN                                     ExtendedKeyboard;
221bcecde140a561c64e297225904afebebd62336cejljusten
222bcecde140a561c64e297225904afebebd62336cejljusten  //
223bcecde140a561c64e297225904afebebd62336cejljusten  // Buffer storing EFI_KEY_DATA
224bcecde140a561c64e297225904afebebd62336cejljusten  //
225bcecde140a561c64e297225904afebebd62336cejljusten  SIMPLE_QUEUE                                Queue;
226bcecde140a561c64e297225904afebebd62336cejljusten
227bcecde140a561c64e297225904afebebd62336cejljusten  //
228bcecde140a561c64e297225904afebebd62336cejljusten  // Notification Function List
229bcecde140a561c64e297225904afebebd62336cejljusten  //
230bcecde140a561c64e297225904afebebd62336cejljusten  LIST_ENTRY                                  NotifyList;
231bcecde140a561c64e297225904afebebd62336cejljusten  EFI_EVENT                                   TimerEvent;
232bcecde140a561c64e297225904afebebd62336cejljusten
233bcecde140a561c64e297225904afebebd62336cejljusten} BIOS_KEYBOARD_DEV;
234bcecde140a561c64e297225904afebebd62336cejljusten
235bcecde140a561c64e297225904afebebd62336cejljusten#define BIOS_KEYBOARD_DEV_FROM_THIS(a)  CR (a, BIOS_KEYBOARD_DEV, SimpleTextIn, BIOS_KEYBOARD_DEV_SIGNATURE)
236bcecde140a561c64e297225904afebebd62336cejljusten#define TEXT_INPUT_EX_BIOS_KEYBOARD_DEV_FROM_THIS(a) \
237bcecde140a561c64e297225904afebebd62336cejljusten  CR (a, \
238bcecde140a561c64e297225904afebebd62336cejljusten      BIOS_KEYBOARD_DEV, \
239bcecde140a561c64e297225904afebebd62336cejljusten      SimpleTextInputEx, \
240bcecde140a561c64e297225904afebebd62336cejljusten      BIOS_KEYBOARD_DEV_SIGNATURE \
241bcecde140a561c64e297225904afebebd62336cejljusten      )
242bcecde140a561c64e297225904afebebd62336cejljusten
243bcecde140a561c64e297225904afebebd62336cejljusten//
244bcecde140a561c64e297225904afebebd62336cejljusten// Global Variables
245bcecde140a561c64e297225904afebebd62336cejljusten//
246bcecde140a561c64e297225904afebebd62336cejljustenextern EFI_DRIVER_BINDING_PROTOCOL   gBiosKeyboardDriverBinding;
247bcecde140a561c64e297225904afebebd62336cejljusten
248bcecde140a561c64e297225904afebebd62336cejljusten//
249bcecde140a561c64e297225904afebebd62336cejljusten// Driver Binding Protocol functions
250bcecde140a561c64e297225904afebebd62336cejljusten//
251bcecde140a561c64e297225904afebebd62336cejljusten
252bcecde140a561c64e297225904afebebd62336cejljusten/**
253bcecde140a561c64e297225904afebebd62336cejljusten  Check whether the driver supports this device.
254bcecde140a561c64e297225904afebebd62336cejljusten
255bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                   The Udriver binding protocol.
256bcecde140a561c64e297225904afebebd62336cejljusten  @param  Controller             The controller handle to check.
257bcecde140a561c64e297225904afebebd62336cejljusten  @param  RemainingDevicePath    The remaining device path.
258bcecde140a561c64e297225904afebebd62336cejljusten
259bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS            The driver supports this controller.
260bcecde140a561c64e297225904afebebd62336cejljusten  @retval other                  This device isn't supported.
261bcecde140a561c64e297225904afebebd62336cejljusten
262bcecde140a561c64e297225904afebebd62336cejljusten**/
263bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
264bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
265bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardDriverBindingSupported (
266bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
267bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_HANDLE                   Controller,
268bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
269bcecde140a561c64e297225904afebebd62336cejljusten  );
270bcecde140a561c64e297225904afebebd62336cejljusten
271bcecde140a561c64e297225904afebebd62336cejljusten/**
272bcecde140a561c64e297225904afebebd62336cejljusten  Starts the device with this driver.
273bcecde140a561c64e297225904afebebd62336cejljusten
274bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                   The driver binding instance.
275bcecde140a561c64e297225904afebebd62336cejljusten  @param  Controller             Handle of device to bind driver to.
276bcecde140a561c64e297225904afebebd62336cejljusten  @param  RemainingDevicePath    Optional parameter use to pick a specific child
277bcecde140a561c64e297225904afebebd62336cejljusten                                 device to start.
278bcecde140a561c64e297225904afebebd62336cejljusten
279bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS            The controller is controlled by the driver.
280bcecde140a561c64e297225904afebebd62336cejljusten  @retval Other                  This controller cannot be started.
281bcecde140a561c64e297225904afebebd62336cejljusten
282bcecde140a561c64e297225904afebebd62336cejljusten**/
283bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
284bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
285bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardDriverBindingStart (
286bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
287bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_HANDLE                   Controller,
288bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
289bcecde140a561c64e297225904afebebd62336cejljusten  );
290bcecde140a561c64e297225904afebebd62336cejljusten
291bcecde140a561c64e297225904afebebd62336cejljusten/**
292bcecde140a561c64e297225904afebebd62336cejljusten  Stop the device handled by this driver.
293bcecde140a561c64e297225904afebebd62336cejljusten
294bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                   The driver binding protocol.
295bcecde140a561c64e297225904afebebd62336cejljusten  @param  Controller             The controller to release.
296bcecde140a561c64e297225904afebebd62336cejljusten  @param  NumberOfChildren       The number of handles in ChildHandleBuffer.
297bcecde140a561c64e297225904afebebd62336cejljusten  @param  ChildHandleBuffer      The array of child handle.
298bcecde140a561c64e297225904afebebd62336cejljusten
299bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS            The device was stopped.
300bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a device error.
301bcecde140a561c64e297225904afebebd62336cejljusten  @retval Others                 Fail to uninstall protocols attached on the device.
302bcecde140a561c64e297225904afebebd62336cejljusten
303bcecde140a561c64e297225904afebebd62336cejljusten**/
304bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
305bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
306bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardDriverBindingStop (
307bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
308bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_HANDLE                   Controller,
309bcecde140a561c64e297225904afebebd62336cejljusten  IN  UINTN                        NumberOfChildren,
310bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_HANDLE                   *ChildHandleBuffer
311bcecde140a561c64e297225904afebebd62336cejljusten  );
312bcecde140a561c64e297225904afebebd62336cejljusten
313bcecde140a561c64e297225904afebebd62336cejljusten/**
314bcecde140a561c64e297225904afebebd62336cejljusten  Retrieves a Unicode string that is the user readable name of the driver.
315bcecde140a561c64e297225904afebebd62336cejljusten
316bcecde140a561c64e297225904afebebd62336cejljusten  This function retrieves the user readable name of a driver in the form of a
317bcecde140a561c64e297225904afebebd62336cejljusten  Unicode string. If the driver specified by This has a user readable name in
318bcecde140a561c64e297225904afebebd62336cejljusten  the language specified by Language, then a pointer to the driver name is
319bcecde140a561c64e297225904afebebd62336cejljusten  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
320bcecde140a561c64e297225904afebebd62336cejljusten  by This does not support the language specified by Language,
321bcecde140a561c64e297225904afebebd62336cejljusten  then EFI_UNSUPPORTED is returned.
322bcecde140a561c64e297225904afebebd62336cejljusten
323bcecde140a561c64e297225904afebebd62336cejljusten  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
324bcecde140a561c64e297225904afebebd62336cejljusten                                EFI_COMPONENT_NAME_PROTOCOL instance.
325bcecde140a561c64e297225904afebebd62336cejljusten
326bcecde140a561c64e297225904afebebd62336cejljusten  @param  Language[in]          A pointer to a Null-terminated ASCII string
327bcecde140a561c64e297225904afebebd62336cejljusten                                array indicating the language. This is the
328bcecde140a561c64e297225904afebebd62336cejljusten                                language of the driver name that the caller is
329bcecde140a561c64e297225904afebebd62336cejljusten                                requesting, and it must match one of the
330bcecde140a561c64e297225904afebebd62336cejljusten                                languages specified in SupportedLanguages. The
331bcecde140a561c64e297225904afebebd62336cejljusten                                number of languages supported by a driver is up
332bcecde140a561c64e297225904afebebd62336cejljusten                                to the driver writer. Language is specified
333bcecde140a561c64e297225904afebebd62336cejljusten                                in RFC 4646 or ISO 639-2 language code format.
334bcecde140a561c64e297225904afebebd62336cejljusten
335bcecde140a561c64e297225904afebebd62336cejljusten  @param  DriverName[out]       A pointer to the Unicode string to return.
336bcecde140a561c64e297225904afebebd62336cejljusten                                This Unicode string is the name of the
337bcecde140a561c64e297225904afebebd62336cejljusten                                driver specified by This in the language
338bcecde140a561c64e297225904afebebd62336cejljusten                                specified by Language.
339bcecde140a561c64e297225904afebebd62336cejljusten
340bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           The Unicode string for the Driver specified by
341bcecde140a561c64e297225904afebebd62336cejljusten                                This and the language specified by Language was
342bcecde140a561c64e297225904afebebd62336cejljusten                                returned in DriverName.
343bcecde140a561c64e297225904afebebd62336cejljusten
344bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER Language is NULL.
345bcecde140a561c64e297225904afebebd62336cejljusten
346bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER DriverName is NULL.
347bcecde140a561c64e297225904afebebd62336cejljusten
348bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_UNSUPPORTED       The driver specified by This does not support
349bcecde140a561c64e297225904afebebd62336cejljusten                                the language specified by Language.
350bcecde140a561c64e297225904afebebd62336cejljusten
351bcecde140a561c64e297225904afebebd62336cejljusten**/
352bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
353bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
354bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardComponentNameGetDriverName (
355bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
356bcecde140a561c64e297225904afebebd62336cejljusten  IN  CHAR8                        *Language,
357bcecde140a561c64e297225904afebebd62336cejljusten  OUT CHAR16                       **DriverName
358bcecde140a561c64e297225904afebebd62336cejljusten  );
359bcecde140a561c64e297225904afebebd62336cejljusten
360bcecde140a561c64e297225904afebebd62336cejljusten
361bcecde140a561c64e297225904afebebd62336cejljusten/**
362bcecde140a561c64e297225904afebebd62336cejljusten  Retrieves a Unicode string that is the user readable name of the controller
363bcecde140a561c64e297225904afebebd62336cejljusten  that is being managed by a driver.
364bcecde140a561c64e297225904afebebd62336cejljusten
365bcecde140a561c64e297225904afebebd62336cejljusten  This function retrieves the user readable name of the controller specified by
366bcecde140a561c64e297225904afebebd62336cejljusten  ControllerHandle and ChildHandle in the form of a Unicode string. If the
367bcecde140a561c64e297225904afebebd62336cejljusten  driver specified by This has a user readable name in the language specified by
368bcecde140a561c64e297225904afebebd62336cejljusten  Language, then a pointer to the controller name is returned in ControllerName,
369bcecde140a561c64e297225904afebebd62336cejljusten  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
370bcecde140a561c64e297225904afebebd62336cejljusten  managing the controller specified by ControllerHandle and ChildHandle,
371bcecde140a561c64e297225904afebebd62336cejljusten  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
372bcecde140a561c64e297225904afebebd62336cejljusten  support the language specified by Language, then EFI_UNSUPPORTED is returned.
373bcecde140a561c64e297225904afebebd62336cejljusten
374bcecde140a561c64e297225904afebebd62336cejljusten  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
375bcecde140a561c64e297225904afebebd62336cejljusten                                EFI_COMPONENT_NAME_PROTOCOL instance.
376bcecde140a561c64e297225904afebebd62336cejljusten
377bcecde140a561c64e297225904afebebd62336cejljusten  @param  ControllerHandle[in]  The handle of a controller that the driver
378bcecde140a561c64e297225904afebebd62336cejljusten                                specified by This is managing.  This handle
379bcecde140a561c64e297225904afebebd62336cejljusten                                specifies the controller whose name is to be
380bcecde140a561c64e297225904afebebd62336cejljusten                                returned.
381bcecde140a561c64e297225904afebebd62336cejljusten
382bcecde140a561c64e297225904afebebd62336cejljusten  @param  ChildHandle[in]       The handle of the child controller to retrieve
383bcecde140a561c64e297225904afebebd62336cejljusten                                the name of.  This is an optional parameter that
384bcecde140a561c64e297225904afebebd62336cejljusten                                may be NULL.  It will be NULL for device
385bcecde140a561c64e297225904afebebd62336cejljusten                                drivers.  It will also be NULL for a bus drivers
386bcecde140a561c64e297225904afebebd62336cejljusten                                that wish to retrieve the name of the bus
387bcecde140a561c64e297225904afebebd62336cejljusten                                controller.  It will not be NULL for a bus
388bcecde140a561c64e297225904afebebd62336cejljusten                                driver that wishes to retrieve the name of a
389bcecde140a561c64e297225904afebebd62336cejljusten                                child controller.
390bcecde140a561c64e297225904afebebd62336cejljusten
391bcecde140a561c64e297225904afebebd62336cejljusten  @param  Language[in]          A pointer to a Null-terminated ASCII string
392bcecde140a561c64e297225904afebebd62336cejljusten                                array indicating the language.  This is the
393bcecde140a561c64e297225904afebebd62336cejljusten                                language of the driver name that the caller is
394bcecde140a561c64e297225904afebebd62336cejljusten                                requesting, and it must match one of the
395bcecde140a561c64e297225904afebebd62336cejljusten                                languages specified in SupportedLanguages. The
396bcecde140a561c64e297225904afebebd62336cejljusten                                number of languages supported by a driver is up
397bcecde140a561c64e297225904afebebd62336cejljusten                                to the driver writer. Language is specified in
398bcecde140a561c64e297225904afebebd62336cejljusten                                RFC 4646 or ISO 639-2 language code format.
399bcecde140a561c64e297225904afebebd62336cejljusten
400bcecde140a561c64e297225904afebebd62336cejljusten  @param  ControllerName[out]   A pointer to the Unicode string to return.
401bcecde140a561c64e297225904afebebd62336cejljusten                                This Unicode string is the name of the
402bcecde140a561c64e297225904afebebd62336cejljusten                                controller specified by ControllerHandle and
403bcecde140a561c64e297225904afebebd62336cejljusten                                ChildHandle in the language specified by
404bcecde140a561c64e297225904afebebd62336cejljusten                                Language from the point of view of the driver
405bcecde140a561c64e297225904afebebd62336cejljusten                                specified by This.
406bcecde140a561c64e297225904afebebd62336cejljusten
407bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           The Unicode string for the user readable name in
408bcecde140a561c64e297225904afebebd62336cejljusten                                the language specified by Language for the
409bcecde140a561c64e297225904afebebd62336cejljusten                                driver specified by This was returned in
410bcecde140a561c64e297225904afebebd62336cejljusten                                DriverName.
411bcecde140a561c64e297225904afebebd62336cejljusten
4120c9f676d5012f4d7d5cfd8195e07c403222a0265niruiyu  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
413bcecde140a561c64e297225904afebebd62336cejljusten
414bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
415bcecde140a561c64e297225904afebebd62336cejljusten                                EFI_HANDLE.
416bcecde140a561c64e297225904afebebd62336cejljusten
417bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER Language is NULL.
418bcecde140a561c64e297225904afebebd62336cejljusten
419bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
420bcecde140a561c64e297225904afebebd62336cejljusten
421bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_UNSUPPORTED       The driver specified by This is not currently
422bcecde140a561c64e297225904afebebd62336cejljusten                                managing the controller specified by
423bcecde140a561c64e297225904afebebd62336cejljusten                                ControllerHandle and ChildHandle.
424bcecde140a561c64e297225904afebebd62336cejljusten
425bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_UNSUPPORTED       The driver specified by This does not support
426bcecde140a561c64e297225904afebebd62336cejljusten                                the language specified by Language.
427bcecde140a561c64e297225904afebebd62336cejljusten
428bcecde140a561c64e297225904afebebd62336cejljusten**/
429bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
430bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
431bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardComponentNameGetControllerName (
432bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
433bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_HANDLE                                      ControllerHandle,
434bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
435bcecde140a561c64e297225904afebebd62336cejljusten  IN  CHAR8                                           *Language,
436bcecde140a561c64e297225904afebebd62336cejljusten  OUT CHAR16                                          **ControllerName
437bcecde140a561c64e297225904afebebd62336cejljusten  );
438bcecde140a561c64e297225904afebebd62336cejljusten
439bcecde140a561c64e297225904afebebd62336cejljusten
440bcecde140a561c64e297225904afebebd62336cejljusten//
441bcecde140a561c64e297225904afebebd62336cejljusten// Simple Text Input Protocol functions
442bcecde140a561c64e297225904afebebd62336cejljusten//
443bcecde140a561c64e297225904afebebd62336cejljusten/**
444bcecde140a561c64e297225904afebebd62336cejljusten  Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE) then do some extra keyboard validations.
445bcecde140a561c64e297225904afebebd62336cejljusten
446bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                  Pointer of simple text Protocol.
447bcecde140a561c64e297225904afebebd62336cejljusten  @param  ExtendedVerification  Whether perform the extra validation of keyboard. True: perform; FALSE: skip.
448bcecde140a561c64e297225904afebebd62336cejljusten
449bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           The command byte is written successfully.
450bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_DEVICE_ERROR      Errors occurred during reseting keyboard.
451bcecde140a561c64e297225904afebebd62336cejljusten
452bcecde140a561c64e297225904afebebd62336cejljusten**/
453bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
454bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
455bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardReset (
456bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
457bcecde140a561c64e297225904afebebd62336cejljusten  IN  BOOLEAN                         ExtendedVerification
458bcecde140a561c64e297225904afebebd62336cejljusten  );
459bcecde140a561c64e297225904afebebd62336cejljusten
460bcecde140a561c64e297225904afebebd62336cejljusten/**
461bcecde140a561c64e297225904afebebd62336cejljusten  Read out the scan code of the key that has just been stroked.
462bcecde140a561c64e297225904afebebd62336cejljusten
463bcecde140a561c64e297225904afebebd62336cejljusten  @param  This        Pointer of simple text Protocol.
464bcecde140a561c64e297225904afebebd62336cejljusten  @param  Key         Pointer for store the key that read out.
465bcecde140a561c64e297225904afebebd62336cejljusten
466bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS The key is read out successfully.
467bcecde140a561c64e297225904afebebd62336cejljusten  @retval other       The key reading failed.
468bcecde140a561c64e297225904afebebd62336cejljusten
469bcecde140a561c64e297225904afebebd62336cejljusten**/
470bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
471bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
472bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardReadKeyStroke (
473bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
474bcecde140a561c64e297225904afebebd62336cejljusten  OUT EFI_INPUT_KEY                   *Key
475bcecde140a561c64e297225904afebebd62336cejljusten  );
476bcecde140a561c64e297225904afebebd62336cejljusten
477bcecde140a561c64e297225904afebebd62336cejljusten//
478bcecde140a561c64e297225904afebebd62336cejljusten// Private worker functions
479bcecde140a561c64e297225904afebebd62336cejljusten//
480bcecde140a561c64e297225904afebebd62336cejljusten/**
481bcecde140a561c64e297225904afebebd62336cejljusten  Waiting on the keyboard event, if there's any key pressed by the user, signal the event
482bcecde140a561c64e297225904afebebd62336cejljusten
483bcecde140a561c64e297225904afebebd62336cejljusten  @param  Event       The event that be siganlled when any key has been stroked.
484bcecde140a561c64e297225904afebebd62336cejljusten  @param  Context     Pointer of the protocol EFI_SIMPLE_TEXT_INPUT_PROTOCOL.
485bcecde140a561c64e297225904afebebd62336cejljusten
486bcecde140a561c64e297225904afebebd62336cejljusten**/
487bcecde140a561c64e297225904afebebd62336cejljustenVOID
488bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
489bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardWaitForKey (
490bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_EVENT  Event,
491bcecde140a561c64e297225904afebebd62336cejljusten  IN  VOID       *Context
492bcecde140a561c64e297225904afebebd62336cejljusten  );
493bcecde140a561c64e297225904afebebd62336cejljusten
494bcecde140a561c64e297225904afebebd62336cejljusten/**
495bcecde140a561c64e297225904afebebd62336cejljusten  Check key buffer to get the key stroke status.
496bcecde140a561c64e297225904afebebd62336cejljusten
497bcecde140a561c64e297225904afebebd62336cejljusten  @param  This         Pointer of the protocol EFI_SIMPLE_TEXT_IN_PROTOCOL.
498bcecde140a561c64e297225904afebebd62336cejljusten
499bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS  A key is being pressed now.
500bcecde140a561c64e297225904afebebd62336cejljusten  @retval Other        No key is now pressed.
501bcecde140a561c64e297225904afebebd62336cejljusten
502bcecde140a561c64e297225904afebebd62336cejljusten**/
503bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
504bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
505bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardCheckForKey (
506bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This
507bcecde140a561c64e297225904afebebd62336cejljusten  );
508bcecde140a561c64e297225904afebebd62336cejljusten
509bcecde140a561c64e297225904afebebd62336cejljusten/**
510bcecde140a561c64e297225904afebebd62336cejljusten  Convert unicode combined with scan code of key to the counterpart of EFIScancode of it.
511bcecde140a561c64e297225904afebebd62336cejljusten
512bcecde140a561c64e297225904afebebd62336cejljusten  @param  KeyChar      Unicode of key.
513bcecde140a561c64e297225904afebebd62336cejljusten  @param  ScanCode     Scan code of key.
514bcecde140a561c64e297225904afebebd62336cejljusten
515bcecde140a561c64e297225904afebebd62336cejljusten  @return The value of EFI Scancode for the key.
516bcecde140a561c64e297225904afebebd62336cejljusten  @retval SCAN_NULL   No corresponding value in the EFI convert table is found for the key.
517bcecde140a561c64e297225904afebebd62336cejljusten
518bcecde140a561c64e297225904afebebd62336cejljusten**/
519bcecde140a561c64e297225904afebebd62336cejljustenUINT16
520bcecde140a561c64e297225904afebebd62336cejljustenConvertToEFIScanCode (
521bcecde140a561c64e297225904afebebd62336cejljusten  IN  CHAR16  KeyChar,
522bcecde140a561c64e297225904afebebd62336cejljusten  IN  UINT16  ScanCode
523bcecde140a561c64e297225904afebebd62336cejljusten  );
524bcecde140a561c64e297225904afebebd62336cejljusten
525bcecde140a561c64e297225904afebebd62336cejljusten/**
526bcecde140a561c64e297225904afebebd62336cejljusten  Check whether there is Ps/2 Keyboard device in system by 0xF4 Keyboard Command
527bcecde140a561c64e297225904afebebd62336cejljusten  If Keyboard receives 0xF4, it will respond with 'ACK'. If it doesn't respond, the device
528bcecde140a561c64e297225904afebebd62336cejljusten  should not be in system.
529bcecde140a561c64e297225904afebebd62336cejljusten
530bcecde140a561c64e297225904afebebd62336cejljusten  @param  BiosKeyboardPrivate  Keyboard Private Data Struture
531bcecde140a561c64e297225904afebebd62336cejljusten
532bcecde140a561c64e297225904afebebd62336cejljusten  @retval TRUE  Keyboard in System.
533bcecde140a561c64e297225904afebebd62336cejljusten  @retval FALSE Keyboard not in System.
534bcecde140a561c64e297225904afebebd62336cejljusten
535bcecde140a561c64e297225904afebebd62336cejljusten**/
536bcecde140a561c64e297225904afebebd62336cejljustenBOOLEAN
537bcecde140a561c64e297225904afebebd62336cejljustenCheckKeyboardConnect (
538bcecde140a561c64e297225904afebebd62336cejljusten  IN  BIOS_KEYBOARD_DEV     *BiosKeyboardPrivate
539bcecde140a561c64e297225904afebebd62336cejljusten  );
540bcecde140a561c64e297225904afebebd62336cejljusten
541bcecde140a561c64e297225904afebebd62336cejljusten/**
542bcecde140a561c64e297225904afebebd62336cejljusten  Timer event handler: read a series of key stroke from 8042
543bcecde140a561c64e297225904afebebd62336cejljusten  and put them into memory key buffer.
544bcecde140a561c64e297225904afebebd62336cejljusten  It is registered as running under TPL_NOTIFY
545bcecde140a561c64e297225904afebebd62336cejljusten
546bcecde140a561c64e297225904afebebd62336cejljusten  @param  Event   The timer event
547bcecde140a561c64e297225904afebebd62336cejljusten  @param  Context A BIOS_KEYBOARD_DEV pointer
548bcecde140a561c64e297225904afebebd62336cejljusten
549bcecde140a561c64e297225904afebebd62336cejljusten**/
550bcecde140a561c64e297225904afebebd62336cejljustenVOID
551bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
552bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardTimerHandler (
553bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_EVENT    Event,
554bcecde140a561c64e297225904afebebd62336cejljusten  IN VOID         *Context
555bcecde140a561c64e297225904afebebd62336cejljusten  );
556bcecde140a561c64e297225904afebebd62336cejljusten
557bcecde140a561c64e297225904afebebd62336cejljusten/**
558bcecde140a561c64e297225904afebebd62336cejljusten  Reset the input device and optionaly run diagnostics
559bcecde140a561c64e297225904afebebd62336cejljusten
560bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                  Protocol instance pointer.
561bcecde140a561c64e297225904afebebd62336cejljusten  @param  ExtendedVerification  Driver may perform diagnostics on reset.
562bcecde140a561c64e297225904afebebd62336cejljusten
563bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           The device was reset.
564bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_DEVICE_ERROR      The device is not functioning properly and could
565bcecde140a561c64e297225904afebebd62336cejljusten                                not be reset.
566bcecde140a561c64e297225904afebebd62336cejljusten
567bcecde140a561c64e297225904afebebd62336cejljusten**/
568bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
569bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
570bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardResetEx (
571bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
572bcecde140a561c64e297225904afebebd62336cejljusten  IN BOOLEAN                            ExtendedVerification
573bcecde140a561c64e297225904afebebd62336cejljusten  );
574bcecde140a561c64e297225904afebebd62336cejljusten
575bcecde140a561c64e297225904afebebd62336cejljusten/**
576bcecde140a561c64e297225904afebebd62336cejljusten  Reads the next keystroke from the input device. The WaitForKey Event can
577bcecde140a561c64e297225904afebebd62336cejljusten  be used to test for existance of a keystroke via WaitForEvent () call.
578bcecde140a561c64e297225904afebebd62336cejljusten
579bcecde140a561c64e297225904afebebd62336cejljusten  @param  This         Protocol instance pointer.
580bcecde140a561c64e297225904afebebd62336cejljusten  @param  KeyData      A pointer to a buffer that is filled in with the keystroke
581bcecde140a561c64e297225904afebebd62336cejljusten                       state data for the key that was pressed.
582bcecde140a561c64e297225904afebebd62336cejljusten
583bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_SUCCESS           The keystroke information was returned.
584bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_NOT_READY         There was no keystroke data availiable.
585bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_DEVICE_ERROR      The keystroke information was not returned due to
586bcecde140a561c64e297225904afebebd62336cejljusten                                 hardware errors.
587bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_INVALID_PARAMETER KeyData is NULL.
588bcecde140a561c64e297225904afebebd62336cejljusten
589bcecde140a561c64e297225904afebebd62336cejljusten**/
590bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
591bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
592bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardReadKeyStrokeEx (
593bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
594bcecde140a561c64e297225904afebebd62336cejljusten  OUT EFI_KEY_DATA                      *KeyData
595bcecde140a561c64e297225904afebebd62336cejljusten  );
596bcecde140a561c64e297225904afebebd62336cejljusten
597bcecde140a561c64e297225904afebebd62336cejljusten/**
598bcecde140a561c64e297225904afebebd62336cejljusten  Set certain state for the input device.
599bcecde140a561c64e297225904afebebd62336cejljusten
600bcecde140a561c64e297225904afebebd62336cejljusten  @param  This              Protocol instance pointer.
601bcecde140a561c64e297225904afebebd62336cejljusten  @param  KeyToggleState    A pointer to the EFI_KEY_TOGGLE_STATE to set the
602bcecde140a561c64e297225904afebebd62336cejljusten                            state for the input device.
603bcecde140a561c64e297225904afebebd62336cejljusten
604bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           The device state was set successfully.
605bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and could
606bcecde140a561c64e297225904afebebd62336cejljusten                                not have the setting adjusted.
607bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_UNSUPPORTED       The device does not have the ability to set its state.
608bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER KeyToggleState is NULL.
609bcecde140a561c64e297225904afebebd62336cejljusten
610bcecde140a561c64e297225904afebebd62336cejljusten**/
611bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
612bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
613bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardSetState (
614bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
615bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
616bcecde140a561c64e297225904afebebd62336cejljusten  );
617bcecde140a561c64e297225904afebebd62336cejljusten
618bcecde140a561c64e297225904afebebd62336cejljusten/**
619bcecde140a561c64e297225904afebebd62336cejljusten  Register a notification function for a particular keystroke for the input device.
620bcecde140a561c64e297225904afebebd62336cejljusten
621bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                    Protocol instance pointer.
622bcecde140a561c64e297225904afebebd62336cejljusten  @param  KeyData                 A pointer to a buffer that is filled in with the keystroke
623bcecde140a561c64e297225904afebebd62336cejljusten                                  information data for the key that was pressed.
624bcecde140a561c64e297225904afebebd62336cejljusten  @param  KeyNotificationFunction Points to the function to be called when the key
625bcecde140a561c64e297225904afebebd62336cejljusten                                  sequence is typed specified by KeyData.
626bcecde140a561c64e297225904afebebd62336cejljusten  @param  NotifyHandle            Points to the unique handle assigned to the registered notification.
627bcecde140a561c64e297225904afebebd62336cejljusten
628bcecde140a561c64e297225904afebebd62336cejljusten
629bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS             The notification function was registered successfully.
630bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_OUT_OF_RESOURCES    Unable to allocate resources for necesssary data structures.
631bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER   KeyData or NotifyHandle is NULL.
632bcecde140a561c64e297225904afebebd62336cejljusten
633bcecde140a561c64e297225904afebebd62336cejljusten**/
634bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
635bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
636bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardRegisterKeyNotify (
637bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
638bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_KEY_DATA                       *KeyData,
639bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
640402e4a9d777677296945afa020194bf4123885e2niruiyu  OUT VOID                              **NotifyHandle
641bcecde140a561c64e297225904afebebd62336cejljusten  );
642bcecde140a561c64e297225904afebebd62336cejljusten
643bcecde140a561c64e297225904afebebd62336cejljusten/**
644bcecde140a561c64e297225904afebebd62336cejljusten  Remove a registered notification function from a particular keystroke.
645bcecde140a561c64e297225904afebebd62336cejljusten
646bcecde140a561c64e297225904afebebd62336cejljusten  @param  This                 Protocol instance pointer.
647bcecde140a561c64e297225904afebebd62336cejljusten  @param  NotificationHandle   The handle of the notification function being unregistered.
648bcecde140a561c64e297225904afebebd62336cejljusten
649bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS             The notification function was unregistered successfully.
650bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER   The NotificationHandle is invalid.
651bcecde140a561c64e297225904afebebd62336cejljusten
652bcecde140a561c64e297225904afebebd62336cejljusten**/
653bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
654bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
655bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardUnregisterKeyNotify (
656bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
657402e4a9d777677296945afa020194bf4123885e2niruiyu  IN VOID                               *NotificationHandle
658bcecde140a561c64e297225904afebebd62336cejljusten  );
659bcecde140a561c64e297225904afebebd62336cejljusten
660bcecde140a561c64e297225904afebebd62336cejljusten/**
661bcecde140a561c64e297225904afebebd62336cejljusten  Wait for a specific value to be presented in
662bcecde140a561c64e297225904afebebd62336cejljusten  Data register of Keyboard Controller by keyboard and then read it,
663bcecde140a561c64e297225904afebebd62336cejljusten  used in keyboard commands ack
664bcecde140a561c64e297225904afebebd62336cejljusten
665bcecde140a561c64e297225904afebebd62336cejljusten  @param   BiosKeyboardPrivate  Keyboard instance pointer.
666bcecde140a561c64e297225904afebebd62336cejljusten  @param   Value                The value to be waited for
667bcecde140a561c64e297225904afebebd62336cejljusten  @param   WaitForValueTimeOut  The limit of microseconds for timeout
668bcecde140a561c64e297225904afebebd62336cejljusten
669bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_SUCCESS          The command byte is written successfully.
670bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_TIMEOUT          Timeout occurred during writing.
671bcecde140a561c64e297225904afebebd62336cejljusten
672bcecde140a561c64e297225904afebebd62336cejljusten**/
673bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
674bcecde140a561c64e297225904afebebd62336cejljustenKeyboardWaitForValue (
675bcecde140a561c64e297225904afebebd62336cejljusten  IN BIOS_KEYBOARD_DEV  *BiosKeyboardPrivate,
676bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8              Value,
677bcecde140a561c64e297225904afebebd62336cejljusten  IN UINTN              WaitForValueTimeOut
678bcecde140a561c64e297225904afebebd62336cejljusten  );
679bcecde140a561c64e297225904afebebd62336cejljusten
680bcecde140a561c64e297225904afebebd62336cejljusten/**
681bcecde140a561c64e297225904afebebd62336cejljusten  Write data byte to input buffer or input/output ports of Keyboard Controller with delay and waiting for buffer-empty state.
682bcecde140a561c64e297225904afebebd62336cejljusten
683bcecde140a561c64e297225904afebebd62336cejljusten  @param   BiosKeyboardPrivate  Keyboard instance pointer.
684bcecde140a561c64e297225904afebebd62336cejljusten  @param   Data                 Data byte to write.
685bcecde140a561c64e297225904afebebd62336cejljusten
686bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_SUCCESS          The data byte is written successfully.
687bcecde140a561c64e297225904afebebd62336cejljusten  @retval  EFI_TIMEOUT          Timeout occurred during writing.
688bcecde140a561c64e297225904afebebd62336cejljusten
689bcecde140a561c64e297225904afebebd62336cejljusten**/
690bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
691bcecde140a561c64e297225904afebebd62336cejljustenKeyboardWrite (
692bcecde140a561c64e297225904afebebd62336cejljusten  IN BIOS_KEYBOARD_DEV  *BiosKeyboardPrivate,
693bcecde140a561c64e297225904afebebd62336cejljusten  IN UINT8              Data
694bcecde140a561c64e297225904afebebd62336cejljusten  );
695bcecde140a561c64e297225904afebebd62336cejljusten
696bcecde140a561c64e297225904afebebd62336cejljusten/**
697bcecde140a561c64e297225904afebebd62336cejljusten  Free keyboard notify list.
698bcecde140a561c64e297225904afebebd62336cejljusten
699bcecde140a561c64e297225904afebebd62336cejljusten  @param  ListHead   The list head
700bcecde140a561c64e297225904afebebd62336cejljusten
701bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_SUCCESS           Free the notify list successfully
702bcecde140a561c64e297225904afebebd62336cejljusten  @retval EFI_INVALID_PARAMETER ListHead is invalid.
703bcecde140a561c64e297225904afebebd62336cejljusten
704bcecde140a561c64e297225904afebebd62336cejljusten**/
705bcecde140a561c64e297225904afebebd62336cejljustenEFI_STATUS
706bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardFreeNotifyList (
707bcecde140a561c64e297225904afebebd62336cejljusten  IN OUT LIST_ENTRY           *ListHead
708bcecde140a561c64e297225904afebebd62336cejljusten  );
709bcecde140a561c64e297225904afebebd62336cejljusten
710bcecde140a561c64e297225904afebebd62336cejljusten/**
711bcecde140a561c64e297225904afebebd62336cejljusten  Check if key is registered.
712bcecde140a561c64e297225904afebebd62336cejljusten
713bcecde140a561c64e297225904afebebd62336cejljusten  @param  RegsiteredData    A pointer to a buffer that is filled in with the keystroke
714bcecde140a561c64e297225904afebebd62336cejljusten                            state data for the key that was registered.
715bcecde140a561c64e297225904afebebd62336cejljusten  @param  InputData         A pointer to a buffer that is filled in with the keystroke
716bcecde140a561c64e297225904afebebd62336cejljusten                            state data for the key that was pressed.
717bcecde140a561c64e297225904afebebd62336cejljusten
718bcecde140a561c64e297225904afebebd62336cejljusten  @retval TRUE              Key be pressed matches a registered key.
719bcecde140a561c64e297225904afebebd62336cejljusten  @retval FLASE             Match failed.
720bcecde140a561c64e297225904afebebd62336cejljusten
721bcecde140a561c64e297225904afebebd62336cejljusten**/
722bcecde140a561c64e297225904afebebd62336cejljustenBOOLEAN
723bcecde140a561c64e297225904afebebd62336cejljustenIsKeyRegistered (
724bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_KEY_DATA  *RegsiteredData,
725bcecde140a561c64e297225904afebebd62336cejljusten  IN EFI_KEY_DATA  *InputData
726bcecde140a561c64e297225904afebebd62336cejljusten  );
727bcecde140a561c64e297225904afebebd62336cejljusten
728bcecde140a561c64e297225904afebebd62336cejljusten/**
729bcecde140a561c64e297225904afebebd62336cejljusten  Waiting on the keyboard event, if there's any key pressed by the user, signal the event
730bcecde140a561c64e297225904afebebd62336cejljusten
731bcecde140a561c64e297225904afebebd62336cejljusten  @param  Event    The event that be siganlled when any key has been stroked.
732bcecde140a561c64e297225904afebebd62336cejljusten  @param  Context  Pointer of the protocol EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.
733bcecde140a561c64e297225904afebebd62336cejljusten
734bcecde140a561c64e297225904afebebd62336cejljusten**/
735bcecde140a561c64e297225904afebebd62336cejljustenVOID
736bcecde140a561c64e297225904afebebd62336cejljustenEFIAPI
737bcecde140a561c64e297225904afebebd62336cejljustenBiosKeyboardWaitForKeyEx (
738bcecde140a561c64e297225904afebebd62336cejljusten  IN  EFI_EVENT  Event,
739bcecde140a561c64e297225904afebebd62336cejljusten  IN  VOID       *Context
740bcecde140a561c64e297225904afebebd62336cejljusten  );
741bcecde140a561c64e297225904afebebd62336cejljusten
742bcecde140a561c64e297225904afebebd62336cejljusten#endif
743bcecde140a561c64e297225904afebebd62336cejljusten
744