mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 16:45:30 +00:00 
			
		
		
		
	 9d64ff86b1
			
		
	
	
		9d64ff86b1
		
	
	
	
	
		
			
			git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3998 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1398 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1398 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**@file
 | |
|   This driver produces a VGA console.
 | |
| 
 | |
| Copyright (c) 2006, Intel Corporation                                                         
 | |
| All rights reserved. This program and the accompanying materials                          
 | |
| are licensed and made available under the terms and conditions of the BSD License         
 | |
| which accompanies this distribution.  The full text of the license may be found at        
 | |
| http://opensource.org/licenses/bsd-license.php                                            
 | |
|                                                                                           
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "VgaClass.h"
 | |
| 
 | |
| //
 | |
| // EFI Driver Binding Protocol for the VGA Class Driver
 | |
| //
 | |
| EFI_DRIVER_BINDING_PROTOCOL gVgaClassDriverBinding = {
 | |
|   VgaClassDriverBindingSupported,
 | |
|   VgaClassDriverBindingStart,
 | |
|   VgaClassDriverBindingStop,
 | |
|   0xa,
 | |
|   NULL,
 | |
|   NULL
 | |
| };
 | |
| 
 | |
| /**
 | |
|   The user Entry Point for module VgaClass. The user code starts with this function.
 | |
| 
 | |
|   @param[in] ImageHandle    The firmware allocated handle for the EFI image.  
 | |
|   @param[in] SystemTable    A pointer to the EFI System Table.
 | |
|   
 | |
|   @retval EFI_SUCCESS       The entry point is executed successfully.
 | |
|   @retval other             Some error occurs when executing this entry point.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| InitializeVgaClass(
 | |
|   IN EFI_HANDLE           ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE     *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS              Status;
 | |
| 
 | |
|   //
 | |
|   // Install driver model protocol(s).
 | |
|   //
 | |
|   Status = EfiLibInstallDriverBindingComponentName2 (
 | |
|              ImageHandle,
 | |
|              SystemTable,
 | |
|              &gVgaClassDriverBinding,
 | |
|              ImageHandle,
 | |
|              &gVgaClassComponentName,
 | |
|              &gVgaClassComponentName2
 | |
|              );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| //
 | |
| // Local variables
 | |
| //
 | |
| static CHAR16               CrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };
 | |
| 
 | |
| typedef struct {
 | |
|   CHAR16  Unicode;
 | |
|   CHAR8   PcAnsi;
 | |
|   CHAR8   Ascii;
 | |
| } UNICODE_TO_CHAR;
 | |
| 
 | |
| //
 | |
| // This list is used to define the valid extend chars.
 | |
| // It also provides a mapping from Unicode to PCANSI or
 | |
| // ASCII. The ASCII mapping we just made up.
 | |
| //
 | |
| //
 | |
| STATIC UNICODE_TO_CHAR  UnicodeToPcAnsiOrAscii[] = {
 | |
|   {
 | |
|     BOXDRAW_HORIZONTAL,
 | |
|     0xc4,
 | |
|     L'-'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL,
 | |
|     0xb3,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_RIGHT,
 | |
|     0xda,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_LEFT,
 | |
|     0xbf,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_RIGHT,
 | |
|     0xc0,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_LEFT,
 | |
|     0xd9,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_RIGHT,
 | |
|     0xc3,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_LEFT,
 | |
|     0xb4,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_HORIZONTAL,
 | |
|     0xc2,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_HORIZONTAL,
 | |
|     0xc1,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_HORIZONTAL,
 | |
|     0xc5,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_HORIZONTAL,
 | |
|     0xcd,
 | |
|     L'-'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_VERTICAL,
 | |
|     0xba,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_RIGHT_DOUBLE,
 | |
|     0xd5,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_DOUBLE_RIGHT,
 | |
|     0xd6,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_DOWN_RIGHT,
 | |
|     0xc9,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_LEFT_DOUBLE,
 | |
|     0xb8,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_DOUBLE_LEFT,
 | |
|     0xb7,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_DOWN_LEFT,
 | |
|     0xbb,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_RIGHT_DOUBLE,
 | |
|     0xd4,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_DOUBLE_RIGHT,
 | |
|     0xd3,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_UP_RIGHT,
 | |
|     0xc8,
 | |
|     L'\\'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_LEFT_DOUBLE,
 | |
|     0xbe,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_DOUBLE_LEFT,
 | |
|     0xbd,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_UP_LEFT,
 | |
|     0xbc,
 | |
|     L'/'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_RIGHT_DOUBLE,
 | |
|     0xc6,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_DOUBLE_RIGHT,
 | |
|     0xc7,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_VERTICAL_RIGHT,
 | |
|     0xcc,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_LEFT_DOUBLE,
 | |
|     0xb5,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_DOUBLE_LEFT,
 | |
|     0xb6,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_VERTICAL_LEFT,
 | |
|     0xb9,
 | |
|     L'|'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_HORIZONTAL_DOUBLE,
 | |
|     0xd1,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOWN_DOUBLE_HORIZONTAL,
 | |
|     0xd2,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_DOWN_HORIZONTAL,
 | |
|     0xcb,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_HORIZONTAL_DOUBLE,
 | |
|     0xcf,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_UP_DOUBLE_HORIZONTAL,
 | |
|     0xd0,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_UP_HORIZONTAL,
 | |
|     0xca,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE,
 | |
|     0xd8,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL,
 | |
|     0xd7,
 | |
|     L'+'
 | |
|   },
 | |
|   {
 | |
|     BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL,
 | |
|     0xce,
 | |
|     L'+'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     BLOCKELEMENT_FULL_BLOCK,
 | |
|     0xdb,
 | |
|     L'*'
 | |
|   },
 | |
|   {
 | |
|     BLOCKELEMENT_LIGHT_SHADE,
 | |
|     0xb0,
 | |
|     L'+'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     GEOMETRICSHAPE_UP_TRIANGLE,
 | |
|     0x1e,
 | |
|     L'^'
 | |
|   },
 | |
|   {
 | |
|     GEOMETRICSHAPE_RIGHT_TRIANGLE,
 | |
|     0x10,
 | |
|     L'>'
 | |
|   },
 | |
|   {
 | |
|     GEOMETRICSHAPE_DOWN_TRIANGLE,
 | |
|     0x1f,
 | |
|     L'v'
 | |
|   },
 | |
|   {
 | |
|     GEOMETRICSHAPE_LEFT_TRIANGLE,
 | |
|     0x11,
 | |
|     L'<'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     ARROW_LEFT,
 | |
|     0x3c,
 | |
|     L'<'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     ARROW_UP,
 | |
|     0x18,
 | |
|     L'^'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     ARROW_RIGHT,
 | |
|     0x3e,
 | |
|     L'>'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     ARROW_DOWN,
 | |
|     0x19,
 | |
|     L'v'
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     0x0000,
 | |
|     0x00,
 | |
|     0x00
 | |
|   }
 | |
| };
 | |
| 
 | |
| //
 | |
| // Private worker functions
 | |
| //
 | |
| STATIC
 | |
| VOID
 | |
| SetVideoCursorPosition (
 | |
|   IN  VGA_CLASS_DEV  *VgaClassDev,
 | |
|   IN  UINTN          Column,
 | |
|   IN  UINTN          Row,
 | |
|   IN  UINTN          MaxColumn
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| WriteCrtc (
 | |
|   IN  VGA_CLASS_DEV  *VgaClassDev,
 | |
|   IN  UINT16         Address,
 | |
|   IN  UINT8          Data
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| LibIsValidTextGraphics (
 | |
|   IN  CHAR16  Graphic,
 | |
|   OUT CHAR8   *PcAnsi, OPTIONAL
 | |
|   OUT CHAR8   *Ascii OPTIONAL
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| IsValidAscii (
 | |
|   IN  CHAR16  Ascii
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| IsValidEfiCntlChar (
 | |
|   IN  CHAR16  c
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassDriverBindingSupported (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   )
 | |
| /*++
 | |
|   
 | |
|   Routine Description:
 | |
|   
 | |
|     Supported.
 | |
|     
 | |
|   Arguments:
 | |
|   
 | |
|     (Standard DriverBinding Protocol Supported() function)
 | |
|     
 | |
|   Returns:
 | |
|   
 | |
|     EFI_STATUS
 | |
|   
 | |
| --*/
 | |
| // GC_TODO:    This - add argument and description to function comment
 | |
| // GC_TODO:    Controller - add argument and description to function comment
 | |
| // GC_TODO:    RemainingDevicePath - add argument and description to function comment
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   EFI_VGA_MINI_PORT_PROTOCOL  *VgaMiniPort;
 | |
| 
 | |
|   //
 | |
|   // Open the IO Abstraction(s) needed to perform the supported test
 | |
|   //
 | |
|   Status = gBS->OpenProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiVgaMiniPortProtocolGuid,
 | |
|                   (VOID **) &VgaMiniPort,
 | |
|                   This->DriverBindingHandle,
 | |
|                   Controller,
 | |
|                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   //
 | |
|   // Open the IO Abstraction(s) needed to perform the supported test
 | |
|   //
 | |
|   Status = gBS->OpenProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiPciIoProtocolGuid,
 | |
|                   NULL,
 | |
|                   This->DriverBindingHandle,
 | |
|                   Controller,
 | |
|                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassDriverBindingStart (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   )
 | |
| /*++
 | |
|   
 | |
|   Routine Description:
 | |
|   
 | |
|     Layers the Simple Text Output Protocol on top of the 
 | |
|     VGA Mini Port Protocol
 | |
|   
 | |
|   Arguments:
 | |
|   
 | |
|     (Standard DriverBinding Protocol Start() function)
 | |
|     
 | |
|   Returns:
 | |
|   
 | |
|     EFI_STATUS
 | |
|     
 | |
| --*/
 | |
| // GC_TODO:    This - add argument and description to function comment
 | |
| // GC_TODO:    Controller - add argument and description to function comment
 | |
| // GC_TODO:    RemainingDevicePath - add argument and description to function comment
 | |
| // GC_TODO:    EFI_OUT_OF_RESOURCES - add return value to function comment
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   EFI_VGA_MINI_PORT_PROTOCOL  *VgaMiniPort;
 | |
|   EFI_PCI_IO_PROTOCOL         *PciIo;
 | |
|   VGA_CLASS_DEV               *VgaClassPrivate;
 | |
|   EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
 | |
| 
 | |
|   Status = gBS->HandleProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiDevicePathProtocolGuid,
 | |
|                   (VOID **) &DevicePath
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   //
 | |
|   // Report that VGA Class driver is being enabled
 | |
|   //
 | |
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH (
 | |
|     EFI_PROGRESS_CODE,
 | |
|     EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_ENABLE,
 | |
|     DevicePath
 | |
|     );
 | |
| 
 | |
|   //
 | |
|   // Open the IO Abstraction(s) needed
 | |
|   //
 | |
|   Status = gBS->OpenProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiPciIoProtocolGuid,
 | |
|                   (VOID **) &PciIo,
 | |
|                   This->DriverBindingHandle,
 | |
|                   Controller,
 | |
|                   EFI_OPEN_PROTOCOL_GET_PROTOCOL
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->OpenProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiVgaMiniPortProtocolGuid,
 | |
|                   (VOID **) &VgaMiniPort,
 | |
|                   This->DriverBindingHandle,
 | |
|                   Controller,
 | |
|                   EFI_OPEN_PROTOCOL_BY_DRIVER
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   //
 | |
|   // Allocate the private device structure
 | |
|   //
 | |
|   Status = gBS->AllocatePool (
 | |
|                   EfiBootServicesData,
 | |
|                   sizeof (VGA_CLASS_DEV),
 | |
|                   (VOID **) &VgaClassPrivate
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     gBS->CloseProtocol (
 | |
|           Controller,
 | |
|           &gEfiVgaMiniPortProtocolGuid,
 | |
|           This->DriverBindingHandle,
 | |
|           Controller
 | |
|           );
 | |
|     return EFI_OUT_OF_RESOURCES;
 | |
|   }
 | |
| 
 | |
|   ZeroMem (VgaClassPrivate, sizeof (VGA_CLASS_DEV));
 | |
| 
 | |
|   //
 | |
|   // Initialize the private device structure
 | |
|   //
 | |
|   VgaClassPrivate->Signature                        = VGA_CLASS_DEV_SIGNATURE;
 | |
|   VgaClassPrivate->Handle = Controller;
 | |
|   VgaClassPrivate->VgaMiniPort = VgaMiniPort;
 | |
|   VgaClassPrivate->PciIo = PciIo;
 | |
| 
 | |
|   VgaClassPrivate->SimpleTextOut.Reset = VgaClassReset;
 | |
|   VgaClassPrivate->SimpleTextOut.OutputString = VgaClassOutputString;
 | |
|   VgaClassPrivate->SimpleTextOut.TestString = VgaClassTestString;
 | |
|   VgaClassPrivate->SimpleTextOut.ClearScreen = VgaClassClearScreen;
 | |
|   VgaClassPrivate->SimpleTextOut.SetAttribute = VgaClassSetAttribute;
 | |
|   VgaClassPrivate->SimpleTextOut.SetCursorPosition = VgaClassSetCursorPosition;
 | |
|   VgaClassPrivate->SimpleTextOut.EnableCursor = VgaClassEnableCursor;
 | |
|   VgaClassPrivate->SimpleTextOut.QueryMode = VgaClassQueryMode;
 | |
|   VgaClassPrivate->SimpleTextOut.SetMode = VgaClassSetMode;
 | |
| 
 | |
|   VgaClassPrivate->SimpleTextOut.Mode = &VgaClassPrivate->SimpleTextOutputMode;
 | |
|   VgaClassPrivate->SimpleTextOutputMode.MaxMode = VgaMiniPort->MaxMode;
 | |
|   VgaClassPrivate->DevicePath = DevicePath;
 | |
| 
 | |
|   Status = VgaClassPrivate->SimpleTextOut.SetAttribute (
 | |
|                                             &VgaClassPrivate->SimpleTextOut,
 | |
|                                             EFI_TEXT_ATTR (EFI_WHITE,
 | |
|     EFI_BLACK)
 | |
|                                             );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     goto ErrorExit;
 | |
|   }
 | |
| 
 | |
|   Status = VgaClassPrivate->SimpleTextOut.Reset (
 | |
|                                             &VgaClassPrivate->SimpleTextOut,
 | |
|                                             FALSE
 | |
|                                             );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     goto ErrorExit;
 | |
|   }
 | |
| 
 | |
|   Status = VgaClassPrivate->SimpleTextOut.EnableCursor (
 | |
|                                             &VgaClassPrivate->SimpleTextOut,
 | |
|                                             TRUE
 | |
|                                             );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     goto ErrorExit;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->InstallMultipleProtocolInterfaces (
 | |
|                   &Controller,
 | |
|                   &gEfiSimpleTextOutProtocolGuid,
 | |
|                   &VgaClassPrivate->SimpleTextOut,
 | |
|                   NULL
 | |
|                   );
 | |
| 
 | |
|   return Status;
 | |
| 
 | |
| ErrorExit:
 | |
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH (
 | |
|     EFI_ERROR_CODE | EFI_ERROR_MINOR,
 | |
|     EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_CONTROLLER_ERROR,
 | |
|     DevicePath
 | |
|     );
 | |
| 
 | |
|   return Status;
 | |
| 
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassDriverBindingStop (
 | |
|   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
 | |
|   IN  EFI_HANDLE                      Controller,
 | |
|   IN  UINTN                           NumberOfChildren,
 | |
|   IN  EFI_HANDLE                      *ChildHandleBuffer
 | |
|   )
 | |
| /*++
 | |
|   
 | |
|   Routine Description:
 | |
|   
 | |
|     Stop.
 | |
|   
 | |
|   Arguments:
 | |
|   
 | |
|     (Standard DriverBinding Protocol Stop() function)
 | |
|   
 | |
|   Returns:
 | |
|   
 | |
|     EFI_STATUS
 | |
|   
 | |
| --*/
 | |
| // GC_TODO:    This - add argument and description to function comment
 | |
| // GC_TODO:    Controller - add argument and description to function comment
 | |
| // GC_TODO:    NumberOfChildren - add argument and description to function comment
 | |
| // GC_TODO:    ChildHandleBuffer - add argument and description to function comment
 | |
| // GC_TODO:    EFI_SUCCESS - add return value to function comment
 | |
| {
 | |
|   EFI_STATUS                    Status;
 | |
|   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *SimpleTextOut;
 | |
|   VGA_CLASS_DEV                 *VgaClassPrivate;
 | |
| 
 | |
|   Status = gBS->OpenProtocol (
 | |
|                   Controller,
 | |
|                   &gEfiSimpleTextOutProtocolGuid,
 | |
|                   (VOID **) &SimpleTextOut,
 | |
|                   This->DriverBindingHandle,
 | |
|                   Controller,
 | |
|                   EFI_OPEN_PROTOCOL_GET_PROTOCOL
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (SimpleTextOut);
 | |
| 
 | |
|   //
 | |
|   // Report that VGA Class driver is being disabled
 | |
|   //
 | |
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH (
 | |
|     EFI_PROGRESS_CODE,
 | |
|     EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_DISABLE,
 | |
|     VgaClassPrivate->DevicePath
 | |
|     );
 | |
| 
 | |
|   Status = gBS->UninstallProtocolInterface (
 | |
|                   Controller,
 | |
|                   &gEfiSimpleTextOutProtocolGuid,
 | |
|                   &VgaClassPrivate->SimpleTextOut
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   //
 | |
|   // Release PCI I/O and VGA Mini Port Protocols on the controller handle.
 | |
|   //
 | |
|   gBS->CloseProtocol (
 | |
|         Controller,
 | |
|         &gEfiPciIoProtocolGuid,
 | |
|         This->DriverBindingHandle,
 | |
|         Controller
 | |
|         );
 | |
| 
 | |
|   gBS->CloseProtocol (
 | |
|         Controller,
 | |
|         &gEfiVgaMiniPortProtocolGuid,
 | |
|         This->DriverBindingHandle,
 | |
|         Controller
 | |
|         );
 | |
| 
 | |
|   gBS->FreePool (VgaClassPrivate);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| //
 | |
| // Simple Text Output Protocol Functions
 | |
| //
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassReset (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL        *This,
 | |
|   IN  BOOLEAN                             ExtendedVerification
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This                  - GC_TODO: add argument description
 | |
|   ExtendedVerification  - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   GC_TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS    Status;
 | |
|   VGA_CLASS_DEV *VgaClassPrivate;
 | |
| 
 | |
|   VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (This);
 | |
| 
 | |
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH (
 | |
|     EFI_PROGRESS_CODE,
 | |
|     EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_RESET,
 | |
|     VgaClassPrivate->DevicePath
 | |
|     );
 | |
| 
 | |
|   This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));
 | |
| 
 | |
|   Status = This->SetMode (This, 0);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   return This->ClearScreen (This);
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassOutputString (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  CHAR16                          *WString
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This    - GC_TODO: add argument description
 | |
|   WString - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   VGA_CLASS_DEV               *VgaClassDev;
 | |
|   EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
 | |
|   UINTN                       MaxColumn;
 | |
|   UINTN                       MaxRow;
 | |
|   UINT32                      VideoChar;
 | |
|   CHAR8                       GraphicChar;
 | |
| 
 | |
|   VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
 | |
| 
 | |
|   Mode        = This->Mode;
 | |
| 
 | |
|   Status = This->QueryMode (
 | |
|                   This,
 | |
|                   Mode->Mode,
 | |
|                   &MaxColumn,
 | |
|                   &MaxRow
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   for (; *WString != CHAR_NULL; WString++) {
 | |
| 
 | |
|     switch (*WString) {
 | |
|     case CHAR_BACKSPACE:
 | |
|       if (Mode->CursorColumn > 0) {
 | |
|         Mode->CursorColumn--;
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case CHAR_LINEFEED:
 | |
|       if (Mode->CursorRow == (INT32) (MaxRow - 1)) {
 | |
|         //
 | |
|         // Scroll the screen by copying the contents
 | |
|         // of the VGA display up one line
 | |
|         //
 | |
|         VgaClassDev->PciIo->CopyMem (
 | |
|                               VgaClassDev->PciIo,
 | |
|                               EfiPciIoWidthUint32,
 | |
|                               VgaClassDev->VgaMiniPort->VgaMemoryBar,
 | |
|                               VgaClassDev->VgaMiniPort->VgaMemoryOffset,
 | |
|                               VgaClassDev->VgaMiniPort->VgaMemoryBar,
 | |
|                               VgaClassDev->VgaMiniPort->VgaMemoryOffset + MaxColumn * 2,
 | |
|                               ((MaxRow - 1) * MaxColumn) >> 1
 | |
|                               );
 | |
| 
 | |
|         //
 | |
|         // Print Blank Line of spaces with the current color attributes
 | |
|         //
 | |
|         VideoChar = (Mode->Attribute << 8) | ' ';
 | |
|         VideoChar = (VideoChar << 16) | VideoChar;
 | |
|         VgaClassDev->PciIo->Mem.Write (
 | |
|                                   VgaClassDev->PciIo,
 | |
|                                   EfiPciIoWidthFillUint32,
 | |
|                                   VgaClassDev->VgaMiniPort->VgaMemoryBar,
 | |
|                                   VgaClassDev->VgaMiniPort->VgaMemoryOffset + (MaxRow - 1) * MaxColumn * 2,
 | |
|                                   MaxColumn >> 1,
 | |
|                                   &VideoChar
 | |
|                                   );
 | |
|       }
 | |
| 
 | |
|       if (Mode->CursorRow < (INT32) (MaxRow - 1)) {
 | |
|         Mode->CursorRow++;
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case CHAR_CARRIAGE_RETURN:
 | |
|       Mode->CursorColumn = 0;
 | |
|       break;
 | |
| 
 | |
|     default:
 | |
|       if (!LibIsValidTextGraphics (*WString, &GraphicChar, NULL)) {
 | |
|         //
 | |
|         // Just convert to ASCII
 | |
|         //
 | |
|         GraphicChar = (CHAR8) *WString;
 | |
|         if (!IsValidAscii (GraphicChar)) {
 | |
|           //
 | |
|           // Keep the API from supporting PCANSI Graphics chars
 | |
|           //
 | |
|           GraphicChar = '?';
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       VideoChar = (Mode->Attribute << 8) | GraphicChar;
 | |
|       VgaClassDev->PciIo->Mem.Write (
 | |
|                                 VgaClassDev->PciIo,
 | |
|                                 EfiPciIoWidthUint16,
 | |
|                                 VgaClassDev->VgaMiniPort->VgaMemoryBar,
 | |
|                                 VgaClassDev->VgaMiniPort->VgaMemoryOffset + ((Mode->CursorRow * MaxColumn + Mode->CursorColumn) * 2),
 | |
|                                 1,
 | |
|                                 &VideoChar
 | |
|                                 );
 | |
| 
 | |
|       if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {
 | |
|         This->OutputString (This, CrLfString);
 | |
|       } else {
 | |
|         Mode->CursorColumn++;
 | |
|       }
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   SetVideoCursorPosition (
 | |
|     VgaClassDev,
 | |
|     (UINTN) Mode->CursorColumn,
 | |
|     (UINTN) Mode->CursorRow,
 | |
|     MaxColumn
 | |
|     );
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassTestString (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  CHAR16                          *WString
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This    - GC_TODO: add argument description
 | |
|   WString - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   while (*WString != 0x0000) {
 | |
|     if (!(IsValidAscii (*WString) || IsValidEfiCntlChar (*WString) || LibIsValidTextGraphics (*WString, NULL, NULL))) {
 | |
|       return EFI_UNSUPPORTED;
 | |
|     }
 | |
| 
 | |
|     WString++;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassClearScreen (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This  - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS    Status;
 | |
|   VGA_CLASS_DEV *VgaClassDev;
 | |
|   UINTN         MaxRow;
 | |
|   UINTN         MaxColumn;
 | |
|   UINT32        VideoChar;
 | |
| 
 | |
|   VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
 | |
| 
 | |
|   Status = This->QueryMode (
 | |
|                   This,
 | |
|                   This->Mode->Mode,
 | |
|                   &MaxColumn,
 | |
|                   &MaxRow
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   VideoChar = (This->Mode->Attribute << 8) | ' ';
 | |
|   VideoChar = (VideoChar << 16) | VideoChar;
 | |
|   VgaClassDev->PciIo->Mem.Write (
 | |
|                             VgaClassDev->PciIo,
 | |
|                             EfiPciIoWidthFillUint32,
 | |
|                             VgaClassDev->VgaMiniPort->VgaMemoryBar,
 | |
|                             VgaClassDev->VgaMiniPort->VgaMemoryOffset,
 | |
|                             (MaxRow * MaxColumn) >> 1,
 | |
|                             &VideoChar
 | |
|                             );
 | |
| 
 | |
|   This->SetCursorPosition (This, 0, 0);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassSetAttribute (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  UINTN                           Attribute
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This      - GC_TODO: add argument description
 | |
|   Attribute - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   if (Attribute <= EFI_MAX_ATTRIBUTE) {
 | |
|     This->Mode->Attribute = (INT32) Attribute;
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   return EFI_UNSUPPORTED;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassSetCursorPosition (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  UINTN                           Column,
 | |
|   IN  UINTN                           Row
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This    - GC_TODO: add argument description
 | |
|   Column  - GC_TODO: add argument description
 | |
|   Row     - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS    Status;
 | |
|   VGA_CLASS_DEV *VgaClassDev;
 | |
|   UINTN         MaxColumn;
 | |
|   UINTN         MaxRow;
 | |
| 
 | |
|   VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
 | |
| 
 | |
|   Status = This->QueryMode (
 | |
|                   This,
 | |
|                   This->Mode->Mode,
 | |
|                   &MaxColumn,
 | |
|                   &MaxRow
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   if (Column >= MaxColumn || Row >= MaxRow) {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   SetVideoCursorPosition (VgaClassDev, Column, Row, MaxColumn);
 | |
| 
 | |
|   This->Mode->CursorColumn  = (INT32) Column;
 | |
|   This->Mode->CursorRow     = (INT32) Row;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassEnableCursor (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  BOOLEAN                         Visible
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This    - GC_TODO: add argument description
 | |
|   Visible - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   VGA_CLASS_DEV *VgaClassDev;
 | |
| 
 | |
|   VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
 | |
|   if (Visible) {
 | |
|     switch (This->Mode->Mode) {
 | |
|     case 1:
 | |
|       WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x06);
 | |
|       WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x07);
 | |
|       break;
 | |
| 
 | |
|     default:
 | |
|       WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x0e);
 | |
|       WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x0f);
 | |
|       break;
 | |
|     }
 | |
|   } else {
 | |
|     WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x20);
 | |
|   }
 | |
| 
 | |
|   This->Mode->CursorVisible = Visible;
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassQueryMode (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  UINTN                           ModeNumber,
 | |
|   OUT UINTN                           *Columns,
 | |
|   OUT UINTN                           *Rows
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This        - GC_TODO: add argument description
 | |
|   ModeNumber  - GC_TODO: add argument description
 | |
|   Columns     - GC_TODO: add argument description
 | |
|   Rows        - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
|   EFI_SUCCESS - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   if ((INT32) ModeNumber >= This->Mode->MaxMode) {
 | |
|     *Columns  = 0;
 | |
|     *Rows     = 0;
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   switch (ModeNumber) {
 | |
|   case 0:
 | |
|     *Columns  = 80;
 | |
|     *Rows     = 25;
 | |
|     break;
 | |
| 
 | |
|   case 1:
 | |
|     *Columns  = 80;
 | |
|     *Rows     = 50;
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     *Columns  = 0;
 | |
|     *Rows     = 0;
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VgaClassSetMode (
 | |
|   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
 | |
|   IN  UINTN                           ModeNumber
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   This        - GC_TODO: add argument description
 | |
|   ModeNumber  - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_UNSUPPORTED - GC_TODO: Add description for return value
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS    Status;
 | |
|   VGA_CLASS_DEV *VgaClassDev;
 | |
| 
 | |
|   VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
 | |
| 
 | |
|   if ((INT32) ModeNumber >= This->Mode->MaxMode) {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   This->ClearScreen (This);
 | |
| 
 | |
|   This->Mode->Mode  = (INT32) ModeNumber;
 | |
| 
 | |
|   Status            = VgaClassDev->VgaMiniPort->SetMode (VgaClassDev->VgaMiniPort, ModeNumber);
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| //
 | |
| // Private Worker Functions
 | |
| //
 | |
| STATIC
 | |
| VOID
 | |
| SetVideoCursorPosition (
 | |
|   IN  VGA_CLASS_DEV  *VgaClassDev,
 | |
|   IN  UINTN          Column,
 | |
|   IN  UINTN          Row,
 | |
|   IN  UINTN          MaxColumn
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   VgaClassDev - GC_TODO: add argument description
 | |
|   Column      - GC_TODO: add argument description
 | |
|   Row         - GC_TODO: add argument description
 | |
|   MaxColumn   - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   GC_TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   Column    = Column & 0xff;
 | |
|   Row       = Row & 0xff;
 | |
|   MaxColumn = MaxColumn & 0xff;
 | |
|   WriteCrtc (
 | |
|     VgaClassDev,
 | |
|     CRTC_CURSOR_LOCATION_HIGH,
 | |
|     (UINT8) ((Row * MaxColumn + Column) >> 8)
 | |
|     );
 | |
|   WriteCrtc (
 | |
|     VgaClassDev,
 | |
|     CRTC_CURSOR_LOCATION_LOW,
 | |
|     (UINT8) ((Row * MaxColumn + Column) & 0xff)
 | |
|     );
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| WriteCrtc (
 | |
|   IN  VGA_CLASS_DEV  *VgaClassDev,
 | |
|   IN  UINT16         Address,
 | |
|   IN  UINT8          Data
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   VgaClassDev - GC_TODO: add argument description
 | |
|   Address     - GC_TODO: add argument description
 | |
|   Data        - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   GC_TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   VgaClassDev->PciIo->Io.Write (
 | |
|                           VgaClassDev->PciIo,
 | |
|                           EfiPciIoWidthUint8,
 | |
|                           VgaClassDev->VgaMiniPort->CrtcAddressRegisterBar,
 | |
|                           VgaClassDev->VgaMiniPort->CrtcAddressRegisterOffset,
 | |
|                           1,
 | |
|                           &Address
 | |
|                           );
 | |
| 
 | |
|   VgaClassDev->PciIo->Io.Write (
 | |
|                           VgaClassDev->PciIo,
 | |
|                           EfiPciIoWidthUint8,
 | |
|                           VgaClassDev->VgaMiniPort->CrtcDataRegisterBar,
 | |
|                           VgaClassDev->VgaMiniPort->CrtcDataRegisterOffset,
 | |
|                           1,
 | |
|                           &Data
 | |
|                           );
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| LibIsValidTextGraphics (
 | |
|   IN  CHAR16  Graphic,
 | |
|   OUT CHAR8   *PcAnsi, OPTIONAL
 | |
|   OUT CHAR8   *Ascii OPTIONAL
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|     Detects if a Unicode char is for Box Drawing text graphics.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|     Grphic  - Unicode char to test.
 | |
| 
 | |
|     PcAnsi  - Optional pointer to return PCANSI equivalent of Graphic.
 | |
| 
 | |
|     Asci    - Optional pointer to return Ascii equivalent of Graphic.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|     TRUE if Gpaphic is a supported Unicode Box Drawing character.
 | |
| 
 | |
| --*/
 | |
| // GC_TODO:    Graphic - add argument and description to function comment
 | |
| {
 | |
|   UNICODE_TO_CHAR *Table;
 | |
| 
 | |
|   if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) {
 | |
|     //
 | |
|     // Unicode drawing code charts are all in the 0x25xx range,
 | |
|     //  arrows are 0x21xx
 | |
|     //
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) {
 | |
|     if (Graphic == Table->Unicode) {
 | |
|       if (PcAnsi) {
 | |
|         *PcAnsi = Table->PcAnsi;
 | |
|       }
 | |
| 
 | |
|       if (Ascii) {
 | |
|         *Ascii = Table->Ascii;
 | |
|       }
 | |
| 
 | |
|       return TRUE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| IsValidAscii (
 | |
|   IN  CHAR16  Ascii
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Ascii - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   GC_TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   if ((Ascii >= 0x20) && (Ascii <= 0x7f)) {
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| IsValidEfiCntlChar (
 | |
|   IN  CHAR16  c
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   GC_TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   c - GC_TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   GC_TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) {
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 |