]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.c
IntelFrameworkModulePkg: Clean up source files
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2Keyboard.c
... / ...
CommitLineData
1/** @file\r
2\r
3 PS/2 Keyboard driver. Routines that interacts with callers,\r
4 conforming to EFI driver model\r
5\r
6Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
7This 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
14\r
15**/\r
16\r
17#include "Ps2Keyboard.h"\r
18\r
19//\r
20// Function prototypes\r
21//\r
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
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
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
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
57/**\r
58 Stop this driver on ControllerHandle. Support stopping 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
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
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
88EFI_STATUS\r
89KbdFreeNotifyList (\r
90 IN OUT LIST_ENTRY *ListHead\r
91 );\r
92\r
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
105/**\r
106 Test controller is a keyboard Controller.\r
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
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
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
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
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
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->DevicePath = ParentDevicePath;\r
247\r
248 ConsoleIn->ConInEx.Reset = KeyboardEfiResetEx;\r
249 ConsoleIn->ConInEx.ReadKeyStrokeEx = KeyboardReadKeyStrokeEx;\r
250 ConsoleIn->ConInEx.SetState = KeyboardSetState;\r
251 ConsoleIn->ConInEx.RegisterKeyNotify = KeyboardRegisterKeyNotify;\r
252 ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify;\r
253\r
254 InitializeListHead (&ConsoleIn->NotifyList);\r
255\r
256 //\r
257 // Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.\r
258 // When KBC decode (IO port 0x60/0x64 decode) is not enabled,\r
259 // KeyboardRead will read back as 0xFF and return status is EFI_SUCCESS.\r
260 // So instead we read status register to detect after read if KBC decode is enabled.\r
261 //\r
262\r
263 //\r
264 // Return code is ignored on purpose.\r
265 //\r
266 if (!PcdGetBool (PcdFastPS2Detection)) {\r
267 KeyboardRead (ConsoleIn, &Data);\r
268 if ((KeyReadStatusRegister (ConsoleIn) & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {\r
269 //\r
270 // If nobody decodes KBC I/O port, it will read back as 0xFF.\r
271 // Check the Time-Out and Parity bit to see if it has an active KBC in system\r
272 //\r
273 Status = EFI_DEVICE_ERROR;\r
274 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
275 goto ErrorExit;\r
276 }\r
277 }\r
278\r
279 //\r
280 // Setup the WaitForKey event\r
281 //\r
282 Status = gBS->CreateEvent (\r
283 EVT_NOTIFY_WAIT,\r
284 TPL_NOTIFY,\r
285 KeyboardWaitForKey,\r
286 ConsoleIn,\r
287 &((ConsoleIn->ConIn).WaitForKey)\r
288 );\r
289 if (EFI_ERROR (Status)) {\r
290 Status = EFI_OUT_OF_RESOURCES;\r
291 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
292 goto ErrorExit;\r
293 }\r
294 //\r
295 // Setup the WaitForKeyEx event\r
296 //\r
297 Status = gBS->CreateEvent (\r
298 EVT_NOTIFY_WAIT,\r
299 TPL_NOTIFY,\r
300 KeyboardWaitForKeyEx,\r
301 ConsoleIn,\r
302 &(ConsoleIn->ConInEx.WaitForKeyEx)\r
303 );\r
304 if (EFI_ERROR (Status)) {\r
305 Status = EFI_OUT_OF_RESOURCES;\r
306 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
307 goto ErrorExit;\r
308 }\r
309\r
310 // Setup a periodic timer, used for reading keystrokes at a fixed interval\r
311 //\r
312 Status = gBS->CreateEvent (\r
313 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
314 TPL_NOTIFY,\r
315 KeyboardTimerHandler,\r
316 ConsoleIn,\r
317 &ConsoleIn->TimerEvent\r
318 );\r
319 if (EFI_ERROR (Status)) {\r
320 Status = EFI_OUT_OF_RESOURCES;\r
321 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
322 goto ErrorExit;\r
323 }\r
324\r
325 Status = gBS->SetTimer (\r
326 ConsoleIn->TimerEvent,\r
327 TimerPeriodic,\r
328 KEYBOARD_TIMER_INTERVAL\r
329 );\r
330 if (EFI_ERROR (Status)) {\r
331 Status = EFI_OUT_OF_RESOURCES;\r
332 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
333 goto ErrorExit;\r
334 }\r
335\r
336 Status = gBS->CreateEvent (\r
337 EVT_NOTIFY_SIGNAL,\r
338 TPL_CALLBACK,\r
339 KeyNotifyProcessHandler,\r
340 ConsoleIn,\r
341 &ConsoleIn->KeyNotifyProcessEvent\r
342 );\r
343 if (EFI_ERROR (Status)) {\r
344 Status = EFI_OUT_OF_RESOURCES;\r
345 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
346 goto ErrorExit;\r
347 }\r
348\r
349 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
350 EFI_PROGRESS_CODE,\r
351 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT,\r
352 ParentDevicePath\r
353 );\r
354\r
355 //\r
356 // Reset the keyboard device\r
357 //\r
358 Status = ConsoleIn->ConInEx.Reset (&ConsoleIn->ConInEx, FeaturePcdGet (PcdPs2KbdExtendedVerification));\r
359 if (EFI_ERROR (Status)) {\r
360 Status = EFI_DEVICE_ERROR;\r
361 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
362 goto ErrorExit;\r
363 }\r
364\r
365 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
366 EFI_PROGRESS_CODE,\r
367 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DETECTED,\r
368 ParentDevicePath\r
369 );\r
370\r
371 ConsoleIn->ControllerNameTable = NULL;\r
372 AddUnicodeString2 (\r
373 "eng",\r
374 gPs2KeyboardComponentName.SupportedLanguages,\r
375 &ConsoleIn->ControllerNameTable,\r
376 L"PS/2 Keyboard Device",\r
377 TRUE\r
378 );\r
379 AddUnicodeString2 (\r
380 "en",\r
381 gPs2KeyboardComponentName2.SupportedLanguages,\r
382 &ConsoleIn->ControllerNameTable,\r
383 L"PS/2 Keyboard Device",\r
384 FALSE\r
385 );\r
386\r
387\r
388 //\r
389 // Install protocol interfaces for the keyboard device.\r
390 //\r
391 Status = gBS->InstallMultipleProtocolInterfaces (\r
392 &Controller,\r
393 &gEfiSimpleTextInProtocolGuid,\r
394 &ConsoleIn->ConIn,\r
395 &gEfiSimpleTextInputExProtocolGuid,\r
396 &ConsoleIn->ConInEx,\r
397 NULL\r
398 );\r
399 if (EFI_ERROR (Status)) {\r
400 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
401 goto ErrorExit;\r
402 }\r
403\r
404 return Status;\r
405\r
406ErrorExit:\r
407 //\r
408 // Report error code\r
409 //\r
410 if (StatusCode != 0) {\r
411 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
412 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
413 StatusCode,\r
414 ParentDevicePath\r
415 );\r
416 }\r
417\r
418 if ((ConsoleIn != NULL) && (ConsoleIn->ConIn.WaitForKey != NULL)) {\r
419 gBS->CloseEvent (ConsoleIn->ConIn.WaitForKey);\r
420 }\r
421\r
422 if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {\r
423 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
424 }\r
425 if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {\r
426 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
427 }\r
428 if ((ConsoleIn != NULL) && (ConsoleIn->KeyNotifyProcessEvent != NULL)) {\r
429 gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);\r
430 }\r
431 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
432 if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {\r
433 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
434 }\r
435 //\r
436 // Since there will be no timer handler for keyboard input any more,\r
437 // exhaust input data just in case there is still keyboard data left\r
438 //\r
439 if (ConsoleIn != NULL) {\r
440 Status1 = EFI_SUCCESS;\r
441 while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) {\r
442 Status1 = KeyboardRead (ConsoleIn, &Data);;\r
443 }\r
444 }\r
445\r
446 if (ConsoleIn != NULL) {\r
447 gBS->FreePool (ConsoleIn);\r
448 }\r
449\r
450 gBS->CloseProtocol (\r
451 Controller,\r
452 &gEfiDevicePathProtocolGuid,\r
453 This->DriverBindingHandle,\r
454 Controller\r
455 );\r
456\r
457 gBS->CloseProtocol (\r
458 Controller,\r
459 &gEfiIsaIoProtocolGuid,\r
460 This->DriverBindingHandle,\r
461 Controller\r
462 );\r
463\r
464 return Status;\r
465}\r
466\r
467/**\r
468 Stop this driver on ControllerHandle. Support stopping any child handles\r
469 created by this driver.\r
470\r
471 @param This Protocol instance pointer.\r
472 @param ControllerHandle Handle of device to stop driver on\r
473 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
474 children is zero stop the entire bus driver.\r
475 @param ChildHandleBuffer List of Child Handles to Stop.\r
476\r
477 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
478 @retval other This driver was not removed from this device\r
479\r
480**/\r
481EFI_STATUS\r
482EFIAPI\r
483KbdControllerDriverStop (\r
484 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
485 IN EFI_HANDLE Controller,\r
486 IN UINTN NumberOfChildren,\r
487 IN EFI_HANDLE *ChildHandleBuffer\r
488 )\r
489{\r
490 EFI_STATUS Status;\r
491 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;\r
492 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
493 UINT8 Data;\r
494\r
495 //\r
496 // Disable Keyboard\r
497 //\r
498 Status = gBS->OpenProtocol (\r
499 Controller,\r
500 &gEfiSimpleTextInProtocolGuid,\r
501 (VOID **) &ConIn,\r
502 This->DriverBindingHandle,\r
503 Controller,\r
504 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
505 );\r
506 if (EFI_ERROR (Status)) {\r
507 return Status;\r
508 }\r
509 Status = gBS->OpenProtocol (\r
510 Controller,\r
511 &gEfiSimpleTextInputExProtocolGuid,\r
512 NULL,\r
513 This->DriverBindingHandle,\r
514 Controller,\r
515 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
516 );\r
517 if (EFI_ERROR (Status)) {\r
518 return Status;\r
519 }\r
520\r
521 ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (ConIn);\r
522\r
523 //\r
524 // Report that the keyboard is being disabled\r
525 //\r
526 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
527 EFI_PROGRESS_CODE,\r
528 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE,\r
529 ConsoleIn->DevicePath\r
530 );\r
531\r
532 if (ConsoleIn->TimerEvent != NULL) {\r
533 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
534 ConsoleIn->TimerEvent = NULL;\r
535 }\r
536\r
537 //\r
538 // Since there will be no timer handler for keyboard input any more,\r
539 // exhaust input data just in case there is still keyboard data left\r
540 //\r
541 Status = EFI_SUCCESS;\r
542 while (!EFI_ERROR (Status)) {\r
543 Status = KeyboardRead (ConsoleIn, &Data);;\r
544 }\r
545 //\r
546 // Uninstall the SimpleTextIn and SimpleTextInEx protocols\r
547 //\r
548 Status = gBS->UninstallMultipleProtocolInterfaces (\r
549 Controller,\r
550 &gEfiSimpleTextInProtocolGuid,\r
551 &ConsoleIn->ConIn,\r
552 &gEfiSimpleTextInputExProtocolGuid,\r
553 &ConsoleIn->ConInEx,\r
554 NULL\r
555 );\r
556 if (EFI_ERROR (Status)) {\r
557 return Status;\r
558 }\r
559\r
560 gBS->CloseProtocol (\r
561 Controller,\r
562 &gEfiDevicePathProtocolGuid,\r
563 This->DriverBindingHandle,\r
564 Controller\r
565 );\r
566\r
567 gBS->CloseProtocol (\r
568 Controller,\r
569 &gEfiIsaIoProtocolGuid,\r
570 This->DriverBindingHandle,\r
571 Controller\r
572 );\r
573\r
574 //\r
575 // Free other resources\r
576 //\r
577 if ((ConsoleIn->ConIn).WaitForKey != NULL) {\r
578 gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);\r
579 (ConsoleIn->ConIn).WaitForKey = NULL;\r
580 }\r
581 if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {\r
582 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
583 ConsoleIn->ConInEx.WaitForKeyEx = NULL;\r
584 }\r
585 if (ConsoleIn->KeyNotifyProcessEvent != NULL) {\r
586 gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);\r
587 ConsoleIn->KeyNotifyProcessEvent = NULL;\r
588 }\r
589 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
590 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
591 gBS->FreePool (ConsoleIn);\r
592\r
593 return EFI_SUCCESS;\r
594}\r
595\r
596/**\r
597 Free the waiting key notify list.\r
598\r
599 @param ListHead Pointer to list head\r
600\r
601 @retval EFI_INVALID_PARAMETER ListHead is NULL\r
602 @retval EFI_SUCCESS Sucess to free NotifyList\r
603**/\r
604EFI_STATUS\r
605KbdFreeNotifyList (\r
606 IN OUT LIST_ENTRY *ListHead\r
607 )\r
608{\r
609 KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
610\r
611 if (ListHead == NULL) {\r
612 return EFI_INVALID_PARAMETER;\r
613 }\r
614 while (!IsListEmpty (ListHead)) {\r
615 NotifyNode = CR (\r
616 ListHead->ForwardLink,\r
617 KEYBOARD_CONSOLE_IN_EX_NOTIFY,\r
618 NotifyEntry,\r
619 KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
620 );\r
621 RemoveEntryList (ListHead->ForwardLink);\r
622 gBS->FreePool (NotifyNode);\r
623 }\r
624\r
625 return EFI_SUCCESS;\r
626}\r
627\r
628/**\r
629 The module Entry Point for module Ps2Keyboard.\r
630\r
631 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
632 @param[in] SystemTable A pointer to the EFI System Table.\r
633\r
634 @retval EFI_SUCCESS The entry point is executed successfully.\r
635 @retval other Some error occurs when executing this entry point.\r
636\r
637**/\r
638EFI_STATUS\r
639EFIAPI\r
640InitializePs2Keyboard(\r
641 IN EFI_HANDLE ImageHandle,\r
642 IN EFI_SYSTEM_TABLE *SystemTable\r
643 )\r
644{\r
645 EFI_STATUS Status;\r
646\r
647 //\r
648 // Install driver model protocol(s).\r
649 //\r
650 Status = EfiLibInstallDriverBindingComponentName2 (\r
651 ImageHandle,\r
652 SystemTable,\r
653 &gKeyboardControllerDriver,\r
654 ImageHandle,\r
655 &gPs2KeyboardComponentName,\r
656 &gPs2KeyboardComponentName2\r
657 );\r
658 ASSERT_EFI_ERROR (Status);\r
659\r
660\r
661 return Status;\r
662}\r
663\r