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