]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/CommPs2.c
mass cleanup inf name
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2MouseDxe / CommPs2.c
CommitLineData
05fbd06d 1/*++\r
2\r
92a428e1 3Copyright (c) 2006 - 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
05fbd06d 8\r
92a428e1 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
05fbd06d 11\r
05fbd06d 12Abstract: \r
13\r
14 PS2 Mouse Communication Interface \r
15\r
16\r
05fbd06d 17--*/\r
18\r
05fbd06d 19#include "Ps2Mouse.h"\r
20#include "CommPs2.h"\r
21\r
22UINT8 SampleRateTbl[MAX_SR] = { 0xa, 0x14, 0x28, 0x3c, 0x50, 0x64, 0xc8 };\r
23\r
24UINT8 ResolutionTbl[MAX_CMR] = { 0, 1, 2, 3 };\r
25\r
26EFI_STATUS\r
27KbcSelfTest (\r
28 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
29 )\r
30/*++\r
31\r
32Routine Description:\r
33\r
34 GC_TODO: Add function description\r
35\r
36Arguments:\r
37\r
38 IsaIo - GC_TODO: add argument description\r
39\r
40Returns:\r
41\r
42 EFI_DEVICE_ERROR - GC_TODO: Add description for return value\r
43 EFI_SUCCESS - GC_TODO: Add description for return value\r
44\r
45--*/\r
46{\r
47 EFI_STATUS Status;\r
48 UINT8 Data;\r
49\r
50 //\r
51 // Keyboard controller self test\r
52 //\r
53 Status = Out8042Command (IsaIo, SELF_TEST);\r
54 if (EFI_ERROR (Status)) {\r
55 return Status;\r
56 }\r
57 //\r
58 // Read return code\r
59 //\r
60 Status = In8042Data (IsaIo, &Data);\r
61 if (EFI_ERROR (Status)) {\r
62 return Status;\r
63 }\r
64\r
65 if (Data != 0x55) {\r
66 return EFI_DEVICE_ERROR;\r
67 }\r
68 //\r
69 // Set system flag\r
70 //\r
71 Status = Out8042Command (IsaIo, READ_CMD_BYTE);\r
72 if (EFI_ERROR (Status)) {\r
73 return Status;\r
74 }\r
75\r
76 Status = In8042Data (IsaIo, &Data);\r
77 if (EFI_ERROR (Status)) {\r
78 return Status;\r
79 }\r
80\r
81 Status = Out8042Command (IsaIo, WRITE_CMD_BYTE);\r
82 if (EFI_ERROR (Status)) {\r
83 return Status;\r
84 }\r
85\r
86 Data |= CMD_SYS_FLAG;\r
87 Status = Out8042Data (IsaIo, Data);\r
88 if (EFI_ERROR (Status)) {\r
89 return Status;\r
90 }\r
91\r
92 return EFI_SUCCESS;\r
93}\r
94\r
95EFI_STATUS\r
96KbcEnableAux (\r
97 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
98 )\r
99/*++\r
100\r
101Routine Description:\r
102\r
103 GC_TODO: Add function description\r
104\r
105Arguments:\r
106\r
107 IsaIo - GC_TODO: add argument description\r
108\r
109Returns:\r
110\r
111 GC_TODO: add return values\r
112\r
113--*/\r
114{\r
115 //\r
116 // Send 8042 enable mouse command\r
117 //\r
118 return Out8042Command (IsaIo, ENABLE_AUX);\r
119}\r
120\r
121EFI_STATUS\r
122KbcDisableAux (\r
123 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
124 )\r
125/*++\r
126\r
127Routine Description:\r
128\r
129 GC_TODO: Add function description\r
130\r
131Arguments:\r
132\r
133 IsaIo - GC_TODO: add argument description\r
134\r
135Returns:\r
136\r
137 GC_TODO: add return values\r
138\r
139--*/\r
140{\r
141 //\r
142 // Send 8042 disable mouse command\r
143 //\r
144 return Out8042Command (IsaIo, DISABLE_AUX);\r
145}\r
146\r
147EFI_STATUS\r
148KbcEnableKb (\r
149 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
150 )\r
151/*++\r
152\r
153Routine Description:\r
154\r
155 GC_TODO: Add function description\r
156\r
157Arguments:\r
158\r
159 IsaIo - GC_TODO: add argument description\r
160\r
161Returns:\r
162\r
163 GC_TODO: add return values\r
164\r
165--*/\r
166{\r
167 //\r
168 // Send 8042 enable keyboard command\r
169 //\r
170 return Out8042Command (IsaIo, ENABLE_KB);\r
171}\r
172\r
173EFI_STATUS\r
174KbcDisableKb (\r
175 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
176 )\r
177/*++\r
178\r
179Routine Description:\r
180\r
181 GC_TODO: Add function description\r
182\r
183Arguments:\r
184\r
185 IsaIo - GC_TODO: add argument description\r
186\r
187Returns:\r
188\r
189 GC_TODO: add return values\r
190\r
191--*/\r
192{\r
193 //\r
194 // Send 8042 disable keyboard command\r
195 //\r
196 return Out8042Command (IsaIo, DISABLE_KB);\r
197}\r
198\r
199EFI_STATUS\r
200CheckKbStatus (\r
201 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
202 OUT BOOLEAN *KeyboardEnable\r
203 )\r
204/*++\r
205\r
206Routine Description:\r
207\r
208 GC_TODO: Add function description\r
209\r
210Arguments:\r
211\r
212 IsaIo - GC_TODO: add argument description\r
213 KeyboardEnable - GC_TODO: add argument description\r
214\r
215Returns:\r
216\r
217 EFI_SUCCESS - GC_TODO: Add description for return value\r
218\r
219--*/\r
220{\r
221 EFI_STATUS Status;\r
222 UINT8 Data;\r
223\r
224 //\r
225 // Send command to read KBC command byte\r
226 //\r
227 Status = Out8042Command (IsaIo, READ_CMD_BYTE);\r
228 if (EFI_ERROR (Status)) {\r
229 return Status;\r
230 }\r
231\r
232 Status = In8042Data (IsaIo, &Data);\r
233 if (EFI_ERROR (Status)) {\r
234 return Status;\r
235 }\r
236 //\r
237 // Check keyboard enable or not\r
238 //\r
239 if ((Data & CMD_KB_STS) == CMD_KB_DIS) {\r
240 *KeyboardEnable = FALSE;\r
241 } else {\r
242 *KeyboardEnable = TRUE;\r
243 }\r
244\r
245 return EFI_SUCCESS;\r
246}\r
247\r
248EFI_STATUS\r
249PS2MouseReset (\r
250 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
251 )\r
252/*++\r
253\r
254Routine Description:\r
255\r
256 GC_TODO: Add function description\r
257\r
258Arguments:\r
259\r
260 IsaIo - GC_TODO: add argument description\r
261\r
262Returns:\r
263\r
264 EFI_DEVICE_ERROR - GC_TODO: Add description for return value\r
265 EFI_DEVICE_ERROR - GC_TODO: Add description for return value\r
266 EFI_SUCCESS - GC_TODO: Add description for return value\r
267\r
268--*/\r
269{\r
270 EFI_STATUS Status;\r
271 UINT8 Data;\r
272\r
273 Status = Out8042AuxCommand (IsaIo, RESET_CMD, FALSE);\r
274 if (EFI_ERROR (Status)) {\r
275 return Status;\r
276 }\r
277\r
278 Status = In8042AuxData (IsaIo, &Data);\r
279 if (EFI_ERROR (Status)) {\r
280 return Status;\r
281 }\r
282 //\r
283 // Check BAT Complete Code\r
284 //\r
285 if (Data != PS2MOUSE_BAT1) {\r
286 return EFI_DEVICE_ERROR;\r
287 }\r
288\r
289 Status = In8042AuxData (IsaIo, &Data);\r
290 if (EFI_ERROR (Status)) {\r
291 return Status;\r
292 }\r
293 //\r
294 // Check BAT Complete Code\r
295 //\r
296 if (Data != PS2MOUSE_BAT2) {\r
297 return EFI_DEVICE_ERROR;\r
298 }\r
299\r
300 return EFI_SUCCESS;\r
301}\r
302\r
303EFI_STATUS\r
304PS2MouseSetSampleRate (\r
305 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
306 IN MOUSE_SR SampleRate\r
307 )\r
308/*++\r
309\r
310Routine Description:\r
311\r
312 GC_TODO: Add function description\r
313\r
314Arguments:\r
315\r
316 IsaIo - GC_TODO: add argument description\r
317 SampleRate - GC_TODO: add argument description\r
318\r
319Returns:\r
320\r
321 GC_TODO: add return values\r
322\r
323--*/\r
324{\r
325 EFI_STATUS Status;\r
326\r
327 //\r
328 // Send auxiliary command to set mouse sample rate\r
329 //\r
330 Status = Out8042AuxCommand (IsaIo, SETSR_CMD, FALSE);\r
331 if (EFI_ERROR (Status)) {\r
332 return Status;\r
333 }\r
334\r
335 Status = Out8042AuxData (IsaIo, SampleRateTbl[SampleRate]);\r
336\r
337 return Status;\r
338}\r
339\r
340EFI_STATUS\r
341PS2MouseSetResolution (\r
342 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
343 IN MOUSE_RE Resolution\r
344 )\r
345/*++\r
346\r
347Routine Description:\r
348\r
349 GC_TODO: Add function description\r
350\r
351Arguments:\r
352\r
353 IsaIo - GC_TODO: add argument description\r
354 Resolution - GC_TODO: add argument description\r
355\r
356Returns:\r
357\r
358 GC_TODO: add return values\r
359\r
360--*/\r
361{\r
362 EFI_STATUS Status;\r
363\r
364 //\r
365 // Send auxiliary command to set mouse resolution\r
366 //\r
367 Status = Out8042AuxCommand (IsaIo, SETRE_CMD, FALSE);\r
368 if (EFI_ERROR (Status)) {\r
369 return Status;\r
370 }\r
371\r
372 Status = Out8042AuxData (IsaIo, ResolutionTbl[Resolution]);\r
373\r
374 return Status;\r
375}\r
376\r
377EFI_STATUS\r
378PS2MouseSetScaling (\r
379 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
380 IN MOUSE_SF Scaling\r
381 )\r
382/*++\r
383\r
384Routine Description:\r
385\r
386 GC_TODO: Add function description\r
387\r
388Arguments:\r
389\r
390 IsaIo - GC_TODO: add argument description\r
391 Scaling - GC_TODO: add argument description\r
392\r
393Returns:\r
394\r
395 GC_TODO: add return values\r
396\r
397--*/\r
398{\r
399 UINT8 Command;\r
400\r
401 Command = (UINT8) (Scaling == SF1 ? SETSF1_CMD : SETSF2_CMD);\r
402\r
403 //\r
404 // Send auxiliary command to set mouse scaling data\r
405 //\r
406 return Out8042AuxCommand (IsaIo, Command, FALSE);\r
407}\r
408\r
409EFI_STATUS\r
410PS2MouseEnable (\r
411 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
412 )\r
413/*++\r
414\r
415Routine Description:\r
416\r
417 GC_TODO: Add function description\r
418\r
419Arguments:\r
420\r
421 IsaIo - GC_TODO: add argument description\r
422\r
423Returns:\r
424\r
425 GC_TODO: add return values\r
426\r
427--*/\r
428{\r
429 //\r
430 // Send auxiliary command to enable mouse\r
431 //\r
432 return Out8042AuxCommand (IsaIo, ENABLE_CMD, FALSE);\r
433}\r
434\r
435EFI_STATUS\r
436PS2MouseGetPacket (\r
437 PS2_MOUSE_DEV *MouseDev\r
438 )\r
439/*++\r
440\r
441Routine Description:\r
442\r
443 Get mouse packet . Only care first 3 bytes\r
444\r
445Arguments:\r
446\r
447 MouseDev - Pointer of PS2 Mouse Private Data Structure \r
448\r
449Returns:\r
450\r
451 EFI_NOT_READY - Mouse Device not ready to input data packet, or some error happened during getting the packet\r
452 EFI_SUCCESS - The data packet is gotten successfully.\r
453\r
454--*/\r
455{\r
456 EFI_STATUS Status;\r
457 BOOLEAN KeyboardEnable;\r
458 UINT8 Packet[PS2_PACKET_LENGTH];\r
459 UINT8 Data;\r
460 UINTN Count;\r
461 UINTN State;\r
462 INT16 RelativeMovementX;\r
463 INT16 RelativeMovementY;\r
464 BOOLEAN LButton;\r
465 BOOLEAN RButton;\r
466\r
467 KeyboardEnable = FALSE;\r
468 Count = 1;\r
469 State = PS2_READ_BYTE_ONE;\r
470\r
471 //\r
472 // State machine to get mouse packet\r
473 //\r
474 while (1) {\r
475\r
476 switch (State) {\r
477 case PS2_READ_BYTE_ONE:\r
478 //\r
479 // Read mouse first byte data, if failed, immediately return\r
480 //\r
481 KbcDisableAux (MouseDev->IsaIo);\r
482 Status = PS2MouseRead (MouseDev->IsaIo, &Data, &Count, State);\r
483 if (EFI_ERROR (Status)) {\r
484 KbcEnableAux (MouseDev->IsaIo);\r
485 return EFI_NOT_READY;\r
486 }\r
487\r
488 if (Count != 1) {\r
489 KbcEnableAux (MouseDev->IsaIo);\r
490 return EFI_NOT_READY;\r
491 }\r
492\r
493 if (IS_PS2_SYNC_BYTE (Data)) {\r
494 Packet[0] = Data;\r
495 State = PS2_READ_DATA_BYTE;\r
496\r
497 CheckKbStatus (MouseDev->IsaIo, &KeyboardEnable);\r
498 KbcDisableKb (MouseDev->IsaIo);\r
499 KbcEnableAux (MouseDev->IsaIo);\r
500 }\r
501 break;\r
502\r
503 case PS2_READ_DATA_BYTE:\r
504 Count = 2;\r
505 Status = PS2MouseRead (MouseDev->IsaIo, (Packet + 1), &Count, State);\r
506 if (EFI_ERROR (Status)) {\r
507 if (KeyboardEnable) {\r
508 KbcEnableKb (MouseDev->IsaIo);\r
509 }\r
510\r
511 return EFI_NOT_READY;\r
512 }\r
513\r
514 if (Count != 2) {\r
515 if (KeyboardEnable) {\r
516 KbcEnableKb (MouseDev->IsaIo);\r
517 }\r
518\r
519 return EFI_NOT_READY;\r
520 }\r
521\r
522 State = PS2_PROCESS_PACKET;\r
523 break;\r
524\r
525 case PS2_PROCESS_PACKET:\r
526 if (KeyboardEnable) {\r
527 KbcEnableKb (MouseDev->IsaIo);\r
528 }\r
529 //\r
530 // Decode the packet\r
531 //\r
532 RelativeMovementX = Packet[1];\r
533 RelativeMovementY = Packet[2];\r
534 //\r
535 // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 \r
536 // Byte 0 | Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn \r
537 // Byte 1 | 8 bit X Movement \r
538 // Byte 2 | 8 bit Y Movement \r
539 // \r
540 // X sign bit + 8 bit X Movement : 9-bit signed twos complement integer that presents the relative displacement of the device in the X direction since the last data transmission.\r
541 // Y sign bit + 8 bit Y Movement : Same as X sign bit + 8 bit X Movement.\r
542 //\r
543 //\r
544 // First, Clear X and Y high 8 bits\r
545 //\r
546 RelativeMovementX = (INT16) (RelativeMovementX & 0xFF); \r
547 RelativeMovementY = (INT16) (RelativeMovementY & 0xFF); \r
548 //\r
549 // Second, if the 9-bit signed twos complement integer is negative, set the high 8 bit 0xff\r
550 //\r
551 if ((Packet[0] & 0x10) != 0) {\r
552 RelativeMovementX = (INT16) (RelativeMovementX | 0xFF00);\r
553 }\r
554 if ((Packet[0] & 0x20) != 0) {\r
555 RelativeMovementY = (INT16) (RelativeMovementY | 0xFF00);\r
556 }\r
557\r
558 \r
559 RButton = (UINT8) (Packet[0] & 0x2);\r
560 LButton = (UINT8) (Packet[0] & 0x1);\r
561\r
562 //\r
563 // Update mouse state\r
564 //\r
565 MouseDev->State.RelativeMovementX += RelativeMovementX;\r
566 MouseDev->State.RelativeMovementY -= RelativeMovementY;\r
567 MouseDev->State.RightButton = (UINT8) (RButton ? TRUE : FALSE);\r
568 MouseDev->State.LeftButton = (UINT8) (LButton ? TRUE : FALSE);\r
569 MouseDev->StateChanged = TRUE;\r
570\r
571 return EFI_SUCCESS;\r
572 }\r
573 }\r
574}\r
575\r
576EFI_STATUS\r
577PS2MouseRead (\r
578 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
579 OUT VOID *Buffer,\r
580 IN OUT UINTN *BufSize,\r
581 IN UINTN State\r
582 )\r
583/*++\r
584\r
585Routine Description:\r
586\r
587 GC_TODO: Add function description\r
588\r
589Arguments:\r
590\r
591 IsaIo - GC_TODO: add argument description\r
592 Buffer - GC_TODO: add argument description\r
593 BufSize - GC_TODO: add argument description\r
594 State - GC_TODO: add argument description\r
595\r
596Returns:\r
597\r
598 GC_TODO: add return values\r
599\r
600--*/\r
601{\r
602 EFI_STATUS Status;\r
603 UINTN BytesRead;\r
604\r
605 Status = EFI_SUCCESS;\r
606 BytesRead = 0;\r
607\r
608 if (State == PS2_READ_BYTE_ONE) {\r
609 //\r
610 // Check input for mouse\r
611 //\r
612 Status = CheckForInput (IsaIo);\r
613\r
614 if (EFI_ERROR (Status)) {\r
615 return Status;\r
616 }\r
617 }\r
618\r
619 while (BytesRead < *BufSize) {\r
620\r
621 Status = WaitOutputFull (IsaIo, TIMEOUT);\r
622 if (EFI_ERROR (Status)) {\r
623 break;\r
624 }\r
625\r
626 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Buffer);\r
627\r
628 BytesRead++;\r
629 Buffer = (UINT8 *) Buffer + 1;\r
630 }\r
631 //\r
632 // Verify the correct number of bytes read\r
633 //\r
634 if (BytesRead == 0 || BytesRead != *BufSize) {\r
635 Status = EFI_NOT_FOUND;\r
636 }\r
637\r
638 *BufSize = BytesRead;\r
639 return Status;\r
640}\r
641//\r
642// 8042 I/O function\r
643//\r
644EFI_STATUS\r
645Out8042Command (\r
646 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
647 IN UINT8 Command\r
648 )\r
649/*++\r
650\r
651Routine Description:\r
652\r
653 GC_TODO: Add function description\r
654\r
655Arguments:\r
656\r
657 IsaIo - GC_TODO: add argument description\r
658 Command - GC_TODO: add argument description\r
659\r
660Returns:\r
661\r
662 EFI_SUCCESS - GC_TODO: Add description for return value\r
663\r
664--*/\r
665{\r
666 EFI_STATUS Status;\r
667 UINT8 Data;\r
668\r
669 //\r
670 // Wait keyboard controller input buffer empty\r
671 //\r
672 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
673 if (EFI_ERROR (Status)) {\r
674 return Status;\r
675 }\r
676 //\r
677 // Send command\r
678 //\r
679 Data = Command;\r
680 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
681\r
682 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
683 if (EFI_ERROR (Status)) {\r
684 return Status;\r
685 }\r
686\r
687 return EFI_SUCCESS;\r
688}\r
689\r
690EFI_STATUS\r
691Out8042Data (\r
692 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
693 IN UINT8 Data\r
694 )\r
695/*++\r
696\r
697Routine Description:\r
698\r
699 GC_TODO: Add function description\r
700\r
701Arguments:\r
702\r
703 IsaIo - GC_TODO: add argument description\r
704 Data - GC_TODO: add argument description\r
705\r
706Returns:\r
707\r
708 EFI_SUCCESS - GC_TODO: Add description for return value\r
709\r
710--*/\r
711{\r
712 EFI_STATUS Status;\r
713 UINT8 temp;\r
714 //\r
715 // Wait keyboard controller input buffer empty\r
716 //\r
717 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
718 if (EFI_ERROR (Status)) {\r
719 return Status;\r
720 }\r
721\r
722 temp = Data;\r
723 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &temp);\r
724\r
725 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
726 if (EFI_ERROR (Status)) {\r
727 return Status;\r
728 }\r
729\r
730 return EFI_SUCCESS;\r
731}\r
732\r
733EFI_STATUS\r
734In8042Data (\r
735 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
736 IN OUT UINT8 *Data\r
737 )\r
738/*++\r
739\r
740Routine Description:\r
741\r
742 GC_TODO: Add function description\r
743\r
744Arguments:\r
745\r
746 IsaIo - GC_TODO: add argument description\r
747 Data - GC_TODO: add argument description\r
748\r
749Returns:\r
750\r
751 EFI_TIMEOUT - GC_TODO: Add description for return value\r
752 EFI_SUCCESS - GC_TODO: Add description for return value\r
753\r
754--*/\r
755{\r
756 UINTN Delay;\r
757 UINT8 temp;\r
758\r
759 Delay = TIMEOUT / 50;\r
760\r
761 do {\r
762 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &temp);\r
763\r
764 //\r
765 // Check keyboard controller status bit 0(output buffer status)\r
766 //\r
767 if ((temp & KBC_OUTB) == KBC_OUTB) {\r
768 break;\r
769 }\r
770\r
771 gBS->Stall (50);\r
772 Delay--;\r
773 } while (Delay);\r
774\r
775 if (Delay == 0) {\r
776 return EFI_TIMEOUT;\r
777 }\r
778\r
779 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data);\r
780\r
781 return EFI_SUCCESS;\r
782}\r
783\r
784EFI_STATUS\r
785Out8042AuxCommand (\r
786 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
787 IN UINT8 Command,\r
788 IN BOOLEAN Resend\r
789 )\r
790/*++\r
791\r
792Routine Description:\r
793\r
794 GC_TODO: Add function description\r
795\r
796Arguments:\r
797\r
798 IsaIo - GC_TODO: add argument description\r
799 Command - GC_TODO: add argument description\r
800 Resend - GC_TODO: add argument description\r
801\r
802Returns:\r
803\r
804 EFI_SUCCESS - GC_TODO: Add description for return value\r
805 EFI_DEVICE_ERROR - GC_TODO: Add description for return value\r
806 EFI_DEVICE_ERROR - GC_TODO: Add description for return value\r
807 EFI_SUCCESS - GC_TODO: Add description for return value\r
808\r
809--*/\r
810{\r
811 EFI_STATUS Status;\r
812 UINT8 Data;\r
813\r
814 //\r
815 // Wait keyboard controller input buffer empty\r
816 //\r
817 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
818 if (EFI_ERROR (Status)) {\r
819 return Status;\r
820 }\r
821 //\r
822 // Send write to auxiliary device command\r
823 //\r
824 Data = WRITE_AUX_DEV;\r
825 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
826\r
827 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
828 if (EFI_ERROR (Status)) {\r
829 return Status;\r
830 }\r
831 //\r
832 // Send auxiliary device command\r
833 //\r
834 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Command);\r
835\r
836 //\r
837 // Read return code\r
838 //\r
839 Status = In8042AuxData (IsaIo, &Data);\r
840 if (EFI_ERROR (Status)) {\r
841 return Status;\r
842 }\r
843\r
844 if (Data == PS2_ACK) {\r
845 //\r
846 // Receive mouse acknowledge, command send success\r
847 //\r
848 return EFI_SUCCESS;\r
849\r
850 } else if (Resend) {\r
851 //\r
852 // Resend fail\r
853 //\r
854 return EFI_DEVICE_ERROR;\r
855\r
856 } else if (Data == PS2_RESEND) {\r
857 //\r
858 // Resend command\r
859 //\r
860 Status = Out8042AuxCommand (IsaIo, Command, TRUE);\r
861 if (EFI_ERROR (Status)) {\r
862 return Status;\r
863 }\r
864\r
865 } else {\r
866 //\r
867 // Invalid return code\r
868 //\r
869 return EFI_DEVICE_ERROR;\r
870\r
871 }\r
872\r
873 return EFI_SUCCESS;\r
874}\r
875\r
876EFI_STATUS\r
877Out8042AuxData (\r
878 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
879 IN UINT8 Data\r
880 )\r
881/*++\r
882\r
883Routine Description:\r
884\r
885 GC_TODO: Add function description\r
886\r
887Arguments:\r
888\r
889 IsaIo - GC_TODO: add argument description\r
890 Data - GC_TODO: add argument description\r
891\r
892Returns:\r
893\r
894 EFI_SUCCESS - GC_TODO: Add description for return value\r
895\r
896--*/\r
897{\r
898 EFI_STATUS Status;\r
899 UINT8 Temp;\r
900 //\r
901 // Wait keyboard controller input buffer empty\r
902 //\r
903 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
904 if (EFI_ERROR (Status)) {\r
905 return Status;\r
906 }\r
907 //\r
908 // Send write to auxiliary device command\r
909 //\r
910 Temp = WRITE_AUX_DEV;\r
911 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Temp);\r
912\r
913 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
914 if (EFI_ERROR (Status)) {\r
915 return Status;\r
916 }\r
917\r
918 Temp = Data;\r
919 IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Temp);\r
920\r
921 Status = WaitInputEmpty (IsaIo, TIMEOUT);\r
922 if (EFI_ERROR (Status)) {\r
923 return Status;\r
924 }\r
925\r
926 return EFI_SUCCESS;\r
927}\r
928\r
929EFI_STATUS\r
930In8042AuxData (\r
931 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
932 IN OUT UINT8 *Data\r
933 )\r
934/*++\r
935\r
936Routine Description:\r
937\r
938 GC_TODO: Add function description\r
939\r
940Arguments:\r
941\r
942 IsaIo - GC_TODO: add argument description\r
943 Data - GC_TODO: add argument description\r
944\r
945Returns:\r
946\r
947 EFI_SUCCESS - GC_TODO: Add description for return value\r
948\r
949--*/\r
950{\r
951 EFI_STATUS Status;\r
952\r
953 //\r
954 // wait for output data\r
955 //\r
956 Status = WaitOutputFull (IsaIo, BAT_TIMEOUT);\r
957 if (EFI_ERROR (Status)) {\r
958 return Status;\r
959 }\r
960\r
961 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data);\r
962\r
963 return EFI_SUCCESS;\r
964}\r
965\r
966EFI_STATUS\r
967CheckForInput (\r
968 IN EFI_ISA_IO_PROTOCOL *IsaIo\r
969 )\r
970/*++\r
971\r
972Routine Description:\r
973\r
974 GC_TODO: Add function description\r
975\r
976Arguments:\r
977\r
978 IsaIo - GC_TODO: add argument description\r
979\r
980Returns:\r
981\r
982 EFI_NOT_READY - GC_TODO: Add description for return value\r
983 EFI_SUCCESS - GC_TODO: Add description for return value\r
984\r
985--*/\r
986{\r
987 UINT8 Data;\r
988\r
989 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
990\r
991 //\r
992 // Check keyboard controller status, if it is output buffer full and for auxiliary device\r
993 //\r
994 if ((Data & (KBC_OUTB | KBC_AUXB)) != (KBC_OUTB | KBC_AUXB)) {\r
995 return EFI_NOT_READY;\r
996 }\r
997\r
998 return EFI_SUCCESS;\r
999}\r
1000\r
1001EFI_STATUS\r
1002WaitInputEmpty (\r
1003 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
1004 IN UINTN Timeout\r
1005 )\r
1006/*++\r
1007\r
1008Routine Description:\r
1009\r
1010 GC_TODO: Add function description\r
1011\r
1012Arguments:\r
1013\r
1014 IsaIo - GC_TODO: add argument description\r
1015 Timeout - GC_TODO: add argument description\r
1016\r
1017Returns:\r
1018\r
1019 EFI_TIMEOUT - GC_TODO: Add description for return value\r
1020 EFI_SUCCESS - GC_TODO: Add description for return value\r
1021\r
1022--*/\r
1023{\r
1024 UINTN Delay;\r
1025 UINT8 Data;\r
1026\r
1027 Delay = Timeout / 50;\r
1028\r
1029 do {\r
1030 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
1031\r
1032 //\r
1033 // Check keyboard controller status bit 1(input buffer status)\r
1034 //\r
1035 if ((Data & KBC_INPB) == 0) {\r
1036 break;\r
1037 }\r
1038\r
1039 gBS->Stall (50);\r
1040 Delay--;\r
1041 } while (Delay);\r
1042\r
1043 if (Delay == 0) {\r
1044 return EFI_TIMEOUT;\r
1045 }\r
1046\r
1047 return EFI_SUCCESS;\r
1048}\r
1049\r
1050EFI_STATUS\r
1051WaitOutputFull (\r
1052 IN EFI_ISA_IO_PROTOCOL *IsaIo,\r
1053 IN UINTN Timeout\r
1054 )\r
1055/*++\r
1056\r
1057Routine Description:\r
1058\r
1059 GC_TODO: Add function description\r
1060\r
1061Arguments:\r
1062\r
1063 IsaIo - GC_TODO: add argument description\r
1064 Timeout - GC_TODO: add argument description\r
1065\r
1066Returns:\r
1067\r
1068 EFI_TIMEOUT - GC_TODO: Add description for return value\r
1069 EFI_SUCCESS - GC_TODO: Add description for return value\r
1070\r
1071--*/\r
1072{\r
1073 UINTN Delay;\r
1074 UINT8 Data;\r
1075\r
1076 Delay = Timeout / 50;\r
1077\r
1078 do {\r
1079 IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
1080\r
1081 //\r
1082 // Check keyboard controller status bit 0(output buffer status)\r
1083 // & bit5(output buffer for auxiliary device)\r
1084 //\r
1085 if ((Data & (KBC_OUTB | KBC_AUXB)) == (KBC_OUTB | KBC_AUXB)) {\r
1086 break;\r
1087 }\r
1088\r
1089 gBS->Stall (50);\r
1090 Delay--;\r
1091 } while (Delay);\r
1092\r
1093 if (Delay == 0) {\r
1094 return EFI_TIMEOUT;\r
1095 }\r
1096\r
1097 return EFI_SUCCESS;\r
1098}\r