]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Bus/Usb/UsbKb/Dxe/efikey.c
Add in feature flag PcdPeiPcdDatabaseSetEnabled, PcdPeiPcdDatabaseGetSizeEnabled...
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbKb / Dxe / efikey.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 EfiKey.c\r
15 \r
16Abstract:\r
17\r
18 USB Keyboard Driver\r
19\r
20Revision History\r
21\r
22--*/\r
23\r
24#include "efikey.h"\r
25#include "keyboard.h"\r
26\r
27//\r
28// Prototypes\r
29// Driver model protocol interface\r
30//\r
31EFI_STATUS\r
32EFIAPI\r
33USBKeyboardDriverBindingEntryPoint (\r
34 IN EFI_HANDLE ImageHandle,\r
35 IN EFI_SYSTEM_TABLE *SystemTable\r
36 );\r
37\r
38EFI_STATUS\r
39EFIAPI\r
40USBKeyboardDriverBindingSupported (\r
41 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
42 IN EFI_HANDLE Controller,\r
43 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
44 );\r
45\r
46EFI_STATUS\r
47EFIAPI\r
48USBKeyboardDriverBindingStart (\r
49 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
50 IN EFI_HANDLE Controller,\r
51 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
52 );\r
53\r
54EFI_STATUS\r
55EFIAPI\r
56USBKeyboardDriverBindingStop (\r
57 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
58 IN EFI_HANDLE Controller,\r
59 IN UINTN NumberOfChildren,\r
60 IN EFI_HANDLE *ChildHandleBuffer\r
61 );\r
62\r
63//\r
64// Simple Text In Protocol Interface\r
65//\r
66STATIC\r
67EFI_STATUS\r
68EFIAPI\r
69USBKeyboardReset (\r
70 IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
71 IN BOOLEAN ExtendedVerification\r
72 );\r
73\r
74STATIC\r
75EFI_STATUS\r
76EFIAPI\r
77USBKeyboardReadKeyStroke (\r
78 IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
79 OUT EFI_INPUT_KEY *Key\r
80 );\r
81\r
82STATIC\r
83VOID\r
84EFIAPI\r
85USBKeyboardWaitForKey (\r
86 IN EFI_EVENT Event,\r
87 IN VOID *Context\r
88 );\r
89\r
90//\r
91// Helper functions\r
92//\r
93STATIC\r
94EFI_STATUS\r
95USBKeyboardCheckForKey (\r
96 IN USB_KB_DEV *UsbKeyboardDevice\r
97 );\r
98\r
99//\r
100// USB Keyboard Driver Global Variables\r
101//\r
102EFI_DRIVER_BINDING_PROTOCOL gUsbKeyboardDriverBinding = {\r
103 USBKeyboardDriverBindingSupported,\r
104 USBKeyboardDriverBindingStart,\r
105 USBKeyboardDriverBindingStop,\r
106 0x10,\r
107 NULL,\r
108 NULL\r
109};\r
110\r
111EFI_STATUS\r
112EFIAPI\r
113USBKeyboardDriverBindingSupported (\r
114 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
115 IN EFI_HANDLE Controller,\r
116 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
117 )\r
118/*++\r
119 \r
120 Routine Description:\r
121 Supported.\r
122 \r
123 Arguments:\r
124 This - EFI_DRIVER_BINDING_PROTOCOL\r
125 Controller - Controller handle\r
126 RemainingDevicePath - EFI_DEVICE_PATH_PROTOCOL \r
127 Returns:\r
128 EFI_STATUS\r
129 \r
130--*/ \r
131{\r
132 EFI_STATUS OpenStatus;\r
133 EFI_USB_IO_PROTOCOL *UsbIo;\r
134 EFI_STATUS Status;\r
135\r
136 //\r
137 // Check if USB_IO protocol is attached on the controller handle.\r
138 //\r
139 OpenStatus = gBS->OpenProtocol (\r
140 Controller,\r
141 &gEfiUsbIoProtocolGuid,\r
142 (VOID **) &UsbIo,\r
143 This->DriverBindingHandle,\r
144 Controller,\r
145 EFI_OPEN_PROTOCOL_BY_DRIVER\r
146 );\r
147 if (EFI_ERROR (OpenStatus)) {\r
148 return OpenStatus;\r
149 }\r
150 \r
151 //\r
152 // Use the USB I/O protocol interface to check whether the Controller is\r
153 // the Keyboard controller that can be managed by this driver.\r
154 //\r
155 Status = EFI_SUCCESS;\r
156\r
157 if (!IsUSBKeyboard (UsbIo)) {\r
158 Status = EFI_UNSUPPORTED;\r
159 }\r
160\r
161 gBS->CloseProtocol (\r
162 Controller,\r
163 &gEfiUsbIoProtocolGuid,\r
164 This->DriverBindingHandle,\r
165 Controller\r
166 );\r
167\r
168 return Status;\r
169}\r
170\r
171EFI_STATUS\r
172EFIAPI\r
173USBKeyboardDriverBindingStart (\r
174 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
175 IN EFI_HANDLE Controller,\r
176 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
177 )\r
178/*++\r
179 \r
180 Routine Description:\r
181 Start.\r
182 \r
183 Arguments:\r
184 This - EFI_DRIVER_BINDING_PROTOCOL\r
185 Controller - Controller handle\r
186 RemainingDevicePath - EFI_DEVICE_PATH_PROTOCOL\r
187 Returns:\r
188 EFI_SUCCESS - Success\r
189 EFI_OUT_OF_RESOURCES - Can't allocate memory\r
190 EFI_UNSUPPORTED - The Start routine fail\r
191--*/ \r
192{ \r
193 EFI_STATUS Status;\r
194 EFI_USB_IO_PROTOCOL *UsbIo;\r
195 USB_KB_DEV *UsbKeyboardDevice;\r
196 UINT8 EndpointNumber;\r
197 EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\r
198 UINT8 Index;\r
199 UINT8 EndpointAddr;\r
200 UINT8 PollingInterval;\r
201 UINT8 PacketSize;\r
202 BOOLEAN Found;\r
203 \r
204 UsbKeyboardDevice = NULL;\r
205 Found = FALSE;\r
206\r
207 //\r
208 // Open USB_IO Protocol\r
209 //\r
210 Status = gBS->OpenProtocol (\r
211 Controller,\r
212 &gEfiUsbIoProtocolGuid,\r
213 (VOID **) &UsbIo,\r
214 This->DriverBindingHandle,\r
215 Controller,\r
216 EFI_OPEN_PROTOCOL_BY_DRIVER\r
217 );\r
218 if (EFI_ERROR (Status)) {\r
219 return Status;\r
220 }\r
221\r
222 UsbKeyboardDevice = AllocateZeroPool (sizeof (USB_KB_DEV));\r
223 if (UsbKeyboardDevice == NULL) {\r
224 gBS->CloseProtocol (\r
225 Controller,\r
226 &gEfiUsbIoProtocolGuid,\r
227 This->DriverBindingHandle,\r
228 Controller\r
229 );\r
230 return EFI_OUT_OF_RESOURCES;\r
231 }\r
232 //\r
233 // Get the Device Path Protocol on Controller's handle\r
234 //\r
235 Status = gBS->OpenProtocol (\r
236 Controller,\r
237 &gEfiDevicePathProtocolGuid,\r
238 (VOID **) &UsbKeyboardDevice->DevicePath,\r
239 This->DriverBindingHandle,\r
240 Controller,\r
241 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
242 );\r
243\r
244 if (EFI_ERROR (Status)) {\r
245 gBS->FreePool (UsbKeyboardDevice);\r
246 gBS->CloseProtocol (\r
247 Controller,\r
248 &gEfiUsbIoProtocolGuid,\r
249 This->DriverBindingHandle,\r
250 Controller\r
251 );\r
252 return Status;\r
253 }\r
254 //\r
255 // Report that the usb keyboard is being enabled\r
256 //\r
257 KbdReportStatusCode (\r
258 UsbKeyboardDevice->DevicePath,\r
259 EFI_PROGRESS_CODE,\r
260 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE)\r
261 );\r
262\r
263 //\r
264 // This is pretty close to keyboard detection, so log progress\r
265 //\r
266 KbdReportStatusCode (\r
267 UsbKeyboardDevice->DevicePath,\r
268 EFI_PROGRESS_CODE,\r
269 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT)\r
270 );\r
271\r
272 //\r
273 // Initialize UsbKeyboardDevice\r
274 //\r
275 UsbKeyboardDevice->UsbIo = UsbIo;\r
276\r
277 //\r
278 // Get interface & endpoint descriptor\r
279 //\r
280 UsbIo->UsbGetInterfaceDescriptor (\r
281 UsbIo,\r
282 &UsbKeyboardDevice->InterfaceDescriptor\r
283 );\r
284\r
285 EndpointNumber = UsbKeyboardDevice->InterfaceDescriptor.NumEndpoints;\r
286\r
287 for (Index = 0; Index < EndpointNumber; Index++) {\r
288\r
289 UsbIo->UsbGetEndpointDescriptor (\r
290 UsbIo,\r
291 Index,\r
292 &EndpointDescriptor\r
293 );\r
294\r
295 if ((EndpointDescriptor.Attributes & 0x03) == 0x03) {\r
296 //\r
297 // We only care interrupt endpoint here\r
298 //\r
299 CopyMem (&UsbKeyboardDevice->IntEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
300 //UsbKeyboardDevice->IntEndpointDescriptor = EndpointDescriptor;\r
301 Found = TRUE;\r
302 }\r
303 }\r
304\r
305 if (!Found) {\r
306 //\r
307 // No interrupt endpoint found, then return unsupported.\r
308 //\r
309 gBS->FreePool (UsbKeyboardDevice);\r
310 gBS->CloseProtocol (\r
311 Controller,\r
312 &gEfiUsbIoProtocolGuid,\r
313 This->DriverBindingHandle,\r
314 Controller\r
315 );\r
316 return EFI_UNSUPPORTED;\r
317 }\r
318\r
319 UsbKeyboardDevice->Signature = USB_KB_DEV_SIGNATURE;\r
320 UsbKeyboardDevice->SimpleInput.Reset = USBKeyboardReset;\r
321 UsbKeyboardDevice->SimpleInput.ReadKeyStroke = USBKeyboardReadKeyStroke;\r
322 Status = gBS->CreateEvent (\r
323 EFI_EVENT_NOTIFY_WAIT,\r
324 EFI_TPL_NOTIFY,\r
325 USBKeyboardWaitForKey,\r
326 UsbKeyboardDevice,\r
327 &(UsbKeyboardDevice->SimpleInput.WaitForKey)\r
328 );\r
329\r
330 if (EFI_ERROR (Status)) {\r
331 gBS->FreePool (UsbKeyboardDevice);\r
332 gBS->CloseProtocol (\r
333 Controller,\r
334 &gEfiUsbIoProtocolGuid,\r
335 This->DriverBindingHandle,\r
336 Controller\r
337 );\r
338 return Status;\r
339 }\r
340 \r
341 //\r
342 // Install simple txt in protocol interface\r
343 // for the usb keyboard device.\r
344 // Usb keyboard is a hot plug device, and expected to work immediately\r
345 // when plugging into system, so a HotPlugDeviceGuid is installed onto\r
346 // the usb keyboard device handle, to distinguish it from other conventional\r
347 // console devices.\r
348 //\r
349 Status = gBS->InstallMultipleProtocolInterfaces (\r
350 &Controller,\r
351 &gEfiSimpleTextInProtocolGuid,\r
352 &UsbKeyboardDevice->SimpleInput,\r
353 &gEfiHotPlugDeviceGuid,\r
354 NULL,\r
355 NULL\r
356 );\r
357 if (EFI_ERROR (Status)) {\r
358 gBS->CloseEvent (UsbKeyboardDevice->SimpleInput.WaitForKey);\r
359 gBS->FreePool (UsbKeyboardDevice);\r
360 gBS->CloseProtocol (\r
361 Controller,\r
362 &gEfiUsbIoProtocolGuid,\r
363 This->DriverBindingHandle,\r
364 Controller\r
365 );\r
366 return Status;\r
367 }\r
368 \r
369 //\r
370 // Reset USB Keyboard Device\r
371 //\r
372 Status = UsbKeyboardDevice->SimpleInput.Reset (\r
373 &UsbKeyboardDevice->SimpleInput,\r
374 TRUE\r
375 );\r
376 if (EFI_ERROR (Status)) {\r
377 gBS->UninstallMultipleProtocolInterfaces (\r
378 Controller,\r
379 &gEfiSimpleTextInProtocolGuid,\r
380 &UsbKeyboardDevice->SimpleInput,\r
381 &gEfiHotPlugDeviceGuid,\r
382 NULL,\r
383 NULL\r
384 );\r
385 gBS->CloseEvent (UsbKeyboardDevice->SimpleInput.WaitForKey);\r
386 gBS->FreePool (UsbKeyboardDevice);\r
387 gBS->CloseProtocol (\r
388 Controller,\r
389 &gEfiUsbIoProtocolGuid,\r
390 This->DriverBindingHandle,\r
391 Controller\r
392 );\r
393 return Status;\r
394 }\r
395 //\r
396 // submit async interrupt transfer\r
397 //\r
398 EndpointAddr = UsbKeyboardDevice->IntEndpointDescriptor.EndpointAddress;\r
399 PollingInterval = UsbKeyboardDevice->IntEndpointDescriptor.Interval;\r
400 PacketSize = (UINT8) (UsbKeyboardDevice->IntEndpointDescriptor.MaxPacketSize);\r
401\r
402 Status = UsbIo->UsbAsyncInterruptTransfer (\r
403 UsbIo,\r
404 EndpointAddr,\r
405 TRUE,\r
406 PollingInterval,\r
407 PacketSize,\r
408 KeyboardHandler,\r
409 UsbKeyboardDevice\r
410 );\r
411\r
412 if (EFI_ERROR (Status)) {\r
413\r
414 gBS->UninstallMultipleProtocolInterfaces (\r
415 Controller,\r
416 &gEfiSimpleTextInProtocolGuid,\r
417 &UsbKeyboardDevice->SimpleInput,\r
418 &gEfiHotPlugDeviceGuid,\r
419 NULL,\r
420 NULL\r
421 );\r
422 gBS->CloseEvent (UsbKeyboardDevice->SimpleInput.WaitForKey);\r
423 gBS->FreePool (UsbKeyboardDevice);\r
424 gBS->CloseProtocol (\r
425 Controller,\r
426 &gEfiUsbIoProtocolGuid,\r
427 This->DriverBindingHandle,\r
428 Controller\r
429 );\r
430 return Status;\r
431 }\r
432\r
433 UsbKeyboardDevice->ControllerNameTable = NULL;\r
434 AddUnicodeString (\r
435 "eng",\r
436 gUsbKeyboardComponentName.SupportedLanguages,\r
437 &UsbKeyboardDevice->ControllerNameTable,\r
438 (CHAR16 *) L"Generic Usb Keyboard"\r
439 );\r
440\r
441 return EFI_SUCCESS;\r
442}\r
443\r
444\r
445EFI_STATUS\r
446EFIAPI\r
447USBKeyboardDriverBindingStop (\r
448 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
449 IN EFI_HANDLE Controller,\r
450 IN UINTN NumberOfChildren,\r
451 IN EFI_HANDLE *ChildHandleBuffer\r
452 )\r
453/*++\r
454 \r
455 Routine Description:\r
456 Stop.\r
457 \r
458 Arguments:\r
459 This - EFI_DRIVER_BINDING_PROTOCOL\r
460 Controller - Controller handle\r
461 NumberOfChildren - Child handle number\r
462 ChildHandleBuffer - Child handle buffer \r
463 Returns:\r
464 EFI_SUCCESS - Success\r
465 EFI_UNSUPPORTED - Can't support \r
466--*/ \r
467{\r
468 EFI_STATUS Status;\r
469 EFI_SIMPLE_TEXT_IN_PROTOCOL *SimpleInput;\r
470 USB_KB_DEV *UsbKeyboardDevice;\r
471 EFI_USB_IO_PROTOCOL *UsbIo;\r
472\r
473 Status = gBS->OpenProtocol (\r
474 Controller,\r
475 &gEfiSimpleTextInProtocolGuid,\r
476 (VOID **) &SimpleInput,\r
477 This->DriverBindingHandle,\r
478 Controller,\r
479 EFI_OPEN_PROTOCOL_BY_DRIVER\r
480 );\r
481 if (EFI_ERROR (Status)) {\r
482 return EFI_UNSUPPORTED;\r
483 }\r
484 \r
485 //\r
486 // Get USB_KB_DEV instance.\r
487 //\r
488 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (SimpleInput);\r
489\r
490 gBS->CloseProtocol (\r
491 Controller,\r
492 &gEfiSimpleTextInProtocolGuid,\r
493 This->DriverBindingHandle,\r
494 Controller\r
495 );\r
496\r
497 UsbIo = UsbKeyboardDevice->UsbIo;\r
498 //\r
499 // Uninstall the Asyn Interrupt Transfer from this device\r
500 // will disable the key data input from this device\r
501 //\r
502 KbdReportStatusCode (\r
503 UsbKeyboardDevice->DevicePath,\r
504 EFI_PROGRESS_CODE,\r
505 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE)\r
506 );\r
507\r
508 //\r
509 // Destroy asynchronous interrupt transfer\r
510 //\r
511 UsbKeyboardDevice->UsbIo->UsbAsyncInterruptTransfer (\r
512 UsbKeyboardDevice->UsbIo,\r
513 UsbKeyboardDevice->IntEndpointDescriptor.EndpointAddress,\r
514 FALSE,\r
515 UsbKeyboardDevice->IntEndpointDescriptor.Interval,\r
516 0,\r
517 NULL,\r
518 NULL\r
519 );\r
520\r
521 gBS->CloseProtocol (\r
522 Controller,\r
523 &gEfiUsbIoProtocolGuid,\r
524 This->DriverBindingHandle,\r
525 Controller\r
526 );\r
527\r
528 Status = gBS->UninstallMultipleProtocolInterfaces (\r
529 Controller,\r
530 &gEfiSimpleTextInProtocolGuid,\r
531 &UsbKeyboardDevice->SimpleInput,\r
532 &gEfiHotPlugDeviceGuid,\r
533 NULL,\r
534 NULL\r
535 );\r
536 //\r
537 // free all the resources.\r
538 //\r
539 gBS->CloseEvent (UsbKeyboardDevice->RepeatTimer);\r
540 gBS->CloseEvent (UsbKeyboardDevice->DelayedRecoveryEvent);\r
541 gBS->CloseEvent ((UsbKeyboardDevice->SimpleInput).WaitForKey);\r
542\r
543 if (UsbKeyboardDevice->ControllerNameTable != NULL) {\r
544 FreeUnicodeStringTable (UsbKeyboardDevice->ControllerNameTable);\r
545 }\r
546\r
547 gBS->FreePool (UsbKeyboardDevice);\r
548\r
549 return Status;\r
550\r
551}\r
552\r
553\r
554EFI_STATUS\r
555EFIAPI\r
556USBKeyboardReset (\r
557 IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
558 IN BOOLEAN ExtendedVerification\r
559 )\r
560/*++\r
561\r
562 Routine Description:\r
563 Implements EFI_SIMPLE_TEXT_IN_PROTOCOL.Reset() function.\r
564 \r
565 Arguments:\r
566 This The EFI_SIMPLE_TEXT_IN_PROTOCOL instance.\r
567 ExtendedVerification\r
568 Indicates that the driver may perform a more exhaustive\r
569 verification operation of the device during reset. \r
570 \r
571 Returns: \r
572 EFI_SUCCESS - Success\r
573 EFI_DEVICE_ERROR - Hardware Error\r
574--*/ \r
575{\r
576 EFI_STATUS Status;\r
577 USB_KB_DEV *UsbKeyboardDevice;\r
578 EFI_USB_IO_PROTOCOL *UsbIo;\r
579\r
580 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (This);\r
581\r
582 UsbIo = UsbKeyboardDevice->UsbIo;\r
583\r
584 KbdReportStatusCode (\r
585 UsbKeyboardDevice->DevicePath,\r
586 EFI_PROGRESS_CODE,\r
587 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_RESET)\r
588 );\r
589\r
590 //\r
591 // Non Exhaustive reset:\r
592 // only reset private data structures.\r
593 //\r
594 if (!ExtendedVerification) {\r
595 //\r
596 // Clear the key buffer of this Usb keyboard\r
597 //\r
598 KbdReportStatusCode (\r
599 UsbKeyboardDevice->DevicePath,\r
600 EFI_PROGRESS_CODE,\r
601 (EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_CLEAR_BUFFER)\r
602 );\r
603\r
604 InitUSBKeyBuffer (&(UsbKeyboardDevice->KeyboardBuffer));\r
605 UsbKeyboardDevice->CurKeyChar = 0;\r
606 return EFI_SUCCESS;\r
607 }\r
608 \r
609 //\r
610 // Exhaustive reset\r
611 //\r
612 Status = InitUSBKeyboard (UsbKeyboardDevice);\r
613 UsbKeyboardDevice->CurKeyChar = 0;\r
614 if (EFI_ERROR (Status)) {\r
615 return EFI_DEVICE_ERROR;\r
616 }\r
617\r
618 return EFI_SUCCESS;\r
619}\r
620\r
621STATIC\r
622EFI_STATUS\r
623EFIAPI\r
624USBKeyboardReadKeyStroke (\r
625 IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
626 OUT EFI_INPUT_KEY *Key\r
627 )\r
628/*++\r
629\r
630 Routine Description:\r
631 Implements EFI_SIMPLE_TEXT_IN_PROTOCOL.ReadKeyStroke() function.\r
632 \r
633 Arguments:\r
634 This The EFI_SIMPLE_TEXT_IN_PROTOCOL instance.\r
635 Key A pointer to a buffer that is filled in with the keystroke\r
636 information for the key that was pressed.\r
637 \r
638 Returns: \r
639 EFI_SUCCESS - Success\r
640--*/ \r
641{\r
642 USB_KB_DEV *UsbKeyboardDevice;\r
643 EFI_STATUS Status;\r
644 UINT8 KeyChar;\r
645\r
646 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (This);\r
647\r
648 //\r
649 // if there is no saved ASCII byte, fetch it\r
650 // by calling USBKeyboardCheckForKey().\r
651 //\r
652 if (UsbKeyboardDevice->CurKeyChar == 0) {\r
653 Status = USBKeyboardCheckForKey (UsbKeyboardDevice);\r
654 if (EFI_ERROR (Status)) {\r
655 return Status;\r
656 }\r
657 }\r
658\r
659 Key->UnicodeChar = 0;\r
660 Key->ScanCode = SCAN_NULL;\r
661\r
662 KeyChar = UsbKeyboardDevice->CurKeyChar;\r
663\r
664 UsbKeyboardDevice->CurKeyChar = 0;\r
665\r
666 //\r
667 // Translate saved ASCII byte into EFI_INPUT_KEY\r
668 //\r
669 Status = USBKeyCodeToEFIScanCode (UsbKeyboardDevice, KeyChar, Key);\r
670\r
671 return Status;\r
672\r
673}\r
674\r
675STATIC\r
676VOID\r
677EFIAPI\r
678USBKeyboardWaitForKey (\r
679 IN EFI_EVENT Event,\r
680 IN VOID *Context\r
681 )\r
682/*++\r
683\r
684 Routine Description:\r
685 Handler function for WaitForKey event. \r
686 \r
687 Arguments:\r
688 Event Event to be signaled when a key is pressed.\r
689 Context Points to USB_KB_DEV instance.\r
690 \r
691 Returns: \r
692 VOID\r
693--*/ \r
694{\r
695 USB_KB_DEV *UsbKeyboardDevice;\r
696\r
697 UsbKeyboardDevice = (USB_KB_DEV *) Context;\r
698\r
699 if (UsbKeyboardDevice->CurKeyChar == 0) {\r
700\r
701 if (EFI_ERROR (USBKeyboardCheckForKey (UsbKeyboardDevice))) {\r
702 return ;\r
703 }\r
704 }\r
705 //\r
706 // If has key pending, signal the event.\r
707 //\r
708 gBS->SignalEvent (Event);\r
709}\r
710\r
711\r
712STATIC\r
713EFI_STATUS\r
714USBKeyboardCheckForKey (\r
715 IN USB_KB_DEV *UsbKeyboardDevice\r
716 )\r
717/*++\r
718\r
719 Routine Description:\r
720 Check whether there is key pending.\r
721 \r
722 Arguments:\r
723 UsbKeyboardDevice The USB_KB_DEV instance.\r
724 \r
725 Returns: \r
726 EFI_SUCCESS - Success\r
727--*/ \r
728{\r
729 EFI_STATUS Status;\r
730 UINT8 KeyChar;\r
731\r
732 //\r
733 // Fetch raw data from the USB keyboard input,\r
734 // and translate it into ASCII data.\r
735 //\r
736 Status = USBParseKey (UsbKeyboardDevice, &KeyChar);\r
737 if (EFI_ERROR (Status)) {\r
738 return Status;\r
739 }\r
740\r
741 UsbKeyboardDevice->CurKeyChar = KeyChar;\r
742 return EFI_SUCCESS;\r
743}\r
744\r
745VOID\r
746KbdReportStatusCode (\r
747 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
748 IN EFI_STATUS_CODE_TYPE CodeType,\r
749 IN EFI_STATUS_CODE_VALUE Value\r
750 )\r
751/*++\r
752\r
753 Routine Description:\r
754 Report Status Code in Usb Bot Driver\r
755\r
756 Arguments:\r
757 DevicePath - Use this to get Device Path\r
758 CodeType - Status Code Type\r
759 CodeValue - Status Code Value\r
760\r
761 Returns:\r
762 None\r
763\r
764--*/\r
765{\r
766\r
767 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
768 CodeType,\r
769 Value,\r
770 DevicePath\r
771 );\r
772}\r