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