[edk2] [Patch][edk2-platforms/devel-MinnowBoard3-UDK2017] QR code display under EFI Shell

xianhu2x posted 1 patch 7 years, 2 months ago
Failed in applying to current master (apply log)
.../MinnowBoard3/BoardInitPostMem/BoardInit.c      |   5 +
.../BoardInitPostMem/BoardInitPostMem.inf          |   1 +
.../Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp    | Bin 0 -> 54670 bytes
.../Common/PlatformSettings/PlatformDxe/Logo.c     | 520 +++++++++++++++++++++
.../Common/PlatformSettings/PlatformDxe/Logo.h     |  27 ++
.../Common/PlatformSettings/PlatformDxe/Platform.c |  21 +-
.../PlatformSettings/PlatformDxe/PlatformDxe.inf   |  10 +
Platform/BroxtonPlatformPkg/PlatformPkg.dec        |   3 +
Platform/BroxtonPlatformPkg/PlatformPkg.fdf        |   3 +
9 files changed, 589 insertions(+), 1 deletion(-)
create mode 100644 Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp
create mode 100644 Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.c
create mode 100644 Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.h
[edk2] [Patch][edk2-platforms/devel-MinnowBoard3-UDK2017] QR code display under EFI Shell
Posted by xianhu2x 7 years, 2 months ago
Showing QR code and website link to screen under EFI shell for MinnowBoard. Output website link to serial port too.

Contributed-under: TianoCore Contribution Agreement 1.1

Signed-off-by: xianhu2x <xianhuix.liu@intel.com>
---
 .../MinnowBoard3/BoardInitPostMem/BoardInit.c      |   5 +
 .../BoardInitPostMem/BoardInitPostMem.inf          |   1 +
 .../Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp    | Bin 0 -> 54670 bytes
 .../Common/PlatformSettings/PlatformDxe/Logo.c     | 520 +++++++++++++++++++++
 .../Common/PlatformSettings/PlatformDxe/Logo.h     |  27 ++
 .../Common/PlatformSettings/PlatformDxe/Platform.c |  21 +-
 .../PlatformSettings/PlatformDxe/PlatformDxe.inf   |  10 +
 Platform/BroxtonPlatformPkg/PlatformPkg.dec        |   3 +
 Platform/BroxtonPlatformPkg/PlatformPkg.fdf        |   3 +
 9 files changed, 589 insertions(+), 1 deletion(-)
 create mode 100644 Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp
 create mode 100644 Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.c
 create mode 100644 Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.h

diff --git Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInit.c Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInit.c
index 0aa9246f4..fc8250fd3 100644
--- Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInit.c
+++ Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInit.c
@@ -101,6 +101,11 @@ MinnowBoard3PostMemInitCallback (
   // Set PcdSueCreek
   //
   PcdSetBool (PcdSueCreek, FALSE);
+
+  //
+  //Set PcdLogoDisplay
+  //
+  PcdSetBool (PcdLogoDisplay, TRUE);
     
   //
   // Add init steps here
diff --git Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInitPostMem.inf Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInitPostMem.inf
index 8fa5ffa64..7651103d1 100644
--- Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInitPostMem.inf
+++ Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/BoardInitPostMem.inf
@@ -60,6 +60,7 @@
   gPlatformModuleTokenSpaceGuid.PcdResetType
   gPlatformModuleTokenSpaceGuid.PcdBoardVbtFileGuid
   gPlatformModuleTokenSpaceGuid.PcdSueCreek
+  gPlatformModuleTokenSpaceGuid.PcdLogoDisplay
 
 [Guids]
   gEfiPlatformInfoGuid
diff --git Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..7d7796e18777e34b802728bfe8ac7815da05256e
GIT binary patch
literal 54670
zcmeI4Ka%H25rstr1{P<K$qBF(`1qJQicY{8WNdH_8CZB2co_0<*T)!Mx3aqXQ@>w!
zs(XeA?bgh^Exr8nGApxs*4T*s)1UwPui^REAAdUxf6&)|0>2r4_iX>mKZoJ(zd!J7
zc=^XN4Ei%H%W>$R`W&`x8@7LM!_WWt+c1oiFbi^wtFQ_CFie9m3i_C4VG&kg6ZT=4
z2VoQ@L1bQpRoH|*>W(@mVHOr)6*gfX27M0eC``gEEW#>m!mcI<VH74|78YR@HenwI
z{TcRAn1oqagjLvteV7KdIgG;7?^#%cRoI06xY{`CoP=3egjLvt{kZlt>YRjGScFyB
zg#8%FJnEc;Sy+Ts*o6HU*D~sygjraGRoI06809+ZoP=3egjLvt{TTB$>YRjGScFyB
zg#CF1(?05)gjraGRoH}mSakno7=@>s&%)F1RoH}mSjIsZg-Mu&MOcMR*pIbMqs~c~
zg+*9}P1ui>&ZEvrn1w}Hg-zIxb*sp-Ou{TI!YXXSemsSB)Hw;Wun4QL3H$L(wo&IK
z%)%n9!Y1s`PiWakos%#Ni?9ltun(K=zYU`>3A3;WtMK%DKc3b&>YRjGScFyBg#CDS
z)2MS2W?>OlVH5V_NzS9rNtlI2ScOg4kLS9KIwxTk7GV`OVLzVoI_jK+Sy+Ts*o6If
z=G&-q5@ul$*5T*>ej9#L+#<bU`1br~`1bATOVIBp(-Z%7{Ob4oW$n4|v+whc6X@^u
zj$3=&bKmFV+1%07_j$*yJ?^>h^YLu%=;`~s<JKPc-1qr-Hh1*&eco|vk9+R>d_0>w
zdip-^xV6VU_kBK|%^f{`pLg8a<DS!f>OaL?`xSK}=`za_3XMFz<p=*Asi4h}tkHrm
z3t=J4`aSzTpWlFe9hotEcm-b;l9df#q}!waJ*2S|X2_6iAq8I+!a|lsx;-lUw23rE
z-7vBX8_9$$k78LK3z7AEY94lYoKrAHas^Dd>|+88+3Kv<Laenp57jKhMzS@gU-mH}
znAN0_tiM~$!w!#g3dTsTfC-m<Okg2fo%LFXwKnIWnuXX%w#M|!J|+aSnlzGKc(++W
zmM3GuU=*_<jARHakTJ5USZi}00%W#BRwA<%tV$M1A1jbCGFacI2EjRT1=iPwcR1}}
z8A27CU_)pm^D5TLX2?R6+8MJItV$M1-}QRTC$nm{LmNpkGONOnV3f8-8$z-E^Qn1o
zPF#WY6{by<)6nTWSf<H%ijn;v_8HBvUmC5CA(n-aK3=d%TWfP30%TU3l?sd@pRHhf
zu{Y}b)L1xl4$u0ymy9u;kt{?XnT?DP9(|vh2Zzq#Ss$mJF{U$;h3F%*krBe<NA8nd
z*qdc-+w{!Ho00W<Y93sH9VHh+mL;5~Z9}gbsY%xNsd>aeV={KU^pRx=5m`vED%MC%
zvc6BvBc_%Ooj$Vq&~4;pV^p`tg?-w5-pq!uUxtM5iz?K#tlv{(;k50X!k9(&eV!-z
z*=c1PXp6{VvbxO6BKto3KKWXnSoSL3N58XF{=Q|2jD>uJu-N51s$}VmWZBk|wKiu#
z93jl3Gy+e==0yyBr$kWJBkTLrJTR>a;p|TnO$2OS#M76E<SSz{WSOY-v8TG2&FlBH
zGk*Txm~gajSibBBf)CAhFErX*hGfj9hcWW(k>1m06pU=<`y^1aa5I+e_vAb-G0wh_
zT1a3>-{*s=_ILYWFcmZ3SRtd3z>xlKA51lUx7pO_v(sisG>}CWd{lXGDP!*U)KKg~
z>_oFoaJpG!!Dp+pf@OW58cW~jc?Q{w<2%YC3%(G`Ho$r<!CIU1kh3AIly%7TEVAG$
zbjEru!CIU1D9n&(hDNe1B=b=vSS0XZWI^-#-$NDABZkeeZR@i}UeH#zMvC=&Y94k@
z)_5A;5kq6JLOSyzfrkyDk*x1i^RTnG#?$bQ7#f2W(wP?tJZuP!WPP8S2WM|5YK^B+
z9x<8G7K(&|k0C77RIIf*(P5}j)EcSDgiQLgK3n0`1SuKw?Uk%CQwg7y{;ZE;tll)O
zwK)#~GKvPHk($;=;};pzS-mxHt<8A|kWn-kjnuS08o$Vx&g!jsYi-U$fQ+KSXr!j~
z(fCEibXIT8TWfP30%Q~oMk6(?kH#-Drn7o$-ddY81aQ#DbOfG=&5Ic8v&KRKTWTuS
z+MK6WpDBGzck#_;^TKI;)>uejOHIXEo3r)!_N0&LZ{yD2HZOv#&l(E}Y^kYOYjd7^
zed6>n-NiSX%?qdXSz{rAEj1NuZO+!?+mk+~zl}S8+q?*}K5Hx_u%)JAt<8Dv^@-ER
zbQj-jHZPpkXN`pfw$xOtwK-dlZ%_J|{x<IXZSx|?`mC{#z?PbdwKnIu*N-^GvYx19
z^Xlo0q*%L(wKgZa`Iu3R<t?MpmZg!59kDuD`*EW+Q=>K+Rd@-@XtZT%B+IIwdLbpF
zOo7?-F!D+ivw1dwVwuWGla!1y1!mL3XxpZdk@Q&>M*7%9)3ny+q|V2TVk~bNjkYX}
zWbBC5$@<SH=kbo&O)!enwh1(nSuq-eWqB>cCKikp?TEoaX{wNAk#%20rtg+&WLZy5
z8yB<*G?LZpWqGX^s?}LVJ7RFK0#(Se$ht2g`#w3ccPyKIn;{ly6KEu3$<O*)FI20u
ztZvhe7#yrX6|yX{?rXg;gA5He(h?6&)?#oLLJ;2w^D-705n_+@=d)GBStyA3R)NL>
z%L>sKV)lY9GIhFcTH@g&bMgJ2b}Fw%jxb}96Cw6!)Ar8SqOV_tg0I0(UreAcW6aA~
zs6>c8S{L5w+9(uc8WZTt81pg~DiLCje$Usj*rC6=-+wXTy<Zl)g1Rv@ZGx|7tu(Uj
zf;JN<7R;*DjhTwCXRS1{ZQD$iKwmJcQa5HQzMi$x*zd`Cyf6;t#r*c8zB(HjQkm~<
zHT``+Y8l%uXfq+xq|ZuQW8`JNlQgMiY`dV%giMn@D{YODm-$Z8q-5;ZG8VKUY^EMU
z=>lW(Wa+!jda8F{k1X89it$R8^?Pb8eV;EA;8S}sn~y>yLoTyOut$Hl8jIP=*~For
zy>EFTk|CE_B-kU}r_K1HF|JM(Yh=h5S-<BO2ly!6uFe`CDSXP__xY)@eVk-hXN@0g
zU5M!WyfCaQp>}oFct!QY*mR#!zJ5eGw*5tRxw^e`zo*7hALSQ!mc4^|6LyhJI(61-
z9Fa}*d$M{D=~Yr^y~g*v8K+h6A-ziKtk>xGY(M4PQk~Ujovti(VoUYNXwBY*Mtcc{
zWM%7-m4B~XuGH`OGBUf!!hBu?-hMFet>@*t?^B~F%qa%O$c!-|B6%<*Saz_UjqLl>
zSPFBB;W08}Oo&Jx3<;JUtY;%H?32w<n~as{qe>w%LYQYYDMr@ssd?C`aj={=XJ~yk
zJ&UBzrn67qgtbze>~bY`VbfV5V>X=?BArKnx0(m%#8FxwXBf;z(wIfk$0q0tW{<v4
zjfF$!D6Nn4EreW7U=vIaW{)4T&q6bH2G+>C6r}q-?F3}B^DRuY9%7e8BUwQ@5_t4?
zt9kT&zC0hkDl$7JhL9B!UJ5^dFg=((e#pCJdE1(8hDLj9E5=Bwv|g;WIS&D{dL>2{
znqe<Y$ix^)mDaqqHs>Kg#)9-wjFE+AY&t7YlRl=C^>?dza0MKt^_^zuG8mFETY-|1
z&Pc1-_o=aPP8_B6ag<pCBQ3KPs2O>T^kUXp&$p3TGwjJmTFo!^dEwpGE7|Vr#(vKS
zqvjj2L4BVZOJPp-jn$v1jkKC}OZCXUPtEFAwog8;jPY^R$7J7MR>=BToviY1t*AAg
zw2v4XGZvZ=Vk>0ER62ELs?JBTh@dfJOmGEKTPmG8Q(5DrSOn0RF(w%O+>}bE&RqAs
zmtx_kF=I@4FaLohl}?=>2)}bvEZj6^j0x}5KQg4!sq-V{v!7z&r7>enIE#PCQ|Zk4
z3-YD^Ug`I|-30nRZ@03v;l9swJhyZ9eco<mX~TV=>3DAE?EAdk%F>4WKGX5s&e`{Q
tyOpI4_kE`0xt+7`^L8ss8}9o|$8$Sp-{<XCmNwk?nU3dn&R@+w{|B-4s8Ij_

literal 0
HcmV?d00001

diff --git Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.c Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.c
new file mode 100644
index 000000000..15efd6677
--- /dev/null
+++ Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.c
@@ -0,0 +1,520 @@
+/** @file
+  Platform Initialization Driver.
+
+  Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+
+#include <IndustryStandard/Bmp.h>
+#include <PiDxe.h>
+#include <Protocol/SimpleTextOut.h>
+#include <Protocol/OEMBadging.h>
+#include <Protocol/GraphicsOutput.h>
+#include <Protocol/UgaDraw.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/PcdLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DebugLib.h>
+
+#include "Logo.h"
+
+
+/**
+  Convert a *.BMP graphics image to a GOP blt buffer. If a NULL Blt buffer
+  is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt
+  buffer is passed in it will be used if it is big enough.
+
+  @param  BmpImage      Pointer to BMP file
+  @param  BmpImageSize  Number of bytes in BmpImage
+  @param  GopBlt        Buffer containing GOP version of BmpImage.
+  @param  GopBltSize    Size of GopBlt in bytes.
+  @param  PixelHeight   Height of GopBlt/BmpImage in pixels
+  @param  PixelWidth    Width of GopBlt/BmpImage in pixels
+
+  @retval EFI_SUCCESS           GopBlt and GopBltSize are returned.
+  @retval EFI_UNSUPPORTED       BmpImage is not a valid *.BMP image
+  @retval EFI_BUFFER_TOO_SMALL  The passed in GopBlt buffer is not big enough.
+                                    GopBltSize will contain the required size.
+  @retval EFI_OUT_OF_RESOURCES  No enough buffer to allocate.
+
+**/
+EFI_STATUS
+EfiShellConvertBmpToGopBlt (
+  IN     VOID      *BmpImage,
+  IN     UINTN     BmpImageSize,
+  IN OUT VOID      **GopBlt,
+  IN OUT UINTN     *GopBltSize,
+  OUT UINTN     *PixelHeight,
+  OUT UINTN     *PixelWidth
+  )
+{
+  UINT8                         *Image;
+  UINT8                         *ImageHeader;
+  BMP_IMAGE_HEADER              *BmpHeader;
+  BMP_COLOR_MAP                 *BmpColorMap;
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
+  UINT64                        BltBufferSize;
+  UINTN                         Index;
+  UINTN                         Height;
+  UINTN                         Width;
+  UINTN                         ImageIndex;
+  UINT32                        DataSizePerLine;
+  BOOLEAN                       IsAllocated;
+  UINT32                        ColorMapNum;
+
+  if (sizeof (BMP_IMAGE_HEADER) > BmpImageSize) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+BmpHeader = (BMP_IMAGE_HEADER *) BmpImage;
+
+if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') {
+  return EFI_UNSUPPORTED;
+}
+
+//
+// Doesn't support compress.
+//
+if (BmpHeader->CompressionType != 0) {
+  return EFI_UNSUPPORTED;
+}
+
+//
+// Only support BITMAPINFOHEADER format.
+// BITMAPFILEHEADER + BITMAPINFOHEADER = BMP_IMAGE_HEADER
+//
+if (BmpHeader->HeaderSize != sizeof (BMP_IMAGE_HEADER) - OFFSET_OF(BMP_IMAGE_HEADER, HeaderSize)) {
+  return EFI_UNSUPPORTED;
+}
+
+//
+// The data size in each line must be 4 byte alignment.
+//
+DataSizePerLine = ((BmpHeader->PixelWidth * BmpHeader->BitPerPixel + 31) >> 3) & (~0x3);
+BltBufferSize = MultU64x32 (DataSizePerLine, BmpHeader->PixelHeight);
+if (BltBufferSize > (UINT32) ~0) {
+  return EFI_INVALID_PARAMETER;
+}
+
+if ((BmpHeader->Size != BmpImageSize) || 
+    (BmpHeader->Size < BmpHeader->ImageOffset) ||
+    (BmpHeader->Size - BmpHeader->ImageOffset !=	BmpHeader->PixelHeight * DataSizePerLine)) {
+  return EFI_INVALID_PARAMETER;
+}
+
+//
+// Calculate Color Map offset in the image.
+//
+Image       = BmpImage;
+BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof (BMP_IMAGE_HEADER));
+if (BmpHeader->ImageOffset < sizeof (BMP_IMAGE_HEADER)) {
+  return EFI_INVALID_PARAMETER;
+}
+
+if (BmpHeader->ImageOffset > sizeof (BMP_IMAGE_HEADER)) {
+  switch (BmpHeader->BitPerPixel) {
+    case 1:
+      ColorMapNum = 2;
+      break;
+    case 4:
+      ColorMapNum = 16;
+      break;
+    case 8:
+      ColorMapNum = 256;
+      break;
+    default:
+      ColorMapNum = 0;
+      break;
+    }
+  //
+  // BMP file may has padding data between the bmp header section and the bmp data section.
+  //
+  if (BmpHeader->ImageOffset - sizeof (BMP_IMAGE_HEADER) < sizeof (BMP_COLOR_MAP) * ColorMapNum) {
+    return EFI_INVALID_PARAMETER;
+  }
+ }
+
+ //
+ // Calculate graphics image data address in the image
+ //
+ Image         = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;
+ ImageHeader   = Image;
+
+ //
+ // Calculate the BltBuffer needed size.
+ //
+ BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight);
+ //
+ // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow
+ //
+ if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
+   return EFI_UNSUPPORTED;
+ }
+ BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
+
+ IsAllocated   = FALSE;
+ if (*GopBlt == NULL) {
+   //
+   // GopBlt is not allocated by caller.
+   //
+   *GopBltSize = (UINTN) BltBufferSize;
+   *GopBlt     = AllocatePool (*GopBltSize);
+   IsAllocated = TRUE;
+   if (*GopBlt == NULL) {
+     return EFI_OUT_OF_RESOURCES;
+   }
+ } else {
+   //
+   // GopBlt has been allocated by caller.
+   //
+   if (*GopBltSize < (UINTN) BltBufferSize) {
+     *GopBltSize = (UINTN) BltBufferSize;
+     return EFI_BUFFER_TOO_SMALL;
+   }
+ }
+
+ *PixelWidth	= BmpHeader->PixelWidth;
+ *PixelHeight	= BmpHeader->PixelHeight;
+
+ //
+ // Convert image from BMP to Blt buffer format
+ //
+ BltBuffer = *GopBlt;
+ for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {
+   Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth];
+   for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) {
+     switch (BmpHeader->BitPerPixel) {
+     case 1:
+       //
+       // Convert 1-bit (2 colors) BMP to 24-bit color
+       //
+       for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++) {
+         Blt->Red	  = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red;
+         Blt->Green  = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green;
+         Blt->Blue   = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue;
+         Blt++;
+         Width++;
+       }
+    
+       Blt--;
+       Width--;
+       break;
+
+     case 4:
+       //
+       // Convert 4-bit (16 colors) BMP Palette to 24-bit color
+       //
+       Index       = (*Image) >> 4;
+       Blt->Red    = BmpColorMap[Index].Red;
+       Blt->Green  = BmpColorMap[Index].Green;
+       Blt->Blue   = BmpColorMap[Index].Blue;
+       if (Width < (BmpHeader->PixelWidth - 1)) {
+         Blt++;
+         Width++;
+         Index       = (*Image) & 0x0f;
+         Blt->Red    = BmpColorMap[Index].Red;
+         Blt->Green  = BmpColorMap[Index].Green;
+         Blt->Blue   = BmpColorMap[Index].Blue;
+       }
+       break;
+
+     case 8:
+       //
+       // Convert 8-bit (256 colors) BMP Palette to 24-bit color
+       //
+       Blt->Red    = BmpColorMap[*Image].Red;
+       Blt->Green  = BmpColorMap[*Image].Green;
+       Blt->Blue   = BmpColorMap[*Image].Blue;
+       break;
+
+     case 24:
+       //
+       // It is 24-bit BMP.
+       //
+       Blt->Blue   = *Image++;
+       Blt->Green  = *Image++;
+       Blt->Red    = *Image;
+       break;
+
+     default:
+       //
+       // Other bit format BMP is not supported.
+       //
+       if (IsAllocated) {
+         FreePool (*GopBlt);
+         *GopBlt = NULL;
+        }
+        return EFI_UNSUPPORTED;
+      };
+
+    }
+
+    ImageIndex = (UINTN)Image - (UINTN)ImageHeader;
+    if ((ImageIndex % 4) != 0) {
+      //
+      // Bmp Image starts each row on a 32-bit boundary!
+      //
+      Image = Image + (4 - (ImageIndex % 4));
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EFIAPI
+WelcomeLineDisplay (
+  IN CHAR16 * WelcomeLine
+  ) 
+{
+  UINTN Length;
+  UINTN Line;
+  UINTN Columns;
+  UINTN Rows;
+  UINTN Column;
+  EFI_STATUS Status;
+  EFI_SIMPLE_TEXT_OUTPUT_MODE SavedConMode;
+
+  Length = StrLen(WelcomeLine);
+  Line = 1;
+  CopyMem(&SavedConMode, gST->ConOut->Mode, sizeof (SavedConMode));
+  gST->ConOut->QueryMode(gST->ConOut, SavedConMode.Mode, &Columns, &Rows);
+  Column = (Columns-Length)/2;
+  gST->ConOut->SetAttribute(gST->ConOut, EFI_YELLOW);
+  gST->ConOut->SetCursorPosition(gST->ConOut, Column, SavedConMode.CursorRow);
+  gST->ConOut->OutputString(gST->ConOut, WelcomeLine);
+  gST->ConOut->EnableCursor      (gST->ConOut, SavedConMode.CursorVisible);
+  gST->ConOut->SetCursorPosition (gST->ConOut, SavedConMode.CursorColumn, (SavedConMode.CursorRow+1));
+  Status = gST->ConOut->SetAttribute     (gST->ConOut, SavedConMode.Attribute);
+  return Status;
+}
+
+EFI_STATUS
+EFIAPI
+LogoDisplay (
+  IN  EFI_GUID  *LogoFile
+  )
+{
+  EFI_STATUS                    Status;
+  UINT32                        SizeOfX;
+  UINT32                        SizeOfY;
+  INTN                          DestX;
+  INTN                          DestY;
+  UINT8                         *ImageData;
+  UINTN                         ImageSize;
+  UINTN                         BltSize;
+  EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;
+  UINTN                         CoordinateX;
+  UINTN                         CoordinateY;
+  UINTN                         Height;
+  UINTN                         Width;
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
+  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;
+  UINT32                        ColorDepth;
+  UINT32                        RefreshRate;
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;
+  UINTN                         LogoDestX;
+  UINTN                         LogoDestY;
+  UINTN                         LogoHeight;
+  UINTN                         LogoWidth;
+      
+  UgaDraw = NULL;
+  //
+  // Try to open GOP first
+  //
+  Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **) &GraphicsOutput);
+  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {
+    GraphicsOutput = NULL;
+    //
+    // Open GOP failed, try to open UGA
+    //
+    Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);
+  }
+  if (EFI_ERROR (Status)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  //
+  // Try to open Boot Logo Protocol.
+  //
+
+  if (GraphicsOutput != NULL) {
+    SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
+    SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;
+
+  } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
+    Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);
+    if (EFI_ERROR (Status)) {
+      return EFI_UNSUPPORTED;
+    }
+  } else {
+    return EFI_UNSUPPORTED;
+  }
+
+  Blt = NULL;
+  LogoDestX = 0;
+  LogoDestY = 0;
+  LogoHeight = 0;
+  LogoWidth = 0;
+      
+  ImageData = NULL;
+  ImageSize = 0;
+
+  //
+  // Get the specified image from FV.
+  //
+  Status = GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **) &ImageData, &ImageSize);
+  if (EFI_ERROR (Status)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  CoordinateX = 0;
+  CoordinateY = 0;
+  Attribute   = EfiBadgingDisplayAttributeRightTop;
+
+  if (Blt != NULL) {
+    FreePool (Blt);
+  }
+
+  //
+  // Try BMP decoder
+  //
+  Blt = NULL;
+  Status = EfiShellConvertBmpToGopBlt (
+             ImageData,
+             ImageSize,
+             (VOID **) &Blt,
+             &BltSize,
+             &Height,
+             &Width
+             );
+
+  if (EFI_ERROR (Status)) {
+    FreePool (ImageData);
+  }
+
+  //
+  // Calculate the display position according to Attribute.
+  //
+  switch (Attribute) {
+    case EfiBadgingDisplayAttributeLeftTop:
+      DestX = CoordinateX;
+      DestY = CoordinateY;
+      break;
+
+    case EfiBadgingDisplayAttributeCenterTop:
+      DestX = (SizeOfX - Width) / 2;
+      DestY = CoordinateY;
+      break;
+
+    case EfiBadgingDisplayAttributeRightTop:
+      DestX = (SizeOfX - Width - CoordinateX);
+      DestY = CoordinateY;;
+      break;
+
+    case EfiBadgingDisplayAttributeCenterRight:
+      DestX = (SizeOfX - Width - CoordinateX);
+      DestY = (SizeOfY - Height) / 2;
+      break;
+
+    case EfiBadgingDisplayAttributeRightBottom:
+      DestX = (SizeOfX - Width - CoordinateX);
+      DestY = (SizeOfY - Height - CoordinateY);
+      break;
+
+    case EfiBadgingDisplayAttributeCenterBottom:
+      DestX = (SizeOfX - Width) / 2;
+      DestY = (SizeOfY - Height - CoordinateY);
+      break;
+
+    case EfiBadgingDisplayAttributeLeftBottom:
+      DestX = CoordinateX;
+      DestY = (SizeOfY - Height - CoordinateY);
+      break;
+
+    case EfiBadgingDisplayAttributeCenterLeft:
+      DestX = CoordinateX;
+      DestY = (SizeOfY - Height) / 2;
+      break;
+
+    case EfiBadgingDisplayAttributeCenter:
+      DestX = (SizeOfX - Width) / 2;
+      DestY = (SizeOfY - Height) / 2;
+      break;
+
+    default:
+      DestX = CoordinateX;
+      DestY = CoordinateY;
+      break;
+    }
+
+  if ((DestX >= 0) && (DestY >= 0)) {
+    if (GraphicsOutput != NULL) {
+      Status = GraphicsOutput->Blt (
+                                 GraphicsOutput,
+                                 Blt,
+                                 EfiBltBufferToVideo,
+                                 0,
+                                 0,
+                                 (UINTN) DestX,
+                                 (UINTN) DestY,
+                                 Width,
+                                 Height,
+                                 Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
+                                 );
+    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
+      Status = UgaDraw->Blt (
+                          UgaDraw,
+                          (EFI_UGA_PIXEL *) Blt,
+                          EfiUgaBltBufferToVideo,
+                          0,
+                          0,
+                          (UINTN) DestX,
+                          (UINTN) DestY,
+                          Width,
+                          Height,
+                          Width * sizeof (EFI_UGA_PIXEL)
+                          );
+    } else {
+      Status = EFI_UNSUPPORTED;
+    }
+
+   }
+
+   FreePool (ImageData);
+
+   FreePool (Blt);
+
+   return Status;
+ }
+
+
+VOID
+EFIAPI
+EfiShellProtocolCallback (
+  IN EFI_EVENT Event,
+  IN VOID *Context
+)
+{
+  CHAR16 *Welcome;
+  Welcome = L"Welcome to https://minnowboard.org/setup";
+  WelcomeLineDisplay(Welcome);
+  LogoDisplay(PcdGetPtr (PcdLogoFileGuid));
+  return;
+}
+
diff --git Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.h Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.h
new file mode 100644
index 000000000..62cb1e588
--- /dev/null
+++ Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Logo.h
@@ -0,0 +1,27 @@
+/** @file
+  Driver configuration include file.
+
+  Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _LOGO_H
+#define _LOGO_H
+
+VOID
+EFIAPI
+EfiShellProtocolCallback (
+  IN EFI_EVENT Event,
+  IN VOID *Context
+);
+
+#endif // #ifndef _CONFIGURATION_H
+
diff --git Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platform.c Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platform.c
index a6d251ded..87268e8fd 100644
--- Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platform.c
+++ Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platform.c
@@ -15,6 +15,7 @@
 
 #include "PlatformDxe.h"
 #include "Platform.h"
+#include "Logo.h"
 
 #include <Library/S3BootScriptLib.h>
 #include <Library/PciLib.h>
@@ -254,7 +255,6 @@ EnableAcpiCallback (
   IoWrite16 (AcpiBaseAddr + R_ACPI_PM1_CNT, Pm1Cnt);
 }
 
-
 VOID
 PlatformScInitBeforeBoot (
   VOID
@@ -699,6 +699,8 @@ InitializePlatform (
   EFI_HOB_GUID_TYPE                   *FdoEnabledGuidHob = NULL;
   EFI_PLATFORM_INFO_HOB               *PlatformInfoHob;
   EFI_PEI_HOB_POINTERS                Hob;
+  EFI_EVENT                           EfiShellEvent = NULL;
+  VOID                                *mEfiShellProtocolRegistration;
 
   mImageHandle = ImageHandle;
 
@@ -900,6 +902,23 @@ InitializePlatform (
 
   OverrideSdCardPresence();
 
+  //
+  //QR code showing under EFI Shell
+  //
+  if (PcdGetBool(PcdLogoDisplay)) {
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  EfiShellProtocolCallback,
+                  NULL,
+                  &EfiShellEvent
+                  );
+  Status = gBS->RegisterProtocolNotify (
+                  &gEfiShellProtocolGuid,
+                  EfiShellEvent,
+                  &mEfiShellProtocolRegistration
+                  );
+  }
   return EFI_SUCCESS;
 }
 
diff --git Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/PlatformDxe.inf Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/PlatformDxe.inf
index ee8fd5a68..b98d32c73 100644
--- Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/PlatformDxe.inf
+++ Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/PlatformDxe.inf
@@ -34,6 +34,7 @@
   IchTcoReset.c
   SensorVar.c
   Rtc.c
+  Logo.c
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -66,6 +67,7 @@
   DxeSaPolicyLib
   ConfigBlockLib
   GpioLib
+  DxeServicesLib
 
 [Guids]
   gEfiBiosIdGuid
@@ -116,6 +118,9 @@
   gDxePlatformTdtPolicyGuid
   gDxePlatformSeCPolicyGuid
   gEfiSeCOperationProtocolGuid
+  gEfiUgaDrawProtocolGuid
+  gEfiUgaDrawProtocolGuid |PcdUgaConsumeSupport
+  gEfiShellProtocolGuid
 
 [Pcd]
   gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
@@ -127,6 +132,11 @@
   gPlatformModuleTokenSpaceGuid.PcdPBTNDisableInterval
   gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection
   gEfiBxtTokenSpaceGuid.PcdP2SBBaseAddress
+  gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid
+  gPlatformModuleTokenSpaceGuid.PcdLogoDisplay
+
+[FeaturePcd]
+  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
 
 [Depex]
   gEfiPciRootBridgeIoProtocolGuid     AND
diff --git Platform/BroxtonPlatformPkg/PlatformPkg.dec Platform/BroxtonPlatformPkg/PlatformPkg.dec
index f37ceafe3..52c05d976 100644
--- Platform/BroxtonPlatformPkg/PlatformPkg.dec
+++ Platform/BroxtonPlatformPkg/PlatformPkg.dec
@@ -184,6 +184,8 @@
   gPlatformModuleTokenSpaceGuid.PcdBoardVbtFileGuid|{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }|VOID*|0x80000014
   ## This PCD used to enable or disable SueCreek
   gPlatformModuleTokenSpaceGuid.PcdSueCreek|FALSE|BOOLEAN|0x80000015
+  ## This PCD used for QR code display under EFI Shell
+  gPlatformModuleTokenSpaceGuid.PcdLogoDisplay|FALSE|BOOLEAN|0x80000016
    
   ## MemoryCheck value for checking memory before boot OS.
   ## To save the boot performance, the default MemoryCheck is set to 0.
@@ -319,6 +321,7 @@
   gPlatformModuleTokenSpaceGuid.PcdTemporaryRamSize|0x2000|UINT32|0x10001002
     # @Prompt Stack size in the temporary RAM.
   gPlatformModuleTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0|UINT32|0x10001003
+  gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid|{0x1b, 0x9a, 0x3d, 0x71, 0x49, 0x88, 0x47, 0xc5, 0xb7, 0x2a, 0xb0, 0x7d, 0xc5, 0x10, 0x60, 0xc4 }|VOID*|0x10001004
 
 [PcdsFixedAtBuild]
   ## Specifies maximum number of PPIs provided by SecCore.
diff --git Platform/BroxtonPlatformPkg/PlatformPkg.fdf Platform/BroxtonPlatformPkg/PlatformPkg.fdf
index 1c1eb475f..32c389268 100644
--- Platform/BroxtonPlatformPkg/PlatformPkg.fdf
+++ Platform/BroxtonPlatformPkg/PlatformPkg.fdf
@@ -582,6 +582,9 @@ APRIORI DXE {
   FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
   SECTION RAW = $(PLATFORM_PACKAGE_COMMON)/Binaries/Logo/Logo.bmp
 }
+  FILE FREEFORM = PCD(gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid) {
+  SECTION RAW = $(PLATFORM_NAME)/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp
+}
 
   INF $(PLATFORM_PACKAGE_COMMON)/PnpDxe/PnpDxe.inf
   INF $(PLATFORM_PACKAGE_COMMON)/PlatformSettings/PlatformGpio/PlatformGpio.inf
-- 
2.14.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch][edk2-platforms/devel-MinnowBoard3-UDK2017] QR code display under EFI Shell
Posted by Wei, David 7 years, 2 months ago
Reviewed-by: zwei4 <david.wei@intel.com> 

Thanks,
David  Wei

Intel SSG/STO/UEFI BIOS                                 

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> xianhu2x
> Sent: Thursday, October 12, 2017 2:53 PM
> To: edk2-devel@lists.01.org
> Subject: [edk2] [Patch][edk2-platforms/devel-MinnowBoard3-UDK2017] QR
> code display under EFI Shell
> Importance: High
> 
> Showing QR code and website link to screen under EFI shell for
> MinnowBoard. Output website link to serial port too.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> 
> Signed-off-by: xianhu2x <xianhuix.liu@intel.com>
> ---
>  .../MinnowBoard3/BoardInitPostMem/BoardInit.c      |   5 +
>  .../BoardInitPostMem/BoardInitPostMem.inf          |   1 +
>  .../Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp    | Bin 0 -> 54670
> bytes
>  .../Common/PlatformSettings/PlatformDxe/Logo.c     | 520
> +++++++++++++++++++++
>  .../Common/PlatformSettings/PlatformDxe/Logo.h     |  27 ++
>  .../Common/PlatformSettings/PlatformDxe/Platform.c |  21 +-
>  .../PlatformSettings/PlatformDxe/PlatformDxe.inf   |  10 +
>  Platform/BroxtonPlatformPkg/PlatformPkg.dec        |   3 +
>  Platform/BroxtonPlatformPkg/PlatformPkg.fdf        |   3 +
>  9 files changed, 589 insertions(+), 1 deletion(-)
>  create mode 100644
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLo
> go.bmp
>  create mode 100644
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.c
>  create mode 100644
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.h
> 
> diff --git
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInit.c
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInit.c
> index 0aa9246f4..fc8250fd3 100644
> ---
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInit.c
> +++
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInit.c
> @@ -101,6 +101,11 @@ MinnowBoard3PostMemInitCallback (
>    // Set PcdSueCreek
>    //
>    PcdSetBool (PcdSueCreek, FALSE);
> +
> +  //
> +  //Set PcdLogoDisplay
> +  //
> +  PcdSetBool (PcdLogoDisplay, TRUE);
> 
>    //
>    // Add init steps here
> diff --git
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInitPostMem.inf
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInitPostMem.inf
> index 8fa5ffa64..7651103d1 100644
> ---
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInitPostMem.inf
> +++
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/BoardInitPostMem/Bo
> ardInitPostMem.inf
> @@ -60,6 +60,7 @@
>    gPlatformModuleTokenSpaceGuid.PcdResetType
>    gPlatformModuleTokenSpaceGuid.PcdBoardVbtFileGuid
>    gPlatformModuleTokenSpaceGuid.PcdSueCreek
> +  gPlatformModuleTokenSpaceGuid.PcdLogoDisplay
> 
>  [Guids]
>    gEfiPlatformInfoGuid
> diff --git
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLo
> go.bmp
> Platform/BroxtonPlatformPkg/Board/MinnowBoard3/Logo/MinnowBoardLo
> go.bmp
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..7d7796e18777e34b802728bfe
> 8ac7815da05256e
> GIT binary patch
> literal 54670
> zcmeI4Ka%H25rstr1{P<K$qBF(`1qJQicY{8WNdH_8CZB2co_0<*T)!Mx3aqXQ@
> >w!
> zs(XeA?bgh^Exr8nGApxs*4T*s)1UwPui^REAAdUxf6&)|0>2r4_iX>mKZoJ(zd!
> J7
> zc=^XN4Ei%H%W>$R`W&`x8@7LM!_WWt+c1oiFbi^wtFQ_CFie9m3i_C4VG&
> kg6ZT=4
> z2VoQ@L1bQpRoH|*>W(@mVHOr)6*gfX27M0eC``gEEW#>m!mcI<VH74|78
> YR@HenwI
> z{TcRAn1oqagjLvteV7KdIgG;7?^#%cRoI06xY{`CoP=3egjLvt{kZlt>YRjGScFyB
> zg#8%FJnEc;Sy+Ts*o6HU*D~sygjraGRoI06809+ZoP=3egjLvt{TTB$>YRjGScFyB
> zg#CF1(?05)gjraGRoH}mSakno7=@>s&%)F1RoH}mSjIsZg-
> Mu&MOcMR*pIbMqs~c~
> zg+*9}P1ui>&ZEvrn1w}Hg-zIxb*sp-
> Ou{TI!YXXSemsSB)Hw;Wun4QL3H$L(wo&IK
> z%)%n9!Y1s`PiWakos%#Ni?9ltun(K=zYU`>3A3;WtMK%DKc3b&>YRjGScFyBg#
> CDS
> z)2MS2W?>OlVH5V_NzS9rNtlI2ScOg4kLS9KIwxTk7GV`OVLzVoI_jK+Sy+Ts*o6
> If
> z=G&-q5@ul$*5T*>ej9#L+#<bU`1br~`1bATOVIBp(-
> Z%7{Ob4oW$n4|v+whc6X@^u
> zj$3=&bKmFV+1%07_j$*yJ?^>h^YLu%=;`~s<JKPc-1qr-
> Hh1*&eco|vk9+R>d_0>w
> zdip-
> ^xV6VU_kBK|%^f{`pLg8a<DS!f>OaL?`xSK}=`za_3XMFz<p=*Asi4h}tkHrm
> z3t=J4`aSzTpWlFe9hotEcm-b;l9df#q}!waJ*2S|X2_6iAq8I+!a|lsx;-lUw23rE
> z-7vBX8_9$$k78LK3z7AEY94lYoKrAHas^Dd>|+88+3Kv<Laenp57jKhMzS@gU-
> mH}
> znAN0_tiM~$!w!#g3dTsTfC-
> m<Okg2fo%LFXwKnIWnuXX%w#M|!J|+aSnlzGKc(++W
> zmM3GuU=*_<jARHakTJ5USZi}00%W#BRwA<%tV$M1A1jbCGFacI2EjRT1=iP
> wcR1}}
> z8A27CU_)pm^D5TLX2?R6+8MJItV$M1-}QRTC$nm{LmNpkGONOnV3f8-8$z-
> E^Qn1o
> zPF#WY6{by<)6nTWSf<H%ijn;v_8HBvUmC5CA(n-
> aK3=d%TWfP30%TU3l?sd@pRHhf
> zu{Y}b)L1xl4$u0ymy9u;kt{?XnT?DP9(|vh2Zzq#Ss$mJF{U$;h3F%*krBe<NA8n
> d
> z*qdc-
> +w{!Ho00W<Y93sH9VHh+mL;5~Z9}gbsY%xNsd>aeV={KU^pRx=5m`vED%MC%
> zvc6BvBc_%Ooj$Vq&~4;pV^p`tg?-w5-pq!uUxtM5iz?K#tlv{(;k50X!k9(&eV!-z
> z*=c1PXp6{VvbxO6BKto3KKWXnSoSL3N58XF{=Q|2jD>uJu-
> N51s$}VmWZBk|wKiu#
> z93jl3Gy+e==0yyBr$kWJBkTLrJTR>a;p|TnO$2OS#M76E<SSz{WSOY-
> v8TG2&FlBH
> zGk*Txm~gajSibBBf)CAhFErX*hGfj9hcWW(k>1m06pU=<`y^1aa5I+e_vAb-
> G0wh_
> zT1a3>-
> {*s=_ILYWFcmZ3SRtd3z>xlKA51lUx7pO_v(sisG>}CWd{lXGDP!*U)KKg~
> z>_oFoaJpG!!Dp+pf@OW58cW~jc?Q{w<2%YC3%(G`Ho$r<!CIU1kh3AIly%7TE
> VAG$
> zbjEru!CIU1D9n&(hDNe1B=b=vSS0XZWI^-#-
> $NDABZkeeZR@i}UeH#zMvC=&Y94k@
> z)_5A;5kq6JLOSyzfrkyDk*x1i^RTnG#?$bQ7#f2W(wP?tJZuP!WPP8S2WM|5YK
> ^B+
> z9x<8G7K(&|k0C77RIIf*(P5}j)EcSDgiQLgK3n0`1SuKw?Uk%CQwg7y{;ZE;tll)O
> zwK)#~GKvPHk($;=;};pzS-mxHt<8A|kWn-kjnuS08o$Vx&g!jsYi-U$fQ+KSXr!j~
> z(fCEibXIT8TWfP30%Q~oMk6(?kH#-Drn7o$-
> ddY81aQ#DbOfG=&5Ic8v&KRKTWTuS
> z+MK6WpDBGzck#_;^TKI;)>uejOHIXEo3r)!_N0&LZ{yD2HZOv#&l(E}Y^kYOYjd
> 7^
> zed6>n-
> NiSX%?qdXSz{rAEj1NuZO+!?+mk+~zl}S8+q?*}K5Hx_u%)JAt<8Dv^@-ER
> zbQj-jHZPpkXN`pfw$xOtwK-dlZ%_J|{x<IXZSx|?`mC{#z?PbdwKnIu*N-
> ^GvYx19
> z^Xlo0q*%L(wKgZa`Iu3R<t?MpmZg!59kDuD`*EW+Q=>K+Rd@-
> @XtZT%B+IIwdLbpF
> zOo7?-
> F!D+ivw1dwVwuWGla!1y1!mL3XxpZdk@Q&>M*7%9)3ny+q|V2TVk~bNjkYX}
> zWbBC5$@<SH=kbo&O)!enwh1(nSuq-
> eWqB>cCKikp?TEoaX{wNAk#%20rtg+&WLZy5
> z8yB<*G?LZpWqGX^s?}LVJ7RFK0#(Se$ht2g`#w3ccPyKIn;{ly6KEu3$<O*)FI20u
> ztZvhe7#yrX6|yX{?rXg;gA5He(h?6&)?#oLLJ;2w^D-705n_+@=d)GBStyA3R)NL>
> z%L>sKV)lY9GIhFcTH@g&bMgJ2b}Fw%jxb}96Cw6!)Ar8SqOV_tg0I0(UreAcW6
> aA~
> zs6>c8S{L5w+9(uc8WZTt81pg~DiLCje$Usj*rC6=-+wXTy<Zl)g1Rv@ZGx|7tu(Uj
> zf;JN<7R;*DjhTwCXRS1{ZQD$iKwmJcQa5HQzMi$x*zd`Cyf6;t#r*c8zB(HjQkm~
> <
> zHT``+Y8l%uXfq+xq|ZuQW8`JNlQgMiY`dV%giMn@D{YODm-$Z8q-
> 5;ZG8VKUY^EMU
> z=>lW(Wa+!jda8F{k1X89it$R8^?Pb8eV;EA;8S}sn~y>yLoTyOut$Hl8jIP=*~For
> zy>EFTk|CE_B-kU}r_K1HF|JM(Yh=h5S-<BO2ly!6uFe`CDSXP__xY)@eVk-
> hXN@0g
> zU5M!WyfCaQp>}oFct!QY*mR#!zJ5eGw*5tRxw^e`zo*7hALSQ!mc4^|6LyhJI(
> 61-
> z9Fa}*d$M{D=~Yr^y~g*v8K+h6A-
> ziKtk>xGY(M4PQk~Ujovti(VoUYNXwBY*Mtcc{
> zWM%7-m4B~XuGH`OGBUf!!hBu?-hMFet>@*t?^B~F%qa%O$c!-
> |B6%<*Saz_UjqLl>
> zSPFBB;W08}Oo&Jx3<;JUtY;%H?32w<n~as{qe>w%LYQYYDMr@ssd?C`aj={=X
> J~yk
> zJ&UBzrn67qgtbze>~bY`VbfV5V>X=?BArKnx0(m%#8FxwXBf;z(wIfk$0q0tW{<
> v4
> zjfF$!D6Nn4EreW7U=vIaW{)4T&q6bH2G+>C6r}q-
> ?F3}B^DRuY9%7e8BUwQ@5_t4?
> zt9kT&zC0hkDl$7JhL9B!UJ5^dFg=((e#pCJdE1(8hDLj9E5=Bwv|g;WIS&D{dL>2{
> znqe<Y$ix^)mDaqqHs>Kg#)9-
> wjFE+AY&t7YlRl=C^>?dza0MKt^_^zuG8mFETY-|1
> z&Pc1-
> _o=aPP8_B6ag<pCBQ3KPs2O>T^kUXp&$p3TGwjJmTFo!^dEwpGE7|Vr#(vKS
> zqvjj2L4BVZOJPp-
> jn$v1jkKC}OZCXUPtEFAwog8;jPY^R$7J7MR>=BToviY1t*AAg
> zw2v4XGZvZ=Vk>0ER62ELs?JBTh@dfJOmGEKTPmG8Q(5DrSOn0RF(w%O+>}b
> E&RqAs
> zmtx_kF=I@4FaLohl}?=>2)}bvEZj6^j0x}5KQg4!sq-V{v!7z&r7>enIE#PCQ|Zk4
> z3-YD^Ug`I|-
> 30nRZ@03v;l9swJhyZ9eco<mX~TV=>3DAE?EAdk%F>4WKGX5s&e`{Q
> tyOpI4_kE`0xt+7`^L8ss8}9o|$8$Sp-{<XCmNwk?nU3dn&R@+w{|B-4s8Ij_
> 
> literal 0
> HcmV?d00001
> 
> diff --git
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.c
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.c
> new file mode 100644
> index 000000000..15efd6677
> --- /dev/null
> +++
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.c
> @@ -0,0 +1,520 @@
> +/** @file
> +  Platform Initialization Driver.
> +
> +  Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD
> License
> +  which accompanies this distribution.  The full text of the license may be
> found at
> +  http://opensource.org/licenses/bsd-license.php.
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +
> +#include <IndustryStandard/Bmp.h>
> +#include <PiDxe.h>
> +#include <Protocol/SimpleTextOut.h>
> +#include <Protocol/OEMBadging.h>
> +#include <Protocol/GraphicsOutput.h>
> +#include <Protocol/UgaDraw.h>
> +#include <Library/BaseLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/DxeServicesLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/DebugLib.h>
> +
> +#include "Logo.h"
> +
> +
> +/**
> +  Convert a *.BMP graphics image to a GOP blt buffer. If a NULL Blt buffer
> +  is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt
> +  buffer is passed in it will be used if it is big enough.
> +
> +  @param  BmpImage      Pointer to BMP file
> +  @param  BmpImageSize  Number of bytes in BmpImage
> +  @param  GopBlt        Buffer containing GOP version of BmpImage.
> +  @param  GopBltSize    Size of GopBlt in bytes.
> +  @param  PixelHeight   Height of GopBlt/BmpImage in pixels
> +  @param  PixelWidth    Width of GopBlt/BmpImage in pixels
> +
> +  @retval EFI_SUCCESS           GopBlt and GopBltSize are returned.
> +  @retval EFI_UNSUPPORTED       BmpImage is not a valid *.BMP image
> +  @retval EFI_BUFFER_TOO_SMALL  The passed in GopBlt buffer is not big
> enough.
> +                                    GopBltSize will contain the required size.
> +  @retval EFI_OUT_OF_RESOURCES  No enough buffer to allocate.
> +
> +**/
> +EFI_STATUS
> +EfiShellConvertBmpToGopBlt (
> +  IN     VOID      *BmpImage,
> +  IN     UINTN     BmpImageSize,
> +  IN OUT VOID      **GopBlt,
> +  IN OUT UINTN     *GopBltSize,
> +  OUT UINTN     *PixelHeight,
> +  OUT UINTN     *PixelWidth
> +  )
> +{
> +  UINT8                         *Image;
> +  UINT8                         *ImageHeader;
> +  BMP_IMAGE_HEADER              *BmpHeader;
> +  BMP_COLOR_MAP                 *BmpColorMap;
> +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;
> +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
> +  UINT64                        BltBufferSize;
> +  UINTN                         Index;
> +  UINTN                         Height;
> +  UINTN                         Width;
> +  UINTN                         ImageIndex;
> +  UINT32                        DataSizePerLine;
> +  BOOLEAN                       IsAllocated;
> +  UINT32                        ColorMapNum;
> +
> +  if (sizeof (BMP_IMAGE_HEADER) > BmpImageSize) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +BmpHeader = (BMP_IMAGE_HEADER *) BmpImage;
> +
> +if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') {
> +  return EFI_UNSUPPORTED;
> +}
> +
> +//
> +// Doesn't support compress.
> +//
> +if (BmpHeader->CompressionType != 0) {
> +  return EFI_UNSUPPORTED;
> +}
> +
> +//
> +// Only support BITMAPINFOHEADER format.
> +// BITMAPFILEHEADER + BITMAPINFOHEADER = BMP_IMAGE_HEADER
> +//
> +if (BmpHeader->HeaderSize != sizeof (BMP_IMAGE_HEADER) -
> OFFSET_OF(BMP_IMAGE_HEADER, HeaderSize)) {
> +  return EFI_UNSUPPORTED;
> +}
> +
> +//
> +// The data size in each line must be 4 byte alignment.
> +//
> +DataSizePerLine = ((BmpHeader->PixelWidth * BmpHeader->BitPerPixel +
> 31) >> 3) & (~0x3);
> +BltBufferSize = MultU64x32 (DataSizePerLine, BmpHeader->PixelHeight);
> +if (BltBufferSize > (UINT32) ~0) {
> +  return EFI_INVALID_PARAMETER;
> +}
> +
> +if ((BmpHeader->Size != BmpImageSize) ||
> +    (BmpHeader->Size < BmpHeader->ImageOffset) ||
> +    (BmpHeader->Size - BmpHeader->ImageOffset !=	BmpHeader-
> >PixelHeight * DataSizePerLine)) {
> +  return EFI_INVALID_PARAMETER;
> +}
> +
> +//
> +// Calculate Color Map offset in the image.
> +//
> +Image       = BmpImage;
> +BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof
> (BMP_IMAGE_HEADER));
> +if (BmpHeader->ImageOffset < sizeof (BMP_IMAGE_HEADER)) {
> +  return EFI_INVALID_PARAMETER;
> +}
> +
> +if (BmpHeader->ImageOffset > sizeof (BMP_IMAGE_HEADER)) {
> +  switch (BmpHeader->BitPerPixel) {
> +    case 1:
> +      ColorMapNum = 2;
> +      break;
> +    case 4:
> +      ColorMapNum = 16;
> +      break;
> +    case 8:
> +      ColorMapNum = 256;
> +      break;
> +    default:
> +      ColorMapNum = 0;
> +      break;
> +    }
> +  //
> +  // BMP file may has padding data between the bmp header section and
> the bmp data section.
> +  //
> +  if (BmpHeader->ImageOffset - sizeof (BMP_IMAGE_HEADER) < sizeof
> (BMP_COLOR_MAP) * ColorMapNum) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> + }
> +
> + //
> + // Calculate graphics image data address in the image
> + //
> + Image         = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;
> + ImageHeader   = Image;
> +
> + //
> + // Calculate the BltBuffer needed size.
> + //
> + BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth,
> BmpHeader->PixelHeight);
> + //
> + // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> doesn't overflow
> + //
> + if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
> +   return EFI_UNSUPPORTED;
> + }
> + BltBufferSize = MultU64x32 (BltBufferSize, sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
> +
> + IsAllocated   = FALSE;
> + if (*GopBlt == NULL) {
> +   //
> +   // GopBlt is not allocated by caller.
> +   //
> +   *GopBltSize = (UINTN) BltBufferSize;
> +   *GopBlt     = AllocatePool (*GopBltSize);
> +   IsAllocated = TRUE;
> +   if (*GopBlt == NULL) {
> +     return EFI_OUT_OF_RESOURCES;
> +   }
> + } else {
> +   //
> +   // GopBlt has been allocated by caller.
> +   //
> +   if (*GopBltSize < (UINTN) BltBufferSize) {
> +     *GopBltSize = (UINTN) BltBufferSize;
> +     return EFI_BUFFER_TOO_SMALL;
> +   }
> + }
> +
> + *PixelWidth	= BmpHeader->PixelWidth;
> + *PixelHeight	= BmpHeader->PixelHeight;
> +
> + //
> + // Convert image from BMP to Blt buffer format
> + //
> + BltBuffer = *GopBlt;
> + for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {
> +   Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader-
> >PixelWidth];
> +   for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++,
> Blt++) {
> +     switch (BmpHeader->BitPerPixel) {
> +     case 1:
> +       //
> +       // Convert 1-bit (2 colors) BMP to 24-bit color
> +       //
> +       for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++)
> {
> +         Blt->Red	  = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red;
> +         Blt->Green  = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green;
> +         Blt->Blue   = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue;
> +         Blt++;
> +         Width++;
> +       }
> +
> +       Blt--;
> +       Width--;
> +       break;
> +
> +     case 4:
> +       //
> +       // Convert 4-bit (16 colors) BMP Palette to 24-bit color
> +       //
> +       Index       = (*Image) >> 4;
> +       Blt->Red    = BmpColorMap[Index].Red;
> +       Blt->Green  = BmpColorMap[Index].Green;
> +       Blt->Blue   = BmpColorMap[Index].Blue;
> +       if (Width < (BmpHeader->PixelWidth - 1)) {
> +         Blt++;
> +         Width++;
> +         Index       = (*Image) & 0x0f;
> +         Blt->Red    = BmpColorMap[Index].Red;
> +         Blt->Green  = BmpColorMap[Index].Green;
> +         Blt->Blue   = BmpColorMap[Index].Blue;
> +       }
> +       break;
> +
> +     case 8:
> +       //
> +       // Convert 8-bit (256 colors) BMP Palette to 24-bit color
> +       //
> +       Blt->Red    = BmpColorMap[*Image].Red;
> +       Blt->Green  = BmpColorMap[*Image].Green;
> +       Blt->Blue   = BmpColorMap[*Image].Blue;
> +       break;
> +
> +     case 24:
> +       //
> +       // It is 24-bit BMP.
> +       //
> +       Blt->Blue   = *Image++;
> +       Blt->Green  = *Image++;
> +       Blt->Red    = *Image;
> +       break;
> +
> +     default:
> +       //
> +       // Other bit format BMP is not supported.
> +       //
> +       if (IsAllocated) {
> +         FreePool (*GopBlt);
> +         *GopBlt = NULL;
> +        }
> +        return EFI_UNSUPPORTED;
> +      };
> +
> +    }
> +
> +    ImageIndex = (UINTN)Image - (UINTN)ImageHeader;
> +    if ((ImageIndex % 4) != 0) {
> +      //
> +      // Bmp Image starts each row on a 32-bit boundary!
> +      //
> +      Image = Image + (4 - (ImageIndex % 4));
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +EFIAPI
> +WelcomeLineDisplay (
> +  IN CHAR16 * WelcomeLine
> +  )
> +{
> +  UINTN Length;
> +  UINTN Line;
> +  UINTN Columns;
> +  UINTN Rows;
> +  UINTN Column;
> +  EFI_STATUS Status;
> +  EFI_SIMPLE_TEXT_OUTPUT_MODE SavedConMode;
> +
> +  Length = StrLen(WelcomeLine);
> +  Line = 1;
> +  CopyMem(&SavedConMode, gST->ConOut->Mode, sizeof
> (SavedConMode));
> +  gST->ConOut->QueryMode(gST->ConOut, SavedConMode.Mode,
> &Columns, &Rows);
> +  Column = (Columns-Length)/2;
> +  gST->ConOut->SetAttribute(gST->ConOut, EFI_YELLOW);
> +  gST->ConOut->SetCursorPosition(gST->ConOut, Column,
> SavedConMode.CursorRow);
> +  gST->ConOut->OutputString(gST->ConOut, WelcomeLine);
> +  gST->ConOut->EnableCursor      (gST->ConOut,
> SavedConMode.CursorVisible);
> +  gST->ConOut->SetCursorPosition (gST->ConOut,
> SavedConMode.CursorColumn, (SavedConMode.CursorRow+1));
> +  Status = gST->ConOut->SetAttribute     (gST->ConOut,
> SavedConMode.Attribute);
> +  return Status;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +LogoDisplay (
> +  IN  EFI_GUID  *LogoFile
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  UINT32                        SizeOfX;
> +  UINT32                        SizeOfY;
> +  INTN                          DestX;
> +  INTN                          DestY;
> +  UINT8                         *ImageData;
> +  UINTN                         ImageSize;
> +  UINTN                         BltSize;
> +  EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;
> +  UINTN                         CoordinateX;
> +  UINTN                         CoordinateY;
> +  UINTN                         Height;
> +  UINTN                         Width;
> +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
> +  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;
> +  UINT32                        ColorDepth;
> +  UINT32                        RefreshRate;
> +  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;
> +  UINTN                         LogoDestX;
> +  UINTN                         LogoDestY;
> +  UINTN                         LogoHeight;
> +  UINTN                         LogoWidth;
> +
> +  UgaDraw = NULL;
> +  //
> +  // Try to open GOP first
> +  //
> +  Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL,
> (VOID **) &GraphicsOutput);
> +  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {
> +    GraphicsOutput = NULL;
> +    //
> +    // Open GOP failed, try to open UGA
> +    //
> +    Status = gBS->HandleProtocol (gST->ConsoleOutHandle,
> &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);
> +  }
> +  if (EFI_ERROR (Status)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  //
> +  // Try to open Boot Logo Protocol.
> +  //
> +
> +  if (GraphicsOutput != NULL) {
> +    SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
> +    SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;
> +
> +  } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport))
> {
> +    Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY,
> &ColorDepth, &RefreshRate);
> +    if (EFI_ERROR (Status)) {
> +      return EFI_UNSUPPORTED;
> +    }
> +  } else {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  Blt = NULL;
> +  LogoDestX = 0;
> +  LogoDestY = 0;
> +  LogoHeight = 0;
> +  LogoWidth = 0;
> +
> +  ImageData = NULL;
> +  ImageSize = 0;
> +
> +  //
> +  // Get the specified image from FV.
> +  //
> +  Status = GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **)
> &ImageData, &ImageSize);
> +  if (EFI_ERROR (Status)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  CoordinateX = 0;
> +  CoordinateY = 0;
> +  Attribute   = EfiBadgingDisplayAttributeRightTop;
> +
> +  if (Blt != NULL) {
> +    FreePool (Blt);
> +  }
> +
> +  //
> +  // Try BMP decoder
> +  //
> +  Blt = NULL;
> +  Status = EfiShellConvertBmpToGopBlt (
> +             ImageData,
> +             ImageSize,
> +             (VOID **) &Blt,
> +             &BltSize,
> +             &Height,
> +             &Width
> +             );
> +
> +  if (EFI_ERROR (Status)) {
> +    FreePool (ImageData);
> +  }
> +
> +  //
> +  // Calculate the display position according to Attribute.
> +  //
> +  switch (Attribute) {
> +    case EfiBadgingDisplayAttributeLeftTop:
> +      DestX = CoordinateX;
> +      DestY = CoordinateY;
> +      break;
> +
> +    case EfiBadgingDisplayAttributeCenterTop:
> +      DestX = (SizeOfX - Width) / 2;
> +      DestY = CoordinateY;
> +      break;
> +
> +    case EfiBadgingDisplayAttributeRightTop:
> +      DestX = (SizeOfX - Width - CoordinateX);
> +      DestY = CoordinateY;;
> +      break;
> +
> +    case EfiBadgingDisplayAttributeCenterRight:
> +      DestX = (SizeOfX - Width - CoordinateX);
> +      DestY = (SizeOfY - Height) / 2;
> +      break;
> +
> +    case EfiBadgingDisplayAttributeRightBottom:
> +      DestX = (SizeOfX - Width - CoordinateX);
> +      DestY = (SizeOfY - Height - CoordinateY);
> +      break;
> +
> +    case EfiBadgingDisplayAttributeCenterBottom:
> +      DestX = (SizeOfX - Width) / 2;
> +      DestY = (SizeOfY - Height - CoordinateY);
> +      break;
> +
> +    case EfiBadgingDisplayAttributeLeftBottom:
> +      DestX = CoordinateX;
> +      DestY = (SizeOfY - Height - CoordinateY);
> +      break;
> +
> +    case EfiBadgingDisplayAttributeCenterLeft:
> +      DestX = CoordinateX;
> +      DestY = (SizeOfY - Height) / 2;
> +      break;
> +
> +    case EfiBadgingDisplayAttributeCenter:
> +      DestX = (SizeOfX - Width) / 2;
> +      DestY = (SizeOfY - Height) / 2;
> +      break;
> +
> +    default:
> +      DestX = CoordinateX;
> +      DestY = CoordinateY;
> +      break;
> +    }
> +
> +  if ((DestX >= 0) && (DestY >= 0)) {
> +    if (GraphicsOutput != NULL) {
> +      Status = GraphicsOutput->Blt (
> +                                 GraphicsOutput,
> +                                 Blt,
> +                                 EfiBltBufferToVideo,
> +                                 0,
> +                                 0,
> +                                 (UINTN) DestX,
> +                                 (UINTN) DestY,
> +                                 Width,
> +                                 Height,
> +                                 Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> +                                 );
> +    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport))
> {
> +      Status = UgaDraw->Blt (
> +                          UgaDraw,
> +                          (EFI_UGA_PIXEL *) Blt,
> +                          EfiUgaBltBufferToVideo,
> +                          0,
> +                          0,
> +                          (UINTN) DestX,
> +                          (UINTN) DestY,
> +                          Width,
> +                          Height,
> +                          Width * sizeof (EFI_UGA_PIXEL)
> +                          );
> +    } else {
> +      Status = EFI_UNSUPPORTED;
> +    }
> +
> +   }
> +
> +   FreePool (ImageData);
> +
> +   FreePool (Blt);
> +
> +   return Status;
> + }
> +
> +
> +VOID
> +EFIAPI
> +EfiShellProtocolCallback (
> +  IN EFI_EVENT Event,
> +  IN VOID *Context
> +)
> +{
> +  CHAR16 *Welcome;
> +  Welcome = L"Welcome to https://minnowboard.org/setup";
> +  WelcomeLineDisplay(Welcome);
> +  LogoDisplay(PcdGetPtr (PcdLogoFileGuid));
> +  return;
> +}
> +
> diff --git
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.h
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.h
> new file mode 100644
> index 000000000..62cb1e588
> --- /dev/null
> +++
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Log
> o.h
> @@ -0,0 +1,27 @@
> +/** @file
> +  Driver configuration include file.
> +
> +  Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD
> License
> +  which accompanies this distribution.  The full text of the license may be
> found at
> +  http://opensource.org/licenses/bsd-license.php.
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef _LOGO_H
> +#define _LOGO_H
> +
> +VOID
> +EFIAPI
> +EfiShellProtocolCallback (
> +  IN EFI_EVENT Event,
> +  IN VOID *Context
> +);
> +
> +#endif // #ifndef _CONFIGURATION_H
> +
> diff --git
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> orm.c
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> orm.c
> index a6d251ded..87268e8fd 100644
> ---
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> orm.c
> +++
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> orm.c
> @@ -15,6 +15,7 @@
> 
>  #include "PlatformDxe.h"
>  #include "Platform.h"
> +#include "Logo.h"
> 
>  #include <Library/S3BootScriptLib.h>
>  #include <Library/PciLib.h>
> @@ -254,7 +255,6 @@ EnableAcpiCallback (
>    IoWrite16 (AcpiBaseAddr + R_ACPI_PM1_CNT, Pm1Cnt);
>  }
> 
> -
>  VOID
>  PlatformScInitBeforeBoot (
>    VOID
> @@ -699,6 +699,8 @@ InitializePlatform (
>    EFI_HOB_GUID_TYPE                   *FdoEnabledGuidHob = NULL;
>    EFI_PLATFORM_INFO_HOB               *PlatformInfoHob;
>    EFI_PEI_HOB_POINTERS                Hob;
> +  EFI_EVENT                           EfiShellEvent = NULL;
> +  VOID                                *mEfiShellProtocolRegistration;
> 
>    mImageHandle = ImageHandle;
> 
> @@ -900,6 +902,23 @@ InitializePlatform (
> 
>    OverrideSdCardPresence();
> 
> +  //
> +  //QR code showing under EFI Shell
> +  //
> +  if (PcdGetBool(PcdLogoDisplay)) {
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  EfiShellProtocolCallback,
> +                  NULL,
> +                  &EfiShellEvent
> +                  );
> +  Status = gBS->RegisterProtocolNotify (
> +                  &gEfiShellProtocolGuid,
> +                  EfiShellEvent,
> +                  &mEfiShellProtocolRegistration
> +                  );
> +  }
>    return EFI_SUCCESS;
>  }
> 
> diff --git
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> ormDxe.inf
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> ormDxe.inf
> index ee8fd5a68..b98d32c73 100644
> ---
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> ormDxe.inf
> +++
> Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformDxe/Platf
> ormDxe.inf
> @@ -34,6 +34,7 @@
>    IchTcoReset.c
>    SensorVar.c
>    Rtc.c
> +  Logo.c
> 
>  [Packages]
>    MdePkg/MdePkg.dec
> @@ -66,6 +67,7 @@
>    DxeSaPolicyLib
>    ConfigBlockLib
>    GpioLib
> +  DxeServicesLib
> 
>  [Guids]
>    gEfiBiosIdGuid
> @@ -116,6 +118,9 @@
>    gDxePlatformTdtPolicyGuid
>    gDxePlatformSeCPolicyGuid
>    gEfiSeCOperationProtocolGuid
> +  gEfiUgaDrawProtocolGuid
> +  gEfiUgaDrawProtocolGuid |PcdUgaConsumeSupport
> +  gEfiShellProtocolGuid
> 
>  [Pcd]
>    gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
> @@ -127,6 +132,11 @@
>    gPlatformModuleTokenSpaceGuid.PcdPBTNDisableInterval
>    gEfiMdeModulePkgTokenSpaceGuid.PcdFastPS2Detection
>    gEfiBxtTokenSpaceGuid.PcdP2SBBaseAddress
> +  gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid
> +  gPlatformModuleTokenSpaceGuid.PcdLogoDisplay
> +
> +[FeaturePcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
> 
>  [Depex]
>    gEfiPciRootBridgeIoProtocolGuid     AND
> diff --git Platform/BroxtonPlatformPkg/PlatformPkg.dec
> Platform/BroxtonPlatformPkg/PlatformPkg.dec
> index f37ceafe3..52c05d976 100644
> --- Platform/BroxtonPlatformPkg/PlatformPkg.dec
> +++ Platform/BroxtonPlatformPkg/PlatformPkg.dec
> @@ -184,6 +184,8 @@
>    gPlatformModuleTokenSpaceGuid.PcdBoardVbtFileGuid|{ 0x00, 0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00 }|VOID*|0x80000014
>    ## This PCD used to enable or disable SueCreek
> 
> gPlatformModuleTokenSpaceGuid.PcdSueCreek|FALSE|BOOLEAN|0x800000
> 15
> +  ## This PCD used for QR code display under EFI Shell
> +
> gPlatformModuleTokenSpaceGuid.PcdLogoDisplay|FALSE|BOOLEAN|0x8000
> 0016
> 
>    ## MemoryCheck value for checking memory before boot OS.
>    ## To save the boot performance, the default MemoryCheck is set to 0.
> @@ -319,6 +321,7 @@
> 
> gPlatformModuleTokenSpaceGuid.PcdTemporaryRamSize|0x2000|UINT32|0
> x10001002
>      # @Prompt Stack size in the temporary RAM.
> 
> gPlatformModuleTokenSpaceGuid.PcdPeiTemporaryRamStackSize|0|UINT3
> 2|0x10001003
> +  gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid|{0x1b, 0x9a, 0x3d,
> 0x71, 0x49, 0x88, 0x47, 0xc5, 0xb7, 0x2a, 0xb0, 0x7d, 0xc5, 0x10, 0x60,
> 0xc4 }|VOID*|0x10001004
> 
>  [PcdsFixedAtBuild]
>    ## Specifies maximum number of PPIs provided by SecCore.
> diff --git Platform/BroxtonPlatformPkg/PlatformPkg.fdf
> Platform/BroxtonPlatformPkg/PlatformPkg.fdf
> index 1c1eb475f..32c389268 100644
> --- Platform/BroxtonPlatformPkg/PlatformPkg.fdf
> +++ Platform/BroxtonPlatformPkg/PlatformPkg.fdf
> @@ -582,6 +582,9 @@ APRIORI DXE {
>    FILE FREEFORM =
> PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
>    SECTION RAW =
> $(PLATFORM_PACKAGE_COMMON)/Binaries/Logo/Logo.bmp
>  }
> +  FILE FREEFORM = PCD(gPlatformModuleTokenSpaceGuid.PcdLogoFileGuid)
> {
> +  SECTION RAW =
> $(PLATFORM_NAME)/Board/MinnowBoard3/Logo/MinnowBoardLogo.bmp
> +}
> 
>    INF $(PLATFORM_PACKAGE_COMMON)/PnpDxe/PnpDxe.inf
>    INF
> $(PLATFORM_PACKAGE_COMMON)/PlatformSettings/PlatformGpio/Platfor
> mGpio.inf
> --
> 2.14.1.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel