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