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