]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
MdeModulePkg CapsuleApp: Refine -D option help information
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleApp.c
index 63c83b1474a585ce5963f94af508ba00bf2ea2ff..e943038a0d00dcee4605961ced7e77609d9404cd 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   A shell application that triggers capsule update process.\r
 \r
 /** @file\r
   A shell application that triggers capsule update process.\r
 \r
-  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -21,6 +21,7 @@
 #include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/PrintLib.h>\r
 #include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/PrintLib.h>\r
+#include <Library/BmpSupportLib.h>\r
 #include <Protocol/GraphicsOutput.h>\r
 #include <Guid/GlobalVariable.h>\r
 #include <Guid/CapsuleReport.h>\r
 #include <Protocol/GraphicsOutput.h>\r
 #include <Guid/GlobalVariable.h>\r
 #include <Guid/CapsuleReport.h>\r
@@ -173,15 +174,21 @@ CreateBmpFmp (
   EFI_DISPLAY_CAPSULE                           *DisplayCapsule;\r
   EFI_STATUS                                    Status;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL                  *Gop;\r
   EFI_DISPLAY_CAPSULE                           *DisplayCapsule;\r
   EFI_STATUS                                    Status;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL                  *Gop;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION          *Info;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL                 *GopBlt;\r
+  UINTN                                         GopBltSize;\r
+  UINTN                                         Height;\r
+  UINTN                                         Width;\r
 \r
   Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);\r
   if (EFI_ERROR(Status)) {\r
     Print(L"CapsuleApp: NO GOP is found.\n");\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);\r
   if (EFI_ERROR(Status)) {\r
     Print(L"CapsuleApp: NO GOP is found.\n");\r
     return EFI_UNSUPPORTED;\r
   }\r
+  Info = Gop->Mode->Info;\r
   Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);\r
   Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);\r
-  Print(L"HorizontalResolution - %d, ", Gop->Mode->Info->HorizontalResolution);\r
-  Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);\r
+  Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);\r
+  Print(L"VerticalResolution - %d\n", Info->VerticalResolution);\r
   // HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth\r
   // VerticalResolution   >= BMP_IMAGE_HEADER.PixelHeight\r
 \r
   // HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth\r
   // VerticalResolution   >= BMP_IMAGE_HEADER.PixelHeight\r
 \r
@@ -207,6 +214,35 @@ CreateBmpFmp (
     goto Done;\r
   }\r
 \r
     goto Done;\r
   }\r
 \r
+  GopBlt = NULL;\r
+  Status = TranslateBmpToGopBlt (\r
+             BmpBuffer,\r
+             FileSize,\r
+             &GopBlt,\r
+             &GopBltSize,\r
+             &Height,\r
+             &Width\r
+             );\r
+  if (EFI_ERROR(Status)) {\r
+    Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);\r
+    goto Done;\r
+  }\r
+  if (GopBlt != NULL) {\r
+    FreePool (GopBlt);\r
+  }\r
+  Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);\r
+\r
+  if (Height > Info->VerticalResolution) {\r
+    Status = EFI_INVALID_PARAMETER;\r
+    Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);\r
+    goto Done;\r
+  }\r
+  if (Width > Info->HorizontalResolution) {\r
+    Status = EFI_INVALID_PARAMETER;\r
+    Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);\r
+    goto Done;\r
+  }\r
+\r
   FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;\r
   FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);\r
   if (FullCapsuleBuffer == NULL) {\r
   FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;\r
   FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);\r
   if (FullCapsuleBuffer == NULL) {\r
@@ -226,8 +262,27 @@ CreateBmpFmp (
   DisplayCapsule->ImagePayload.ImageType = 0; // BMP\r
   DisplayCapsule->ImagePayload.Reserved = 0;\r
   DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;\r
   DisplayCapsule->ImagePayload.ImageType = 0; // BMP\r
   DisplayCapsule->ImagePayload.Reserved = 0;\r
   DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;\r
-  DisplayCapsule->ImagePayload.OffsetX = 0;\r
-  DisplayCapsule->ImagePayload.OffsetY = 0;\r
+\r
+  //\r
+  // Center the bitmap horizontally\r
+  //\r
+  DisplayCapsule->ImagePayload.OffsetX = (UINT32)((Info->HorizontalResolution - Width) / 2);\r
+\r
+  //\r
+  // Put bitmap 3/4 down the display.  If bitmap is too tall, then align bottom\r
+  // of bitmap at bottom of display.\r
+  //\r
+  DisplayCapsule->ImagePayload.OffsetY =\r
+    MIN (\r
+      (UINT32)(Info->VerticalResolution - Height),\r
+      (UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)\r
+      );\r
+\r
+  Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",\r
+    BmpName,\r
+    DisplayCapsule->ImagePayload.OffsetX,\r
+    DisplayCapsule->ImagePayload.OffsetY\r
+    );\r
 \r
   CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);\r
 \r
 \r
   CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);\r
 \r
@@ -376,7 +431,7 @@ CreateNestedFmp (
   ZeroMem(NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);\r
   CopyGuid(&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);\r
   NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;\r
   ZeroMem(NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);\r
   CopyGuid(&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);\r
   NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;\r
-  NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_DEVICEFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;\r
+  NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;\r
   NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize;\r
 \r
   CopyMem((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);\r
   NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize;\r
 \r
   CopyMem((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);\r
@@ -497,7 +552,7 @@ BuildGatherList (
       goto ERREXIT;\r
     } else {\r
       Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN) BlockDescriptors1);\r
       goto ERREXIT;\r
     } else {\r
       Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN) BlockDescriptors1);\r
-      Print (L"CapsuleApp: capsule data starts          at 0x%X with size 0x%X\n", (UINTN) CapsuleBuffer, FileSize);\r
+      Print (L"CapsuleApp: capsule data starts          at 0x%X with size 0x%X\n", (UINTN) CapsuleBuffer[Index], FileSize[Index]);\r
     }\r
 \r
     //\r
     }\r
 \r
     //\r
@@ -653,7 +708,7 @@ CleanGatherList (
         break;\r
       }\r
 \r
         break;\r
       }\r
 \r
-      TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr->Union.ContinuationPointer);\r
+      TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr[Index].Union.ContinuationPointer);\r
       FreePool(TempBlockPtr1);\r
       TempBlockPtr1 = TempBlockPtr2;\r
     }\r
       FreePool(TempBlockPtr1);\r
       TempBlockPtr1 = TempBlockPtr2;\r
     }\r
@@ -687,13 +742,13 @@ PrintUsage (
   Print(L"       which is defined in UEFI specification.\n");\r
   Print(L"  -P:  Dump UEFI FMP protocol info.\n");\r
   Print(L"  -E:  Dump UEFI ESRT table info.\n");\r
   Print(L"       which is defined in UEFI specification.\n");\r
   Print(L"  -P:  Dump UEFI FMP protocol info.\n");\r
   Print(L"  -E:  Dump UEFI ESRT table info.\n");\r
-  Print(L"  -G:  Convert a BMP file to be a UX capsule,\n");\r
+  Print(L"  -G:  Convert a BMP file to be an UX capsule,\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
   Print(L"  -N:  Append a Capsule Header to an existing capsule image,\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
   Print(L"  -O:  Output new Capsule file name\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
   Print(L"  -N:  Append a Capsule Header to an existing capsule image,\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
   Print(L"  -O:  Output new Capsule file name\n");\r
-  Print(L"  -D:  Dump Capsule image header information and FMP header information,\n");\r
-  Print(L"       if it is an FMP capsule.\n");\r
+  Print(L"  -D:  Dump Capsule image header information, image payload information if it is an UX capsule\n");\r
+  Print(L"       and FMP header information if it is a FMP capsule.\n");\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -737,6 +792,10 @@ UefiMain (
     return EFI_INVALID_PARAMETER;\r
   }\r
   if (StrCmp(Argv[1], L"-D") == 0) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   if (StrCmp(Argv[1], L"-D") == 0) {\r
+    if (Argc < 3) {\r
+      Print(L"CapsuleApp: NO input capsule name.\n");\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
     Status = DumpCapsule(Argv[2]);\r
     return Status;\r
   }\r
     Status = DumpCapsule(Argv[2]);\r
     return Status;\r
   }\r