]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2Mouse.c
0693e11087f0fdf5ca08cfd698102ba0f283e11d
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2MouseDxe / Ps2Mouse.c
1 /** @file
2 PS/2 Mouse driver. Routines that interacts with callers,
3 conforming to EFI driver model.
4
5 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #include "Ps2Mouse.h"
17 #include "CommPs2.h"
18
19 ///
20 /// DriverBinding Protocol Instance
21 ///
22 EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
23 PS2MouseDriverSupported,
24 PS2MouseDriverStart,
25 PS2MouseDriverStop,
26 0xa,
27 NULL,
28 NULL
29 };
30
31 /**
32 Test to see if this driver supports ControllerHandle. Any ControllerHandle
33 than contains a IsaIo protocol can be supported.
34
35 @param This Protocol instance pointer.
36 @param ControllerHandle Handle of device to test
37 @param RemainingDevicePath Optional parameter use to pick a specific child
38 device to start.
39
40 @retval EFI_SUCCESS This driver supports this device
41 @retval EFI_ALREADY_STARTED This driver is already running on this device
42 @retval other This driver does not support this device
43
44 **/
45 EFI_STATUS
46 EFIAPI
47 PS2MouseDriverSupported (
48 IN EFI_DRIVER_BINDING_PROTOCOL *This,
49 IN EFI_HANDLE Controller,
50 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
51 )
52 {
53 EFI_STATUS Status;
54 EFI_ISA_IO_PROTOCOL *IsaIo;
55
56 Status = EFI_SUCCESS;
57
58 //
59 // Open the IO Abstraction(s) needed to perform the supported test
60 //
61 Status = gBS->OpenProtocol (
62 Controller,
63 &gEfiIsaIoProtocolGuid,
64 (VOID **) &IsaIo,
65 This->DriverBindingHandle,
66 Controller,
67 EFI_OPEN_PROTOCOL_BY_DRIVER
68 );
69 if (EFI_ERROR (Status)) {
70 return Status;
71 }
72 //
73 // Use the ISA I/O Protocol to see if Controller is the Keyboard controller
74 //
75 switch (IsaIo->ResourceList->Device.HID) {
76 case EISA_PNP_ID (0xF03):
77 //
78 // Microsoft PS/2 style mouse
79 //
80 case EISA_PNP_ID (0xF13):
81 //
82 // PS/2 Port for PS/2-style Mice
83 //
84 break;
85
86 case EISA_PNP_ID (0x303):
87 //
88 // IBM Enhanced (101/102-key, PS/2 mouse support)
89 //
90 if (IsaIo->ResourceList->Device.UID == 1) {
91 break;
92 }
93
94 default:
95 Status = EFI_UNSUPPORTED;
96 break;
97 }
98 //
99 // Close the I/O Abstraction(s) used to perform the supported test
100 //
101 gBS->CloseProtocol (
102 Controller,
103 &gEfiIsaIoProtocolGuid,
104 This->DriverBindingHandle,
105 Controller
106 );
107
108 return Status;
109 }
110
111 /**
112 Start this driver on ControllerHandle by opening a IsaIo protocol, creating
113 PS2_MOUSE_ABSOLUTE_POINTER_DEV device and install gEfiAbsolutePointerProtocolGuid
114 finally.
115
116 @param This Protocol instance pointer.
117 @param ControllerHandle Handle of device to bind driver to
118 @param RemainingDevicePath Optional parameter use to pick a specific child
119 device to start.
120
121 @retval EFI_SUCCESS This driver is added to ControllerHandle
122 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
123 @retval other This driver does not support this device
124
125 **/
126 EFI_STATUS
127 EFIAPI
128 PS2MouseDriverStart (
129 IN EFI_DRIVER_BINDING_PROTOCOL *This,
130 IN EFI_HANDLE Controller,
131 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
132 )
133 {
134 EFI_STATUS Status;
135 EFI_STATUS EmptyStatus;
136 EFI_ISA_IO_PROTOCOL *IsaIo;
137 PS2_MOUSE_DEV *MouseDev;
138 UINT8 Data;
139 EFI_TPL OldTpl;
140 EFI_STATUS_CODE_VALUE StatusCode;
141 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
142
143 StatusCode = 0;
144 MouseDev = NULL;
145 IsaIo = NULL;
146
147 //
148 // Open the device path protocol
149 //
150 Status = gBS->OpenProtocol (
151 Controller,
152 &gEfiDevicePathProtocolGuid,
153 (VOID **) &ParentDevicePath,
154 This->DriverBindingHandle,
155 Controller,
156 EFI_OPEN_PROTOCOL_BY_DRIVER
157 );
158 if (EFI_ERROR (Status)) {
159 return Status;
160 }
161 //
162 // Report that the keyboard is being enabled
163 //
164 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
165 EFI_PROGRESS_CODE,
166 EFI_PERIPHERAL_MOUSE | EFI_P_PC_ENABLE,
167 ParentDevicePath
168 );
169
170 //
171 // Get the ISA I/O Protocol on Controller's handle
172 //
173 Status = gBS->OpenProtocol (
174 Controller,
175 &gEfiIsaIoProtocolGuid,
176 (VOID **) &IsaIo,
177 This->DriverBindingHandle,
178 Controller,
179 EFI_OPEN_PROTOCOL_BY_DRIVER
180 );
181 if (EFI_ERROR (Status)) {
182 gBS->CloseProtocol (
183 Controller,
184 &gEfiDevicePathProtocolGuid,
185 This->DriverBindingHandle,
186 Controller
187 );
188 return EFI_INVALID_PARAMETER;
189 }
190 //
191 // Raise TPL to avoid keyboard operation impact
192 //
193 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
194
195 //
196 // Allocate private data
197 //
198 MouseDev = AllocateZeroPool (sizeof (PS2_MOUSE_DEV));
199 if (MouseDev == NULL) {
200 Status = EFI_OUT_OF_RESOURCES;
201 goto ErrorExit;
202 }
203 //
204 // Setup the device instance
205 //
206 MouseDev->Signature = PS2_MOUSE_DEV_SIGNATURE;
207 MouseDev->Handle = Controller;
208 MouseDev->SampleRate = SampleRate20;
209 MouseDev->Resolution = MouseResolution4;
210 MouseDev->Scaling = Scaling1;
211 MouseDev->DataPackageSize = 3;
212 MouseDev->IsaIo = IsaIo;
213 MouseDev->DevicePath = ParentDevicePath;
214
215 //
216 // Resolution = 4 counts/mm
217 //
218 MouseDev->Mode.ResolutionX = 4;
219 MouseDev->Mode.ResolutionY = 4;
220 MouseDev->Mode.LeftButton = TRUE;
221 MouseDev->Mode.RightButton = TRUE;
222
223 MouseDev->SimplePointerProtocol.Reset = MouseReset;
224 MouseDev->SimplePointerProtocol.GetState = MouseGetState;
225 MouseDev->SimplePointerProtocol.Mode = &(MouseDev->Mode);
226
227 //
228 // Initialize keyboard controller if necessary
229 //
230 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
231 //
232 // Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.
233 //
234 if ((Data & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {
235 //
236 // If nobody decodes KBC I/O port, it will read back as 0xFF.
237 // Check the Time-Out and Parity bit to see if it has an active KBC in system
238 //
239 Status = EFI_DEVICE_ERROR;
240 StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
241 goto ErrorExit;
242 }
243
244 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
245 EFI_PROGRESS_CODE,
246 EFI_PERIPHERAL_MOUSE | EFI_P_MOUSE_PC_SELF_TEST,
247 ParentDevicePath
248 );
249
250 if ((Data & KBC_SYSF) != KBC_SYSF) {
251 Status = KbcSelfTest (IsaIo);
252 if (EFI_ERROR (Status)) {
253 StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_CONTROLLER_ERROR;
254 goto ErrorExit;
255 }
256 }
257
258 KbcEnableAux (IsaIo);
259
260 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
261 EFI_PROGRESS_CODE,
262 EFI_PERIPHERAL_MOUSE | EFI_P_PC_PRESENCE_DETECT,
263 ParentDevicePath
264 );
265
266 //
267 // Reset the mouse
268 //
269 Status = MouseDev->SimplePointerProtocol.Reset (&MouseDev->SimplePointerProtocol, TRUE);
270 if (EFI_ERROR (Status)) {
271 //
272 // mouse not connected
273 //
274 Status = EFI_SUCCESS;
275 StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
276 goto ErrorExit;
277 }
278 //
279 // Setup the WaitForKey event
280 //
281 Status = gBS->CreateEvent (
282 EVT_NOTIFY_WAIT,
283 TPL_NOTIFY,
284 MouseWaitForInput,
285 MouseDev,
286 &((MouseDev->SimplePointerProtocol).WaitForInput)
287 );
288 if (EFI_ERROR (Status)) {
289 Status = EFI_OUT_OF_RESOURCES;
290 goto ErrorExit;
291 }
292 //
293 // Setup a periodic timer, used to poll mouse state
294 //
295 Status = gBS->CreateEvent (
296 EVT_TIMER | EVT_NOTIFY_SIGNAL,
297 TPL_NOTIFY,
298 PollMouse,
299 MouseDev,
300 &MouseDev->TimerEvent
301 );
302 if (EFI_ERROR (Status)) {
303 Status = EFI_OUT_OF_RESOURCES;
304 goto ErrorExit;
305 }
306 //
307 // Start timer to poll mouse (100 samples per second)
308 //
309 Status = gBS->SetTimer (MouseDev->TimerEvent, TimerPeriodic, 100000);
310 if (EFI_ERROR (Status)) {
311 Status = EFI_OUT_OF_RESOURCES;
312 goto ErrorExit;
313 }
314
315 MouseDev->ControllerNameTable = NULL;
316 AddUnicodeString2 (
317 "eng",
318 gPs2MouseComponentName.SupportedLanguages,
319 &MouseDev->ControllerNameTable,
320 L"PS/2 Mouse Device",
321 TRUE
322 );
323 AddUnicodeString2 (
324 "en",
325 gPs2MouseComponentName2.SupportedLanguages,
326 &MouseDev->ControllerNameTable,
327 L"PS/2 Mouse Device",
328 FALSE
329 );
330
331
332 //
333 // Install protocol interfaces for the mouse device.
334 //
335 Status = gBS->InstallMultipleProtocolInterfaces (
336 &Controller,
337 &gEfiSimplePointerProtocolGuid,
338 &MouseDev->SimplePointerProtocol,
339 NULL
340 );
341 if (EFI_ERROR (Status)) {
342 goto ErrorExit;
343 }
344
345 gBS->RestoreTPL (OldTpl);
346
347 return Status;
348
349 ErrorExit:
350
351 if (Status != EFI_DEVICE_ERROR) {
352 KbcDisableAux (IsaIo);
353 }
354
355 if (StatusCode != 0) {
356 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
357 EFI_ERROR_CODE | EFI_ERROR_MINOR,
358 StatusCode,
359 ParentDevicePath
360 );
361 }
362
363 if ((MouseDev != NULL) && (MouseDev->SimplePointerProtocol.WaitForInput != NULL)) {
364 gBS->CloseEvent (MouseDev->SimplePointerProtocol.WaitForInput);
365 }
366
367 if ((MouseDev != NULL) && (MouseDev->TimerEvent != NULL)) {
368 gBS->CloseEvent (MouseDev->TimerEvent);
369 }
370
371 if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) {
372 FreeUnicodeStringTable (MouseDev->ControllerNameTable);
373 }
374
375 if (Status != EFI_DEVICE_ERROR) {
376 //
377 // Since there will be no timer handler for mouse input any more,
378 // exhaust input data just in case there is still mouse data left
379 //
380 EmptyStatus = EFI_SUCCESS;
381 while (!EFI_ERROR (EmptyStatus)) {
382 EmptyStatus = In8042Data (IsaIo, &Data);
383 }
384 }
385
386 if (MouseDev != NULL) {
387 FreePool (MouseDev);
388 }
389
390 gBS->CloseProtocol (
391 Controller,
392 &gEfiDevicePathProtocolGuid,
393 This->DriverBindingHandle,
394 Controller
395 );
396
397 gBS->CloseProtocol (
398 Controller,
399 &gEfiIsaIoProtocolGuid,
400 This->DriverBindingHandle,
401 Controller
402 );
403
404 gBS->RestoreTPL (OldTpl);
405
406 return Status;
407 }
408
409 /**
410 Stop this driver on ControllerHandle. Support stoping any child handles
411 created by this driver.
412
413 @param This Protocol instance pointer.
414 @param ControllerHandle Handle of device to stop driver on
415 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
416 children is zero stop the entire bus driver.
417 @param ChildHandleBuffer List of Child Handles to Stop.
418
419 @retval EFI_SUCCESS This driver is removed ControllerHandle
420 @retval other This driver was not removed from this device
421
422 **/
423 EFI_STATUS
424 EFIAPI
425 PS2MouseDriverStop (
426 IN EFI_DRIVER_BINDING_PROTOCOL *This,
427 IN EFI_HANDLE Controller,
428 IN UINTN NumberOfChildren,
429 IN EFI_HANDLE *ChildHandleBuffer
430 )
431 {
432 EFI_STATUS Status;
433 EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
434 PS2_MOUSE_DEV *MouseDev;
435 UINT8 Data;
436
437 Status = gBS->OpenProtocol (
438 Controller,
439 &gEfiSimplePointerProtocolGuid,
440 (VOID **) &SimplePointerProtocol,
441 This->DriverBindingHandle,
442 Controller,
443 EFI_OPEN_PROTOCOL_GET_PROTOCOL
444 );
445 if (EFI_ERROR (Status)) {
446 return EFI_SUCCESS;
447 }
448
449 MouseDev = PS2_MOUSE_DEV_FROM_THIS (SimplePointerProtocol);
450
451 //
452 // Report that the keyboard is being disabled
453 //
454 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
455 EFI_PROGRESS_CODE,
456 EFI_PERIPHERAL_MOUSE | EFI_P_PC_DISABLE,
457 MouseDev->DevicePath
458 );
459
460 Status = gBS->UninstallProtocolInterface (
461 Controller,
462 &gEfiSimplePointerProtocolGuid,
463 &MouseDev->SimplePointerProtocol
464 );
465 if (EFI_ERROR (Status)) {
466 return Status;
467 }
468
469 //
470 // Cancel mouse data polling timer, close timer event
471 //
472 gBS->SetTimer (MouseDev->TimerEvent, TimerCancel, 0);
473 gBS->CloseEvent (MouseDev->TimerEvent);
474
475 //
476 // Since there will be no timer handler for mouse input any more,
477 // exhaust input data just in case there is still mouse data left
478 //
479 Status = EFI_SUCCESS;
480 while (!EFI_ERROR (Status)) {
481 Status = In8042Data (MouseDev->IsaIo, &Data);
482 }
483
484 gBS->CloseEvent (MouseDev->SimplePointerProtocol.WaitForInput);
485 FreeUnicodeStringTable (MouseDev->ControllerNameTable);
486 FreePool (MouseDev);
487
488 gBS->CloseProtocol (
489 Controller,
490 &gEfiDevicePathProtocolGuid,
491 This->DriverBindingHandle,
492 Controller
493 );
494
495 gBS->CloseProtocol (
496 Controller,
497 &gEfiIsaIoProtocolGuid,
498 This->DriverBindingHandle,
499 Controller
500 );
501
502 return EFI_SUCCESS;
503 }
504
505 /**
506 Reset the Mouse and do BAT test for it, if ExtendedVerification isTRUE and there is a mouse device connectted to system
507
508 @param This - Pointer of simple pointer Protocol.
509 @param ExtendedVerification - Whether configure mouse parameters. True: do; FALSE: skip.
510
511
512 @retval EFI_SUCCESS - The command byte is written successfully.
513 @retval EFI_DEVICE_ERROR - Errors occurred during reseting keyboard.
514
515 **/
516 EFI_STATUS
517 EFIAPI
518 MouseReset (
519 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
520 IN BOOLEAN ExtendedVerification
521 )
522 {
523 EFI_STATUS Status;
524 PS2_MOUSE_DEV *MouseDev;
525 EFI_TPL OldTpl;
526 BOOLEAN KeyboardEnable;
527 UINT8 Data;
528
529 MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
530
531 //
532 // Report reset progress code
533 //
534 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
535 EFI_PROGRESS_CODE,
536 EFI_PERIPHERAL_MOUSE | EFI_P_PC_RESET,
537 MouseDev->DevicePath
538 );
539
540 KeyboardEnable = FALSE;
541
542 //
543 // Raise TPL to avoid keyboard operation impact
544 //
545 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
546
547 ZeroMem (&MouseDev->State, sizeof (EFI_SIMPLE_POINTER_STATE));
548 MouseDev->StateChanged = FALSE;
549
550 //
551 // Exhaust input data
552 //
553 Status = EFI_SUCCESS;
554 while (!EFI_ERROR (Status)) {
555 Status = In8042Data (MouseDev->IsaIo, &Data);
556 }
557
558 CheckKbStatus (MouseDev->IsaIo, &KeyboardEnable);
559
560 KbcDisableKb (MouseDev->IsaIo);
561
562 MouseDev->IsaIo->Io.Read (MouseDev->IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
563
564 //
565 // if there's data block on KBC data port, read it out
566 //
567 if ((Data & KBC_OUTB) == KBC_OUTB) {
568 MouseDev->IsaIo->Io.Read (MouseDev->IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Data);
569 }
570
571 Status = EFI_SUCCESS;
572 //
573 // The PS2 mouse driver reset behavior is always successfully return no matter wheater or not there is mouse connected to system.
574 // This behavior is needed by performance speed. The following mouse command only succeessfully finish when mouse device is
575 // connected to system, so if PS2 mouse device not connect to system or user not ask for, we skip the mouse configuration and enabling
576 //
577 if (ExtendedVerification && CheckMouseConnect (MouseDev)) {
578 //
579 // Send mouse reset command and set mouse default configure
580 //
581 Status = PS2MouseReset (MouseDev->IsaIo);
582 if (EFI_ERROR (Status)) {
583 Status = EFI_DEVICE_ERROR;
584 goto Exit;
585 }
586
587 Status = PS2MouseSetSampleRate (MouseDev->IsaIo, MouseDev->SampleRate);
588 if (EFI_ERROR (Status)) {
589 Status = EFI_DEVICE_ERROR;
590 goto Exit;
591 }
592
593 Status = PS2MouseSetResolution (MouseDev->IsaIo, MouseDev->Resolution);
594 if (EFI_ERROR (Status)) {
595 Status = EFI_DEVICE_ERROR;
596 goto Exit;
597 }
598
599 Status = PS2MouseSetScaling (MouseDev->IsaIo, MouseDev->Scaling);
600 if (EFI_ERROR (Status)) {
601 Status = EFI_DEVICE_ERROR;
602 goto Exit;
603 }
604
605 Status = PS2MouseEnable (MouseDev->IsaIo);
606 if (EFI_ERROR (Status)) {
607 Status = EFI_DEVICE_ERROR;
608 goto Exit;
609 }
610 }
611 Exit:
612 gBS->RestoreTPL (OldTpl);
613
614 if (KeyboardEnable) {
615 KbcEnableKb (MouseDev->IsaIo);
616 }
617
618 return Status;
619 }
620
621 /**
622 Check whether there is Ps/2 mouse device in system
623
624 @param MouseDev - Mouse Private Data Structure
625
626 @retval TRUE - Keyboard in System.
627 @retval FALSE - Keyboard not in System.
628
629 **/
630 BOOLEAN
631 CheckMouseConnect (
632 IN PS2_MOUSE_DEV *MouseDev
633 )
634
635 {
636 EFI_STATUS Status;
637
638 Status = PS2MouseEnable (MouseDev->IsaIo);
639 if (!EFI_ERROR (Status)) {
640 return TRUE;
641 }
642
643 return FALSE;
644 }
645
646 /**
647 Get and Clear mouse status.
648
649 @param This - Pointer of simple pointer Protocol.
650 @param State - Output buffer holding status.
651
652 @retval EFI_INVALID_PARAMETER Output buffer is invalid.
653 @retval EFI_NOT_READY Mouse is not changed status yet.
654 @retval EFI_SUCCESS Mouse status is changed and get successful.
655 **/
656 EFI_STATUS
657 EFIAPI
658 MouseGetState (
659 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
660 IN OUT EFI_SIMPLE_POINTER_STATE *State
661 )
662 {
663 PS2_MOUSE_DEV *MouseDev;
664 EFI_TPL OldTpl;
665
666 MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
667
668 if (State == NULL) {
669 return EFI_INVALID_PARAMETER;
670 }
671
672 if (!MouseDev->StateChanged) {
673 return EFI_NOT_READY;
674 }
675
676 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
677 CopyMem (State, &(MouseDev->State), sizeof (EFI_SIMPLE_POINTER_STATE));
678
679 //
680 // clear mouse state
681 //
682 MouseDev->State.RelativeMovementX = 0;
683 MouseDev->State.RelativeMovementY = 0;
684 MouseDev->State.RelativeMovementZ = 0;
685 MouseDev->StateChanged = FALSE;
686 gBS->RestoreTPL (OldTpl);
687
688 return EFI_SUCCESS;
689 }
690
691 /**
692
693 Event notification function for SIMPLE_POINTER.WaitForInput event.
694 Signal the event if there is input from mouse.
695
696 @param Event event object
697 @param Context event context
698
699 **/
700 VOID
701 EFIAPI
702 MouseWaitForInput (
703 IN EFI_EVENT Event,
704 IN VOID *Context
705 )
706 {
707 PS2_MOUSE_DEV *MouseDev;
708
709 MouseDev = (PS2_MOUSE_DEV *) Context;
710
711 //
712 // Someone is waiting on the mouse event, if there's
713 // input from mouse, signal the event
714 //
715 if (MouseDev->StateChanged) {
716 gBS->SignalEvent (Event);
717 }
718
719 }
720
721 /**
722 Event notification function for TimerEvent event.
723 If mouse device is connected to system, try to get the mouse packet data.
724
725 @param Event - TimerEvent in PS2_MOUSE_DEV
726 @param Context - Pointer to PS2_MOUSE_DEV structure
727
728 **/
729 VOID
730 EFIAPI
731 PollMouse (
732 IN EFI_EVENT Event,
733 IN VOID *Context
734 )
735
736 {
737 PS2_MOUSE_DEV *MouseDev;
738
739 MouseDev = (PS2_MOUSE_DEV *) Context;
740
741 //
742 // Polling mouse packet data
743 //
744 PS2MouseGetPacket (MouseDev);
745 }
746
747 /**
748 The user Entry Point for module Ps2Mouse. The user code starts with this function.
749
750 @param[in] ImageHandle The firmware allocated handle for the EFI image.
751 @param[in] SystemTable A pointer to the EFI System Table.
752
753 @retval EFI_SUCCESS The entry point is executed successfully.
754 @retval other Some error occurs when executing this entry point.
755
756 **/
757 EFI_STATUS
758 EFIAPI
759 InitializePs2Mouse(
760 IN EFI_HANDLE ImageHandle,
761 IN EFI_SYSTEM_TABLE *SystemTable
762 )
763 {
764 EFI_STATUS Status;
765
766 //
767 // Install driver model protocol(s).
768 //
769 Status = EfiLibInstallDriverBindingComponentName2 (
770 ImageHandle,
771 SystemTable,
772 &gPS2MouseDriver,
773 ImageHandle,
774 &gPs2MouseComponentName,
775 &gPs2MouseComponentName2
776 );
777 ASSERT_EFI_ERROR (Status);
778
779
780 return Status;
781 }
782