]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.c
Fix the potential issue that using integrate as BOOLEAN value in judgment.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2Keyboard.c
CommitLineData
f713c4fe 1/** @file\r
f8cd287b 2\r
3 PS/2 Keyboard driver. Routines that interacts with callers,\r
4 conforming to EFI driver model\r
05fbd06d 5\r
f713c4fe 6Copyright (c) 2006 - 2009, Intel Corporation\r
df0dcb5e 7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
05fbd06d 14\r
f8cd287b 15**/\r
05fbd06d 16\r
05fbd06d 17#include "Ps2Keyboard.h"\r
18\r
19//\r
20// Function prototypes\r
21//\r
f713c4fe 22/**\r
23 Test controller is a keyboard Controller.\r
24 \r
25 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
26 @param Controller driver's controller\r
27 @param RemainingDevicePath children device path\r
28 \r
29 @retval EFI_UNSUPPORTED controller is not floppy disk\r
30 @retval EFI_SUCCESS controller is floppy disk\r
31**/\r
05fbd06d 32EFI_STATUS\r
33EFIAPI\r
34KbdControllerDriverSupported (\r
35 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
36 IN EFI_HANDLE Controller,\r
37 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
38 );\r
39\r
f713c4fe 40/**\r
41 Create KEYBOARD_CONSOLE_IN_DEV instance on controller.\r
42 \r
43 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
44 @param Controller driver controller handle\r
45 @param RemainingDevicePath Children's device path\r
46 \r
47 @retval whether success to create floppy control instance.\r
48**/\r
05fbd06d 49EFI_STATUS\r
50EFIAPI\r
51KbdControllerDriverStart (\r
52 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
53 IN EFI_HANDLE Controller,\r
54 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
55 );\r
56\r
f713c4fe 57/**\r
58 Stop this driver on ControllerHandle. Support stoping any child handles\r
59 created by this driver.\r
60\r
61 @param This Protocol instance pointer.\r
62 @param ControllerHandle Handle of device to stop driver on\r
63 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
64 children is zero stop the entire bus driver.\r
65 @param ChildHandleBuffer List of Child Handles to Stop.\r
66\r
67 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
68 @retval other This driver was not removed from this device\r
69\r
70**/\r
05fbd06d 71EFI_STATUS\r
72EFIAPI\r
73KbdControllerDriverStop (\r
74 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
75 IN EFI_HANDLE Controller,\r
76 IN UINTN NumberOfChildren,\r
77 IN EFI_HANDLE *ChildHandleBuffer\r
78 );\r
79\r
f713c4fe 80/**\r
81 Free the waiting key notify list.\r
82 \r
83 @param ListHead Pointer to list head\r
84 \r
85 @retval EFI_INVALID_PARAMETER ListHead is NULL\r
86 @retval EFI_SUCCESS Sucess to free NotifyList\r
87**/\r
f3d1e940 88EFI_STATUS\r
89KbdFreeNotifyList (\r
90 IN OUT LIST_ENTRY *ListHead\r
91 ); \r
92\r
05fbd06d 93//\r
94// DriverBinding Protocol Instance\r
95//\r
96EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {\r
97 KbdControllerDriverSupported,\r
98 KbdControllerDriverStart,\r
99 KbdControllerDriverStop,\r
100 0xa,\r
101 NULL,\r
102 NULL\r
103};\r
104\r
bcd70414 105/**\r
f713c4fe 106 Test controller is a keyboard Controller.\r
bcd70414 107 \r
108 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
109 @param Controller driver's controller\r
110 @param RemainingDevicePath children device path\r
111 \r
112 @retval EFI_UNSUPPORTED controller is not floppy disk\r
113 @retval EFI_SUCCESS controller is floppy disk\r
114**/\r
05fbd06d 115EFI_STATUS\r
116EFIAPI\r
117KbdControllerDriverSupported (\r
118 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
119 IN EFI_HANDLE Controller,\r
120 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
121 )\r
05fbd06d 122{\r
123 EFI_STATUS Status;\r
124 EFI_ISA_IO_PROTOCOL *IsaIo;\r
125\r
126 //\r
127 // Open the IO Abstraction(s) needed to perform the supported test\r
128 //\r
129 Status = gBS->OpenProtocol (\r
130 Controller,\r
131 &gEfiIsaIoProtocolGuid,\r
132 (VOID **) &IsaIo,\r
133 This->DriverBindingHandle,\r
134 Controller,\r
135 EFI_OPEN_PROTOCOL_BY_DRIVER\r
136 );\r
137 if (EFI_ERROR (Status)) {\r
138 return Status;\r
139 }\r
140 //\r
141 // Use the ISA I/O Protocol to see if Controller is the Keyboard controller\r
142 //\r
143 if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x303) || IsaIo->ResourceList->Device.UID != 0) {\r
144 Status = EFI_UNSUPPORTED;\r
145 }\r
146 //\r
147 // Close the I/O Abstraction(s) used to perform the supported test\r
148 //\r
149 gBS->CloseProtocol (\r
150 Controller,\r
151 &gEfiIsaIoProtocolGuid,\r
152 This->DriverBindingHandle,\r
153 Controller\r
154 );\r
155\r
156 return Status;\r
157}\r
158\r
bcd70414 159/**\r
160 Create KEYBOARD_CONSOLE_IN_DEV instance on controller.\r
161 \r
162 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
163 @param Controller driver controller handle\r
164 @param RemainingDevicePath Children's device path\r
165 \r
166 @retval whether success to create floppy control instance.\r
167**/\r
05fbd06d 168EFI_STATUS\r
169EFIAPI\r
170KbdControllerDriverStart (\r
171 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
172 IN EFI_HANDLE Controller,\r
173 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
174 )\r
05fbd06d 175{\r
176 EFI_STATUS Status;\r
177 EFI_STATUS Status1;\r
178 EFI_ISA_IO_PROTOCOL *IsaIo;\r
179 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
180 UINT8 Data;\r
181 EFI_STATUS_CODE_VALUE StatusCode;\r
182 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
183\r
184 StatusCode = 0;\r
185\r
186 Status = gBS->OpenProtocol (\r
187 Controller,\r
188 &gEfiDevicePathProtocolGuid,\r
189 (VOID **) &ParentDevicePath,\r
190 This->DriverBindingHandle,\r
191 Controller,\r
192 EFI_OPEN_PROTOCOL_BY_DRIVER\r
193 );\r
194 if (EFI_ERROR (Status)) {\r
195 return Status;\r
196 }\r
197 //\r
198 // Report that the keyboard is being enabled\r
199 //\r
200 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
201 EFI_PROGRESS_CODE,\r
202 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE,\r
203 ParentDevicePath\r
204 );\r
205\r
206 //\r
207 // Get the ISA I/O Protocol on Controller's handle\r
208 //\r
209 Status = gBS->OpenProtocol (\r
210 Controller,\r
211 &gEfiIsaIoProtocolGuid,\r
212 (VOID **) &IsaIo,\r
213 This->DriverBindingHandle,\r
214 Controller,\r
215 EFI_OPEN_PROTOCOL_BY_DRIVER\r
216 );\r
217 if (EFI_ERROR (Status)) {\r
218 gBS->CloseProtocol (\r
219 Controller,\r
220 &gEfiDevicePathProtocolGuid,\r
221 This->DriverBindingHandle,\r
222 Controller\r
223 );\r
224 return EFI_INVALID_PARAMETER;\r
225 }\r
226 //\r
227 // Allocate private data\r
228 //\r
229 ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV));\r
230 if (ConsoleIn == NULL) {\r
231 Status = EFI_OUT_OF_RESOURCES;\r
232 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
233 goto ErrorExit;\r
234 }\r
235 //\r
236 // Setup the device instance\r
237 //\r
238 ConsoleIn->Signature = KEYBOARD_CONSOLE_IN_DEV_SIGNATURE;\r
239 ConsoleIn->Handle = Controller;\r
240 (ConsoleIn->ConIn).Reset = KeyboardEfiReset;\r
241 (ConsoleIn->ConIn).ReadKeyStroke = KeyboardReadKeyStroke;\r
242 ConsoleIn->DataRegisterAddress = KEYBOARD_8042_DATA_REGISTER;\r
243 ConsoleIn->StatusRegisterAddress = KEYBOARD_8042_STATUS_REGISTER;\r
244 ConsoleIn->CommandRegisterAddress = KEYBOARD_8042_COMMAND_REGISTER;\r
245 ConsoleIn->IsaIo = IsaIo;\r
246 ConsoleIn->ScancodeBufStartPos = 0;\r
247 ConsoleIn->ScancodeBufEndPos = KEYBOARD_BUFFER_MAX_COUNT - 1;\r
248 ConsoleIn->ScancodeBufCount = 0;\r
249 ConsoleIn->Ctrled = FALSE;\r
250 ConsoleIn->Alted = FALSE;\r
251 ConsoleIn->DevicePath = ParentDevicePath;\r
252\r
f3d1e940 253 ConsoleIn->ConInEx.Reset = KeyboardEfiResetEx;\r
254 ConsoleIn->ConInEx.ReadKeyStrokeEx = KeyboardReadKeyStrokeEx;\r
255 ConsoleIn->ConInEx.SetState = KeyboardSetState;\r
256 ConsoleIn->ConInEx.RegisterKeyNotify = KeyboardRegisterKeyNotify;\r
257 ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify; \r
258 \r
259 InitializeListHead (&ConsoleIn->NotifyList);\r
007c18f5 260\r
261 //\r
262 // Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.\r
263 //\r
264 KeyboardRead (ConsoleIn, &Data);\r
265 if ((KeyReadStatusRegister (ConsoleIn) & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {\r
266 //\r
267 // If nobody decodes KBC I/O port, it will read back as 0xFF.\r
268 // Check the Time-Out and Parity bit to see if it has an active KBC in system\r
269 //\r
270 Status = EFI_DEVICE_ERROR;\r
271 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
272 goto ErrorExit;\r
273 }\r
274 \r
05fbd06d 275 //\r
276 // Setup the WaitForKey event\r
277 //\r
278 Status = gBS->CreateEvent (\r
279 EVT_NOTIFY_WAIT,\r
280 TPL_NOTIFY,\r
281 KeyboardWaitForKey,\r
282 &(ConsoleIn->ConIn),\r
283 &((ConsoleIn->ConIn).WaitForKey)\r
284 );\r
285 if (EFI_ERROR (Status)) {\r
286 Status = EFI_OUT_OF_RESOURCES;\r
287 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
288 goto ErrorExit;\r
289 }\r
290 //\r
f3d1e940 291 // Setup the WaitForKeyEx event\r
292 // \r
293 Status = gBS->CreateEvent (\r
294 EVT_NOTIFY_WAIT,\r
295 TPL_NOTIFY,\r
296 KeyboardWaitForKeyEx,\r
297 &(ConsoleIn->ConInEx),\r
298 &(ConsoleIn->ConInEx.WaitForKeyEx)\r
299 );\r
300 if (EFI_ERROR (Status)) {\r
301 Status = EFI_OUT_OF_RESOURCES;\r
302 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
303 goto ErrorExit;\r
304 }\r
05fbd06d 305 // Setup a periodic timer, used for reading keystrokes at a fixed interval\r
306 //\r
307 Status = gBS->CreateEvent (\r
308 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
309 TPL_NOTIFY,\r
310 KeyboardTimerHandler,\r
311 ConsoleIn,\r
312 &ConsoleIn->TimerEvent\r
313 );\r
314 if (EFI_ERROR (Status)) {\r
315 Status = EFI_OUT_OF_RESOURCES;\r
316 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
317 goto ErrorExit;\r
318 }\r
319\r
320 Status = gBS->SetTimer (\r
321 ConsoleIn->TimerEvent,\r
322 TimerPeriodic,\r
323 KEYBOARD_TIMER_INTERVAL\r
324 );\r
325 if (EFI_ERROR (Status)) {\r
326 Status = EFI_OUT_OF_RESOURCES;\r
327 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
328 goto ErrorExit;\r
329 }\r
330\r
331 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
332 EFI_PROGRESS_CODE,\r
333 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT,\r
334 ParentDevicePath\r
335 );\r
336\r
337 //\r
338 // Reset the keyboard device\r
339 //\r
340 Status = ConsoleIn->ConIn.Reset (&ConsoleIn->ConIn, TRUE);\r
341 if (EFI_ERROR (Status)) {\r
342 Status = EFI_DEVICE_ERROR;\r
343 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
344 goto ErrorExit;\r
345 }\r
346\r
347 ConsoleIn->ControllerNameTable = NULL;\r
f3d08ccf 348 AddUnicodeString2 (\r
05fbd06d 349 "eng",\r
350 gPs2KeyboardComponentName.SupportedLanguages,\r
351 &ConsoleIn->ControllerNameTable,\r
f3d08ccf 352 L"PS/2 Keyboard Device",\r
353 TRUE\r
05fbd06d 354 );\r
f3d08ccf 355 AddUnicodeString2 (\r
356 "en",\r
357 gPs2KeyboardComponentName2.SupportedLanguages,\r
358 &ConsoleIn->ControllerNameTable,\r
359 L"PS/2 Keyboard Device",\r
360 FALSE\r
361 );\r
362\r
05fbd06d 363\r
364 //\r
365 // Install protocol interfaces for the keyboard device.\r
366 //\r
367 Status = gBS->InstallMultipleProtocolInterfaces (\r
368 &Controller,\r
369 &gEfiSimpleTextInProtocolGuid,\r
370 &ConsoleIn->ConIn,\r
f3d1e940 371 &gEfiSimpleTextInputExProtocolGuid,\r
372 &ConsoleIn->ConInEx,\r
05fbd06d 373 NULL\r
374 );\r
375 if (EFI_ERROR (Status)) {\r
376 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
377 goto ErrorExit;\r
378 }\r
379\r
380 return Status;\r
381\r
382ErrorExit:\r
383 //\r
384 // Report error code\r
385 //\r
386 if (StatusCode != 0) {\r
387 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
388 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
389 StatusCode,\r
390 ParentDevicePath\r
391 );\r
392 }\r
393\r
394 if ((ConsoleIn != NULL) && (ConsoleIn->ConIn.WaitForKey != NULL)) {\r
395 gBS->CloseEvent (ConsoleIn->ConIn.WaitForKey);\r
396 }\r
397\r
398 if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {\r
399 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
400 }\r
f3d1e940 401 if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {\r
402 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
403 }\r
404 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 405 if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {\r
406 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
407 }\r
408 //\r
409 // Since there will be no timer handler for keyboard input any more,\r
410 // exhaust input data just in case there is still keyboard data left\r
411 //\r
261136bc 412 if (ConsoleIn != NULL) {\r
413 Status1 = EFI_SUCCESS;\r
007c18f5 414 while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) {\r
261136bc 415 Status1 = KeyboardRead (ConsoleIn, &Data);;\r
416 }\r
05fbd06d 417 }\r
261136bc 418 \r
05fbd06d 419 if (ConsoleIn != NULL) {\r
420 gBS->FreePool (ConsoleIn);\r
421 }\r
422\r
423 gBS->CloseProtocol (\r
424 Controller,\r
425 &gEfiDevicePathProtocolGuid,\r
426 This->DriverBindingHandle,\r
427 Controller\r
428 );\r
429\r
430 gBS->CloseProtocol (\r
431 Controller,\r
432 &gEfiIsaIoProtocolGuid,\r
433 This->DriverBindingHandle,\r
434 Controller\r
435 );\r
436\r
437 return Status;\r
438}\r
439\r
bcd70414 440/**\r
441 Stop this driver on ControllerHandle. Support stoping any child handles\r
442 created by this driver.\r
443\r
444 @param This Protocol instance pointer.\r
445 @param ControllerHandle Handle of device to stop driver on\r
446 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
447 children is zero stop the entire bus driver.\r
448 @param ChildHandleBuffer List of Child Handles to Stop.\r
449\r
450 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
451 @retval other This driver was not removed from this device\r
452\r
453**/\r
05fbd06d 454EFI_STATUS\r
455EFIAPI\r
456KbdControllerDriverStop (\r
457 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
458 IN EFI_HANDLE Controller,\r
459 IN UINTN NumberOfChildren,\r
460 IN EFI_HANDLE *ChildHandleBuffer\r
461 )\r
05fbd06d 462{\r
463 EFI_STATUS Status;\r
464 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;\r
465 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
466 UINT8 Data;\r
467\r
468 //\r
469 // Disable Keyboard\r
470 //\r
471 Status = gBS->OpenProtocol (\r
472 Controller,\r
473 &gEfiSimpleTextInProtocolGuid,\r
474 (VOID **) &ConIn,\r
475 This->DriverBindingHandle,\r
476 Controller,\r
477 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
478 );\r
479 if (EFI_ERROR (Status)) {\r
480 return Status;\r
481 }\r
f3d1e940 482 Status = gBS->OpenProtocol (\r
483 Controller,\r
484 &gEfiSimpleTextInputExProtocolGuid,\r
485 NULL,\r
486 This->DriverBindingHandle,\r
487 Controller,\r
488 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
489 );\r
490 if (EFI_ERROR (Status)) {\r
491 return Status;\r
492 }\r
493 \r
05fbd06d 494 ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (ConIn);\r
495\r
496 //\r
497 // Report that the keyboard is being disabled\r
498 //\r
499 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
500 EFI_PROGRESS_CODE,\r
501 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE,\r
502 ConsoleIn->DevicePath\r
503 );\r
504\r
f713c4fe 505 if (ConsoleIn->TimerEvent != NULL) {\r
05fbd06d 506 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
507 ConsoleIn->TimerEvent = NULL;\r
508 }\r
509 //\r
510 // Disable the keyboard interface\r
511 //\r
512 Status = DisableKeyboard (ConsoleIn);\r
513\r
514 //\r
515 // Since there will be no timer handler for keyboard input any more,\r
516 // exhaust input data just in case there is still keyboard data left\r
517 //\r
518 Status = EFI_SUCCESS;\r
519 while (!EFI_ERROR (Status)) {\r
520 Status = KeyboardRead (ConsoleIn, &Data);;\r
521 }\r
522 //\r
f3d1e940 523 // Uninstall the SimpleTextIn and SimpleTextInEx protocols\r
05fbd06d 524 //\r
f3d1e940 525 Status = gBS->UninstallMultipleProtocolInterfaces (\r
05fbd06d 526 Controller,\r
527 &gEfiSimpleTextInProtocolGuid,\r
f3d1e940 528 &ConsoleIn->ConIn,\r
529 &gEfiSimpleTextInputExProtocolGuid,\r
530 &ConsoleIn->ConInEx,\r
531 NULL\r
05fbd06d 532 );\r
533 if (EFI_ERROR (Status)) {\r
534 return Status;\r
535 }\r
536\r
537 gBS->CloseProtocol (\r
538 Controller,\r
539 &gEfiDevicePathProtocolGuid,\r
540 This->DriverBindingHandle,\r
541 Controller\r
542 );\r
543\r
544 gBS->CloseProtocol (\r
545 Controller,\r
546 &gEfiIsaIoProtocolGuid,\r
547 This->DriverBindingHandle,\r
548 Controller\r
549 );\r
550\r
551 //\r
552 // Free other resources\r
553 //\r
7ec9caab 554 if ((ConsoleIn->ConIn).WaitForKey != NULL) {\r
05fbd06d 555 gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);\r
556 (ConsoleIn->ConIn).WaitForKey = NULL;\r
557 }\r
f3d1e940 558 if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {\r
559 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
560 ConsoleIn->ConInEx.WaitForKeyEx = NULL;\r
561 }\r
562 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 563 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
564 gBS->FreePool (ConsoleIn);\r
565\r
566 return EFI_SUCCESS;\r
567}\r
c21fc3e8 568\r
bcd70414 569/**\r
570 Free the waiting key notify list.\r
571 \r
572 @param ListHead Pointer to list head\r
f713c4fe 573 \r
574 @retval EFI_INVALID_PARAMETER ListHead is NULL\r
575 @retval EFI_SUCCESS Sucess to free NotifyList\r
bcd70414 576**/\r
f3d1e940 577EFI_STATUS\r
578KbdFreeNotifyList (\r
579 IN OUT LIST_ENTRY *ListHead\r
580 )\r
f3d1e940 581{\r
582 KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
583\r
584 if (ListHead == NULL) {\r
585 return EFI_INVALID_PARAMETER;\r
586 }\r
587 while (!IsListEmpty (ListHead)) {\r
588 NotifyNode = CR (\r
589 ListHead->ForwardLink, \r
590 KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
591 NotifyEntry, \r
592 KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
593 );\r
594 RemoveEntryList (ListHead->ForwardLink);\r
595 gBS->FreePool (NotifyNode);\r
596 }\r
597 \r
598 return EFI_SUCCESS;\r
599}\r
c21fc3e8 600\r
601/**\r
b6763e03 602 The module Entry Point for module Ps2Keyboard. \r
c21fc3e8 603\r
604 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
605 @param[in] SystemTable A pointer to the EFI System Table.\r
606 \r
607 @retval EFI_SUCCESS The entry point is executed successfully.\r
608 @retval other Some error occurs when executing this entry point.\r
609\r
610**/\r
611EFI_STATUS\r
612EFIAPI\r
613InitializePs2Keyboard(\r
614 IN EFI_HANDLE ImageHandle,\r
615 IN EFI_SYSTEM_TABLE *SystemTable\r
616 )\r
617{\r
618 EFI_STATUS Status;\r
619\r
620 //\r
621 // Install driver model protocol(s).\r
622 //\r
f3d08ccf 623 Status = EfiLibInstallDriverBindingComponentName2 (\r
c21fc3e8 624 ImageHandle,\r
625 SystemTable,\r
626 &gKeyboardControllerDriver,\r
627 ImageHandle,\r
628 &gPs2KeyboardComponentName,\r
f3d08ccf 629 &gPs2KeyboardComponentName2\r
c21fc3e8 630 );\r
631 ASSERT_EFI_ERROR (Status);\r
632\r
633\r
634 return Status;\r
635}\r
bcd70414 636\r