2 This driver produces a VGA console.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 // EFI Driver Binding Protocol for the VGA Class Driver
20 EFI_DRIVER_BINDING_PROTOCOL gVgaClassDriverBinding
= {
21 VgaClassDriverBindingSupported
,
22 VgaClassDriverBindingStart
,
23 VgaClassDriverBindingStop
,
30 The user Entry Point for module VgaClass. The user code starts with this function.
32 @param[in] ImageHandle The firmware allocated handle for the EFI image.
33 @param[in] SystemTable A pointer to the EFI System Table.
35 @retval EFI_SUCCESS The entry point is executed successfully.
36 @retval other Some error occurs when executing this entry point.
42 IN EFI_HANDLE ImageHandle
,
43 IN EFI_SYSTEM_TABLE
*SystemTable
49 // Install driver model protocol(s).
51 Status
= EfiLibInstallDriverBindingComponentName2 (
54 &gVgaClassDriverBinding
,
56 &gVgaClassComponentName
,
57 &gVgaClassComponentName2
59 ASSERT_EFI_ERROR (Status
);
68 static CHAR16 CrLfString
[3] = { CHAR_CARRIAGE_RETURN
, CHAR_LINEFEED
, CHAR_NULL
};
77 // This list is used to define the valid extend chars.
78 // It also provides a mapping from Unicode to PCANSI or
79 // ASCII. The ASCII mapping we just made up.
82 STATIC UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii
[] = {
114 BOXDRAW_VERTICAL_RIGHT
,
119 BOXDRAW_VERTICAL_LEFT
,
124 BOXDRAW_DOWN_HORIZONTAL
,
129 BOXDRAW_UP_HORIZONTAL
,
134 BOXDRAW_VERTICAL_HORIZONTAL
,
139 BOXDRAW_DOUBLE_HORIZONTAL
,
144 BOXDRAW_DOUBLE_VERTICAL
,
149 BOXDRAW_DOWN_RIGHT_DOUBLE
,
154 BOXDRAW_DOWN_DOUBLE_RIGHT
,
159 BOXDRAW_DOUBLE_DOWN_RIGHT
,
164 BOXDRAW_DOWN_LEFT_DOUBLE
,
169 BOXDRAW_DOWN_DOUBLE_LEFT
,
174 BOXDRAW_DOUBLE_DOWN_LEFT
,
179 BOXDRAW_UP_RIGHT_DOUBLE
,
184 BOXDRAW_UP_DOUBLE_RIGHT
,
189 BOXDRAW_DOUBLE_UP_RIGHT
,
194 BOXDRAW_UP_LEFT_DOUBLE
,
199 BOXDRAW_UP_DOUBLE_LEFT
,
204 BOXDRAW_DOUBLE_UP_LEFT
,
209 BOXDRAW_VERTICAL_RIGHT_DOUBLE
,
214 BOXDRAW_VERTICAL_DOUBLE_RIGHT
,
219 BOXDRAW_DOUBLE_VERTICAL_RIGHT
,
224 BOXDRAW_VERTICAL_LEFT_DOUBLE
,
229 BOXDRAW_VERTICAL_DOUBLE_LEFT
,
234 BOXDRAW_DOUBLE_VERTICAL_LEFT
,
239 BOXDRAW_DOWN_HORIZONTAL_DOUBLE
,
244 BOXDRAW_DOWN_DOUBLE_HORIZONTAL
,
249 BOXDRAW_DOUBLE_DOWN_HORIZONTAL
,
254 BOXDRAW_UP_HORIZONTAL_DOUBLE
,
259 BOXDRAW_UP_DOUBLE_HORIZONTAL
,
264 BOXDRAW_DOUBLE_UP_HORIZONTAL
,
269 BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE
,
274 BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL
,
279 BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL
,
285 BLOCKELEMENT_FULL_BLOCK
,
290 BLOCKELEMENT_LIGHT_SHADE
,
296 GEOMETRICSHAPE_UP_TRIANGLE
,
301 GEOMETRICSHAPE_RIGHT_TRIANGLE
,
306 GEOMETRICSHAPE_DOWN_TRIANGLE
,
311 GEOMETRICSHAPE_LEFT_TRIANGLE
,
348 // Private worker functions
352 SetVideoCursorPosition (
353 IN VGA_CLASS_DEV
*VgaClassDev
,
362 IN VGA_CLASS_DEV
*VgaClassDev
,
369 LibIsValidTextGraphics (
371 OUT CHAR8
*PcAnsi
, OPTIONAL
372 OUT CHAR8
*Ascii OPTIONAL
388 Test to see if this driver supports ControllerHandle. Any ControllerHandle
389 than contains a VgaMiniPort and PciIo protocol can be supported.
391 @param This Protocol instance pointer.
392 @param ControllerHandle Handle of device to test
393 @param RemainingDevicePath Optional parameter use to pick a specific child
396 @retval EFI_SUCCESS This driver supports this device
397 @retval EFI_ALREADY_STARTED This driver is already running on this device
398 @retval other This driver does not support this device
403 VgaClassDriverBindingSupported (
404 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
405 IN EFI_HANDLE Controller
,
406 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
410 EFI_VGA_MINI_PORT_PROTOCOL
*VgaMiniPort
;
413 // Open the IO Abstraction(s) needed to perform the supported test
415 Status
= gBS
->OpenProtocol (
417 &gEfiVgaMiniPortProtocolGuid
,
418 (VOID
**) &VgaMiniPort
,
419 This
->DriverBindingHandle
,
421 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
423 if (EFI_ERROR (Status
)) {
427 // Open the IO Abstraction(s) needed to perform the supported test
429 Status
= gBS
->OpenProtocol (
431 &gEfiPciIoProtocolGuid
,
433 This
->DriverBindingHandle
,
435 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
437 if (EFI_ERROR (Status
)) {
445 Start this driver on ControllerHandle by opening a PciIo and VgaMiniPort
446 protocol, creating VGA_CLASS_DEV device and install gEfiSimpleTextOutProtocolGuid
449 @param This Protocol instance pointer.
450 @param ControllerHandle Handle of device to bind driver to
451 @param RemainingDevicePath Optional parameter use to pick a specific child
454 @retval EFI_SUCCESS This driver is added to ControllerHandle
455 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
456 @retval other This driver does not support this device
461 VgaClassDriverBindingStart (
462 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
463 IN EFI_HANDLE Controller
,
464 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
468 EFI_VGA_MINI_PORT_PROTOCOL
*VgaMiniPort
;
469 EFI_PCI_IO_PROTOCOL
*PciIo
;
470 VGA_CLASS_DEV
*VgaClassPrivate
;
471 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
473 Status
= gBS
->HandleProtocol (
475 &gEfiDevicePathProtocolGuid
,
476 (VOID
**) &DevicePath
478 if (EFI_ERROR (Status
)) {
482 // Report that VGA Class driver is being enabled
484 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
486 EFI_PERIPHERAL_LOCAL_CONSOLE
| EFI_P_PC_ENABLE
,
491 // Open the IO Abstraction(s) needed
493 Status
= gBS
->OpenProtocol (
495 &gEfiPciIoProtocolGuid
,
497 This
->DriverBindingHandle
,
499 EFI_OPEN_PROTOCOL_GET_PROTOCOL
501 if (EFI_ERROR (Status
)) {
505 Status
= gBS
->OpenProtocol (
507 &gEfiVgaMiniPortProtocolGuid
,
508 (VOID
**) &VgaMiniPort
,
509 This
->DriverBindingHandle
,
511 EFI_OPEN_PROTOCOL_BY_DRIVER
513 if (EFI_ERROR (Status
)) {
517 // Allocate the private device structure
519 Status
= gBS
->AllocatePool (
521 sizeof (VGA_CLASS_DEV
),
522 (VOID
**) &VgaClassPrivate
524 if (EFI_ERROR (Status
)) {
527 &gEfiVgaMiniPortProtocolGuid
,
528 This
->DriverBindingHandle
,
531 return EFI_OUT_OF_RESOURCES
;
534 ZeroMem (VgaClassPrivate
, sizeof (VGA_CLASS_DEV
));
537 // Initialize the private device structure
539 VgaClassPrivate
->Signature
= VGA_CLASS_DEV_SIGNATURE
;
540 VgaClassPrivate
->Handle
= Controller
;
541 VgaClassPrivate
->VgaMiniPort
= VgaMiniPort
;
542 VgaClassPrivate
->PciIo
= PciIo
;
544 VgaClassPrivate
->SimpleTextOut
.Reset
= VgaClassReset
;
545 VgaClassPrivate
->SimpleTextOut
.OutputString
= VgaClassOutputString
;
546 VgaClassPrivate
->SimpleTextOut
.TestString
= VgaClassTestString
;
547 VgaClassPrivate
->SimpleTextOut
.ClearScreen
= VgaClassClearScreen
;
548 VgaClassPrivate
->SimpleTextOut
.SetAttribute
= VgaClassSetAttribute
;
549 VgaClassPrivate
->SimpleTextOut
.SetCursorPosition
= VgaClassSetCursorPosition
;
550 VgaClassPrivate
->SimpleTextOut
.EnableCursor
= VgaClassEnableCursor
;
551 VgaClassPrivate
->SimpleTextOut
.QueryMode
= VgaClassQueryMode
;
552 VgaClassPrivate
->SimpleTextOut
.SetMode
= VgaClassSetMode
;
554 VgaClassPrivate
->SimpleTextOut
.Mode
= &VgaClassPrivate
->SimpleTextOutputMode
;
555 VgaClassPrivate
->SimpleTextOutputMode
.MaxMode
= VgaMiniPort
->MaxMode
;
556 VgaClassPrivate
->DevicePath
= DevicePath
;
558 Status
= VgaClassPrivate
->SimpleTextOut
.SetAttribute (
559 &VgaClassPrivate
->SimpleTextOut
,
560 EFI_TEXT_ATTR (EFI_WHITE
,
563 if (EFI_ERROR (Status
)) {
567 Status
= VgaClassPrivate
->SimpleTextOut
.Reset (
568 &VgaClassPrivate
->SimpleTextOut
,
571 if (EFI_ERROR (Status
)) {
575 Status
= VgaClassPrivate
->SimpleTextOut
.EnableCursor (
576 &VgaClassPrivate
->SimpleTextOut
,
579 if (EFI_ERROR (Status
)) {
583 Status
= gBS
->InstallMultipleProtocolInterfaces (
585 &gEfiSimpleTextOutProtocolGuid
,
586 &VgaClassPrivate
->SimpleTextOut
,
593 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
594 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
595 EFI_PERIPHERAL_LOCAL_CONSOLE
| EFI_P_EC_CONTROLLER_ERROR
,
604 Stop this driver on ControllerHandle. Support stoping any child handles
605 created by this driver.
607 @param This Protocol instance pointer.
608 @param ControllerHandle Handle of device to stop driver on
609 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
610 children is zero stop the entire bus driver.
611 @param ChildHandleBuffer List of Child Handles to Stop.
613 @retval EFI_SUCCESS This driver is removed ControllerHandle
614 @retval other This driver was not removed from this device
619 VgaClassDriverBindingStop (
620 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
621 IN EFI_HANDLE Controller
,
622 IN UINTN NumberOfChildren
,
623 IN EFI_HANDLE
*ChildHandleBuffer
627 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*SimpleTextOut
;
628 VGA_CLASS_DEV
*VgaClassPrivate
;
630 Status
= gBS
->OpenProtocol (
632 &gEfiSimpleTextOutProtocolGuid
,
633 (VOID
**) &SimpleTextOut
,
634 This
->DriverBindingHandle
,
636 EFI_OPEN_PROTOCOL_GET_PROTOCOL
638 if (EFI_ERROR (Status
)) {
642 VgaClassPrivate
= VGA_CLASS_DEV_FROM_THIS (SimpleTextOut
);
645 // Report that VGA Class driver is being disabled
647 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
649 EFI_PERIPHERAL_LOCAL_CONSOLE
| EFI_P_PC_DISABLE
,
650 VgaClassPrivate
->DevicePath
653 Status
= gBS
->UninstallProtocolInterface (
655 &gEfiSimpleTextOutProtocolGuid
,
656 &VgaClassPrivate
->SimpleTextOut
658 if (EFI_ERROR (Status
)) {
662 // Release PCI I/O and VGA Mini Port Protocols on the controller handle.
666 &gEfiPciIoProtocolGuid
,
667 This
->DriverBindingHandle
,
673 &gEfiVgaMiniPortProtocolGuid
,
674 This
->DriverBindingHandle
,
678 gBS
->FreePool (VgaClassPrivate
);
684 Reset VgaClass device and clear output.
686 @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
687 @param ExtendedVerification Whether need additional judgement
692 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
693 IN BOOLEAN ExtendedVerification
697 VGA_CLASS_DEV
*VgaClassPrivate
;
699 VgaClassPrivate
= VGA_CLASS_DEV_FROM_THIS (This
);
701 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
703 EFI_PERIPHERAL_LOCAL_CONSOLE
| EFI_P_PC_RESET
,
704 VgaClassPrivate
->DevicePath
707 This
->SetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BACKGROUND_BLACK
));
709 Status
= This
->SetMode (This
, 0);
710 if (EFI_ERROR (Status
)) {
714 return This
->ClearScreen (This
);
718 Output a string to VgaClass device.
720 @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
721 @param WString wide chars.
725 VgaClassOutputString (
726 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
731 VGA_CLASS_DEV
*VgaClassDev
;
732 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
738 VgaClassDev
= VGA_CLASS_DEV_FROM_THIS (This
);
742 Status
= This
->QueryMode (
748 if (EFI_ERROR (Status
)) {
752 for (; *WString
!= CHAR_NULL
; WString
++) {
756 if (Mode
->CursorColumn
> 0) {
757 Mode
->CursorColumn
--;
762 if (Mode
->CursorRow
== (INT32
) (MaxRow
- 1)) {
764 // Scroll the screen by copying the contents
765 // of the VGA display up one line
767 VgaClassDev
->PciIo
->CopyMem (
770 VgaClassDev
->VgaMiniPort
->VgaMemoryBar
,
771 VgaClassDev
->VgaMiniPort
->VgaMemoryOffset
,
772 VgaClassDev
->VgaMiniPort
->VgaMemoryBar
,
773 VgaClassDev
->VgaMiniPort
->VgaMemoryOffset
+ MaxColumn
* 2,
774 ((MaxRow
- 1) * MaxColumn
) >> 1
778 // Print Blank Line of spaces with the current color attributes
780 VideoChar
= (Mode
->Attribute
<< 8) | ' ';
781 VideoChar
= (VideoChar
<< 16) | VideoChar
;
782 VgaClassDev
->PciIo
->Mem
.Write (
784 EfiPciIoWidthFillUint32
,
785 VgaClassDev
->VgaMiniPort
->VgaMemoryBar
,
786 VgaClassDev
->VgaMiniPort
->VgaMemoryOffset
+ (MaxRow
- 1) * MaxColumn
* 2,
792 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
797 case CHAR_CARRIAGE_RETURN
:
798 Mode
->CursorColumn
= 0;
802 if (!LibIsValidTextGraphics (*WString
, &GraphicChar
, NULL
)) {
804 // Just convert to ASCII
806 GraphicChar
= (CHAR8
) *WString
;
807 if (!IsValidAscii (GraphicChar
)) {
809 // Keep the API from supporting PCANSI Graphics chars
815 VideoChar
= (Mode
->Attribute
<< 8) | GraphicChar
;
816 VgaClassDev
->PciIo
->Mem
.Write (
819 VgaClassDev
->VgaMiniPort
->VgaMemoryBar
,
820 VgaClassDev
->VgaMiniPort
->VgaMemoryOffset
+ ((Mode
->CursorRow
* MaxColumn
+ Mode
->CursorColumn
) * 2),
825 if (Mode
->CursorColumn
>= (INT32
) (MaxColumn
- 1)) {
826 This
->OutputString (This
, CrLfString
);
828 Mode
->CursorColumn
++;
834 SetVideoCursorPosition (
836 (UINTN
) Mode
->CursorColumn
,
837 (UINTN
) Mode
->CursorRow
,
845 Detects if a Unicode char is for Box Drawing text graphics.
847 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
848 @param WString Unicode chars
850 @return if a Unicode char is for Box Drawing text graphics.
855 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
859 while (*WString
!= 0x0000) {
860 if (!(IsValidAscii (*WString
) || IsValidEfiCntlChar (*WString
) || LibIsValidTextGraphics (*WString
, NULL
, NULL
))) {
861 return EFI_UNSUPPORTED
;
871 Clear Screen via VgaClass device
873 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
875 @retval EFI_SUCESS Success to clear screen
876 @retval Others Wrong displaying mode.
880 VgaClassClearScreen (
881 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
885 VGA_CLASS_DEV
*VgaClassDev
;
890 VgaClassDev
= VGA_CLASS_DEV_FROM_THIS (This
);
892 Status
= This
->QueryMode (
898 if (EFI_ERROR (Status
)) {
902 VideoChar
= (This
->Mode
->Attribute
<< 8) | ' ';
903 VideoChar
= (VideoChar
<< 16) | VideoChar
;
904 VgaClassDev
->PciIo
->Mem
.Write (
906 EfiPciIoWidthFillUint32
,
907 VgaClassDev
->VgaMiniPort
->VgaMemoryBar
,
908 VgaClassDev
->VgaMiniPort
->VgaMemoryOffset
,
909 (MaxRow
* MaxColumn
) >> 1,
913 This
->SetCursorPosition (This
, 0, 0);
919 Set displaying mode's attribute
921 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
922 @param Attribute Mode's attribute
924 @param EFI_SUCCESS Success to set attribute
925 @param EFI_UNSUPPORTED Wrong mode's attribute wanted to be set
929 VgaClassSetAttribute (
930 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
934 if (Attribute
<= EFI_MAX_ATTRIBUTE
) {
935 This
->Mode
->Attribute
= (INT32
) Attribute
;
939 return EFI_UNSUPPORTED
;
945 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
946 @param Column Column of new cursor position.
947 @param Row Row of new cursor position.
949 @retval EFI_SUCCESS Sucess to set cursor's position.
950 @retval Others Wrong current displaying mode.
954 VgaClassSetCursorPosition (
955 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
961 VGA_CLASS_DEV
*VgaClassDev
;
965 VgaClassDev
= VGA_CLASS_DEV_FROM_THIS (This
);
967 Status
= This
->QueryMode (
973 if (EFI_ERROR (Status
)) {
977 if (Column
>= MaxColumn
|| Row
>= MaxRow
) {
978 return EFI_UNSUPPORTED
;
981 SetVideoCursorPosition (VgaClassDev
, Column
, Row
, MaxColumn
);
983 This
->Mode
->CursorColumn
= (INT32
) Column
;
984 This
->Mode
->CursorRow
= (INT32
) Row
;
990 Enable cursor to display or not.
992 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
993 @param Visible Display cursor or not.
995 @retval EFI_SUCESS Success to display the cursor or not.
999 VgaClassEnableCursor (
1000 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
1004 VGA_CLASS_DEV
*VgaClassDev
;
1006 VgaClassDev
= VGA_CLASS_DEV_FROM_THIS (This
);
1008 switch (This
->Mode
->Mode
) {
1010 WriteCrtc (VgaClassDev
, CRTC_CURSOR_START
, 0x06);
1011 WriteCrtc (VgaClassDev
, CRTC_CURSOR_END
, 0x07);
1015 WriteCrtc (VgaClassDev
, CRTC_CURSOR_START
, 0x0e);
1016 WriteCrtc (VgaClassDev
, CRTC_CURSOR_END
, 0x0f);
1020 WriteCrtc (VgaClassDev
, CRTC_CURSOR_START
, 0x20);
1023 This
->Mode
->CursorVisible
= Visible
;
1028 Query colum and row according displaying mode number
1033 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
1034 @param ModeNumber Mode number
1035 @param Columns return the columen in current mode number
1036 @param Rows return the row in current mode number.
1038 @return EFI_SUCCESS Sucess to get columns and rows according to mode number
1039 @return EFI_UNSUPPORTED Unsupported mode number
1044 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
1045 IN UINTN ModeNumber
,
1050 if ((INT32
) ModeNumber
>= This
->Mode
->MaxMode
) {
1053 return EFI_UNSUPPORTED
;
1056 switch (ModeNumber
) {
1070 return EFI_UNSUPPORTED
;
1077 Set displaying mode number
1079 @param This Pointer of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
1080 @param ModeNumber mode number
1082 @retval EFI_UNSUPPORTED Unsupported mode number in parameter
1083 @retval EFI_SUCCESS Success to set the mode number.
1088 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
1093 VGA_CLASS_DEV
*VgaClassDev
;
1095 VgaClassDev
= VGA_CLASS_DEV_FROM_THIS (This
);
1097 if ((INT32
) ModeNumber
>= This
->Mode
->MaxMode
) {
1098 return EFI_UNSUPPORTED
;
1101 This
->ClearScreen (This
);
1103 This
->Mode
->Mode
= (INT32
) ModeNumber
;
1105 Status
= VgaClassDev
->VgaMiniPort
->SetMode (VgaClassDev
->VgaMiniPort
, ModeNumber
);
1111 Set logic cursor's position to VgaClass device
1113 @param VgaClassDev device instance object
1114 @param Column cursor logic position.
1115 @param Row cursor logic position.
1116 @param MaxColumn max logic column
1121 SetVideoCursorPosition (
1122 IN VGA_CLASS_DEV
*VgaClassDev
,
1128 Column
= Column
& 0xff;
1130 MaxColumn
= MaxColumn
& 0xff;
1133 CRTC_CURSOR_LOCATION_HIGH
,
1134 (UINT8
) ((Row
* MaxColumn
+ Column
) >> 8)
1138 CRTC_CURSOR_LOCATION_LOW
,
1139 (UINT8
) ((Row
* MaxColumn
+ Column
) & 0xff)
1144 Program CRTC register via PCI IO.
1146 @param VgaClassDev device instance object
1147 @param Address address
1153 IN VGA_CLASS_DEV
*VgaClassDev
,
1158 VgaClassDev
->PciIo
->Io
.Write (
1161 VgaClassDev
->VgaMiniPort
->CrtcAddressRegisterBar
,
1162 VgaClassDev
->VgaMiniPort
->CrtcAddressRegisterOffset
,
1167 VgaClassDev
->PciIo
->Io
.Write (
1170 VgaClassDev
->VgaMiniPort
->CrtcDataRegisterBar
,
1171 VgaClassDev
->VgaMiniPort
->CrtcDataRegisterOffset
,
1178 Detects if a Unicode char is for Box Drawing text graphics.
1180 @param Grphic Unicode char to test.
1181 @param PcAnsi Optional pointer to return PCANSI equivalent of Graphic.
1182 @param Asci Optional pointer to return Ascii equivalent of Graphic.
1184 @return TRUE if Gpaphic is a supported Unicode Box Drawing character.
1189 LibIsValidTextGraphics (
1191 OUT CHAR8
*PcAnsi
, OPTIONAL
1192 OUT CHAR8
*Ascii OPTIONAL
1195 UNICODE_TO_CHAR
*Table
;
1197 if ((((Graphic
& 0xff00) != 0x2500) && ((Graphic
& 0xff00) != 0x2100))) {
1199 // Unicode drawing code charts are all in the 0x25xx range,
1200 // arrows are 0x21xx
1205 for (Table
= UnicodeToPcAnsiOrAscii
; Table
->Unicode
!= 0x0000; Table
++) {
1206 if (Graphic
== Table
->Unicode
) {
1208 *PcAnsi
= Table
->PcAnsi
;
1212 *Ascii
= Table
->Ascii
;
1223 Judge whether is an ASCII char.
1225 @param Ascii character
1226 @return whether is an ASCII char.
1234 if ((Ascii
>= 0x20) && (Ascii
<= 0x7f)) {
1242 Judge whether is diplaying control character.
1245 @return whether is diplaying control character.
1249 IsValidEfiCntlChar (
1253 if (c
== CHAR_NULL
|| c
== CHAR_BACKSPACE
|| c
== CHAR_LINEFEED
|| c
== CHAR_CARRIAGE_RETURN
) {