]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClass.c
Correct all header files for doxygen format and correct the license issue for VgaClas...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / Console / VgaClassDxe / VgaClass.c
CommitLineData
3db51098 1/**@file\r
2 This driver produces a VGA console.\r
3\r
4Copyright (c) 2006, Intel Corporation \r
5All rights reserved. This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php \r
9 \r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12\r
13**/\r
e081218d 14\r
15#include "VgaClass.h"\r
16\r
17//\r
18// EFI Driver Binding Protocol for the VGA Class Driver\r
19//\r
20EFI_DRIVER_BINDING_PROTOCOL gVgaClassDriverBinding = {\r
21 VgaClassDriverBindingSupported,\r
22 VgaClassDriverBindingStart,\r
23 VgaClassDriverBindingStop,\r
24 0xa,\r
25 NULL,\r
26 NULL\r
27};\r
28\r
29/**\r
30 The user Entry Point for module VgaClass. The user code starts with this function.\r
31\r
32 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
33 @param[in] SystemTable A pointer to the EFI System Table.\r
34 \r
35 @retval EFI_SUCCESS The entry point is executed successfully.\r
36 @retval other Some error occurs when executing this entry point.\r
37\r
38**/\r
39EFI_STATUS\r
40EFIAPI\r
41InitializeVgaClass(\r
42 IN EFI_HANDLE ImageHandle,\r
43 IN EFI_SYSTEM_TABLE *SystemTable\r
44 )\r
45{\r
46 EFI_STATUS Status;\r
47\r
48 //\r
49 // Install driver model protocol(s).\r
50 //\r
51 Status = EfiLibInstallAllDriverProtocols (\r
52 ImageHandle,\r
53 SystemTable,\r
54 &gVgaClassDriverBinding,\r
55 ImageHandle,\r
56 &gVgaClassComponentName,\r
57 NULL,\r
58 NULL\r
59 );\r
60 ASSERT_EFI_ERROR (Status);\r
61\r
62\r
63 return Status;\r
64}\r
65\r
66//\r
67// Local variables\r
68//\r
69static CHAR16 CrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
70\r
71typedef struct {\r
72 CHAR16 Unicode;\r
73 CHAR8 PcAnsi;\r
74 CHAR8 Ascii;\r
75} UNICODE_TO_CHAR;\r
76\r
77//\r
78// This list is used to define the valid extend chars.\r
79// It also provides a mapping from Unicode to PCANSI or\r
80// ASCII. The ASCII mapping we just made up.\r
81//\r
82//\r
83STATIC UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = {\r
84 {\r
85 BOXDRAW_HORIZONTAL,\r
86 0xc4,\r
87 L'-'\r
88 },\r
89 {\r
90 BOXDRAW_VERTICAL,\r
91 0xb3,\r
92 L'|'\r
93 },\r
94 {\r
95 BOXDRAW_DOWN_RIGHT,\r
96 0xda,\r
97 L'/'\r
98 },\r
99 {\r
100 BOXDRAW_DOWN_LEFT,\r
101 0xbf,\r
102 L'\\'\r
103 },\r
104 {\r
105 BOXDRAW_UP_RIGHT,\r
106 0xc0,\r
107 L'\\'\r
108 },\r
109 {\r
110 BOXDRAW_UP_LEFT,\r
111 0xd9,\r
112 L'/'\r
113 },\r
114 {\r
115 BOXDRAW_VERTICAL_RIGHT,\r
116 0xc3,\r
117 L'|'\r
118 },\r
119 {\r
120 BOXDRAW_VERTICAL_LEFT,\r
121 0xb4,\r
122 L'|'\r
123 },\r
124 {\r
125 BOXDRAW_DOWN_HORIZONTAL,\r
126 0xc2,\r
127 L'+'\r
128 },\r
129 {\r
130 BOXDRAW_UP_HORIZONTAL,\r
131 0xc1,\r
132 L'+'\r
133 },\r
134 {\r
135 BOXDRAW_VERTICAL_HORIZONTAL,\r
136 0xc5,\r
137 L'+'\r
138 },\r
139 {\r
140 BOXDRAW_DOUBLE_HORIZONTAL,\r
141 0xcd,\r
142 L'-'\r
143 },\r
144 {\r
145 BOXDRAW_DOUBLE_VERTICAL,\r
146 0xba,\r
147 L'|'\r
148 },\r
149 {\r
150 BOXDRAW_DOWN_RIGHT_DOUBLE,\r
151 0xd5,\r
152 L'/'\r
153 },\r
154 {\r
155 BOXDRAW_DOWN_DOUBLE_RIGHT,\r
156 0xd6,\r
157 L'/'\r
158 },\r
159 {\r
160 BOXDRAW_DOUBLE_DOWN_RIGHT,\r
161 0xc9,\r
162 L'/'\r
163 },\r
164 {\r
165 BOXDRAW_DOWN_LEFT_DOUBLE,\r
166 0xb8,\r
167 L'\\'\r
168 },\r
169 {\r
170 BOXDRAW_DOWN_DOUBLE_LEFT,\r
171 0xb7,\r
172 L'\\'\r
173 },\r
174 {\r
175 BOXDRAW_DOUBLE_DOWN_LEFT,\r
176 0xbb,\r
177 L'\\'\r
178 },\r
179 {\r
180 BOXDRAW_UP_RIGHT_DOUBLE,\r
181 0xd4,\r
182 L'\\'\r
183 },\r
184 {\r
185 BOXDRAW_UP_DOUBLE_RIGHT,\r
186 0xd3,\r
187 L'\\'\r
188 },\r
189 {\r
190 BOXDRAW_DOUBLE_UP_RIGHT,\r
191 0xc8,\r
192 L'\\'\r
193 },\r
194 {\r
195 BOXDRAW_UP_LEFT_DOUBLE,\r
196 0xbe,\r
197 L'/'\r
198 },\r
199 {\r
200 BOXDRAW_UP_DOUBLE_LEFT,\r
201 0xbd,\r
202 L'/'\r
203 },\r
204 {\r
205 BOXDRAW_DOUBLE_UP_LEFT,\r
206 0xbc,\r
207 L'/'\r
208 },\r
209 {\r
210 BOXDRAW_VERTICAL_RIGHT_DOUBLE,\r
211 0xc6,\r
212 L'|'\r
213 },\r
214 {\r
215 BOXDRAW_VERTICAL_DOUBLE_RIGHT,\r
216 0xc7,\r
217 L'|'\r
218 },\r
219 {\r
220 BOXDRAW_DOUBLE_VERTICAL_RIGHT,\r
221 0xcc,\r
222 L'|'\r
223 },\r
224 {\r
225 BOXDRAW_VERTICAL_LEFT_DOUBLE,\r
226 0xb5,\r
227 L'|'\r
228 },\r
229 {\r
230 BOXDRAW_VERTICAL_DOUBLE_LEFT,\r
231 0xb6,\r
232 L'|'\r
233 },\r
234 {\r
235 BOXDRAW_DOUBLE_VERTICAL_LEFT,\r
236 0xb9,\r
237 L'|'\r
238 },\r
239 {\r
240 BOXDRAW_DOWN_HORIZONTAL_DOUBLE,\r
241 0xd1,\r
242 L'+'\r
243 },\r
244 {\r
245 BOXDRAW_DOWN_DOUBLE_HORIZONTAL,\r
246 0xd2,\r
247 L'+'\r
248 },\r
249 {\r
250 BOXDRAW_DOUBLE_DOWN_HORIZONTAL,\r
251 0xcb,\r
252 L'+'\r
253 },\r
254 {\r
255 BOXDRAW_UP_HORIZONTAL_DOUBLE,\r
256 0xcf,\r
257 L'+'\r
258 },\r
259 {\r
260 BOXDRAW_UP_DOUBLE_HORIZONTAL,\r
261 0xd0,\r
262 L'+'\r
263 },\r
264 {\r
265 BOXDRAW_DOUBLE_UP_HORIZONTAL,\r
266 0xca,\r
267 L'+'\r
268 },\r
269 {\r
270 BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE,\r
271 0xd8,\r
272 L'+'\r
273 },\r
274 {\r
275 BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL,\r
276 0xd7,\r
277 L'+'\r
278 },\r
279 {\r
280 BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL,\r
281 0xce,\r
282 L'+'\r
283 },\r
284\r
285 {\r
286 BLOCKELEMENT_FULL_BLOCK,\r
287 0xdb,\r
288 L'*'\r
289 },\r
290 {\r
291 BLOCKELEMENT_LIGHT_SHADE,\r
292 0xb0,\r
293 L'+'\r
294 },\r
295\r
296 {\r
297 GEOMETRICSHAPE_UP_TRIANGLE,\r
298 0x1e,\r
299 L'^'\r
300 },\r
301 {\r
302 GEOMETRICSHAPE_RIGHT_TRIANGLE,\r
303 0x10,\r
304 L'>'\r
305 },\r
306 {\r
307 GEOMETRICSHAPE_DOWN_TRIANGLE,\r
308 0x1f,\r
309 L'v'\r
310 },\r
311 {\r
312 GEOMETRICSHAPE_LEFT_TRIANGLE,\r
313 0x11,\r
314 L'<'\r
315 },\r
316\r
317 {\r
318 ARROW_LEFT,\r
319 0x3c,\r
320 L'<'\r
321 },\r
322\r
323 {\r
324 ARROW_UP,\r
325 0x18,\r
326 L'^'\r
327 },\r
328\r
329 {\r
330 ARROW_RIGHT,\r
331 0x3e,\r
332 L'>'\r
333 },\r
334\r
335 {\r
336 ARROW_DOWN,\r
337 0x19,\r
338 L'v'\r
339 },\r
340\r
341 {\r
342 0x0000,\r
343 0x00,\r
344 0x00\r
345 }\r
346};\r
347\r
348//\r
349// Private worker functions\r
350//\r
351STATIC\r
352VOID\r
353SetVideoCursorPosition (\r
354 IN VGA_CLASS_DEV *VgaClassDev,\r
355 IN UINTN Column,\r
356 IN UINTN Row,\r
357 IN UINTN MaxColumn\r
358 );\r
359\r
360STATIC\r
361VOID\r
362WriteCrtc (\r
363 IN VGA_CLASS_DEV *VgaClassDev,\r
364 IN UINT16 Address,\r
365 IN UINT8 Data\r
366 );\r
367\r
368STATIC\r
369BOOLEAN\r
370LibIsValidTextGraphics (\r
371 IN CHAR16 Graphic,\r
372 OUT CHAR8 *PcAnsi, OPTIONAL\r
373 OUT CHAR8 *Ascii OPTIONAL\r
374 );\r
375\r
376STATIC\r
377BOOLEAN\r
378IsValidAscii (\r
379 IN CHAR16 Ascii\r
380 );\r
381\r
382STATIC\r
383BOOLEAN\r
384IsValidEfiCntlChar (\r
385 IN CHAR16 c\r
386 );\r
387\r
388EFI_STATUS\r
389EFIAPI\r
390VgaClassDriverBindingSupported (\r
391 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
392 IN EFI_HANDLE Controller,\r
393 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
394 )\r
395/*++\r
396 \r
397 Routine Description:\r
398 \r
399 Supported.\r
400 \r
401 Arguments:\r
402 \r
403 (Standard DriverBinding Protocol Supported() function)\r
404 \r
405 Returns:\r
406 \r
407 EFI_STATUS\r
408 \r
409--*/\r
410// GC_TODO: This - add argument and description to function comment\r
411// GC_TODO: Controller - add argument and description to function comment\r
412// GC_TODO: RemainingDevicePath - add argument and description to function comment\r
413{\r
414 EFI_STATUS Status;\r
415 EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort;\r
416\r
417 //\r
418 // Open the IO Abstraction(s) needed to perform the supported test\r
419 //\r
420 Status = gBS->OpenProtocol (\r
421 Controller,\r
422 &gEfiVgaMiniPortProtocolGuid,\r
423 (VOID **) &VgaMiniPort,\r
424 This->DriverBindingHandle,\r
425 Controller,\r
426 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
427 );\r
428 if (EFI_ERROR (Status)) {\r
429 return Status;\r
430 }\r
431 //\r
432 // Open the IO Abstraction(s) needed to perform the supported test\r
433 //\r
434 Status = gBS->OpenProtocol (\r
435 Controller,\r
436 &gEfiPciIoProtocolGuid,\r
437 NULL,\r
438 This->DriverBindingHandle,\r
439 Controller,\r
440 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
441 );\r
442 if (EFI_ERROR (Status)) {\r
443 return Status;\r
444 }\r
445\r
446 return Status;\r
447}\r
448\r
449EFI_STATUS\r
450EFIAPI\r
451VgaClassDriverBindingStart (\r
452 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
453 IN EFI_HANDLE Controller,\r
454 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
455 )\r
456/*++\r
457 \r
458 Routine Description:\r
459 \r
460 Layers the Simple Text Output Protocol on top of the \r
461 VGA Mini Port Protocol\r
462 \r
463 Arguments:\r
464 \r
465 (Standard DriverBinding Protocol Start() function)\r
466 \r
467 Returns:\r
468 \r
469 EFI_STATUS\r
470 \r
471--*/\r
472// GC_TODO: This - add argument and description to function comment\r
473// GC_TODO: Controller - add argument and description to function comment\r
474// GC_TODO: RemainingDevicePath - add argument and description to function comment\r
475// GC_TODO: EFI_OUT_OF_RESOURCES - add return value to function comment\r
476{\r
477 EFI_STATUS Status;\r
478 EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort;\r
479 EFI_PCI_IO_PROTOCOL *PciIo;\r
480 VGA_CLASS_DEV *VgaClassPrivate;\r
481 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
482\r
483 Status = gBS->HandleProtocol (\r
484 Controller,\r
485 &gEfiDevicePathProtocolGuid,\r
486 (VOID **) &DevicePath\r
487 );\r
488 if (EFI_ERROR (Status)) {\r
489 return Status;\r
490 }\r
491 //\r
492 // Report that VGA Class driver is being enabled\r
493 //\r
494 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
495 EFI_PROGRESS_CODE,\r
496 EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_ENABLE,\r
497 DevicePath\r
498 );\r
499\r
500 //\r
501 // Open the IO Abstraction(s) needed\r
502 //\r
503 Status = gBS->OpenProtocol (\r
504 Controller,\r
505 &gEfiPciIoProtocolGuid,\r
506 (VOID **) &PciIo,\r
507 This->DriverBindingHandle,\r
508 Controller,\r
509 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
510 );\r
511 if (EFI_ERROR (Status)) {\r
512 return Status;\r
513 }\r
514\r
515 Status = gBS->OpenProtocol (\r
516 Controller,\r
517 &gEfiVgaMiniPortProtocolGuid,\r
518 (VOID **) &VgaMiniPort,\r
519 This->DriverBindingHandle,\r
520 Controller,\r
521 EFI_OPEN_PROTOCOL_BY_DRIVER\r
522 );\r
523 if (EFI_ERROR (Status)) {\r
524 return Status;\r
525 }\r
526 //\r
527 // Allocate the private device structure\r
528 //\r
529 Status = gBS->AllocatePool (\r
530 EfiBootServicesData,\r
531 sizeof (VGA_CLASS_DEV),\r
532 (VOID **) &VgaClassPrivate\r
533 );\r
534 if (EFI_ERROR (Status)) {\r
535 gBS->CloseProtocol (\r
536 Controller,\r
537 &gEfiVgaMiniPortProtocolGuid,\r
538 This->DriverBindingHandle,\r
539 Controller\r
540 );\r
541 return EFI_OUT_OF_RESOURCES;\r
542 }\r
543\r
544 ZeroMem (VgaClassPrivate, sizeof (VGA_CLASS_DEV));\r
545\r
546 //\r
547 // Initialize the private device structure\r
548 //\r
549 VgaClassPrivate->Signature = VGA_CLASS_DEV_SIGNATURE;\r
550 VgaClassPrivate->Handle = Controller;\r
551 VgaClassPrivate->VgaMiniPort = VgaMiniPort;\r
552 VgaClassPrivate->PciIo = PciIo;\r
553\r
554 VgaClassPrivate->SimpleTextOut.Reset = VgaClassReset;\r
555 VgaClassPrivate->SimpleTextOut.OutputString = VgaClassOutputString;\r
556 VgaClassPrivate->SimpleTextOut.TestString = VgaClassTestString;\r
557 VgaClassPrivate->SimpleTextOut.ClearScreen = VgaClassClearScreen;\r
558 VgaClassPrivate->SimpleTextOut.SetAttribute = VgaClassSetAttribute;\r
559 VgaClassPrivate->SimpleTextOut.SetCursorPosition = VgaClassSetCursorPosition;\r
560 VgaClassPrivate->SimpleTextOut.EnableCursor = VgaClassEnableCursor;\r
561 VgaClassPrivate->SimpleTextOut.QueryMode = VgaClassQueryMode;\r
562 VgaClassPrivate->SimpleTextOut.SetMode = VgaClassSetMode;\r
563\r
564 VgaClassPrivate->SimpleTextOut.Mode = &VgaClassPrivate->SimpleTextOutputMode;\r
565 VgaClassPrivate->SimpleTextOutputMode.MaxMode = VgaMiniPort->MaxMode;\r
566 VgaClassPrivate->DevicePath = DevicePath;\r
567\r
568 Status = VgaClassPrivate->SimpleTextOut.SetAttribute (\r
569 &VgaClassPrivate->SimpleTextOut,\r
570 EFI_TEXT_ATTR (EFI_WHITE,\r
571 EFI_BLACK)\r
572 );\r
573 if (EFI_ERROR (Status)) {\r
574 goto ErrorExit;\r
575 }\r
576\r
577 Status = VgaClassPrivate->SimpleTextOut.Reset (\r
578 &VgaClassPrivate->SimpleTextOut,\r
579 FALSE\r
580 );\r
581 if (EFI_ERROR (Status)) {\r
582 goto ErrorExit;\r
583 }\r
584\r
585 Status = VgaClassPrivate->SimpleTextOut.EnableCursor (\r
586 &VgaClassPrivate->SimpleTextOut,\r
587 TRUE\r
588 );\r
589 if (EFI_ERROR (Status)) {\r
590 goto ErrorExit;\r
591 }\r
592\r
593 Status = gBS->InstallMultipleProtocolInterfaces (\r
594 &Controller,\r
595 &gEfiSimpleTextOutProtocolGuid,\r
596 &VgaClassPrivate->SimpleTextOut,\r
597 NULL\r
598 );\r
599\r
600 return Status;\r
601\r
602ErrorExit:\r
603 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
604 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
605 EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_CONTROLLER_ERROR,\r
606 DevicePath\r
607 );\r
608\r
609 return Status;\r
610\r
611}\r
612\r
613EFI_STATUS\r
614EFIAPI\r
615VgaClassDriverBindingStop (\r
616 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
617 IN EFI_HANDLE Controller,\r
618 IN UINTN NumberOfChildren,\r
619 IN EFI_HANDLE *ChildHandleBuffer\r
620 )\r
621/*++\r
622 \r
623 Routine Description:\r
624 \r
625 Stop.\r
626 \r
627 Arguments:\r
628 \r
629 (Standard DriverBinding Protocol Stop() function)\r
630 \r
631 Returns:\r
632 \r
633 EFI_STATUS\r
634 \r
635--*/\r
636// GC_TODO: This - add argument and description to function comment\r
637// GC_TODO: Controller - add argument and description to function comment\r
638// GC_TODO: NumberOfChildren - add argument and description to function comment\r
639// GC_TODO: ChildHandleBuffer - add argument and description to function comment\r
640// GC_TODO: EFI_SUCCESS - add return value to function comment\r
641{\r
642 EFI_STATUS Status;\r
643 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
644 VGA_CLASS_DEV *VgaClassPrivate;\r
645\r
646 Status = gBS->OpenProtocol (\r
647 Controller,\r
648 &gEfiSimpleTextOutProtocolGuid,\r
649 (VOID **) &SimpleTextOut,\r
650 This->DriverBindingHandle,\r
651 Controller,\r
652 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
653 );\r
654 if (EFI_ERROR (Status)) {\r
655 return Status;\r
656 }\r
657\r
658 VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (SimpleTextOut);\r
659\r
660 //\r
661 // Report that VGA Class driver is being disabled\r
662 //\r
663 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
664 EFI_PROGRESS_CODE,\r
665 EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_DISABLE,\r
666 VgaClassPrivate->DevicePath\r
667 );\r
668\r
669 Status = gBS->UninstallProtocolInterface (\r
670 Controller,\r
671 &gEfiSimpleTextOutProtocolGuid,\r
672 &VgaClassPrivate->SimpleTextOut\r
673 );\r
674 if (EFI_ERROR (Status)) {\r
675 return Status;\r
676 }\r
677 //\r
678 // Release PCI I/O and VGA Mini Port Protocols on the controller handle.\r
679 //\r
680 gBS->CloseProtocol (\r
681 Controller,\r
682 &gEfiPciIoProtocolGuid,\r
683 This->DriverBindingHandle,\r
684 Controller\r
685 );\r
686\r
687 gBS->CloseProtocol (\r
688 Controller,\r
689 &gEfiVgaMiniPortProtocolGuid,\r
690 This->DriverBindingHandle,\r
691 Controller\r
692 );\r
693\r
694 gBS->FreePool (VgaClassPrivate);\r
695\r
696 return EFI_SUCCESS;\r
697}\r
698//\r
699// Simple Text Output Protocol Functions\r
700//\r
701EFI_STATUS\r
702EFIAPI\r
703VgaClassReset (\r
704 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
705 IN BOOLEAN ExtendedVerification\r
706 )\r
707/*++\r
708\r
709Routine Description:\r
710\r
711 GC_TODO: Add function description\r
712\r
713Arguments:\r
714\r
715 This - GC_TODO: add argument description\r
716 ExtendedVerification - GC_TODO: add argument description\r
717\r
718Returns:\r
719\r
720 GC_TODO: add return values\r
721\r
722--*/\r
723{\r
724 EFI_STATUS Status;\r
725 VGA_CLASS_DEV *VgaClassPrivate;\r
726\r
727 VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (This);\r
728\r
729 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
730 EFI_PROGRESS_CODE,\r
731 EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_RESET,\r
732 VgaClassPrivate->DevicePath\r
733 );\r
734\r
735 This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
736\r
737 Status = This->SetMode (This, 0);\r
738 if (EFI_ERROR (Status)) {\r
739 return Status;\r
740 }\r
741\r
742 return This->ClearScreen (This);\r
743}\r
744\r
745EFI_STATUS\r
746EFIAPI\r
747VgaClassOutputString (\r
748 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
749 IN CHAR16 *WString\r
750 )\r
751/*++\r
752\r
753Routine Description:\r
754\r
755 GC_TODO: Add function description\r
756\r
757Arguments:\r
758\r
759 This - GC_TODO: add argument description\r
760 WString - GC_TODO: add argument description\r
761\r
762Returns:\r
763\r
764 EFI_SUCCESS - GC_TODO: Add description for return value\r
765\r
766--*/\r
767{\r
768 EFI_STATUS Status;\r
769 VGA_CLASS_DEV *VgaClassDev;\r
770 EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
771 UINTN MaxColumn;\r
772 UINTN MaxRow;\r
773 UINT32 VideoChar;\r
774 CHAR8 GraphicChar;\r
775\r
776 VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);\r
777\r
778 Mode = This->Mode;\r
779\r
780 Status = This->QueryMode (\r
781 This,\r
782 Mode->Mode,\r
783 &MaxColumn,\r
784 &MaxRow\r
785 );\r
786 if (EFI_ERROR (Status)) {\r
787 return Status;\r
788 }\r
789\r
790 for (; *WString != CHAR_NULL; WString++) {\r
791\r
792 switch (*WString) {\r
793 case CHAR_BACKSPACE:\r
794 if (Mode->CursorColumn > 0) {\r
795 Mode->CursorColumn--;\r
796 }\r
797 break;\r
798\r
799 case CHAR_LINEFEED:\r
800 if (Mode->CursorRow == (INT32) (MaxRow - 1)) {\r
801 //\r
802 // Scroll the screen by copying the contents\r
803 // of the VGA display up one line\r
804 //\r
805 VgaClassDev->PciIo->CopyMem (\r
806 VgaClassDev->PciIo,\r
807 EfiPciIoWidthUint32,\r
808 VgaClassDev->VgaMiniPort->VgaMemoryBar,\r
809 VgaClassDev->VgaMiniPort->VgaMemoryOffset,\r
810 VgaClassDev->VgaMiniPort->VgaMemoryBar,\r
811 VgaClassDev->VgaMiniPort->VgaMemoryOffset + MaxColumn * 2,\r
812 ((MaxRow - 1) * MaxColumn) >> 1\r
813 );\r
814\r
815 //\r
816 // Print Blank Line of spaces with the current color attributes\r
817 //\r
818 VideoChar = (Mode->Attribute << 8) | ' ';\r
819 VideoChar = (VideoChar << 16) | VideoChar;\r
820 VgaClassDev->PciIo->Mem.Write (\r
821 VgaClassDev->PciIo,\r
822 EfiPciIoWidthFillUint32,\r
823 VgaClassDev->VgaMiniPort->VgaMemoryBar,\r
824 VgaClassDev->VgaMiniPort->VgaMemoryOffset + (MaxRow - 1) * MaxColumn * 2,\r
825 MaxColumn >> 1,\r
826 &VideoChar\r
827 );\r
828 }\r
829\r
830 if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
831 Mode->CursorRow++;\r
832 }\r
833 break;\r
834\r
835 case CHAR_CARRIAGE_RETURN:\r
836 Mode->CursorColumn = 0;\r
837 break;\r
838\r
839 default:\r
840 if (!LibIsValidTextGraphics (*WString, &GraphicChar, NULL)) {\r
841 //\r
842 // Just convert to ASCII\r
843 //\r
844 GraphicChar = (CHAR8) *WString;\r
845 if (!IsValidAscii (GraphicChar)) {\r
846 //\r
847 // Keep the API from supporting PCANSI Graphics chars\r
848 //\r
849 GraphicChar = '?';\r
850 }\r
851 }\r
852\r
853 VideoChar = (Mode->Attribute << 8) | GraphicChar;\r
854 VgaClassDev->PciIo->Mem.Write (\r
855 VgaClassDev->PciIo,\r
856 EfiPciIoWidthUint16,\r
857 VgaClassDev->VgaMiniPort->VgaMemoryBar,\r
858 VgaClassDev->VgaMiniPort->VgaMemoryOffset + ((Mode->CursorRow * MaxColumn + Mode->CursorColumn) * 2),\r
859 1,\r
860 &VideoChar\r
861 );\r
862\r
863 if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {\r
864 This->OutputString (This, CrLfString);\r
865 } else {\r
866 Mode->CursorColumn++;\r
867 }\r
868 break;\r
869 }\r
870 }\r
871\r
872 SetVideoCursorPosition (\r
873 VgaClassDev,\r
874 (UINTN) Mode->CursorColumn,\r
875 (UINTN) Mode->CursorRow,\r
876 MaxColumn\r
877 );\r
878\r
879 return EFI_SUCCESS;\r
880}\r
881\r
882EFI_STATUS\r
883EFIAPI\r
884VgaClassTestString (\r
885 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
886 IN CHAR16 *WString\r
887 )\r
888/*++\r
889\r
890Routine Description:\r
891\r
892 GC_TODO: Add function description\r
893\r
894Arguments:\r
895\r
896 This - GC_TODO: add argument description\r
897 WString - GC_TODO: add argument description\r
898\r
899Returns:\r
900\r
901 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
902 EFI_SUCCESS - GC_TODO: Add description for return value\r
903\r
904--*/\r
905{\r
906 while (*WString != 0x0000) {\r
907 if (!(IsValidAscii (*WString) || IsValidEfiCntlChar (*WString) || LibIsValidTextGraphics (*WString, NULL, NULL))) {\r
908 return EFI_UNSUPPORTED;\r
909 }\r
910\r
911 WString++;\r
912 }\r
913\r
914 return EFI_SUCCESS;\r
915}\r
916\r
917EFI_STATUS\r
918EFIAPI\r
919VgaClassClearScreen (\r
920 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
921 )\r
922/*++\r
923\r
924Routine Description:\r
925\r
926 GC_TODO: Add function description\r
927\r
928Arguments:\r
929\r
930 This - GC_TODO: add argument description\r
931\r
932Returns:\r
933\r
934 EFI_SUCCESS - GC_TODO: Add description for return value\r
935\r
936--*/\r
937{\r
938 EFI_STATUS Status;\r
939 VGA_CLASS_DEV *VgaClassDev;\r
940 UINTN MaxRow;\r
941 UINTN MaxColumn;\r
942 UINT32 VideoChar;\r
943\r
944 VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);\r
945\r
946 Status = This->QueryMode (\r
947 This,\r
948 This->Mode->Mode,\r
949 &MaxColumn,\r
950 &MaxRow\r
951 );\r
952 if (EFI_ERROR (Status)) {\r
953 return Status;\r
954 }\r
955\r
956 VideoChar = (This->Mode->Attribute << 8) | ' ';\r
957 VideoChar = (VideoChar << 16) | VideoChar;\r
958 VgaClassDev->PciIo->Mem.Write (\r
959 VgaClassDev->PciIo,\r
960 EfiPciIoWidthFillUint32,\r
961 VgaClassDev->VgaMiniPort->VgaMemoryBar,\r
962 VgaClassDev->VgaMiniPort->VgaMemoryOffset,\r
963 (MaxRow * MaxColumn) >> 1,\r
964 &VideoChar\r
965 );\r
966\r
967 This->SetCursorPosition (This, 0, 0);\r
968\r
969 return EFI_SUCCESS;\r
970}\r
971\r
972EFI_STATUS\r
973EFIAPI\r
974VgaClassSetAttribute (\r
975 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
976 IN UINTN Attribute\r
977 )\r
978/*++\r
979\r
980Routine Description:\r
981\r
982 GC_TODO: Add function description\r
983\r
984Arguments:\r
985\r
986 This - GC_TODO: add argument description\r
987 Attribute - GC_TODO: add argument description\r
988\r
989Returns:\r
990\r
991 EFI_SUCCESS - GC_TODO: Add description for return value\r
992 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
993\r
994--*/\r
995{\r
996 if (Attribute <= EFI_MAX_ATTRIBUTE) {\r
997 This->Mode->Attribute = (INT32) Attribute;\r
998 return EFI_SUCCESS;\r
999 }\r
1000\r
1001 return EFI_UNSUPPORTED;\r
1002}\r
1003\r
1004EFI_STATUS\r
1005EFIAPI\r
1006VgaClassSetCursorPosition (\r
1007 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
1008 IN UINTN Column,\r
1009 IN UINTN Row\r
1010 )\r
1011/*++\r
1012\r
1013Routine Description:\r
1014\r
1015 GC_TODO: Add function description\r
1016\r
1017Arguments:\r
1018\r
1019 This - GC_TODO: add argument description\r
1020 Column - GC_TODO: add argument description\r
1021 Row - GC_TODO: add argument description\r
1022\r
1023Returns:\r
1024\r
1025 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
1026 EFI_SUCCESS - GC_TODO: Add description for return value\r
1027\r
1028--*/\r
1029{\r
1030 EFI_STATUS Status;\r
1031 VGA_CLASS_DEV *VgaClassDev;\r
1032 UINTN MaxColumn;\r
1033 UINTN MaxRow;\r
1034\r
1035 VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);\r
1036\r
1037 Status = This->QueryMode (\r
1038 This,\r
1039 This->Mode->Mode,\r
1040 &MaxColumn,\r
1041 &MaxRow\r
1042 );\r
1043 if (EFI_ERROR (Status)) {\r
1044 return Status;\r
1045 }\r
1046\r
1047 if (Column >= MaxColumn || Row >= MaxRow) {\r
1048 return EFI_UNSUPPORTED;\r
1049 }\r
1050\r
1051 SetVideoCursorPosition (VgaClassDev, Column, Row, MaxColumn);\r
1052\r
1053 This->Mode->CursorColumn = (INT32) Column;\r
1054 This->Mode->CursorRow = (INT32) Row;\r
1055\r
1056 return EFI_SUCCESS;\r
1057}\r
1058\r
1059EFI_STATUS\r
1060EFIAPI\r
1061VgaClassEnableCursor (\r
1062 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
1063 IN BOOLEAN Visible\r
1064 )\r
1065/*++\r
1066\r
1067Routine Description:\r
1068\r
1069 GC_TODO: Add function description\r
1070\r
1071Arguments:\r
1072\r
1073 This - GC_TODO: add argument description\r
1074 Visible - GC_TODO: add argument description\r
1075\r
1076Returns:\r
1077\r
1078 EFI_SUCCESS - GC_TODO: Add description for return value\r
1079\r
1080--*/\r
1081{\r
1082 VGA_CLASS_DEV *VgaClassDev;\r
1083\r
1084 VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);\r
1085 if (Visible) {\r
1086 switch (This->Mode->Mode) {\r
1087 case 1:\r
1088 WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x06);\r
1089 WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x07);\r
1090 break;\r
1091\r
1092 default:\r
1093 WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x0e);\r
1094 WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x0f);\r
1095 break;\r
1096 }\r
1097 } else {\r
1098 WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x20);\r
1099 }\r
1100\r
1101 This->Mode->CursorVisible = Visible;\r
1102 return EFI_SUCCESS;\r
1103}\r
1104\r
1105EFI_STATUS\r
1106EFIAPI\r
1107VgaClassQueryMode (\r
1108 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
1109 IN UINTN ModeNumber,\r
1110 OUT UINTN *Columns,\r
1111 OUT UINTN *Rows\r
1112 )\r
1113/*++\r
1114\r
1115Routine Description:\r
1116\r
1117 GC_TODO: Add function description\r
1118\r
1119Arguments:\r
1120\r
1121 This - GC_TODO: add argument description\r
1122 ModeNumber - GC_TODO: add argument description\r
1123 Columns - GC_TODO: add argument description\r
1124 Rows - GC_TODO: add argument description\r
1125\r
1126Returns:\r
1127\r
1128 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
1129 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
1130 EFI_SUCCESS - GC_TODO: Add description for return value\r
1131\r
1132--*/\r
1133{\r
1134 if ((INT32) ModeNumber >= This->Mode->MaxMode) {\r
1135 *Columns = 0;\r
1136 *Rows = 0;\r
1137 return EFI_UNSUPPORTED;\r
1138 }\r
1139\r
1140 switch (ModeNumber) {\r
1141 case 0:\r
1142 *Columns = 80;\r
1143 *Rows = 25;\r
1144 break;\r
1145\r
1146 case 1:\r
1147 *Columns = 80;\r
1148 *Rows = 50;\r
1149 break;\r
1150\r
1151 default:\r
1152 *Columns = 0;\r
1153 *Rows = 0;\r
1154 return EFI_UNSUPPORTED;\r
1155 }\r
1156\r
1157 return EFI_SUCCESS;\r
1158}\r
1159\r
1160EFI_STATUS\r
1161EFIAPI\r
1162VgaClassSetMode (\r
1163 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
1164 IN UINTN ModeNumber\r
1165 )\r
1166/*++\r
1167\r
1168Routine Description:\r
1169\r
1170 GC_TODO: Add function description\r
1171\r
1172Arguments:\r
1173\r
1174 This - GC_TODO: add argument description\r
1175 ModeNumber - GC_TODO: add argument description\r
1176\r
1177Returns:\r
1178\r
1179 EFI_UNSUPPORTED - GC_TODO: Add description for return value\r
1180\r
1181--*/\r
1182{\r
1183 EFI_STATUS Status;\r
1184 VGA_CLASS_DEV *VgaClassDev;\r
1185\r
1186 VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);\r
1187\r
1188 if ((INT32) ModeNumber >= This->Mode->MaxMode) {\r
1189 return EFI_UNSUPPORTED;\r
1190 }\r
1191\r
1192 This->ClearScreen (This);\r
1193\r
1194 This->Mode->Mode = (INT32) ModeNumber;\r
1195\r
1196 Status = VgaClassDev->VgaMiniPort->SetMode (VgaClassDev->VgaMiniPort, ModeNumber);\r
1197\r
1198 return Status;\r
1199}\r
1200//\r
1201// Private Worker Functions\r
1202//\r
1203STATIC\r
1204VOID\r
1205SetVideoCursorPosition (\r
1206 IN VGA_CLASS_DEV *VgaClassDev,\r
1207 IN UINTN Column,\r
1208 IN UINTN Row,\r
1209 IN UINTN MaxColumn\r
1210 )\r
1211/*++\r
1212\r
1213Routine Description:\r
1214\r
1215 GC_TODO: Add function description\r
1216\r
1217Arguments:\r
1218\r
1219 VgaClassDev - GC_TODO: add argument description\r
1220 Column - GC_TODO: add argument description\r
1221 Row - GC_TODO: add argument description\r
1222 MaxColumn - GC_TODO: add argument description\r
1223\r
1224Returns:\r
1225\r
1226 GC_TODO: add return values\r
1227\r
1228--*/\r
1229{\r
1230 Column = Column & 0xff;\r
1231 Row = Row & 0xff;\r
1232 MaxColumn = MaxColumn & 0xff;\r
1233 WriteCrtc (\r
1234 VgaClassDev,\r
1235 CRTC_CURSOR_LOCATION_HIGH,\r
1236 (UINT8) ((Row * MaxColumn + Column) >> 8)\r
1237 );\r
1238 WriteCrtc (\r
1239 VgaClassDev,\r
1240 CRTC_CURSOR_LOCATION_LOW,\r
1241 (UINT8) ((Row * MaxColumn + Column) & 0xff)\r
1242 );\r
1243}\r
1244\r
1245STATIC\r
1246VOID\r
1247WriteCrtc (\r
1248 IN VGA_CLASS_DEV *VgaClassDev,\r
1249 IN UINT16 Address,\r
1250 IN UINT8 Data\r
1251 )\r
1252/*++\r
1253\r
1254Routine Description:\r
1255\r
1256 GC_TODO: Add function description\r
1257\r
1258Arguments:\r
1259\r
1260 VgaClassDev - GC_TODO: add argument description\r
1261 Address - GC_TODO: add argument description\r
1262 Data - GC_TODO: add argument description\r
1263\r
1264Returns:\r
1265\r
1266 GC_TODO: add return values\r
1267\r
1268--*/\r
1269{\r
1270 VgaClassDev->PciIo->Io.Write (\r
1271 VgaClassDev->PciIo,\r
1272 EfiPciIoWidthUint8,\r
1273 VgaClassDev->VgaMiniPort->CrtcAddressRegisterBar,\r
1274 VgaClassDev->VgaMiniPort->CrtcAddressRegisterOffset,\r
1275 1,\r
1276 &Address\r
1277 );\r
1278\r
1279 VgaClassDev->PciIo->Io.Write (\r
1280 VgaClassDev->PciIo,\r
1281 EfiPciIoWidthUint8,\r
1282 VgaClassDev->VgaMiniPort->CrtcDataRegisterBar,\r
1283 VgaClassDev->VgaMiniPort->CrtcDataRegisterOffset,\r
1284 1,\r
1285 &Data\r
1286 );\r
1287}\r
1288\r
1289STATIC\r
1290BOOLEAN\r
1291LibIsValidTextGraphics (\r
1292 IN CHAR16 Graphic,\r
1293 OUT CHAR8 *PcAnsi, OPTIONAL\r
1294 OUT CHAR8 *Ascii OPTIONAL\r
1295 )\r
1296/*++\r
1297\r
1298Routine Description:\r
1299\r
1300 Detects if a Unicode char is for Box Drawing text graphics.\r
1301\r
1302Arguments:\r
1303\r
1304 Grphic - Unicode char to test.\r
1305\r
1306 PcAnsi - Optional pointer to return PCANSI equivalent of Graphic.\r
1307\r
1308 Asci - Optional pointer to return Ascii equivalent of Graphic.\r
1309\r
1310Returns:\r
1311\r
1312 TRUE if Gpaphic is a supported Unicode Box Drawing character.\r
1313\r
1314--*/\r
1315// GC_TODO: Graphic - add argument and description to function comment\r
1316{\r
1317 UNICODE_TO_CHAR *Table;\r
1318\r
1319 if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) {\r
1320 //\r
1321 // Unicode drawing code charts are all in the 0x25xx range,\r
1322 // arrows are 0x21xx\r
1323 //\r
1324 return FALSE;\r
1325 }\r
1326\r
1327 for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) {\r
1328 if (Graphic == Table->Unicode) {\r
1329 if (PcAnsi) {\r
1330 *PcAnsi = Table->PcAnsi;\r
1331 }\r
1332\r
1333 if (Ascii) {\r
1334 *Ascii = Table->Ascii;\r
1335 }\r
1336\r
1337 return TRUE;\r
1338 }\r
1339 }\r
1340\r
1341 return FALSE;\r
1342}\r
1343\r
1344STATIC\r
1345BOOLEAN\r
1346IsValidAscii (\r
1347 IN CHAR16 Ascii\r
1348 )\r
1349/*++\r
1350\r
1351Routine Description:\r
1352\r
1353 GC_TODO: Add function description\r
1354\r
1355Arguments:\r
1356\r
1357 Ascii - GC_TODO: add argument description\r
1358\r
1359Returns:\r
1360\r
1361 GC_TODO: add return values\r
1362\r
1363--*/\r
1364{\r
1365 if ((Ascii >= 0x20) && (Ascii <= 0x7f)) {\r
1366 return TRUE;\r
1367 }\r
1368\r
1369 return FALSE;\r
1370}\r
1371\r
1372STATIC\r
1373BOOLEAN\r
1374IsValidEfiCntlChar (\r
1375 IN CHAR16 c\r
1376 )\r
1377/*++\r
1378\r
1379Routine Description:\r
1380\r
1381 GC_TODO: Add function description\r
1382\r
1383Arguments:\r
1384\r
1385 c - GC_TODO: add argument description\r
1386\r
1387Returns:\r
1388\r
1389 GC_TODO: add return values\r
1390\r
1391--*/\r
1392{\r
1393 if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) {\r
1394 return TRUE;\r
1395 }\r
1396\r
1397 return FALSE;\r
1398}\r