155a1bb43aa37fc948911197a99e23199fcc58b72xli/** @file 255a1bb43aa37fc948911197a99e23199fcc58b72xli VGA Class Driver that managers VGA devices and produces Simple Text Output Protocol. 33db510989eb500296c3f4839c427325a02aea2e3klu 4180a5a35cb49699bd249dee19e41cee34c856a58hhtianCopyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> 5180a5a35cb49699bd249dee19e41cee34c856a58hhtianThis program and the accompanying materials 63db510989eb500296c3f4839c427325a02aea2e3kluare licensed and made available under the terms and conditions of the BSD License 73db510989eb500296c3f4839c427325a02aea2e3kluwhich accompanies this distribution. The full text of the license may be found at 83db510989eb500296c3f4839c427325a02aea2e3kluhttp://opensource.org/licenses/bsd-license.php 93db510989eb500296c3f4839c427325a02aea2e3klu 103db510989eb500296c3f4839c427325a02aea2e3kluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 113db510989eb500296c3f4839c427325a02aea2e3kluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 123db510989eb500296c3f4839c427325a02aea2e3klu 133db510989eb500296c3f4839c427325a02aea2e3klu**/ 14e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 15e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang#include "VgaClass.h" 16e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 17e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 18e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// EFI Driver Binding Protocol for the VGA Class Driver 19e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 20e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_DRIVER_BINDING_PROTOCOL gVgaClassDriverBinding = { 21e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDriverBindingSupported, 22e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDriverBindingStart, 23e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDriverBindingStop, 24e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xa, 25e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang NULL, 26e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang NULL 27e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}; 28e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 29e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 30e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// Local variables 31e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 32819d1488930d30b30bb467fcb3bf0f05b28d675ejjiCHAR16 CrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL }; 33e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 34e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 35e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// This list is used to define the valid extend chars. 36e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// It also provides a mapping from Unicode to PCANSI or 37e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// ASCII. The ASCII mapping we just made up. 38e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 39e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// 40819d1488930d30b30bb467fcb3bf0f05b28d675ejjiUNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { 41e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 42e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_HORIZONTAL, 43e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc4, 44e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'-' 45e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 46e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 47e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL, 48e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb3, 49e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 50e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 51e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 52e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_RIGHT, 53e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xda, 54e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 55e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 56e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 57e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_LEFT, 58e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xbf, 59e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 60e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 61e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 62e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_RIGHT, 63e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc0, 64e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 65e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 66e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 67e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_LEFT, 68e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd9, 69e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 70e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 71e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 72e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_RIGHT, 73e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc3, 74e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 75e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 76e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 77e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_LEFT, 78e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb4, 79e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 80e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 81e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 82e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_HORIZONTAL, 83e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc2, 84e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 85e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 86e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 87e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_HORIZONTAL, 88e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc1, 89e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 90e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 91e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 92e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_HORIZONTAL, 93e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc5, 94e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 95e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 96e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 97e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_HORIZONTAL, 98e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xcd, 99e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'-' 100e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 101e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 102e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_VERTICAL, 103e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xba, 104e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 105e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 106e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 107e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_RIGHT_DOUBLE, 108e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd5, 109e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 110e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 111e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 112e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_DOUBLE_RIGHT, 113e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd6, 114e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 115e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 116e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 117e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_DOWN_RIGHT, 118e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc9, 119e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 120e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 121e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 122e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_LEFT_DOUBLE, 123e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb8, 124e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 125e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 126e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 127e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_DOUBLE_LEFT, 128e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb7, 129e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 130e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 131e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 132e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_DOWN_LEFT, 133e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xbb, 134e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 135e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 136e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 137e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_RIGHT_DOUBLE, 138e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd4, 139e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 140e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 141e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 142e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_DOUBLE_RIGHT, 143e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd3, 144e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 145e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 146e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 147e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_UP_RIGHT, 148e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc8, 149e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'\\' 150e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 151e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 152e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_LEFT_DOUBLE, 153e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xbe, 154e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 155e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 156e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 157e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_DOUBLE_LEFT, 158e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xbd, 159e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 160e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 161e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 162e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_UP_LEFT, 163e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xbc, 164e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'/' 165e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 166e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 167e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_RIGHT_DOUBLE, 168e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc6, 169e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 170e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 171e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 172e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_DOUBLE_RIGHT, 173e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xc7, 174e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 175e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 176e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 177e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_VERTICAL_RIGHT, 178e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xcc, 179e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 180e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 181e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 182e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_LEFT_DOUBLE, 183e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb5, 184e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 185e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 186e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 187e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_DOUBLE_LEFT, 188e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb6, 189e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 190e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 191e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 192e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_VERTICAL_LEFT, 193e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb9, 194e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'|' 195e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 196e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 197e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 198e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd1, 199e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 200e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 201e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 202e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 203e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd2, 204e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 205e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 206e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 207e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 208e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xcb, 209e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 210e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 211e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 212e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_HORIZONTAL_DOUBLE, 213e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xcf, 214e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 215e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 216e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 217e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_UP_DOUBLE_HORIZONTAL, 218e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd0, 219e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 220e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 221e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 222e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_UP_HORIZONTAL, 223e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xca, 224e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 225e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 226e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 227e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 228e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd8, 229e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 230e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 231e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 232e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 233e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xd7, 234e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 235e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 236e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 237e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 238e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xce, 239e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 240e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 241e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 242e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 243e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BLOCKELEMENT_FULL_BLOCK, 244e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xdb, 245e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'*' 246e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 247e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 248e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang BLOCKELEMENT_LIGHT_SHADE, 249e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0xb0, 250e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'+' 251e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 252e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 253e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 254e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang GEOMETRICSHAPE_UP_TRIANGLE, 255e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x1e, 256e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'^' 257e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 258e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 259e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang GEOMETRICSHAPE_RIGHT_TRIANGLE, 260e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x10, 261e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'>' 262e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 263e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 264e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang GEOMETRICSHAPE_DOWN_TRIANGLE, 265e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x1f, 266e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'v' 267e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 268e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 269e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang GEOMETRICSHAPE_LEFT_TRIANGLE, 270e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x11, 271e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'<' 272e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 273e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 274e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 275e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ARROW_LEFT, 276e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x3c, 277e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'<' 278e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 279e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 280e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 281e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ARROW_UP, 282e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x18, 283e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'^' 284e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 285e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 286e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 287e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ARROW_RIGHT, 288e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x3e, 289e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'>' 290e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 291e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 292e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 293e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ARROW_DOWN, 294e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x19, 295e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang L'v' 296e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang }, 297e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 298e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang { 299e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x0000, 300e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x00, 301e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 0x00 302e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 303e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}; 304e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 30555a1bb43aa37fc948911197a99e23199fcc58b72xli/** 30655a1bb43aa37fc948911197a99e23199fcc58b72xli Entrypoint of this VGA Class Driver. 30755a1bb43aa37fc948911197a99e23199fcc58b72xli 30855a1bb43aa37fc948911197a99e23199fcc58b72xli This function is the entrypoint of this VGA Class Driver. It installs Driver Binding 30955a1bb43aa37fc948911197a99e23199fcc58b72xli Protocols together with Component Name Protocols. 31055a1bb43aa37fc948911197a99e23199fcc58b72xli 31155a1bb43aa37fc948911197a99e23199fcc58b72xli @param ImageHandle The firmware allocated handle for the EFI image. 31255a1bb43aa37fc948911197a99e23199fcc58b72xli @param SystemTable A pointer to the EFI System Table. 31355a1bb43aa37fc948911197a99e23199fcc58b72xli 31455a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The entry point is executed successfully. 31555a1bb43aa37fc948911197a99e23199fcc58b72xli 31655a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 31755a1bb43aa37fc948911197a99e23199fcc58b72xliEFI_STATUS 31855a1bb43aa37fc948911197a99e23199fcc58b72xliEFIAPI 31955a1bb43aa37fc948911197a99e23199fcc58b72xliInitializeVgaClass( 32055a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_HANDLE ImageHandle, 32155a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SYSTEM_TABLE *SystemTable 32255a1bb43aa37fc948911197a99e23199fcc58b72xli ) 32355a1bb43aa37fc948911197a99e23199fcc58b72xli{ 32455a1bb43aa37fc948911197a99e23199fcc58b72xli EFI_STATUS Status; 32555a1bb43aa37fc948911197a99e23199fcc58b72xli 32655a1bb43aa37fc948911197a99e23199fcc58b72xli // 32755a1bb43aa37fc948911197a99e23199fcc58b72xli // Install driver model protocol(s). 32855a1bb43aa37fc948911197a99e23199fcc58b72xli // 32955a1bb43aa37fc948911197a99e23199fcc58b72xli Status = EfiLibInstallDriverBindingComponentName2 ( 33055a1bb43aa37fc948911197a99e23199fcc58b72xli ImageHandle, 33155a1bb43aa37fc948911197a99e23199fcc58b72xli SystemTable, 33255a1bb43aa37fc948911197a99e23199fcc58b72xli &gVgaClassDriverBinding, 33355a1bb43aa37fc948911197a99e23199fcc58b72xli ImageHandle, 33455a1bb43aa37fc948911197a99e23199fcc58b72xli &gVgaClassComponentName, 33555a1bb43aa37fc948911197a99e23199fcc58b72xli &gVgaClassComponentName2 33655a1bb43aa37fc948911197a99e23199fcc58b72xli ); 33755a1bb43aa37fc948911197a99e23199fcc58b72xli ASSERT_EFI_ERROR (Status); 33855a1bb43aa37fc948911197a99e23199fcc58b72xli 33955a1bb43aa37fc948911197a99e23199fcc58b72xli return EFI_SUCCESS; 34055a1bb43aa37fc948911197a99e23199fcc58b72xli} 34155a1bb43aa37fc948911197a99e23199fcc58b72xli 34255a1bb43aa37fc948911197a99e23199fcc58b72xli/** 34355a1bb43aa37fc948911197a99e23199fcc58b72xli Internal worker function to program CRTC register via PCI I/O Protocol. 34455a1bb43aa37fc948911197a99e23199fcc58b72xli 34555a1bb43aa37fc948911197a99e23199fcc58b72xli @param VgaClassDev device instance object 34655a1bb43aa37fc948911197a99e23199fcc58b72xli @param Address Address of register to write 34755a1bb43aa37fc948911197a99e23199fcc58b72xli @param Data Data to write to register. 34855a1bb43aa37fc948911197a99e23199fcc58b72xli 34955a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 35055a1bb43aa37fc948911197a99e23199fcc58b72xliVOID 35155a1bb43aa37fc948911197a99e23199fcc58b72xliWriteCrtc ( 35255a1bb43aa37fc948911197a99e23199fcc58b72xli IN VGA_CLASS_DEV *VgaClassDev, 35355a1bb43aa37fc948911197a99e23199fcc58b72xli IN UINT16 Address, 35455a1bb43aa37fc948911197a99e23199fcc58b72xli IN UINT8 Data 35555a1bb43aa37fc948911197a99e23199fcc58b72xli ) 35655a1bb43aa37fc948911197a99e23199fcc58b72xli{ 35755a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->PciIo->Io.Write ( 35855a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->PciIo, 35955a1bb43aa37fc948911197a99e23199fcc58b72xli EfiPciIoWidthUint8, 36055a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->VgaMiniPort->CrtcAddressRegisterBar, 36155a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->VgaMiniPort->CrtcAddressRegisterOffset, 36255a1bb43aa37fc948911197a99e23199fcc58b72xli 1, 36355a1bb43aa37fc948911197a99e23199fcc58b72xli &Address 36455a1bb43aa37fc948911197a99e23199fcc58b72xli ); 36555a1bb43aa37fc948911197a99e23199fcc58b72xli 36655a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->PciIo->Io.Write ( 36755a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->PciIo, 36855a1bb43aa37fc948911197a99e23199fcc58b72xli EfiPciIoWidthUint8, 36955a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->VgaMiniPort->CrtcDataRegisterBar, 37055a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev->VgaMiniPort->CrtcDataRegisterOffset, 37155a1bb43aa37fc948911197a99e23199fcc58b72xli 1, 37255a1bb43aa37fc948911197a99e23199fcc58b72xli &Data 37355a1bb43aa37fc948911197a99e23199fcc58b72xli ); 37455a1bb43aa37fc948911197a99e23199fcc58b72xli} 37555a1bb43aa37fc948911197a99e23199fcc58b72xli 37655a1bb43aa37fc948911197a99e23199fcc58b72xli/** 37755a1bb43aa37fc948911197a99e23199fcc58b72xli Internal worker function to set cursor's position to VgaClass device 37855a1bb43aa37fc948911197a99e23199fcc58b72xli 37955a1bb43aa37fc948911197a99e23199fcc58b72xli @param VgaClassDev Private data structure for device instance. 38055a1bb43aa37fc948911197a99e23199fcc58b72xli @param Column Colomn of position to set cursor to. 38155a1bb43aa37fc948911197a99e23199fcc58b72xli @param Row Row of position to set cursor to. 38255a1bb43aa37fc948911197a99e23199fcc58b72xli @param MaxColumn Max value of column. 38355a1bb43aa37fc948911197a99e23199fcc58b72xli 38455a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 385e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVOID 386e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangSetVideoCursorPosition ( 387e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN VGA_CLASS_DEV *VgaClassDev, 388e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN Column, 389e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN Row, 390e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN MaxColumn 39155a1bb43aa37fc948911197a99e23199fcc58b72xli ) 39255a1bb43aa37fc948911197a99e23199fcc58b72xli{ 39355a1bb43aa37fc948911197a99e23199fcc58b72xli Column = Column & 0xff; 39455a1bb43aa37fc948911197a99e23199fcc58b72xli Row = Row & 0xff; 39555a1bb43aa37fc948911197a99e23199fcc58b72xli MaxColumn = MaxColumn & 0xff; 396e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 39755a1bb43aa37fc948911197a99e23199fcc58b72xli WriteCrtc ( 39855a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev, 39955a1bb43aa37fc948911197a99e23199fcc58b72xli CRTC_CURSOR_LOCATION_HIGH, 40055a1bb43aa37fc948911197a99e23199fcc58b72xli (UINT8) ((Row * MaxColumn + Column) >> 8) 40155a1bb43aa37fc948911197a99e23199fcc58b72xli ); 40255a1bb43aa37fc948911197a99e23199fcc58b72xli WriteCrtc ( 40355a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassDev, 40455a1bb43aa37fc948911197a99e23199fcc58b72xli CRTC_CURSOR_LOCATION_LOW, 40555a1bb43aa37fc948911197a99e23199fcc58b72xli (UINT8) ((Row * MaxColumn + Column) & 0xff) 40655a1bb43aa37fc948911197a99e23199fcc58b72xli ); 40755a1bb43aa37fc948911197a99e23199fcc58b72xli} 40855a1bb43aa37fc948911197a99e23199fcc58b72xli 40955a1bb43aa37fc948911197a99e23199fcc58b72xli/** 41055a1bb43aa37fc948911197a99e23199fcc58b72xli Internal worker function to detect if a Unicode char is for Box Drawing text graphics. 411e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 41255a1bb43aa37fc948911197a99e23199fcc58b72xli @param Graphic Unicode char to test. 41355a1bb43aa37fc948911197a99e23199fcc58b72xli @param PcAnsi Pointer to PCANSI equivalent of Graphic for output. 41455a1bb43aa37fc948911197a99e23199fcc58b72xli If NULL, then PCANSI value is not returned. 41555a1bb43aa37fc948911197a99e23199fcc58b72xli @param Ascii Pointer to ASCII equivalent of Graphic for output. 41655a1bb43aa37fc948911197a99e23199fcc58b72xli If NULL, then ASCII value is not returned. 41755a1bb43aa37fc948911197a99e23199fcc58b72xli 41855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval TRUE Gpaphic is a supported Unicode Box Drawing character. 41955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval FALSE Gpaphic is not a supported Unicode Box Drawing character. 42055a1bb43aa37fc948911197a99e23199fcc58b72xli 42155a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 422e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN 423e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangLibIsValidTextGraphics ( 424e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN CHAR16 Graphic, 425e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang OUT CHAR8 *PcAnsi, OPTIONAL 426e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang OUT CHAR8 *Ascii OPTIONAL 42755a1bb43aa37fc948911197a99e23199fcc58b72xli ) 42855a1bb43aa37fc948911197a99e23199fcc58b72xli{ 42955a1bb43aa37fc948911197a99e23199fcc58b72xli UNICODE_TO_CHAR *Table; 43055a1bb43aa37fc948911197a99e23199fcc58b72xli 43155a1bb43aa37fc948911197a99e23199fcc58b72xli // 43255a1bb43aa37fc948911197a99e23199fcc58b72xli // Unicode drawing code charts are all in the 0x25xx range, arrows are 0x21xx. 43355a1bb43aa37fc948911197a99e23199fcc58b72xli // So first filter out values not in these 2 ranges. 43455a1bb43aa37fc948911197a99e23199fcc58b72xli // 43555a1bb43aa37fc948911197a99e23199fcc58b72xli if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { 43655a1bb43aa37fc948911197a99e23199fcc58b72xli return FALSE; 43755a1bb43aa37fc948911197a99e23199fcc58b72xli } 43855a1bb43aa37fc948911197a99e23199fcc58b72xli 43955a1bb43aa37fc948911197a99e23199fcc58b72xli // 44055a1bb43aa37fc948911197a99e23199fcc58b72xli // Search UnicodeToPcAnsiOrAscii table for matching entry. 44155a1bb43aa37fc948911197a99e23199fcc58b72xli // 44255a1bb43aa37fc948911197a99e23199fcc58b72xli for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { 44355a1bb43aa37fc948911197a99e23199fcc58b72xli if (Graphic == Table->Unicode) { 44455a1bb43aa37fc948911197a99e23199fcc58b72xli if (PcAnsi != NULL) { 44555a1bb43aa37fc948911197a99e23199fcc58b72xli *PcAnsi = Table->PcAnsi; 44655a1bb43aa37fc948911197a99e23199fcc58b72xli } 44755a1bb43aa37fc948911197a99e23199fcc58b72xli 44855a1bb43aa37fc948911197a99e23199fcc58b72xli if (Ascii != NULL) { 44955a1bb43aa37fc948911197a99e23199fcc58b72xli *Ascii = Table->Ascii; 45055a1bb43aa37fc948911197a99e23199fcc58b72xli } 45155a1bb43aa37fc948911197a99e23199fcc58b72xli 45255a1bb43aa37fc948911197a99e23199fcc58b72xli return TRUE; 45355a1bb43aa37fc948911197a99e23199fcc58b72xli } 45455a1bb43aa37fc948911197a99e23199fcc58b72xli } 45555a1bb43aa37fc948911197a99e23199fcc58b72xli 45655a1bb43aa37fc948911197a99e23199fcc58b72xli // 45755a1bb43aa37fc948911197a99e23199fcc58b72xli // If value is not found in UnicodeToPcAnsiOrAscii table, then return FALSE. 45855a1bb43aa37fc948911197a99e23199fcc58b72xli // 45955a1bb43aa37fc948911197a99e23199fcc58b72xli return FALSE; 46055a1bb43aa37fc948911197a99e23199fcc58b72xli} 46155a1bb43aa37fc948911197a99e23199fcc58b72xli 46255a1bb43aa37fc948911197a99e23199fcc58b72xli/** 46355a1bb43aa37fc948911197a99e23199fcc58b72xli Internal worker function to check whether input value is an ASCII char. 46455a1bb43aa37fc948911197a99e23199fcc58b72xli 46555a1bb43aa37fc948911197a99e23199fcc58b72xli @param Char Character to check. 46655a1bb43aa37fc948911197a99e23199fcc58b72xli 46755a1bb43aa37fc948911197a99e23199fcc58b72xli @retval TRUE Input value is an ASCII char. 46855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval FALSE Input value is not an ASCII char. 469e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 47055a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 471e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN 472e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangIsValidAscii ( 47355a1bb43aa37fc948911197a99e23199fcc58b72xli IN CHAR16 Char 47455a1bb43aa37fc948911197a99e23199fcc58b72xli ) 47555a1bb43aa37fc948911197a99e23199fcc58b72xli{ 47655a1bb43aa37fc948911197a99e23199fcc58b72xli if ((Char >= 0x20) && (Char <= 0x7f)) { 47755a1bb43aa37fc948911197a99e23199fcc58b72xli return TRUE; 47855a1bb43aa37fc948911197a99e23199fcc58b72xli } 479e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 48055a1bb43aa37fc948911197a99e23199fcc58b72xli return FALSE; 48155a1bb43aa37fc948911197a99e23199fcc58b72xli} 48255a1bb43aa37fc948911197a99e23199fcc58b72xli 48355a1bb43aa37fc948911197a99e23199fcc58b72xli/** 48455a1bb43aa37fc948911197a99e23199fcc58b72xli Internal worker function to check whether input value is a unicode control char. 48555a1bb43aa37fc948911197a99e23199fcc58b72xli 48655a1bb43aa37fc948911197a99e23199fcc58b72xli @param Char Character to check. 48755a1bb43aa37fc948911197a99e23199fcc58b72xli 48855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval TRUE Input value is a unicode control char. 48955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval FALSE Input value is not a unicode control char. 49055a1bb43aa37fc948911197a99e23199fcc58b72xli 49155a1bb43aa37fc948911197a99e23199fcc58b72xli**/ 492e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN 493e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangIsValidEfiCntlChar ( 49455a1bb43aa37fc948911197a99e23199fcc58b72xli IN CHAR16 Char 49555a1bb43aa37fc948911197a99e23199fcc58b72xli ) 49655a1bb43aa37fc948911197a99e23199fcc58b72xli{ 49755a1bb43aa37fc948911197a99e23199fcc58b72xli if (Char == CHAR_NULL || Char == CHAR_BACKSPACE || Char == CHAR_LINEFEED || Char == CHAR_CARRIAGE_RETURN) { 49855a1bb43aa37fc948911197a99e23199fcc58b72xli return TRUE; 49955a1bb43aa37fc948911197a99e23199fcc58b72xli } 50055a1bb43aa37fc948911197a99e23199fcc58b72xli 50155a1bb43aa37fc948911197a99e23199fcc58b72xli return FALSE; 50255a1bb43aa37fc948911197a99e23199fcc58b72xli} 503e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 504a73d0c743b5192b1038a24711525eed71dfa300fklu/** 50555a1bb43aa37fc948911197a99e23199fcc58b72xli Tests to see if this driver supports a given controller. 506a73d0c743b5192b1038a24711525eed71dfa300fklu 50755a1bb43aa37fc948911197a99e23199fcc58b72xli This function implments EFI_DRIVER_BINDING_PROTOCOL.Supported(). 50855a1bb43aa37fc948911197a99e23199fcc58b72xli It Checks if this driver supports the controller specified. Any Controller 50955a1bb43aa37fc948911197a99e23199fcc58b72xli with VgaMiniPort Protocol and Pci I/O protocol can be supported. 51055a1bb43aa37fc948911197a99e23199fcc58b72xli 51155a1bb43aa37fc948911197a99e23199fcc58b72xli @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. 512a73d0c743b5192b1038a24711525eed71dfa300fklu @param ControllerHandle Handle of device to test 513a73d0c743b5192b1038a24711525eed71dfa300fklu @param RemainingDevicePath Optional parameter use to pick a specific child 514a73d0c743b5192b1038a24711525eed71dfa300fklu device to start. 515a73d0c743b5192b1038a24711525eed71dfa300fklu 51655a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS This driver supports this device. 51755a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_ALREADY_STARTED This driver is already running on this device. 51855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED This driver does not support this device. 519a73d0c743b5192b1038a24711525eed71dfa300fklu 520a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 521e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 522e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 523e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingSupported ( 524e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_DRIVER_BINDING_PROTOCOL *This, 525e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_HANDLE Controller, 52655a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL 527e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 528e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 529e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 530e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 531e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 53255a1bb43aa37fc948911197a99e23199fcc58b72xli // Checks if Abstraction(s) needed to perform the supported test 533e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 534e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->OpenProtocol ( 535e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 536e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiVgaMiniPortProtocolGuid, 53755a1bb43aa37fc948911197a99e23199fcc58b72xli NULL, 538e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->DriverBindingHandle, 539e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 540e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_OPEN_PROTOCOL_TEST_PROTOCOL 541e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 542e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 543e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 544e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 545e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 546e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Open the IO Abstraction(s) needed to perform the supported test 547e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 548e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->OpenProtocol ( 549e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 550e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiPciIoProtocolGuid, 551e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang NULL, 552e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->DriverBindingHandle, 553e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 554e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_OPEN_PROTOCOL_TEST_PROTOCOL 555e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 556e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 557e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 558e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 559e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 560e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 561e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 562e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 563a73d0c743b5192b1038a24711525eed71dfa300fklu/** 56455a1bb43aa37fc948911197a99e23199fcc58b72xli Starts the device controller. 565a73d0c743b5192b1038a24711525eed71dfa300fklu 56655a1bb43aa37fc948911197a99e23199fcc58b72xli This function implments EFI_DRIVER_BINDING_PROTOCOL.Start(). 56755a1bb43aa37fc948911197a99e23199fcc58b72xli It starts the device specified by Controller with the driver based on PCI I/O Protocol 56855a1bb43aa37fc948911197a99e23199fcc58b72xli and VgaMiniPort Protocol. It creates context for device instance and install EFI_SIMPLE_TEXT_OUT_PROTOCOL. 56955a1bb43aa37fc948911197a99e23199fcc58b72xli 57055a1bb43aa37fc948911197a99e23199fcc58b72xli @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. 571a73d0c743b5192b1038a24711525eed71dfa300fklu @param ControllerHandle Handle of device to bind driver to 572a73d0c743b5192b1038a24711525eed71dfa300fklu @param RemainingDevicePath Optional parameter use to pick a specific child 573a73d0c743b5192b1038a24711525eed71dfa300fklu device to start. 574a73d0c743b5192b1038a24711525eed71dfa300fklu 57555a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The device was started. 57655a1bb43aa37fc948911197a99e23199fcc58b72xli @retval other Fail to start the device. 577a73d0c743b5192b1038a24711525eed71dfa300fklu 578a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 579e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 580e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 581e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingStart ( 582e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_DRIVER_BINDING_PROTOCOL *This, 583e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_HANDLE Controller, 58455a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL 585e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 586e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 587e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 588e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort; 589e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PCI_IO_PROTOCOL *PciIo; 590e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassPrivate; 591e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_DEVICE_PATH_PROTOCOL *DevicePath; 592e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 593e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->HandleProtocol ( 594e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 595e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiDevicePathProtocolGuid, 596e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (VOID **) &DevicePath 597e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 598e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 599e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 600e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 601e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 602e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Report that VGA Class driver is being enabled 603e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 604e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang REPORT_STATUS_CODE_WITH_DEVICE_PATH ( 605e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PROGRESS_CODE, 606e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_ENABLE, 607e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang DevicePath 608e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 609e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 610e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 61155a1bb43aa37fc948911197a99e23199fcc58b72xli // Open the PCI I/O Protocol 612e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 613e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->OpenProtocol ( 614e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 615e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiPciIoProtocolGuid, 616e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (VOID **) &PciIo, 617e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->DriverBindingHandle, 618e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 619e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_OPEN_PROTOCOL_GET_PROTOCOL 620e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 621e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 622e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 623e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 62455a1bb43aa37fc948911197a99e23199fcc58b72xli // 62555a1bb43aa37fc948911197a99e23199fcc58b72xli // Open the VGA Mini Port Protocol 62655a1bb43aa37fc948911197a99e23199fcc58b72xli // 627e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->OpenProtocol ( 628e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 629e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiVgaMiniPortProtocolGuid, 630e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (VOID **) &VgaMiniPort, 631e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->DriverBindingHandle, 632e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 633e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_OPEN_PROTOCOL_BY_DRIVER 634e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 635e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 636e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 637e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 638e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 639e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Allocate the private device structure 640e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 64155a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate = AllocateZeroPool (sizeof (VGA_CLASS_DEV)); 64255a1bb43aa37fc948911197a99e23199fcc58b72xli ASSERT (VgaClassPrivate != NULL); 643e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 644e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 645e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Initialize the private device structure 646e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 64755a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->Signature = VGA_CLASS_DEV_SIGNATURE; 64855a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->Handle = Controller; 649e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate->VgaMiniPort = VgaMiniPort; 65055a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->PciIo = PciIo; 651e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 65255a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.Reset = VgaClassReset; 65355a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.OutputString = VgaClassOutputString; 65455a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.TestString = VgaClassTestString; 65555a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.ClearScreen = VgaClassClearScreen; 65655a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.SetAttribute = VgaClassSetAttribute; 657e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate->SimpleTextOut.SetCursorPosition = VgaClassSetCursorPosition; 65855a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.EnableCursor = VgaClassEnableCursor; 65955a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.QueryMode = VgaClassQueryMode; 66055a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.SetMode = VgaClassSetMode; 661e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 66255a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOut.Mode = &VgaClassPrivate->SimpleTextOutputMode; 66355a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->SimpleTextOutputMode.MaxMode = VgaMiniPort->MaxMode; 66455a1bb43aa37fc948911197a99e23199fcc58b72xli VgaClassPrivate->DevicePath = DevicePath; 665e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 66655a1bb43aa37fc948911197a99e23199fcc58b72xli // 66755a1bb43aa37fc948911197a99e23199fcc58b72xli // Initialize the VGA device. 66855a1bb43aa37fc948911197a99e23199fcc58b72xli // 669e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = VgaClassPrivate->SimpleTextOut.SetAttribute ( 670e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VgaClassPrivate->SimpleTextOut, 67155a1bb43aa37fc948911197a99e23199fcc58b72xli EFI_TEXT_ATTR (EFI_WHITE, EFI_BLACK) 672e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 673e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 674e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang goto ErrorExit; 675e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 676e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 677e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = VgaClassPrivate->SimpleTextOut.Reset ( 678e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VgaClassPrivate->SimpleTextOut, 679e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang FALSE 680e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 681e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 682e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang goto ErrorExit; 683e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 684e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 685e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = VgaClassPrivate->SimpleTextOut.EnableCursor ( 686e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VgaClassPrivate->SimpleTextOut, 687e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang TRUE 688e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 689e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 690e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang goto ErrorExit; 691e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 692e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 693e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->InstallMultipleProtocolInterfaces ( 694e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &Controller, 695e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiSimpleTextOutProtocolGuid, 696e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VgaClassPrivate->SimpleTextOut, 697e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang NULL 698e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 699e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 700e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 701e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 702e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangErrorExit: 703e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang REPORT_STATUS_CODE_WITH_DEVICE_PATH ( 704e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_ERROR_CODE | EFI_ERROR_MINOR, 705e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_CONTROLLER_ERROR, 706e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang DevicePath 707e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 708e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 709e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 710e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 711e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 712e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 713a73d0c743b5192b1038a24711525eed71dfa300fklu/** 71455a1bb43aa37fc948911197a99e23199fcc58b72xli Starts the device controller. 71555a1bb43aa37fc948911197a99e23199fcc58b72xli 71655a1bb43aa37fc948911197a99e23199fcc58b72xli This function implments EFI_DRIVER_BINDING_PROTOCOL.Stop(). 71755a1bb43aa37fc948911197a99e23199fcc58b72xli It stops this driver on Controller. Support stoping any child handles 718a73d0c743b5192b1038a24711525eed71dfa300fklu created by this driver. 719a73d0c743b5192b1038a24711525eed71dfa300fklu 72055a1bb43aa37fc948911197a99e23199fcc58b72xli @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. 72155a1bb43aa37fc948911197a99e23199fcc58b72xli @param ControllerHandle A handle to the device being stopped. 72255a1bb43aa37fc948911197a99e23199fcc58b72xli @param NumberOfChildren The number of child device handles in ChildHandleBuffer. 72355a1bb43aa37fc948911197a99e23199fcc58b72xli @param ChildHandleBuffer An array of child handles to be freed. 724a73d0c743b5192b1038a24711525eed71dfa300fklu 725a73d0c743b5192b1038a24711525eed71dfa300fklu @retval EFI_SUCCESS This driver is removed ControllerHandle 726a73d0c743b5192b1038a24711525eed71dfa300fklu @retval other This driver was not removed from this device 727a73d0c743b5192b1038a24711525eed71dfa300fklu 728a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 729e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 730e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 731e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingStop ( 732e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_DRIVER_BINDING_PROTOCOL *This, 733e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_HANDLE Controller, 734e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN NumberOfChildren, 73555a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_HANDLE *ChildHandleBuffer OPTIONAL 736e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 737e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 738e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 739e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; 740e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassPrivate; 741e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 742e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->OpenProtocol ( 743e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 744e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiSimpleTextOutProtocolGuid, 745e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (VOID **) &SimpleTextOut, 746e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->DriverBindingHandle, 747e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 748e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_OPEN_PROTOCOL_GET_PROTOCOL 749e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 750e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 751e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 752e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 753e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 754e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (SimpleTextOut); 755e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 756e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 757e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Report that VGA Class driver is being disabled 758e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 759e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang REPORT_STATUS_CODE_WITH_DEVICE_PATH ( 760e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PROGRESS_CODE, 761e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_DISABLE, 762e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate->DevicePath 763e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 764e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 765e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = gBS->UninstallProtocolInterface ( 766e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Controller, 767e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &gEfiSimpleTextOutProtocolGuid, 768e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VgaClassPrivate->SimpleTextOut 769e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 770e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 771e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 772e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 773e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 774e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Release PCI I/O and VGA Mini Port Protocols on the controller handle. 775e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 776e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang gBS->CloseProtocol ( 77755a1bb43aa37fc948911197a99e23199fcc58b72xli Controller, 77855a1bb43aa37fc948911197a99e23199fcc58b72xli &gEfiPciIoProtocolGuid, 77955a1bb43aa37fc948911197a99e23199fcc58b72xli This->DriverBindingHandle, 78055a1bb43aa37fc948911197a99e23199fcc58b72xli Controller 78155a1bb43aa37fc948911197a99e23199fcc58b72xli ); 782e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 783e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang gBS->CloseProtocol ( 78455a1bb43aa37fc948911197a99e23199fcc58b72xli Controller, 78555a1bb43aa37fc948911197a99e23199fcc58b72xli &gEfiVgaMiniPortProtocolGuid, 78655a1bb43aa37fc948911197a99e23199fcc58b72xli This->DriverBindingHandle, 78755a1bb43aa37fc948911197a99e23199fcc58b72xli Controller 78855a1bb43aa37fc948911197a99e23199fcc58b72xli ); 789e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 79055a1bb43aa37fc948911197a99e23199fcc58b72xli FreePool (VgaClassPrivate); 791e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 792e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 793e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 794a73d0c743b5192b1038a24711525eed71dfa300fklu 795a73d0c743b5192b1038a24711525eed71dfa300fklu/** 79655a1bb43aa37fc948911197a99e23199fcc58b72xli Resets the text output device hardware. 79755a1bb43aa37fc948911197a99e23199fcc58b72xli 79855a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset(). 79955a1bb43aa37fc948911197a99e23199fcc58b72xli It resets the text output device hardware. The cursor position is set to (0, 0), 80055a1bb43aa37fc948911197a99e23199fcc58b72xli and the screen is cleared to the default background color for the output device. 801a73d0c743b5192b1038a24711525eed71dfa300fklu 80255a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 80355a1bb43aa37fc948911197a99e23199fcc58b72xli @param ExtendedVerification Indicates that the driver may perform a more exhaustive 80455a1bb43aa37fc948911197a99e23199fcc58b72xli verification operation of the device during reset. 80555a1bb43aa37fc948911197a99e23199fcc58b72xli 80655a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The text output device was reset. 80755a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The text output device is not functioning correctly and could not be reset. 80855a1bb43aa37fc948911197a99e23199fcc58b72xli 809a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 810e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 811e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 812e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassReset ( 81355a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 814e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN BOOLEAN ExtendedVerification 815e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 816e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 817e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 818e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassPrivate; 819e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 820e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (This); 821e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 822e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang REPORT_STATUS_CODE_WITH_DEVICE_PATH ( 823e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PROGRESS_CODE, 824e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_RESET, 825e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassPrivate->DevicePath 826e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 827e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 828e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK)); 829e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 830e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = This->SetMode (This, 0); 831e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 832e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 833e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 834e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 835e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return This->ClearScreen (This); 836e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 837e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 838a73d0c743b5192b1038a24711525eed71dfa300fklu/** 83955a1bb43aa37fc948911197a99e23199fcc58b72xli Writes a Unicode string to the output device. 840a73d0c743b5192b1038a24711525eed71dfa300fklu 84155a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString(). 84255a1bb43aa37fc948911197a99e23199fcc58b72xli It writes a Unicode string to the output device. This is the most basic output mechanism 84355a1bb43aa37fc948911197a99e23199fcc58b72xli on an output device. 84455a1bb43aa37fc948911197a99e23199fcc58b72xli 84555a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 84655a1bb43aa37fc948911197a99e23199fcc58b72xli @param String The Null-terminated Unicode string to be displayed on the output device(s). 84755a1bb43aa37fc948911197a99e23199fcc58b72xli 84855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The string was output to the device. 84955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device reported an error while attempting to output the text. 8501910fbaf7014fab2012f06ab03829f0146cf32d4vanjeff @retval EFI_UNSUPPORTED The output device's mode is not currently in a defined text mode. 85155a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_WARN_UNKNOWN_GLYPH This warning code indicates that some of the characters in 85255a1bb43aa37fc948911197a99e23199fcc58b72xli the Unicode string could not be rendered and were skipped. 85355a1bb43aa37fc948911197a99e23199fcc58b72xli 854a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 855e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 856e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 857e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassOutputString ( 85855a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 85955a1bb43aa37fc948911197a99e23199fcc58b72xli IN CHAR16 *String 860e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 861e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 862e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 863e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassDev; 864e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; 865e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxColumn; 866e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxRow; 867e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINT32 VideoChar; 868e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang CHAR8 GraphicChar; 869e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 870e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This); 871e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Mode = This->Mode; 872e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 873e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = This->QueryMode ( 87455a1bb43aa37fc948911197a99e23199fcc58b72xli This, 87555a1bb43aa37fc948911197a99e23199fcc58b72xli Mode->Mode, 87655a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxColumn, 87755a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxRow 87855a1bb43aa37fc948911197a99e23199fcc58b72xli ); 879e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 880e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 881e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 882e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 88355a1bb43aa37fc948911197a99e23199fcc58b72xli // 88455a1bb43aa37fc948911197a99e23199fcc58b72xli // Parse each character of the string to output 88555a1bb43aa37fc948911197a99e23199fcc58b72xli // 88655a1bb43aa37fc948911197a99e23199fcc58b72xli for (; *String != CHAR_NULL; String++) { 887e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 88855a1bb43aa37fc948911197a99e23199fcc58b72xli switch (*String) { 889e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang case CHAR_BACKSPACE: 890e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Mode->CursorColumn > 0) { 891e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Mode->CursorColumn--; 892e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 893e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 894e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 895e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang case CHAR_LINEFEED: 896e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Mode->CursorRow == (INT32) (MaxRow - 1)) { 897e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 898e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Scroll the screen by copying the contents 899e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // of the VGA display up one line 900e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 901e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo->CopyMem ( 902e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo, 903e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EfiPciIoWidthUint32, 904e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryBar, 905e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryOffset, 906e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryBar, 907e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryOffset + MaxColumn * 2, 908e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ((MaxRow - 1) * MaxColumn) >> 1 909e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 910e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 911e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 912e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // Print Blank Line of spaces with the current color attributes 913e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 914e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VideoChar = (Mode->Attribute << 8) | ' '; 915e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VideoChar = (VideoChar << 16) | VideoChar; 916e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo->Mem.Write ( 917e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo, 918e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EfiPciIoWidthFillUint32, 919e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryBar, 920e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryOffset + (MaxRow - 1) * MaxColumn * 2, 921e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang MaxColumn >> 1, 922e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VideoChar 923e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 924e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 925e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 926e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Mode->CursorRow < (INT32) (MaxRow - 1)) { 927e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Mode->CursorRow++; 928e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 929e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 930e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 931e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang case CHAR_CARRIAGE_RETURN: 932e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Mode->CursorColumn = 0; 933e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 934e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 935e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang default: 93655a1bb43aa37fc948911197a99e23199fcc58b72xli if (!LibIsValidTextGraphics (*String, &GraphicChar, NULL)) { 937e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 93855a1bb43aa37fc948911197a99e23199fcc58b72xli // If this character is not ,Box Drawing text graphics, then convert it to ASCII. 939e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 94055a1bb43aa37fc948911197a99e23199fcc58b72xli GraphicChar = (CHAR8) *String; 941e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (!IsValidAscii (GraphicChar)) { 942e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 94355a1bb43aa37fc948911197a99e23199fcc58b72xli // If not valid ASCII char, convert it to "?" 944e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang // 945e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang GraphicChar = '?'; 946e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 947e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 948e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 949e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VideoChar = (Mode->Attribute << 8) | GraphicChar; 950e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo->Mem.Write ( 951e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo, 952e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EfiPciIoWidthUint16, 953e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryBar, 954e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryOffset + ((Mode->CursorRow * MaxColumn + Mode->CursorColumn) * 2), 955e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1, 956e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VideoChar 957e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 958e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 959e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) { 960e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->OutputString (This, CrLfString); 961e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } else { 962e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Mode->CursorColumn++; 963e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 964e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 965e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 966e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 967e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 968e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang SetVideoCursorPosition ( 969e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev, 970e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (UINTN) Mode->CursorColumn, 971e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (UINTN) Mode->CursorRow, 972e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang MaxColumn 973e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 974e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 975e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 976e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 977e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 978a73d0c743b5192b1038a24711525eed71dfa300fklu/** 97955a1bb43aa37fc948911197a99e23199fcc58b72xli Verifies that all characters in a Unicode string can be output to the target device. 980a73d0c743b5192b1038a24711525eed71dfa300fklu 98155a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString(). 98255a1bb43aa37fc948911197a99e23199fcc58b72xli It verifies that all characters in a Unicode string can be output to the target device. 98355a1bb43aa37fc948911197a99e23199fcc58b72xli 98455a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 98555a1bb43aa37fc948911197a99e23199fcc58b72xli @param String The Null-terminated Unicode string to be examined for the output device(s). 98655a1bb43aa37fc948911197a99e23199fcc58b72xli 98755a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The device(s) are capable of rendering the output string. 98855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered by 98955a1bb43aa37fc948911197a99e23199fcc58b72xli one or more of the output devices mapped by the EFI handle. 99055a1bb43aa37fc948911197a99e23199fcc58b72xli 991a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 992e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 993e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 994e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassTestString ( 99555a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 99655a1bb43aa37fc948911197a99e23199fcc58b72xli IN CHAR16 *String 997e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 998e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 99955a1bb43aa37fc948911197a99e23199fcc58b72xli while (*String != CHAR_NULL) { 100055a1bb43aa37fc948911197a99e23199fcc58b72xli if (!(IsValidAscii (*String) || IsValidEfiCntlChar (*String) || LibIsValidTextGraphics (*String, NULL, NULL))) { 1001e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1002e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1003e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 100455a1bb43aa37fc948911197a99e23199fcc58b72xli String++; 1005e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1006e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1007e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1008e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1009e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1010a73d0c743b5192b1038a24711525eed71dfa300fklu/** 101155a1bb43aa37fc948911197a99e23199fcc58b72xli Clears the output device(s) display to the currently selected background color. 1012a73d0c743b5192b1038a24711525eed71dfa300fklu 101355a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen(). 101455a1bb43aa37fc948911197a99e23199fcc58b72xli The ClearScreen() function clears the output device(s) display to the currently 101555a1bb43aa37fc948911197a99e23199fcc58b72xli selected background color. The cursor position is set to (0, 0). 101655a1bb43aa37fc948911197a99e23199fcc58b72xli 101755a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 1018a73d0c743b5192b1038a24711525eed71dfa300fklu 101955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCESS The operation completed successfully. 102055a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 102155a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED The output device is not in a valid text mode. 102255a1bb43aa37fc948911197a99e23199fcc58b72xli 1023a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1024e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1025e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1026e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassClearScreen ( 1027e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This 1028e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1029e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1030e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 1031e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassDev; 1032e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxRow; 1033e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxColumn; 1034e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINT32 VideoChar; 1035e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1036e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This); 1037e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1038e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = This->QueryMode ( 103955a1bb43aa37fc948911197a99e23199fcc58b72xli This, 104055a1bb43aa37fc948911197a99e23199fcc58b72xli This->Mode->Mode, 104155a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxColumn, 104255a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxRow 104355a1bb43aa37fc948911197a99e23199fcc58b72xli ); 1044e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 1045e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 1046e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1047e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1048e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VideoChar = (This->Mode->Attribute << 8) | ' '; 1049e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VideoChar = (VideoChar << 16) | VideoChar; 1050e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo->Mem.Write ( 1051e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->PciIo, 1052e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EfiPciIoWidthFillUint32, 1053e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryBar, 1054e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev->VgaMiniPort->VgaMemoryOffset, 1055e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang (MaxRow * MaxColumn) >> 1, 1056e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang &VideoChar 1057e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ); 1058e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1059e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->SetCursorPosition (This, 0, 0); 1060e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1061e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1062e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1063e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1064a73d0c743b5192b1038a24711525eed71dfa300fklu/** 106555a1bb43aa37fc948911197a99e23199fcc58b72xli Sets the background and foreground colors for theOutputString() and ClearScreen() functions. 1066a73d0c743b5192b1038a24711525eed71dfa300fklu 106755a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute(). 106855a1bb43aa37fc948911197a99e23199fcc58b72xli It sets the background and foreground colors for the OutputString() and ClearScreen() functions. 106955a1bb43aa37fc948911197a99e23199fcc58b72xli The color mask can be set even when the device is in an invalid text mode. 107055a1bb43aa37fc948911197a99e23199fcc58b72xli Devices supporting a different number of text colors are required to emulate the above colors 1071689b2d720c21a286103d188070c1a76633fa95bevanjeff to the best of the device's capabilities. 107255a1bb43aa37fc948911197a99e23199fcc58b72xli 107355a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 107455a1bb43aa37fc948911197a99e23199fcc58b72xli @param Attribute The attribute to set. 107555a1bb43aa37fc948911197a99e23199fcc58b72xli Bits 0..3 are the foreground color, 107655a1bb43aa37fc948911197a99e23199fcc58b72xli and bits 4..6 are the background color. 1077a73d0c743b5192b1038a24711525eed71dfa300fklu 107855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The requested attributes were set. 107955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 108055a1bb43aa37fc948911197a99e23199fcc58b72xli 1081a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1082e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1083e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1084e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetAttribute ( 108555a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 1086e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN Attribute 1087e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1088e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1089e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Attribute <= EFI_MAX_ATTRIBUTE) { 1090e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->Mode->Attribute = (INT32) Attribute; 1091e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1092e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1093e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1094e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1095e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1096e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1097a73d0c743b5192b1038a24711525eed71dfa300fklu/** 109855a1bb43aa37fc948911197a99e23199fcc58b72xli Sets the current coordinates of the cursor position. 109955a1bb43aa37fc948911197a99e23199fcc58b72xli 110055a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition(). 110155a1bb43aa37fc948911197a99e23199fcc58b72xli It sets the current coordinates of the cursor position. 110255a1bb43aa37fc948911197a99e23199fcc58b72xli The upper left corner of the screen is defined as coordinate (0, 0). 1103a73d0c743b5192b1038a24711525eed71dfa300fklu 110455a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 110555a1bb43aa37fc948911197a99e23199fcc58b72xli @param Column Column of position to set the cursor to. 110655a1bb43aa37fc948911197a99e23199fcc58b72xli @param Row Row of position to set the cursor to. 1107a73d0c743b5192b1038a24711525eed71dfa300fklu 110855a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The operation completed successfully. 110955a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 111055a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED The output device is not in a valid text mode, or the cursor 111155a1bb43aa37fc948911197a99e23199fcc58b72xli position is invalid for the current mode. 111255a1bb43aa37fc948911197a99e23199fcc58b72xli 1113a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1114e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1115e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1116e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetCursorPosition ( 111755a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 1118e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN Column, 1119e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN Row 1120e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1121e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1122e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang EFI_STATUS Status; 1123e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassDev; 1124e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxColumn; 1125e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang UINTN MaxRow; 1126e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1127e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This); 1128e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1129e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang Status = This->QueryMode ( 113055a1bb43aa37fc948911197a99e23199fcc58b72xli This, 113155a1bb43aa37fc948911197a99e23199fcc58b72xli This->Mode->Mode, 113255a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxColumn, 113355a1bb43aa37fc948911197a99e23199fcc58b72xli &MaxRow 113455a1bb43aa37fc948911197a99e23199fcc58b72xli ); 1135e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (EFI_ERROR (Status)) { 1136e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return Status; 1137e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1138e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1139e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Column >= MaxColumn || Row >= MaxRow) { 1140e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1141e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1142e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1143e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang SetVideoCursorPosition (VgaClassDev, Column, Row, MaxColumn); 1144e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1145e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->Mode->CursorColumn = (INT32) Column; 1146e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->Mode->CursorRow = (INT32) Row; 1147e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1148e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1149e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1150e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1151a73d0c743b5192b1038a24711525eed71dfa300fklu/** 115255a1bb43aa37fc948911197a99e23199fcc58b72xli Makes the cursor visible or invisible. 1153a73d0c743b5192b1038a24711525eed71dfa300fklu 115455a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.EnableCursor(). 115555a1bb43aa37fc948911197a99e23199fcc58b72xli It makes the cursor visible or invisible. 115655a1bb43aa37fc948911197a99e23199fcc58b72xli 115755a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 115855a1bb43aa37fc948911197a99e23199fcc58b72xli @param Visible If TRUE, the cursor is set to be visible. 115955a1bb43aa37fc948911197a99e23199fcc58b72xli If FALSE, the cursor is set to be invisible. 1160a73d0c743b5192b1038a24711525eed71dfa300fklu 116155a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCESS The operation completed successfully. 116255a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request or the 116355a1bb43aa37fc948911197a99e23199fcc58b72xli device does not support changing the cursor mode. 116455a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED The output device does not support visibility control of the cursor. 116555a1bb43aa37fc948911197a99e23199fcc58b72xli 1166a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1167e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1168e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1169e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassEnableCursor ( 117055a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 1171e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN BOOLEAN Visible 1172e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1173e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1174e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassDev; 1175e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1176e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This); 1177e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if (Visible) { 117855a1bb43aa37fc948911197a99e23199fcc58b72xli if (This->Mode->Mode == 1) { 117955a1bb43aa37fc948911197a99e23199fcc58b72xli // 118055a1bb43aa37fc948911197a99e23199fcc58b72xli // 80 * 50 118155a1bb43aa37fc948911197a99e23199fcc58b72xli // 1182e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x06); 1183e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x07); 118455a1bb43aa37fc948911197a99e23199fcc58b72xli } else { 118555a1bb43aa37fc948911197a99e23199fcc58b72xli // 118655a1bb43aa37fc948911197a99e23199fcc58b72xli // 80 * 25 118755a1bb43aa37fc948911197a99e23199fcc58b72xli // 1188e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x0e); 1189e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x0f); 1190e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1191e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } else { 1192e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x20); 1193e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1194e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1195e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->Mode->CursorVisible = Visible; 1196e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1197e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1198e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1199a73d0c743b5192b1038a24711525eed71dfa300fklu/** 120055a1bb43aa37fc948911197a99e23199fcc58b72xli Returns information for an available text mode that the output device(s) supports. 120155a1bb43aa37fc948911197a99e23199fcc58b72xli 120255a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode(). 120355a1bb43aa37fc948911197a99e23199fcc58b72xli It returns information for an available text mode that the output device(s) supports. 120455a1bb43aa37fc948911197a99e23199fcc58b72xli It is required that all output devices support at least 80x25 text mode. This mode is defined to be mode 0. 120555a1bb43aa37fc948911197a99e23199fcc58b72xli If the output devices support 80x50, that is defined to be mode 1. 120655a1bb43aa37fc948911197a99e23199fcc58b72xli 120755a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 120855a1bb43aa37fc948911197a99e23199fcc58b72xli @param ModeNumber The mode number to return information on. 120955a1bb43aa37fc948911197a99e23199fcc58b72xli @param Columns Columen in current mode number 121055a1bb43aa37fc948911197a99e23199fcc58b72xli @param Rows Row in current mode number. 1211a73d0c743b5192b1038a24711525eed71dfa300fklu 121255a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The requested mode information was returned. 121355a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 121455a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED The mode number was not valid. 121555a1bb43aa37fc948911197a99e23199fcc58b72xli 1216a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1217e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1218e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1219e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassQueryMode ( 122055a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 1221e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN ModeNumber, 1222e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang OUT UINTN *Columns, 1223e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang OUT UINTN *Rows 1224e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1225e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1226e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if ((INT32) ModeNumber >= This->Mode->MaxMode) { 1227e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Columns = 0; 1228e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Rows = 0; 1229e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1230e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1231e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1232e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang switch (ModeNumber) { 1233e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang case 0: 1234e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Columns = 80; 1235e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Rows = 25; 1236e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 1237e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1238e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang case 1: 1239e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Columns = 80; 1240e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Rows = 50; 1241e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang break; 1242e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1243e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang default: 1244e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Columns = 0; 1245e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang *Rows = 0; 1246e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1247e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1248e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1249e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_SUCCESS; 1250e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1251e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1252a73d0c743b5192b1038a24711525eed71dfa300fklu/** 125355a1bb43aa37fc948911197a99e23199fcc58b72xli Sets the output device(s) to a specified mode. 1254a73d0c743b5192b1038a24711525eed71dfa300fklu 125555a1bb43aa37fc948911197a99e23199fcc58b72xli This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode(). 125655a1bb43aa37fc948911197a99e23199fcc58b72xli It sets the output device(s) to the requested mode. 125755a1bb43aa37fc948911197a99e23199fcc58b72xli On success the device is in the geometry for the requested mode, 125855a1bb43aa37fc948911197a99e23199fcc58b72xli and the device has been cleared to the current background color with the cursor at (0,0). 125955a1bb43aa37fc948911197a99e23199fcc58b72xli 126055a1bb43aa37fc948911197a99e23199fcc58b72xli @param This Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. 126155a1bb43aa37fc948911197a99e23199fcc58b72xli @param ModeNumber The text mode to set. 1262a73d0c743b5192b1038a24711525eed71dfa300fklu 126355a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_SUCCESS The requested text mode was set. 126455a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 126555a1bb43aa37fc948911197a99e23199fcc58b72xli @retval EFI_UNSUPPORTED The mode number was not valid. 126655a1bb43aa37fc948911197a99e23199fcc58b72xli 1267a73d0c743b5192b1038a24711525eed71dfa300fklu**/ 1268e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS 1269e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI 1270e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetMode ( 127155a1bb43aa37fc948911197a99e23199fcc58b72xli IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 1272e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang IN UINTN ModeNumber 1273e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang ) 1274e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{ 1275e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VGA_CLASS_DEV *VgaClassDev; 1276e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1277e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This); 1278e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1279e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang if ((INT32) ModeNumber >= This->Mode->MaxMode) { 1280e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang return EFI_UNSUPPORTED; 1281e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang } 1282e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1283e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->ClearScreen (This); 1284e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 1285e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang This->Mode->Mode = (INT32) ModeNumber; 1286e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang 128755a1bb43aa37fc948911197a99e23199fcc58b72xli return VgaClassDev->VgaMiniPort->SetMode (VgaClassDev->VgaMiniPort, ModeNumber); 1288e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang} 1289