]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add new op-code samples, includes efi varstore, refresh guid group and ref op-code.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 30 Aug 2011 12:39:53 +0000 (12:39 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 30 Aug 2011 12:39:53 +0000 (12:39 +0000)
Signed-off-by:ydong10
Reviewed-by:lgao4

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12232 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h
MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr
MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni

index e20e030be8fbf0fba1c20855a9bf2ab3eecc70b8..1484404687e5cc789a29f972d87a6e060a5de817 100644 (file)
@@ -23,6 +23,7 @@ EFI_GUID   mInventoryGuid = INVENTORY_GUID;
 EFI_GUID   MyEventGroupGuid = EFI_IFR_REFRESH_ID_OP_GUID;\r
 \r
 CHAR16     VariableName[] = L"MyIfrNVData";\r
+CHAR16     MyEfiVar[] = L"MyEfiVar";\r
 EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};\r
 DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData = NULL;\r
 EFI_EVENT                       mEvent;\r
@@ -868,6 +869,13 @@ ExtractConfig (
       return EFI_NOT_FOUND;\r
     }\r
     //\r
+    // Check whether request for EFI Varstore. EFI varstore get data\r
+    // through hii database, not support in this path.\r
+    //\r
+    if (HiiIsConfigHdrMatch(Request, &mFormSetGuid, MyEfiVar)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+    //\r
     // Set Request to the unified request string.\r
     //\r
     ConfigRequest = Request;\r
@@ -1070,6 +1078,14 @@ RouteConfig (
     return EFI_NOT_FOUND;\r
   }\r
 \r
+  //\r
+  // Check whether request for EFI Varstore. EFI varstore get data\r
+  // through hii database, not support in this path.\r
+  //\r
+  if (HiiIsConfigHdrMatch(Configuration, &mFormSetGuid, MyEfiVar)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   //\r
   // Get Buffer Storage data from EFI variable\r
   //\r
@@ -1269,7 +1285,6 @@ DriverCallback (
 {\r
   DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData;\r
   EFI_STATUS                      Status;\r
-  UINT8                           MyVar;\r
   VOID                            *StartOpCodeHandle;\r
   VOID                            *OptionsOpCodeHandle;\r
   EFI_IFR_GUID_LABEL              *StartLabel;\r
@@ -1277,7 +1292,7 @@ DriverCallback (
   EFI_IFR_GUID_LABEL              *EndLabel;\r
   EFI_INPUT_KEY                   Key;\r
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;\r
-  UINTN                           MyVarSize;\r
+  MY_EFI_VARSTORE_DATA            *EfiData;\r
   EFI_FORM_ID                     FormId;\r
   \r
   if (((Value == NULL) && (Action != EFI_BROWSER_ACTION_FORM_OPEN) && (Action != EFI_BROWSER_ACTION_FORM_CLOSE))||\r
@@ -1370,21 +1385,14 @@ DriverCallback (
     \r
   case EFI_BROWSER_ACTION_RETRIEVE:\r
     {\r
-      if (QuestionId == 0x1111) {\r
-        //\r
-        // EfiVarstore question takes sample action (print value as debug information) \r
-        // after read/write question.\r
-        //\r
-        MyVarSize = 1;\r
-        Status = gRT->GetVariable(\r
-                        L"MyVar",\r
-                        &mFormSetGuid,\r
-                        NULL,\r
-                        &MyVarSize,\r
-                        &MyVar\r
-                        );\r
-        ASSERT_EFI_ERROR (Status);\r
-        DEBUG ((DEBUG_INFO, "EfiVarstore question: Tall value is %d with value width %d\n", MyVar, MyVarSize));\r
+      if (QuestionId == 0x1248) {\r
+        {\r
+          if (Type != EFI_IFR_TYPE_REF) {\r
+            return EFI_INVALID_PARAMETER;\r
+          }\r
+        \r
+          Value->ref.FormId = 0x3;\r
+        }\r
       }\r
     }\r
     break;\r
@@ -1420,6 +1428,15 @@ DriverCallback (
   case EFI_BROWSER_ACTION_CHANGING:\r
   {\r
     switch (QuestionId) {\r
+    case 0x1249:\r
+      {\r
+        if (Type != EFI_IFR_TYPE_REF) {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
+\r
+        Value->ref.FormId = 0x1234;\r
+      }\r
+    break;\r
     case 0x1234:\r
       //\r
       // Initialize the container for dynamic opcodes\r
@@ -1612,7 +1629,7 @@ DriverCallback (
         PrivateData->Configuration.DynamicRefresh++;\r
       } else if (QuestionId == 0x1247 ) {\r
         StartLabel->Number       = LABEL_UPDATE3;\r
-        FormId                   = 0x05;\r
+        FormId                   = 0x06;\r
         PrivateData->Configuration.RefreshGuidCount++;\r
       }\r
 \r
@@ -1648,18 +1665,21 @@ DriverCallback (
 \r
       if (QuestionId == 0x5678) {\r
         //\r
-        // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause\r
-        // the first statement in Form 3 be suppressed\r
+        // Update uncommitted data of Browser\r
         //\r
-        MyVarSize = 1;\r
-        MyVar = 111;\r
-        Status = gRT->SetVariable(\r
-                        L"MyVar",\r
-                        &mFormSetGuid,\r
-                        EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                        MyVarSize,\r
-                        &MyVar\r
-                        );\r
+        EfiData = AllocateZeroPool (sizeof (MY_EFI_VARSTORE_DATA));\r
+        ASSERT (EfiData != NULL);\r
+        if (HiiGetBrowserData (&mFormSetGuid, MyEfiVar, sizeof (MY_EFI_VARSTORE_DATA), (UINT8 *) EfiData)) {\r
+          EfiData->Field8 = 111;\r
+          HiiSetBrowserData (\r
+            &mFormSetGuid,\r
+            MyEfiVar,\r
+            sizeof (MY_EFI_VARSTORE_DATA),\r
+            (UINT8 *) EfiData,\r
+            NULL\r
+            );\r
+        }\r
+        FreePool (EfiData);\r
       }\r
       break;\r
 \r
@@ -1741,21 +1761,6 @@ DriverCallback (
 \r
       break;\r
 \r
-    case 0x1111:\r
-      //\r
-      // EfiVarstore question takes sample action (print value as debug information) \r
-      // after read/write question.\r
-      //\r
-      MyVarSize = 1;\r
-      Status = gRT->GetVariable(\r
-                      L"MyVar",\r
-                      &mFormSetGuid,\r
-                      NULL,\r
-                      &MyVarSize,\r
-                      &MyVar\r
-                      );\r
-      ASSERT_EFI_ERROR (Status);\r
-      DEBUG ((DEBUG_INFO, "EfiVarstore question: Tall value is %d with value width %d\n", MyVar, MyVarSize));\r
     default:\r
       break;\r
     }\r
@@ -1798,6 +1803,7 @@ DriverSampleInit (
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;\r
   BOOLEAN                         ActionFlag;\r
   EFI_STRING                      ConfigRequestHdr;\r
+  MY_EFI_VARSTORE_DATA            *VarStoreConfig;\r
 \r
   //\r
   // Initialize the local variables.\r
@@ -1978,7 +1984,44 @@ DriverSampleInit (
     ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
     ASSERT (ActionFlag);\r
   }\r
+  FreePool (ConfigRequestHdr);\r
 \r
+  //\r
+  // Initialize efi varstore configuration data\r
+  //\r
+  VarStoreConfig = &PrivateData->VarStoreConfig;\r
+  ZeroMem (VarStoreConfig, sizeof (MY_EFI_VARSTORE_DATA));\r
+\r
+  ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, MyEfiVar, DriverHandle[0]);\r
+  ASSERT (ConfigRequestHdr != NULL);\r
+\r
+  BufferSize = sizeof (MY_EFI_VARSTORE_DATA);\r
+  Status = gRT->GetVariable (MyEfiVar, &mFormSetGuid, NULL, &BufferSize, VarStoreConfig);\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // Store zero data to EFI variable Storage.\r
+    //\r
+    Status = gRT->SetVariable(\r
+                    MyEfiVar,\r
+                    &mFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (MY_EFI_VARSTORE_DATA),\r
+                    VarStoreConfig\r
+                    );\r
+    ASSERT (Status == EFI_SUCCESS);\r
+    //\r
+    // EFI variable for NV config doesn't exit, we should build this variable\r
+    // based on default values stored in IFR\r
+    //\r
+    ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+    ASSERT (ActionFlag);\r
+  } else {\r
+    //\r
+    // EFI variable does exist and Validate Current Setting\r
+    //\r
+    ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
+    ASSERT (ActionFlag);\r
+  }\r
   FreePool (ConfigRequestHdr);\r
 \r
   Status = gBS->CreateEventEx (\r
index a6445664df39975985f983e984c5d8f574474e87..29f4611893ba99270f72a62fe4ba9291aaf4a4b4 100644 (file)
@@ -81,6 +81,7 @@ typedef struct {
   EFI_HANDLE                       DriverHandle[2];\r
   EFI_HII_HANDLE                   HiiHandle[2];\r
   DRIVER_SAMPLE_CONFIGURATION      Configuration;\r
+  MY_EFI_VARSTORE_DATA             VarStoreConfig;\r
   UINT8                            PasswordState;\r
 \r
   //\r
index f0240301f06aa0eb62481ae13c4d1aff82eae382..06953ca6cb4a606634baa489cdaa97abaa337d88 100644 (file)
@@ -46,6 +46,11 @@ Revision History:
     0xF5E655D9, 0x02A6, 0x46f2, {0x9E, 0x76, 0xB8, 0xBE, 0x8E, 0x60, 0xAB, 0x22} \\r
   }\r
 \r
+#define ZERO_GUID \\r
+  { \\r
+    0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} \\r
+  } \r
+\r
 #define CONFIGURATION_VARSTORE_ID    0x1234\r
 \r
 #pragma pack(1)\r
@@ -72,6 +77,7 @@ typedef struct {
   UINT8   DynamicOneof;\r
   UINT8   DynamicOrderedList[5];\r
   UINT8   Reserved;\r
+  EFI_HII_REF RefData;\r
   UINT8   NameValueVar0;\r
   UINT16  NameValueVar1;\r
   UINT16  NameValueVar2[20];\r
@@ -92,7 +98,7 @@ typedef struct {
   UINT8         Field8;\r
   UINT16        Field16;\r
   UINT8         OrderedList[3];\r
-} MY_DATA2;\r
+} MY_EFI_VARSTORE_DATA;\r
 \r
 //\r
 // Labels definition\r
index 47304ab0f9595600775f0e04ce8c6b1fabd9947d..d3165111336558fe3fde3baff93cb37079481d5f 100644 (file)
@@ -73,21 +73,13 @@ formset
     name  = MyIfrNVData,                    // Define referenced name in vfr\r
     guid  = FORMSET_GUID;                   // GUID of this buffer storage\r
 \r
-  //\r
-  // Define another Buffer Storage\r
-  //\r
-  varstore MY_DATA2,\r
-    name  = MyIfrNVData2,\r
-    guid  = FORMSET_GUID;\r
-\r
   //\r
   // Define a EFI variable Storage (EFI_IFR_VARSTORE_EFI)\r
   //\r
-  efivarstore MyEfiVar,                           // Define referenced name in vfr\r
-    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attribures\r
-    name      = STRING_TOKEN(STR_VAR_NAME),       // EFI variable name\r
-    varsize   = 1,                                // Size of the EFI variable\r
-    guid      = FORMSET_GUID;                     // EFI variable GUID\r
+  efivarstore MY_EFI_VARSTORE_DATA,\r
+    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attribures  \r
+    name  = MyEfiVar,\r
+    guid  = FORMSET_GUID;\r
 \r
   //\r
   // Define a Name/Value Storage (EFI_IFR_VARSTORE_NAME_VALUE)\r
@@ -330,21 +322,22 @@ formset
             inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),\r
               ideqval MyIfrNVData.HowOldAreYouInYearsManual == 99\r
               OR\r
-              ideqid  MyIfrNVData.HowOldAreYouInYearsManual == MyEfiVar\r
+              ideqid  MyIfrNVData.HowOldAreYouInYearsManual == MyEfiVar.Field8\r
               OR\r
               ideqvallist MyIfrNVData.HowOldAreYouInYearsManual == 1 3 5 7\r
             endif\r
 \r
     endnumeric;\r
 \r
-    numeric varid   = MyEfiVar,                           // Reference of EFI variable storage\r
+    numeric varid   = MyEfiVar.Field8,                    // Reference of EFI variable storage\r
             questionid  = 0x1111,\r
             prompt  = STRING_TOKEN(STR_TALL_HEX_PROMPT),\r
             help    = STRING_TOKEN(STR_NUMERIC_HELP1),\r
             flags   = DISPLAY_UINT_HEX | INTERACTIVE,     // Display in HEX format (if not specified, default is in decimal format)\r
             minimum = 0,\r
             maximum = 250,\r
-            default = 175,\r
+            default = 18, defaultstore = MyStandardDefault,     // This is standard default value\r
+            default = 19, defaultstore = MyManufactureDefault,  // This is manufacture default value\r
 \r
     endnumeric;\r
 \r
@@ -383,6 +376,13 @@ formset
               maxsize  = 0x14,\r
     endstring;\r
 \r
+    oneof varid   = MyEfiVar.Field16,\r
+      prompt      = STRING_TOKEN(STR_ONE_OF_PROMPT),\r
+      help        = STRING_TOKEN(STR_NUMERIC_NUM_HELP),\r
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0x0, flags = 0;\r
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 0x1, flags = DEFAULT;\r
+    endoneof;\r
+\r
     label LABEL_1_VALUE;\r
     label LABEL_2_VALUE;\r
 \r
@@ -483,9 +483,17 @@ formset
       prompt = STRING_TOKEN(STR_GOTO_FORM4), //FourthSetupPage  // this too has no end-op and basically it's a jump to a form ONLY\r
       help   = STRING_TOKEN(STR_GOTO_HELP);\r
 \r
+    goto 5,\r
+      prompt = STRING_TOKEN(STR_GOTO_FORM5), //FifthSetupPage  // this too has no end-op and basically it's a jump to a form ONLY\r
+      help   = STRING_TOKEN(STR_GOTO_FORM5_HELP);\r
+      \r
+    goto 6,\r
+      prompt = STRING_TOKEN(STR_GOTO_FORM6), //SixthSetupPage  // this too has no end-op and basically it's a jump to a form ONLY\r
+      help   = STRING_TOKEN(STR_GOTO_HELP);\r
+\r
     guidop \r
       guid = FORMSET_GUID,\r
-      datatype = MY_DATA2,\r
+      datatype = MY_EFI_VARSTORE_DATA,\r
         data.Field8  = 0x21, \r
         data.Field16 = 0x2121,\r
         data.OrderedList[0] = 0x21,        \r
@@ -621,12 +629,29 @@ formset
         prompt = STRING_TOKEN(STR_GOTO_FORM1), //MainSetupPage  // this too has no end-op and basically it's a jump to a form ONLY\r
         help   = STRING_TOKEN(STR_GOTO_HELP);\r
 \r
+    goto \r
+      varid   = MyIfrNVData.RefData,\r
+      prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC3),\r
+      help    = STRING_TOKEN(STR_GOTO_DYNAMIC3_HELP),\r
+      flags   = INTERACTIVE,\r
+      key     = 0x1248;\r
+      //\r
+      // Set the defult value, format is QuestionId; FormId; FormsetGuid; Device Path String Token\r
+      //\r
+      default = 0;0;ZERO_GUID;STRING_TOKEN(STR_NULL_STRING),  \r
+\r
+    goto \r
+      prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC4),\r
+      help    = STRING_TOKEN(STR_GOTO_DYNAMIC4_HELP),\r
+      flags   = INTERACTIVE,\r
+      key     = 0x1249;\r
+      \r
     endform;\r
   endif;\r
 \r
   form formid = 3, title = STRING_TOKEN(STR_FORM3_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code\r
 \r
-    suppressif  ideqval MyEfiVar == 111;\r
+    suppressif  ideqval MyEfiVar.Field8 == 111;\r
       text\r
         help = STRING_TOKEN(STR_TEXT_HELP),\r
         text = STRING_TOKEN(STR_TEXT_TEXT_1);\r
@@ -712,6 +737,51 @@ formset
 \r
   endform;\r
 \r
+  form formid = 5,            // Modal form\r
+       title = STRING_TOKEN(STR_MODAL_FORM_TITLE);\r
+    //\r
+    //  This form is a modal form.\r
+    //\r
+    modal;\r
+    text\r
+      help   = STRING_TOKEN(STR_EXIT_TEXT),\r
+      text   = STRING_TOKEN(STR_EXIT_TEXT),\r
+        text   = STRING_TOKEN(STR_EXIT_TEXT),\r
+      flags  = INTERACTIVE,   // VfrCompiler will generate opcode EFI_IFR_ACTION for Text marked as INTERACTIVE\r
+      key    = 0x1245;\r
+\r
+    text\r
+      help   = STRING_TOKEN(STR_SAVE_TEXT),\r
+      text   = STRING_TOKEN(STR_SAVE_TEXT),\r
+        text   = STRING_TOKEN(STR_SAVE_TEXT),\r
+      flags  = INTERACTIVE,   // VfrCompiler will generate opcode EFI_IFR_ACTION for Text marked as INTERACTIVE\r
+      key    = 0x1246;\r
+  endform;\r
+\r
+  form formid = 6,            // Form to show the refresh guid group op-code\r
+       title = STRING_TOKEN(STR_FORM6_TITLE); \r
+\r
+    text\r
+      help   = STRING_TOKEN(STR_TEXT_REFRESH_GUID),\r
+      text   = STRING_TOKEN(STR_TEXT_REFRESH_GUID);\r
+\r
+    numeric varid   = MyIfrNVData.RefreshGuidCount,\r
+            prompt  = STRING_TOKEN(STR_TEXT_REFRESH_GUID_COUNT),\r
+            help    = STRING_TOKEN(STR_NUMERIC_HELP0),\r
+            flags   = INTERACTIVE,\r
+            key     = 0x1247,\r
+            minimum = 0,\r
+            maximum = 0xff,\r
+            step    = 0,\r
+            default = 0,\r
+            refreshguid = EFI_IFR_REFRESH_ID_OP_GUID,\r
+    endnumeric;\r
+\r
+    label LABEL_UPDATE3;\r
+    label LABEL_END;\r
+\r
+  endform;\r
+\r
   form formid = 0x1234,            // Dynamically created page,\r
        title = STRING_TOKEN(STR_DYNAMIC_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code\r
 \r
index d09fa5f26553bb6eacbf6a819bf7aa5ffb67a043..8aa526b83a7a88e0f40c45f6b42330d289db306c 100644 (file)
Binary files a/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni and b/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni differ