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