+/**\r
+ Converts the unicode character of the string from uppercase to lowercase.\r
+ This is a internal function.\r
+\r
+ @param ConfigString String to be converted\r
+\r
+**/\r
+VOID\r
+HiiToLower (\r
+ IN EFI_STRING ConfigString\r
+ )\r
+{\r
+ EFI_STRING String;\r
+ BOOLEAN Lower;\r
+\r
+ ASSERT (ConfigString != NULL);\r
+\r
+ //\r
+ // Convert all hex digits in range [A-F] in the configuration header to [a-f]\r
+ //\r
+ for (String = ConfigString, Lower = FALSE; *String != L'\0'; String++) {\r
+ if (*String == L'=') {\r
+ Lower = TRUE;\r
+ } else if (*String == L'&') {\r
+ Lower = FALSE;\r
+ } else if (Lower && *String >= L'A' && *String <= L'F') {\r
+ *String = (CHAR16) (*String - L'A' + L'a');\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Update the progress string through the offset value.\r
+\r
+ @param Offset The offset value\r
+ @param Configuration Point to the configuration string.\r
+\r
+**/\r
+EFI_STRING\r
+UpdateProgress(\r
+ IN UINTN Offset,\r
+ IN EFI_STRING Configuration\r
+)\r
+{\r
+ UINTN Length;\r
+ EFI_STRING StringPtr;\r
+ EFI_STRING ReturnString;\r
+\r
+ StringPtr = NULL;\r
+ ReturnString = NULL;\r
+\r
+ //\r
+ // &OFFSET=XXXX followed by a Null-terminator.\r
+ // Length = StrLen (L"&OFFSET=") + 4 + 1\r
+ //\r
+ Length = StrLen (L"&OFFSET=") + 4 + 1;\r
+\r
+ StringPtr = AllocateZeroPool (Length * sizeof (CHAR16));\r
+\r
+ if (StringPtr == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ StringPtr,\r
+ (8 + 4 + 1) * sizeof (CHAR16),\r
+ L"&OFFSET=%04x",\r
+ Offset\r
+ );\r
+\r
+ ReturnString = StrStr (Configuration, StringPtr);\r
+\r
+ if (ReturnString == NULL) {\r
+ //\r
+ // If doesn't find the string in Configuration, convert the string to lower case then search again.\r
+ //\r
+ HiiToLower (StringPtr);\r
+ ReturnString = StrStr (Configuration, StringPtr);\r
+ }\r
+\r
+ FreePool (StringPtr);\r
+\r
+ return ReturnString;\r
+}\r
+\r
+/**\r
+ Update the terminal content in TerminalMenu.\r
+\r
+ @param BmmData The BMM fake NV data.\r
+\r
+**/\r
+VOID\r
+UpdateTerminalContent (\r
+ IN BMM_FAKE_NV_DATA *BmmData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ ASSERT (NewMenuEntry != NULL);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewTerminalContext->BaudRateIndex = BmmData->COMBaudRate[Index];\r
+ ASSERT (BmmData->COMBaudRate[Index] < (ARRAY_SIZE (BaudRateList)));\r
+ NewTerminalContext->BaudRate = BaudRateList[BmmData->COMBaudRate[Index]].Value;\r
+ NewTerminalContext->DataBitsIndex = BmmData->COMDataRate[Index];\r
+ ASSERT (BmmData->COMDataRate[Index] < (ARRAY_SIZE (DataBitsList)));\r
+ NewTerminalContext->DataBits = (UINT8) DataBitsList[BmmData->COMDataRate[Index]].Value;\r
+ NewTerminalContext->StopBitsIndex = BmmData->COMStopBits[Index];\r
+ ASSERT (BmmData->COMStopBits[Index] < (ARRAY_SIZE (StopBitsList)));\r
+ NewTerminalContext->StopBits = (UINT8) StopBitsList[BmmData->COMStopBits[Index]].Value;\r
+ NewTerminalContext->ParityIndex = BmmData->COMParity[Index];\r
+ ASSERT (BmmData->COMParity[Index] < (ARRAY_SIZE (ParityList)));\r
+ NewTerminalContext->Parity = (UINT8) ParityList[BmmData->COMParity[Index]].Value;\r
+ NewTerminalContext->TerminalType = BmmData->COMTerminalType[Index];\r
+ NewTerminalContext->FlowControl = BmmData->COMFlowControl[Index];\r
+ ChangeTerminalDevicePath (\r
+ NewTerminalContext->DevicePath,\r
+ FALSE\r
+ );\r
+ }\r
+}\r
+\r
+/**\r
+ Update the console content in ConsoleMenu.\r
+\r
+ @param ConsoleName The name for the console device type.\r
+ @param BmmData The BMM fake NV data.\r
+\r
+**/\r
+VOID\r
+UpdateConsoleContent(\r
+ IN CHAR16 *ConsoleName,\r
+ IN BMM_FAKE_NV_DATA *BmmData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ if (StrCmp (ConsoleName, L"ConIn") == 0) {\r
+ for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleInCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConIn = BmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+ }\r
+ }\r
+\r
+ if (StrCmp (ConsoleName, L"ConOut") == 0) {\r
+ for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleOutCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConOut = BmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+ }\r
+ }\r
+ if (StrCmp (ConsoleName, L"ErrOut") == 0) {\r
+ for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleErrCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsStdErr = BmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+ }\r
+ }\r
+}\r
+\r