]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Usb/UsbKbDxe/efikey.c
1. Fixed tools_def.template to meet ICC build for IA32
[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
c52fa98c 177 (VOID **) &UsbIo,\r
ed838d0c 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
c52fa98c 247 (VOID **) &UsbIo,\r
ed838d0c 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
ed838d0c 503\r
504 Status = gBS->OpenProtocol (\r
505 Controller,\r
506 &gEfiSimpleTextInProtocolGuid,\r
c52fa98c 507 (VOID **) &SimpleInput,\r
ed838d0c 508 This->DriverBindingHandle,\r
509 Controller,\r
510 EFI_OPEN_PROTOCOL_BY_DRIVER\r
511 );\r
512 if (EFI_ERROR (Status)) {\r
513 return EFI_UNSUPPORTED;\r
514 }\r
515\r
516 //\r
517 // Get USB_KB_DEV instance.\r
518 //\r
519 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (SimpleInput);\r
520\r
521 gBS->CloseProtocol (\r
522 Controller,\r
523 &gEfiSimpleTextInProtocolGuid,\r
524 This->DriverBindingHandle,\r
525 Controller\r
526 );\r
527\r
ed838d0c 528 //\r
529 // Uninstall the Asyn Interrupt Transfer from this device\r
530 // will disable the key data input from this device\r
531 //\r
532 KbdReportStatusCode (\r
533 UsbKeyboardDevice->DevicePath,\r
534 EFI_PROGRESS_CODE,\r
535 PcdGet32 (PcdStatusCodeValueKeyboardDisable)\r
536 );\r
537\r
538 //\r
539 // Destroy asynchronous interrupt transfer\r
540 //\r
541 UsbKeyboardDevice->UsbIo->UsbAsyncInterruptTransfer (\r
542 UsbKeyboardDevice->UsbIo,\r
543 UsbKeyboardDevice->IntEndpointDescriptor.EndpointAddress,\r
544 FALSE,\r
545 UsbKeyboardDevice->IntEndpointDescriptor.Interval,\r
546 0,\r
547 NULL,\r
548 NULL\r
549 );\r
550\r
551 gBS->CloseProtocol (\r
552 Controller,\r
553 &gEfiUsbIoProtocolGuid,\r
554 This->DriverBindingHandle,\r
555 Controller\r
556 );\r
557\r
558 Status = gBS->UninstallMultipleProtocolInterfaces (\r
559 Controller,\r
560 &gEfiSimpleTextInProtocolGuid,\r
561 &UsbKeyboardDevice->SimpleInput,\r
562 &gEfiHotPlugDeviceGuid,\r
563 NULL,\r
564 NULL\r
565 );\r
566 //\r
567 // free all the resources.\r
568 //\r
569 gBS->CloseEvent (UsbKeyboardDevice->RepeatTimer);\r
570 gBS->CloseEvent (UsbKeyboardDevice->DelayedRecoveryEvent);\r
571 gBS->CloseEvent ((UsbKeyboardDevice->SimpleInput).WaitForKey);\r
572\r
573 if (UsbKeyboardDevice->ControllerNameTable != NULL) {\r
574 FreeUnicodeStringTable (UsbKeyboardDevice->ControllerNameTable);\r
575 }\r
576\r
577 gBS->FreePool (UsbKeyboardDevice);\r
578\r
579 return Status;\r
580\r
581}\r
582\r
583\r
584\r
585/**\r
586 Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.Reset() function.\r
587\r
588 This The EFI_SIMPLE_TEXT_INPUT_PROTOCOL instance.\r
589 ExtendedVerification\r
590 Indicates that the driver may perform a more exhaustive\r
591 verification operation of the device during reset.\r
592\r
593 @retval EFI_SUCCESS Success\r
594 @retval EFI_DEVICE_ERROR Hardware Error\r
595\r
596**/\r
597EFI_STATUS\r
598EFIAPI\r
599USBKeyboardReset (\r
600 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
601 IN BOOLEAN ExtendedVerification\r
602 )\r
603{\r
604 EFI_STATUS Status;\r
605 USB_KB_DEV *UsbKeyboardDevice;\r
ed838d0c 606\r
607 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (This);\r
608\r
ed838d0c 609 KbdReportStatusCode (\r
610 UsbKeyboardDevice->DevicePath,\r
611 EFI_PROGRESS_CODE,\r
612 PcdGet32 (PcdStatusCodeValueKeyboardReset)\r
613 );\r
614\r
615 //\r
616 // Non Exhaustive reset:\r
617 // only reset private data structures.\r
618 //\r
619 if (!ExtendedVerification) {\r
620 //\r
621 // Clear the key buffer of this Usb keyboard\r
622 //\r
623 KbdReportStatusCode (\r
624 UsbKeyboardDevice->DevicePath,\r
625 EFI_PROGRESS_CODE,\r
626 PcdGet32 (PcdStatusCodeValueKeyboardClearBuffer)\r
627 );\r
628\r
629 InitUSBKeyBuffer (&(UsbKeyboardDevice->KeyboardBuffer));\r
630 UsbKeyboardDevice->CurKeyChar = 0;\r
631 return EFI_SUCCESS;\r
632 }\r
633\r
634 //\r
635 // Exhaustive reset\r
636 //\r
637 Status = InitUSBKeyboard (UsbKeyboardDevice);\r
638 UsbKeyboardDevice->CurKeyChar = 0;\r
639 if (EFI_ERROR (Status)) {\r
640 return EFI_DEVICE_ERROR;\r
641 }\r
642\r
643 return EFI_SUCCESS;\r
644}\r
645\r
646\r
647/**\r
648 Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.ReadKeyStroke() function.\r
649\r
650 This The EFI_SIMPLE_TEXT_INPUT_PROTOCOL instance.\r
651 Key A pointer to a buffer that is filled in with the keystroke\r
652 information for the key that was pressed.\r
653\r
654 @retval EFI_SUCCESS Success\r
655\r
656**/\r
657STATIC\r
658EFI_STATUS\r
659EFIAPI\r
660USBKeyboardReadKeyStroke (\r
661 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
662 OUT EFI_INPUT_KEY *Key\r
663 )\r
664{\r
665 USB_KB_DEV *UsbKeyboardDevice;\r
666 EFI_STATUS Status;\r
667 UINT8 KeyChar;\r
668\r
669 UsbKeyboardDevice = USB_KB_DEV_FROM_THIS (This);\r
670\r
671 //\r
672 // if there is no saved ASCII byte, fetch it\r
673 // by calling USBKeyboardCheckForKey().\r
674 //\r
675 if (UsbKeyboardDevice->CurKeyChar == 0) {\r
676 Status = USBKeyboardCheckForKey (UsbKeyboardDevice);\r
677 if (EFI_ERROR (Status)) {\r
678 return Status;\r
679 }\r
680 }\r
681\r
682 Key->UnicodeChar = 0;\r
683 Key->ScanCode = SCAN_NULL;\r
684\r
685 KeyChar = UsbKeyboardDevice->CurKeyChar;\r
686\r
687 UsbKeyboardDevice->CurKeyChar = 0;\r
688\r
689 //\r
690 // Translate saved ASCII byte into EFI_INPUT_KEY\r
691 //\r
692 Status = USBKeyCodeToEFIScanCode (UsbKeyboardDevice, KeyChar, Key);\r
693\r
694 return Status;\r
695\r
696}\r
697\r
698\r
699/**\r
700 Handler function for WaitForKey event.\r
701\r
702 Event Event to be signaled when a key is pressed.\r
703 Context Points to USB_KB_DEV instance.\r
704\r
705 @return VOID\r
706\r
707**/\r
708STATIC\r
709VOID\r
710EFIAPI\r
711USBKeyboardWaitForKey (\r
712 IN EFI_EVENT Event,\r
713 IN VOID *Context\r
714 )\r
715{\r
716 USB_KB_DEV *UsbKeyboardDevice;\r
717\r
718 UsbKeyboardDevice = (USB_KB_DEV *) Context;\r
719\r
720 if (UsbKeyboardDevice->CurKeyChar == 0) {\r
721\r
722 if (EFI_ERROR (USBKeyboardCheckForKey (UsbKeyboardDevice))) {\r
723 return ;\r
724 }\r
725 }\r
726 //\r
727 // If has key pending, signal the event.\r
728 //\r
729 gBS->SignalEvent (Event);\r
730}\r
731\r
732\r
733\r
734/**\r
735 Check whether there is key pending.\r
736\r
737 UsbKeyboardDevice The USB_KB_DEV instance.\r
738\r
739 @retval EFI_SUCCESS Success\r
740\r
741**/\r
742STATIC\r
743EFI_STATUS\r
744USBKeyboardCheckForKey (\r
745 IN USB_KB_DEV *UsbKeyboardDevice\r
746 )\r
747{\r
748 EFI_STATUS Status;\r
749 UINT8 KeyChar;\r
750\r
751 //\r
752 // Fetch raw data from the USB keyboard input,\r
753 // and translate it into ASCII data.\r
754 //\r
755 Status = USBParseKey (UsbKeyboardDevice, &KeyChar);\r
756 if (EFI_ERROR (Status)) {\r
757 return Status;\r
758 }\r
759\r
760 UsbKeyboardDevice->CurKeyChar = KeyChar;\r
761 return EFI_SUCCESS;\r
762}\r
763\r
764\r
765/**\r
766 Report Status Code in Usb Bot Driver\r
767\r
768 @param DevicePath Use this to get Device Path\r
769 @param CodeType Status Code Type\r
770 @param CodeValue Status Code Value\r
771\r
772 @return None\r
773\r
774**/\r
775VOID\r
776KbdReportStatusCode (\r
777 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
778 IN EFI_STATUS_CODE_TYPE CodeType,\r
779 IN EFI_STATUS_CODE_VALUE Value\r
780 )\r
781{\r
782\r
783 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
784 CodeType,\r
785 Value,\r
786 DevicePath\r
787 );\r
788}\r