/** @file Callback Functions for Console Redirection Configuration ;****************************************************************************** ;* Copyright (c) 2016, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ #include "CrConfigUtil.h" #include "CrDeviceMenu.h" #include "CrConfig.h" extern CR_CONFIG_MANAGER_PRIVATE_DATA *mPrivateData; extern CHAR16 *mVariableName; CR_DEV_NODE *mCurrentDevNode = NULL; STATIC EFI_STATUS ForceSubmit ( VOID ) { EFI_STATUS Status; EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2; CHAR16 *ConfigRequest; UINTN ConfigRequestSize; EFI_GUID *NameValueGuid; CHAR16 *NameValueName; STATIC UINT8 NameValueValue = 0; // // Change name value data to make form brower will call RouteConfig () when SubmitForm () // Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2); if (EFI_ERROR (Status)) { ASSERT (FALSE); return Status; } NameValueGuid = &gH2OCrConfigurationGuid; NameValueName = HiiGetString (mPrivateData->HiiHandle, STRING_TOKEN(STR_NAME_VALUE_VAR_NAME0), NULL); if (NameValueValue < 0xFF) { NameValueValue ++; } else { NameValueValue = 0; } ConfigRequestSize = 0x100; ConfigRequest = AllocateZeroPool (ConfigRequestSize); UnicodeSPrint (ConfigRequest, ConfigRequestSize, L"%s=%02x", NameValueName, NameValueValue); Status = FormBrowser2->BrowserCallback ( FormBrowser2, &ConfigRequestSize, ConfigRequest, FALSE, NameValueGuid, NameValueName ); FreePool (NameValueName); FreePool (ConfigRequest); if (EFI_ERROR (Status)) { ASSERT (FALSE); return Status; } return EFI_SUCCESS; } STATIC BOOLEAN IsGlobalSetting ( IN EFI_QUESTION_ID QuestionId ) { switch (QuestionId) { case KEY_GLOBAL_TERMINAL_TYPE: case KEY_GLOBAL_BAUD_RATE: case KEY_GLOBAL_DATA_BITS: case KEY_GLOBAL_PARITY: case KEY_GLOBAL_STOP_BITS: case KEY_GLOBAL_FLOW_CONTROL: return TRUE; default: break; } return FALSE; } STATIC BOOLEAN IsLocalSetting ( IN EFI_QUESTION_ID QuestionId ) { switch (QuestionId) { //[-start-190613-IB07401110-remove]// // case KEY_PORT_ENABLE: // case KEY_USE_GLOBAL_SETTING: // case KEY_TERMINAL_TYPE: // case KEY_BAUD_RATE: // case KEY_DATA_BITS: // case KEY_PARITY: // case KEY_STOP_BITS: // case KEY_FLOW_CONTROL: //[-end-190613-IB07401110-remove]// //[-start-190612-IB07401110-add]// case KEY_PORT_ENABLE0: case KEY_PORT_ENABLE1: case KEY_PORT_ENABLE2: case KEY_PORT_ENABLE3: case KEY_PORT_ENABLE4: case KEY_PORT_ENABLE5: case KEY_PORT_ENABLE6: case KEY_PORT_ENABLE7: case KEY_PORT_ENABLE8: case KEY_PORT_ENABLE9: case KEY_PORT_ENABLE10: case KEY_USE_GLOBAL_SETTING0: case KEY_USE_GLOBAL_SETTING1: case KEY_USE_GLOBAL_SETTING2: case KEY_USE_GLOBAL_SETTING3: case KEY_USE_GLOBAL_SETTING4: case KEY_USE_GLOBAL_SETTING5: case KEY_USE_GLOBAL_SETTING6: case KEY_USE_GLOBAL_SETTING7: case KEY_USE_GLOBAL_SETTING8: case KEY_USE_GLOBAL_SETTING9: case KEY_USE_GLOBAL_SETTING10: case KEY_TERMINAL_TYPE0: case KEY_TERMINAL_TYPE1: case KEY_TERMINAL_TYPE2: case KEY_TERMINAL_TYPE3: case KEY_TERMINAL_TYPE4: case KEY_TERMINAL_TYPE5: case KEY_TERMINAL_TYPE6: case KEY_TERMINAL_TYPE7: case KEY_TERMINAL_TYPE8: case KEY_TERMINAL_TYPE9: case KEY_TERMINAL_TYPE10: case KEY_BAUD_RATE0: case KEY_BAUD_RATE1: case KEY_BAUD_RATE2: case KEY_BAUD_RATE3: case KEY_BAUD_RATE4: case KEY_BAUD_RATE5: case KEY_BAUD_RATE6: case KEY_BAUD_RATE7: case KEY_BAUD_RATE8: case KEY_BAUD_RATE9: case KEY_BAUD_RATE10: case KEY_DATA_BITS0: case KEY_DATA_BITS1: case KEY_DATA_BITS2: case KEY_DATA_BITS3: case KEY_DATA_BITS4: case KEY_DATA_BITS5: case KEY_DATA_BITS6: case KEY_DATA_BITS7: case KEY_DATA_BITS8: case KEY_DATA_BITS9: case KEY_DATA_BITS10: case KEY_PARITY0: case KEY_PARITY1: case KEY_PARITY2: case KEY_PARITY3: case KEY_PARITY4: case KEY_PARITY5: case KEY_PARITY6: case KEY_PARITY7: case KEY_PARITY8: case KEY_PARITY9: case KEY_PARITY10: case KEY_STOP_BITS0: case KEY_STOP_BITS1: case KEY_STOP_BITS2: case KEY_STOP_BITS3: case KEY_STOP_BITS4: case KEY_STOP_BITS5: case KEY_STOP_BITS6: case KEY_STOP_BITS7: case KEY_STOP_BITS8: case KEY_STOP_BITS9: case KEY_STOP_BITS10: case KEY_FLOW_CONTROL0: case KEY_FLOW_CONTROL1: case KEY_FLOW_CONTROL2: case KEY_FLOW_CONTROL3: case KEY_FLOW_CONTROL4: case KEY_FLOW_CONTROL5: case KEY_FLOW_CONTROL6: case KEY_FLOW_CONTROL7: case KEY_FLOW_CONTROL8: case KEY_FLOW_CONTROL9: case KEY_FLOW_CONTROL10: //[-end-190612-IB07401110-add]// return TRUE; default: break; } return FALSE; } STATIC EFI_STATUS UpdateStatusStr ( IN CR_DEV_NODE *DevNode ) { CHAR16 *Str; if (DevNode == NULL) { return EFI_INVALID_PARAMETER; } Str = GetStatusStr (&DevNode->Dev); HiiSetString (mPrivateData->HiiHandle, DevNode->StatusStrId, Str, NULL); FreePool (Str); return EFI_SUCCESS; } STATIC EFI_STATUS UpdateGlobalToLocal ( IN CR_CONFIGURATION *CrConfig ) { if (CrConfig == NULL) { return EFI_INVALID_PARAMETER; } //[-start-190612-IB07401110-modify]// CrConfig->CrPortConfig[mCurrentDevNode->Index].TerminalType = CrConfig->GlobalTerminalType; CrConfig->CrPortConfig[mCurrentDevNode->Index].BaudRate = CrConfig->GlobalBaudRate; CrConfig->CrPortConfig[mCurrentDevNode->Index].Parity = CrConfig->GlobalParity; CrConfig->CrPortConfig[mCurrentDevNode->Index].DataBits = CrConfig->GlobalDataBits; CrConfig->CrPortConfig[mCurrentDevNode->Index].StopBits = CrConfig->GlobalStopBits; CrConfig->CrPortConfig[mCurrentDevNode->Index].FlowControl = CrConfig->GlobalFlowControl; //[-end-190612-IB07401110-modify]// return EFI_SUCCESS; } STATIC EFI_STATUS UpdateDeviceToCrConfig ( IN CR_DEVICE_SETTING *Device, IN CR_CONFIGURATION *CrConfig ) { if (Device == NULL || CrConfig == NULL) { return EFI_INVALID_PARAMETER; } //[-start-190612-IB07401110-modify]// CrConfig->CrPortConfig[mCurrentDevNode->Index].PortEnable = Device->Attribute.PortEnable; CrConfig->CrPortConfig[mCurrentDevNode->Index].UseGlobalSetting = Device->Attribute.UseGlobalSetting; CrConfig->CrPortConfig[mCurrentDevNode->Index].TerminalType = Device->Attribute.TerminalType; CrConfig->CrPortConfig[mCurrentDevNode->Index].BaudRate = Device->Attribute.BaudRate; CrConfig->CrPortConfig[mCurrentDevNode->Index].Parity = Device->Attribute.Parity; CrConfig->CrPortConfig[mCurrentDevNode->Index].DataBits = Device->Attribute.DataBits; CrConfig->CrPortConfig[mCurrentDevNode->Index].StopBits = Device->Attribute.StopBits; CrConfig->CrPortConfig[mCurrentDevNode->Index].FlowControl = Device->Attribute.FlowControl; //[-end-190612-IB07401110-modify]// return EFI_SUCCESS; } STATIC EFI_STATUS UpdateDeviceFromCrConfig ( IN CR_DEVICE_SETTING *Device, IN CR_CONFIGURATION *CrConfig ) { if (Device == NULL || CrConfig == NULL) { return EFI_INVALID_PARAMETER; } //[-start-190612-IB07401110-modify]// Device->Attribute.PortEnable = CrConfig->CrPortConfig[mCurrentDevNode->Index].PortEnable; Device->Attribute.UseGlobalSetting = CrConfig->CrPortConfig[mCurrentDevNode->Index].UseGlobalSetting; Device->Attribute.TerminalType = CrConfig->CrPortConfig[mCurrentDevNode->Index].TerminalType; Device->Attribute.BaudRate = CrConfig->CrPortConfig[mCurrentDevNode->Index].BaudRate; Device->Attribute.Parity = CrConfig->CrPortConfig[mCurrentDevNode->Index].Parity; Device->Attribute.DataBits = CrConfig->CrPortConfig[mCurrentDevNode->Index].DataBits; Device->Attribute.StopBits = CrConfig->CrPortConfig[mCurrentDevNode->Index].StopBits; Device->Attribute.FlowControl = CrConfig->CrPortConfig[mCurrentDevNode->Index].FlowControl; //[-end-190612-IB07401110-modify]// return EFI_SUCCESS; } STATIC EFI_STATUS UpdateAllDevFromConfig ( IN CR_CONFIGURATION *CrConfig ) { LIST_ENTRY *Link; CR_DEV_NODE *CrDevNode; if (IsListEmpty (&mPrivateData->CrDevListHead)) { return EFI_NOT_FOUND; } Link = GetFirstNode (&mPrivateData->CrDevListHead); while (!IsNull (&mPrivateData->CrDevListHead, Link)) { CrDevNode = CR_DEV_NODE_FROM_LINK (Link); Link = GetNextNode (&mPrivateData->CrDevListHead, Link); if (CrDevNode->Dev.Attribute.UseGlobalSetting) { CrDevNode->Dev.Attribute.TerminalType = CrConfig->GlobalTerminalType; CrDevNode->Dev.Attribute.BaudRate = CrConfig->GlobalBaudRate; CrDevNode->Dev.Attribute.Parity = CrConfig->GlobalParity; CrDevNode->Dev.Attribute.DataBits = CrConfig->GlobalDataBits; CrDevNode->Dev.Attribute.StopBits = CrConfig->GlobalStopBits; CrDevNode->Dev.Attribute.FlowControl = CrConfig->GlobalFlowControl; } UpdateStatusStr (CrDevNode); } return EFI_SUCCESS; } STATIC EFI_STATUS UpdateDevPage ( VOID ) { EFI_STATUS Status; CR_DEVICE_SETTING *Device; CR_CONFIGURATION CrConfig; BOOLEAN IsSuccess; if (mCurrentDevNode == NULL) { return EFI_UNSUPPORTED; } Device = &mCurrentDevNode->Dev; Status = HiiSetString (mPrivateData->HiiHandle, STRING_TOKEN (STR_STR_CR_DEVICE_TITLE), Device->DevName, NULL); if (EFI_ERROR (Status)) { ASSERT (FALSE); return Status; } IsSuccess = HiiGetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } UpdateDeviceToCrConfig (Device, &CrConfig); IsSuccess = HiiSetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig, NULL); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } return Status; } STATIC EFI_STATUS GotoDevCallback ( IN EFI_QUESTION_ID QuestionId ) { EFI_STATUS Status; CR_DEV_NODE *DevNode; // // Current question is the "created goto question" // Status = GetDevNodeByQuestionId (QuestionId, &DevNode); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } mCurrentDevNode = DevNode; UpdateDevPage (); return EFI_SUCCESS; } STATIC EFI_STATUS GlobalSettingCallback ( VOID ) { CR_CONFIGURATION CrConfig; BOOLEAN IsSuccess; IsSuccess = HiiGetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } UpdateAllDevFromConfig (&CrConfig); IsSuccess = HiiSetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig, NULL); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } return EFI_SUCCESS; } STATIC EFI_STATUS LocalSettingCallback ( VOID ) { CR_DEVICE_SETTING *Device; CR_CONFIGURATION CrConfig; BOOLEAN IsSuccess; if (mCurrentDevNode == NULL) { return EFI_UNSUPPORTED; } IsSuccess = HiiGetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } Device = &mCurrentDevNode->Dev; //[-start-190612-IB07401110-modify]// if (CrConfig.CrPortConfig[mCurrentDevNode->Index].UseGlobalSetting) { //[-end-190612-IB07401110-modify]// UpdateGlobalToLocal (&CrConfig); } UpdateDeviceFromCrConfig (Device, &CrConfig); UpdateStatusStr (mCurrentDevNode); IsSuccess = HiiSetBrowserData (&gH2OCrConfigurationGuid, mVariableName, sizeof (CR_CONFIGURATION), (UINT8 *)&CrConfig, NULL); if (!IsSuccess) { ASSERT (FALSE); return EFI_UNSUPPORTED; } return EFI_SUCCESS; } STATIC EFI_STATUS AfterLoadDefault ( VOID ) { // // Update CR devices // UpdateDevices (TRUE); // // Check use global setting // GlobalSettingCallback (); // // Update device page // UpdateDevPage (); return EFI_SUCCESS; } EFI_STATUS EFIAPI CrSubmit ( VOID ) { return SetDevVariables (); } EFI_STATUS EFIAPI CrDriverCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { EFI_STATUS Status; //[-start-180823-IB10920058-add]// CR_CONFIGURATION Configuration = {0}; UINTN ConfigSize; //[-end-180823-IB10920058-add]// // // Ensure call RoutConfig () when submit even if no changing anything // if (IsListEmpty (&mPrivateData->CrDevListHead)) { return EFI_UNSUPPORTED; } else { ForceSubmit (); } if (((Value == NULL) && (Action != EFI_BROWSER_ACTION_FORM_OPEN) && (Action != EFI_BROWSER_ACTION_FORM_CLOSE))|| (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } Status = EFI_UNSUPPORTED; switch (Action) { case EFI_BROWSER_ACTION_CHANGING: DEBUG ((EFI_D_INFO, "CRCallBack->CHANGING Qid:0x%x Typ:0x%x\n", QuestionId, Type)); Status = GotoDevCallback (QuestionId); break; case EFI_BROWSER_ACTION_CHANGED: DEBUG ((EFI_D_INFO, "CRCallBack->CHANGED Qid:0x%x Typ:0x%x\n", QuestionId, Type)); if (IsGlobalSetting (QuestionId)) { Status = GlobalSettingCallback (); } else if (IsLocalSetting (QuestionId)) { Status = LocalSettingCallback (); } break; case EFI_BROWSER_ACTION_DEFAULT_STANDARD: DEBUG ((EFI_D_INFO, "CRCallBack->DEFAULT_STANDARD Qid:0x%x Typ:0x%x\n", QuestionId, Type)); //[-start-180823-IB10920058-add]// if (QuestionId == KEY_SCAN_F9) { // // Last question in this formset // ConfigSize = sizeof (CR_CONFIGURATION); Status = LoadVarDefault ( mVariableName, &gH2OCrConfigurationGuid, &ConfigSize, &Configuration ); } //[-end-180823-IB10920058-add]// if (QuestionId == KEY_SCAN_F9) { Status = AfterLoadDefault (); } else { Status = EFI_UNSUPPORTED; } break; case EFI_BROWSER_ACTION_RETRIEVE: DEBUG ((EFI_D_INFO, "CRCallBack->RETRIEVE Qid:0x%x Typ:0x%x\n", QuestionId, Type)); if (QuestionId == KEY_SCAN_F9) { Status = EFI_SUCCESS; } else { Status = EFI_UNSUPPORTED; } break; default: DEBUG ((EFI_D_INFO, "CRCallBack->default:Action=0x%x Qid:0x%x Typ:0x%x\n", Action , QuestionId, Type)); Status = EFI_UNSUPPORTED; break; } return Status; }