878ddf1f |
1 | /*++\r |
2 | \r |
3 | Copyright (c) 2006, Intel Corporation \r |
4 | All rights reserved. This program and the accompanying materials \r |
5 | are licensed and made available under the terms and conditions of the BSD License \r |
6 | which accompanies this distribution. The full text of the license may be found at \r |
7 | http://opensource.org/licenses/bsd-license.php \r |
8 | \r |
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r |
11 | \r |
12 | Module Name:\r |
13 | \r |
14 | EfiKey.c\r |
15 | \r |
16 | Abstract:\r |
17 | \r |
18 | USB Keyboard Driver\r |
19 | \r |
20 | Revision 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 |
31 | EFI_STATUS\r |
32 | EFIAPI\r |
33 | USBKeyboardDriverBindingEntryPoint (\r |
34 | IN EFI_HANDLE ImageHandle,\r |
35 | IN EFI_SYSTEM_TABLE *SystemTable\r |
36 | );\r |
37 | \r |
38 | EFI_STATUS\r |
39 | EFIAPI\r |
40 | USBKeyboardDriverBindingSupported (\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 |
46 | EFI_STATUS\r |
47 | EFIAPI\r |
48 | USBKeyboardDriverBindingStart (\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 |
54 | EFI_STATUS\r |
55 | EFIAPI\r |
56 | USBKeyboardDriverBindingStop (\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 |
66 | STATIC\r |
67 | EFI_STATUS\r |
68 | EFIAPI\r |
69 | USBKeyboardReset (\r |
70 | IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r |
71 | IN BOOLEAN ExtendedVerification\r |
72 | );\r |
73 | \r |
74 | STATIC\r |
75 | EFI_STATUS\r |
76 | EFIAPI\r |
77 | USBKeyboardReadKeyStroke (\r |
78 | IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r |
79 | OUT EFI_INPUT_KEY *Key\r |
80 | );\r |
81 | \r |
82 | STATIC\r |
83 | VOID\r |
84 | EFIAPI\r |
85 | USBKeyboardWaitForKey (\r |
86 | IN EFI_EVENT Event,\r |
87 | IN VOID *Context\r |
88 | );\r |
89 | \r |
90 | //\r |
91 | // Helper functions\r |
92 | //\r |
93 | STATIC\r |
94 | EFI_STATUS\r |
95 | USBKeyboardCheckForKey (\r |
96 | IN USB_KB_DEV *UsbKeyboardDevice\r |
97 | );\r |
98 | \r |
99 | //\r |
100 | // USB Keyboard Driver Global Variables\r |
101 | //\r |
102 | EFI_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 |
111 | EFI_STATUS\r |
112 | EFIAPI\r |
113 | USBKeyboardDriverBindingSupported (\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 |
171 | EFI_STATUS\r |
172 | EFIAPI\r |
173 | USBKeyboardDriverBindingStart (\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 |
445 | EFI_STATUS\r |
446 | EFIAPI\r |
447 | USBKeyboardDriverBindingStop (\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 |
554 | EFI_STATUS\r |
555 | EFIAPI\r |
556 | USBKeyboardReset (\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 |
621 | STATIC\r |
622 | EFI_STATUS\r |
623 | EFIAPI\r |
624 | USBKeyboardReadKeyStroke (\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 |
675 | STATIC\r |
676 | VOID\r |
677 | EFIAPI\r |
678 | USBKeyboardWaitForKey (\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 |
712 | STATIC\r |
713 | EFI_STATUS\r |
714 | USBKeyboardCheckForKey (\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 |
745 | VOID\r |
746 | KbdReportStatusCode (\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 |