]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2Mouse.c
Fix comparisons of enumerated types which may cause warnings for some compilers.
[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 (
270 &MouseDev->SimplePointerProtocol,
271 FeaturePcdGet (PcdPs2MouseExtendedVerification)
272 );
273 if (EFI_ERROR (Status)) {
274 //
275 // mouse not connected
276 //
277 Status = EFI_SUCCESS;
278 StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
279 goto ErrorExit;
280 }
281 //
282 // Setup the WaitForKey event
283 //
284 Status = gBS->CreateEvent (
285 EVT_NOTIFY_WAIT,
286 TPL_NOTIFY,
287 MouseWaitForInput,
288 MouseDev,
289 &((MouseDev->SimplePointerProtocol).WaitForInput)
290 );
291 if (EFI_ERROR (Status)) {
292 Status = EFI_OUT_OF_RESOURCES;
293 goto ErrorExit;
294 }
295 //
296 // Setup a periodic timer, used to poll mouse state
297 //
298 Status = gBS->CreateEvent (
299 EVT_TIMER | EVT_NOTIFY_SIGNAL,
300 TPL_NOTIFY,
301 PollMouse,
302 MouseDev,
303 &MouseDev->TimerEvent
304 );
305 if (EFI_ERROR (Status)) {
306 Status = EFI_OUT_OF_RESOURCES;
307 goto ErrorExit;
308 }
309 //
310 // Start timer to poll mouse (100 samples per second)
311 //
312 Status = gBS->SetTimer (MouseDev->TimerEvent, TimerPeriodic, 100000);
313 if (EFI_ERROR (Status)) {
314 Status = EFI_OUT_OF_RESOURCES;
315 goto ErrorExit;
316 }
317
318 MouseDev->ControllerNameTable = NULL;
319 AddUnicodeString2 (
320 "eng",
321 gPs2MouseComponentName.SupportedLanguages,
322 &MouseDev->ControllerNameTable,
323 L"PS/2 Mouse Device",
324 TRUE
325 );
326 AddUnicodeString2 (
327 "en",
328 gPs2MouseComponentName2.SupportedLanguages,
329 &MouseDev->ControllerNameTable,
330 L"PS/2 Mouse Device",
331 FALSE
332 );
333
334
335 //
336 // Install protocol interfaces for the mouse device.
337 //
338 Status = gBS->InstallMultipleProtocolInterfaces (
339 &Controller,
340 &gEfiSimplePointerProtocolGuid,
341 &MouseDev->SimplePointerProtocol,
342 NULL
343 );
344 if (EFI_ERROR (Status)) {
345 goto ErrorExit;
346 }
347
348 gBS->RestoreTPL (OldTpl);
349
350 return Status;
351
352 ErrorExit:
353
354 if (Status != EFI_DEVICE_ERROR) {
355 KbcDisableAux (IsaIo);
356 }
357
358 if (StatusCode != 0) {
359 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
360 EFI_ERROR_CODE | EFI_ERROR_MINOR,
361 StatusCode,
362 ParentDevicePath
363 );
364 }
365
366 if ((MouseDev != NULL) && (MouseDev->SimplePointerProtocol.WaitForInput != NULL)) {
367 gBS->CloseEvent (MouseDev->SimplePointerProtocol.WaitForInput);
368 }
369
370 if ((MouseDev != NULL) && (MouseDev->TimerEvent != NULL)) {
371 gBS->CloseEvent (MouseDev->TimerEvent);
372 }
373
374 if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) {
375 FreeUnicodeStringTable (MouseDev->ControllerNameTable);
376 }
377
378 if (Status != EFI_DEVICE_ERROR) {
379 //
380 // Since there will be no timer handler for mouse input any more,
381 // exhaust input data just in case there is still mouse data left
382 //
383 EmptyStatus = EFI_SUCCESS;
384 while (!EFI_ERROR (EmptyStatus)) {
385 EmptyStatus = In8042Data (IsaIo, &Data);
386 }
387 }
388
389 if (MouseDev != NULL) {
390 FreePool (MouseDev);
391 }
392
393 gBS->CloseProtocol (
394 Controller,
395 &gEfiDevicePathProtocolGuid,
396 This->DriverBindingHandle,
397 Controller
398 );
399
400 gBS->CloseProtocol (
401 Controller,
402 &gEfiIsaIoProtocolGuid,
403 This->DriverBindingHandle,
404 Controller
405 );
406
407 gBS->RestoreTPL (OldTpl);
408
409 return Status;
410 }
411
412 /**
413 Stop this driver on ControllerHandle. Support stoping any child handles
414 created by this driver.
415
416 @param This Protocol instance pointer.
417 @param ControllerHandle Handle of device to stop driver on
418 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
419 children is zero stop the entire bus driver.
420 @param ChildHandleBuffer List of Child Handles to Stop.
421
422 @retval EFI_SUCCESS This driver is removed ControllerHandle
423 @retval other This driver was not removed from this device
424
425 **/
426 EFI_STATUS
427 EFIAPI
428 PS2MouseDriverStop (
429 IN EFI_DRIVER_BINDING_PROTOCOL *This,
430 IN EFI_HANDLE Controller,
431 IN UINTN NumberOfChildren,
432 IN EFI_HANDLE *ChildHandleBuffer
433 )
434 {
435 EFI_STATUS Status;
436 EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
437 PS2_MOUSE_DEV *MouseDev;
438 UINT8 Data;
439
440 Status = gBS->OpenProtocol (
441 Controller,
442 &gEfiSimplePointerProtocolGuid,
443 (VOID **) &SimplePointerProtocol,
444 This->DriverBindingHandle,
445 Controller,
446 EFI_OPEN_PROTOCOL_GET_PROTOCOL
447 );
448 if (EFI_ERROR (Status)) {
449 return EFI_SUCCESS;
450 }
451
452 MouseDev = PS2_MOUSE_DEV_FROM_THIS (SimplePointerProtocol);
453
454 //
455 // Report that the keyboard is being disabled
456 //
457 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
458 EFI_PROGRESS_CODE,
459 EFI_PERIPHERAL_MOUSE | EFI_P_PC_DISABLE,
460 MouseDev->DevicePath
461 );
462
463 Status = gBS->UninstallProtocolInterface (
464 Controller,
465 &gEfiSimplePointerProtocolGuid,
466 &MouseDev->SimplePointerProtocol
467 );
468 if (EFI_ERROR (Status)) {
469 return Status;
470 }
471
472 //
473 // Cancel mouse data polling timer, close timer event
474 //
475 gBS->SetTimer (MouseDev->TimerEvent, TimerCancel, 0);
476 gBS->CloseEvent (MouseDev->TimerEvent);
477
478 //
479 // Since there will be no timer handler for mouse input any more,
480 // exhaust input data just in case there is still mouse data left
481 //
482 Status = EFI_SUCCESS;
483 while (!EFI_ERROR (Status)) {
484 Status = In8042Data (MouseDev->IsaIo, &Data);
485 }
486
487 gBS->CloseEvent (MouseDev->SimplePointerProtocol.WaitForInput);
488 FreeUnicodeStringTable (MouseDev->ControllerNameTable);
489 FreePool (MouseDev);
490
491 gBS->CloseProtocol (
492 Controller,
493 &gEfiDevicePathProtocolGuid,
494 This->DriverBindingHandle,
495 Controller
496 );
497
498 gBS->CloseProtocol (
499 Controller,
500 &gEfiIsaIoProtocolGuid,
501 This->DriverBindingHandle,
502 Controller
503 );
504
505 return EFI_SUCCESS;
506 }
507
508 /**
509 Reset the Mouse and do BAT test for it, if ExtendedVerification isTRUE and there is a mouse device connectted to system
510
511 @param This - Pointer of simple pointer Protocol.
512 @param ExtendedVerification - Whether configure mouse parameters. True: do; FALSE: skip.
513
514
515 @retval EFI_SUCCESS - The command byte is written successfully.
516 @retval EFI_DEVICE_ERROR - Errors occurred during reseting keyboard.
517
518 **/
519 EFI_STATUS
520 EFIAPI
521 MouseReset (
522 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
523 IN BOOLEAN ExtendedVerification
524 )
525 {
526 EFI_STATUS Status;
527 PS2_MOUSE_DEV *MouseDev;
528 EFI_TPL OldTpl;
529 BOOLEAN KeyboardEnable;
530 UINT8 Data;
531
532 MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
533
534 //
535 // Report reset progress code
536 //
537 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
538 EFI_PROGRESS_CODE,
539 EFI_PERIPHERAL_MOUSE | EFI_P_PC_RESET,
540 MouseDev->DevicePath
541 );
542
543 KeyboardEnable = FALSE;
544
545 //
546 // Raise TPL to avoid keyboard operation impact
547 //
548 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
549
550 ZeroMem (&MouseDev->State, sizeof (EFI_SIMPLE_POINTER_STATE));
551 MouseDev->StateChanged = FALSE;
552
553 //
554 // Exhaust input data
555 //
556 Status = EFI_SUCCESS;
557 while (!EFI_ERROR (Status)) {
558 Status = In8042Data (MouseDev->IsaIo, &Data);
559 }
560
561 CheckKbStatus (MouseDev->IsaIo, &KeyboardEnable);
562
563 KbcDisableKb (MouseDev->IsaIo);
564
565 MouseDev->IsaIo->Io.Read (MouseDev->IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
566
567 //
568 // if there's data block on KBC data port, read it out
569 //
570 if ((Data & KBC_OUTB) == KBC_OUTB) {
571 MouseDev->IsaIo->Io.Read (MouseDev->IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Data);
572 }
573
574 Status = EFI_SUCCESS;
575 //
576 // The PS2 mouse driver reset behavior is always successfully return no matter wheater or not there is mouse connected to system.
577 // This behavior is needed by performance speed. The following mouse command only succeessfully finish when mouse device is
578 // connected to system, so if PS2 mouse device not connect to system or user not ask for, we skip the mouse configuration and enabling
579 //
580 if (ExtendedVerification && CheckMouseConnect (MouseDev)) {
581 //
582 // Send mouse reset command and set mouse default configure
583 //
584 Status = PS2MouseReset (MouseDev->IsaIo);
585 if (EFI_ERROR (Status)) {
586 Status = EFI_DEVICE_ERROR;
587 goto Exit;
588 }
589
590 Status = PS2MouseSetSampleRate (MouseDev->IsaIo, MouseDev->SampleRate);
591 if (EFI_ERROR (Status)) {
592 Status = EFI_DEVICE_ERROR;
593 goto Exit;
594 }
595
596 Status = PS2MouseSetResolution (MouseDev->IsaIo, MouseDev->Resolution);
597 if (EFI_ERROR (Status)) {
598 Status = EFI_DEVICE_ERROR;
599 goto Exit;
600 }
601
602 Status = PS2MouseSetScaling (MouseDev->IsaIo, MouseDev->Scaling);
603 if (EFI_ERROR (Status)) {
604 Status = EFI_DEVICE_ERROR;
605 goto Exit;
606 }
607
608 Status = PS2MouseEnable (MouseDev->IsaIo);
609 if (EFI_ERROR (Status)) {
610 Status = EFI_DEVICE_ERROR;
611 goto Exit;
612 }
613 }
614 Exit:
615 gBS->RestoreTPL (OldTpl);
616
617 if (KeyboardEnable) {
618 KbcEnableKb (MouseDev->IsaIo);
619 }
620
621 return Status;
622 }
623
624 /**
625 Check whether there is Ps/2 mouse device in system
626
627 @param MouseDev - Mouse Private Data Structure
628
629 @retval TRUE - Keyboard in System.
630 @retval FALSE - Keyboard not in System.
631
632 **/
633 BOOLEAN
634 CheckMouseConnect (
635 IN PS2_MOUSE_DEV *MouseDev
636 )
637
638 {
639 EFI_STATUS Status;
640
641 Status = PS2MouseEnable (MouseDev->IsaIo);
642 if (!EFI_ERROR (Status)) {
643 return TRUE;
644 }
645
646 return FALSE;
647 }
648
649 /**
650 Get and Clear mouse status.
651
652 @param This - Pointer of simple pointer Protocol.
653 @param State - Output buffer holding status.
654
655 @retval EFI_INVALID_PARAMETER Output buffer is invalid.
656 @retval EFI_NOT_READY Mouse is not changed status yet.
657 @retval EFI_SUCCESS Mouse status is changed and get successful.
658 **/
659 EFI_STATUS
660 EFIAPI
661 MouseGetState (
662 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
663 IN OUT EFI_SIMPLE_POINTER_STATE *State
664 )
665 {
666 PS2_MOUSE_DEV *MouseDev;
667 EFI_TPL OldTpl;
668
669 MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
670
671 if (State == NULL) {
672 return EFI_INVALID_PARAMETER;
673 }
674
675 if (!MouseDev->StateChanged) {
676 return EFI_NOT_READY;
677 }
678
679 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
680 CopyMem (State, &(MouseDev->State), sizeof (EFI_SIMPLE_POINTER_STATE));
681
682 //
683 // clear mouse state
684 //
685 MouseDev->State.RelativeMovementX = 0;
686 MouseDev->State.RelativeMovementY = 0;
687 MouseDev->State.RelativeMovementZ = 0;
688 MouseDev->StateChanged = FALSE;
689 gBS->RestoreTPL (OldTpl);
690
691 return EFI_SUCCESS;
692 }
693
694 /**
695
696 Event notification function for SIMPLE_POINTER.WaitForInput event.
697 Signal the event if there is input from mouse.
698
699 @param Event event object
700 @param Context event context
701
702 **/
703 VOID
704 EFIAPI
705 MouseWaitForInput (
706 IN EFI_EVENT Event,
707 IN VOID *Context
708 )
709 {
710 PS2_MOUSE_DEV *MouseDev;
711
712 MouseDev = (PS2_MOUSE_DEV *) Context;
713
714 //
715 // Someone is waiting on the mouse event, if there's
716 // input from mouse, signal the event
717 //
718 if (MouseDev->StateChanged) {
719 gBS->SignalEvent (Event);
720 }
721
722 }
723
724 /**
725 Event notification function for TimerEvent event.
726 If mouse device is connected to system, try to get the mouse packet data.
727
728 @param Event - TimerEvent in PS2_MOUSE_DEV
729 @param Context - Pointer to PS2_MOUSE_DEV structure
730
731 **/
732 VOID
733 EFIAPI
734 PollMouse (
735 IN EFI_EVENT Event,
736 IN VOID *Context
737 )
738
739 {
740 PS2_MOUSE_DEV *MouseDev;
741
742 MouseDev = (PS2_MOUSE_DEV *) Context;
743
744 //
745 // Polling mouse packet data
746 //
747 PS2MouseGetPacket (MouseDev);
748 }
749
750 /**
751 The user Entry Point for module Ps2Mouse. The user code starts with this function.
752
753 @param[in] ImageHandle The firmware allocated handle for the EFI image.
754 @param[in] SystemTable A pointer to the EFI System Table.
755
756 @retval EFI_SUCCESS The entry point is executed successfully.
757 @retval other Some error occurs when executing this entry point.
758
759 **/
760 EFI_STATUS
761 EFIAPI
762 InitializePs2Mouse(
763 IN EFI_HANDLE ImageHandle,
764 IN EFI_SYSTEM_TABLE *SystemTable
765 )
766 {
767 EFI_STATUS Status;
768
769 //
770 // Install driver model protocol(s).
771 //
772 Status = EfiLibInstallDriverBindingComponentName2 (
773 ImageHandle,
774 SystemTable,
775 &gPS2MouseDriver,
776 ImageHandle,
777 &gPs2MouseComponentName,
778 &gPs2MouseComponentName2
779 );
780 ASSERT_EFI_ERROR (Status);
781
782
783 return Status;
784 }
785