From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from zg8tmty1ljiyny4xntqumjca.icoremail.net (zg8tmty1ljiyny4xntqumjca.icoremail.net [165.227.154.27]) by mx.groups.io with SMTP id smtpd.web10.1381.1610700556552220795 for ; Fri, 15 Jan 2021 00:49:17 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: phytium.com.cn, ip: 165.227.154.27, mailfrom: jialing@phytium.com.cn) Received: from localhost.localdomain (unknown [117.136.88.47]) by c1app12 (Coremail) with SMTP id DAINCgDHzpbFVgFgExlyBA--.39669S8; Fri, 15 Jan 2021 16:49:09 +0800 (CST) From: Ling Jia To: devel@edk2.groups.io Cc: Leif Lindholm , Ling , Peng Xie , Yiqi Shu Subject: [PATCH v1 06/10] Silicon/Phytium: Added Logo support to Phytium Silicon Date: Fri, 15 Jan 2021 08:47:58 +0000 Message-Id: <20210115084802.62196-7-jialing@phytium.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210115084802.62196-1-jialing@phytium.com.cn> References: <20210115084802.62196-1-jialing@phytium.com.cn> MIME-Version: 1.0 X-CM-TRANSID: DAINCgDHzpbFVgFgExlyBA--.39669S8 X-Coremail-Antispam: 1UD129KBjvAXoWfuFWrWry8Wry7Ar48Aw18Zrb_yoW8ZFy3Xo W7AF1Iq3y8Grn3A3WUWrnxGrWIqFsIva1aqw1IyFW7WF9Ivr15tF18X3W5XrWayFy7G3Wx WrWft347XFWIqw18n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUY_7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j6r 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26F4U JVW0owAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7V C0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j 6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE14v_GF yl42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWU JVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7V AKI48JMIIF0xvE2Ix0cI8IcVAFwI0_JFI_Gr1lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42 IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUeeHqDUUUU X-Originating-IP: [117.136.88.47] X-CM-SenderInfo: xmldzxdqj61x51wl3zoofrzhdfq/ Content-Transfer-Encoding: quoted-printable From: Ling The LogoLib and PhytiumLogo.bmp is used to supported the function of image display in the setup interface. Cc: Leif Lindholm Signed-off-by: Ling Jia Signed-off-by: Peng Xie Reviewed-by: Yiqi Shu --- Platform/Phytium/Durian/DurianPkg.dsc | 1 + Platform/Phytium/Durian/DurianPkg.fdf | 8 ++ Silicon/Phytium/Library/LogoLib/LogoLib.inf | 58 +++++++++ Silicon/Phytium/Library/LogoLib/Logo.c | 133 ++++++++++++++++++++ Silicon/Phytium/Logo/PhytiumLogo.bmp | Bin 0 -> 32454 bytes 5 files changed, 200 insertions(+) diff --git a/Platform/Phytium/Durian/DurianPkg.dsc b/Platform/Phytium/Duria= n/DurianPkg.dsc index 09c90d590347..5c40d9fb5dce 100644 --- a/Platform/Phytium/Durian/DurianPkg.dsc +++ b/Platform/Phytium/Durian/DurianPkg.dsc @@ -28,6 +28,7 @@ [Defines] [LibraryClasses.common]=0D # Phytium Platform library=0D ArmPlatformLib|Silicon/Phytium/Phytium2000-4/Library/PhytiumPlatformLib/= PhytiumPlatformLib.inf=0D + LogoLib|Silicon/Phytium/Library/LogoLib/LogoLib.inf=0D =0D TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf=0D =0D diff --git a/Platform/Phytium/Durian/DurianPkg.fdf b/Platform/Phytium/Duria= n/DurianPkg.fdf index d50b2116b99a..d39d1a660102 100644 --- a/Platform/Phytium/Durian/DurianPkg.fdf +++ b/Platform/Phytium/Durian/DurianPkg.fdf @@ -192,6 +192,14 @@ [FV.FvMain] INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf=0D INF MdeModulePkg/Application/UiApp/UiApp.inf=0D =0D + #=0D + # Logo=0D + #=0D + INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf=0D + FILE FREEFORM =3D PCD(gPhytiumPlatformTokenSpaceGuid.PcdLogoFile) {=0D + SECTION RAW =3D Silicon/Phytium/Logo/PhytiumLogo.bmp=0D + }=0D +=0D [FV.FVMAIN_COMPACT]=0D FvAlignment =3D 16=0D ERASE_POLARITY =3D 1=0D diff --git a/Silicon/Phytium/Library/LogoLib/LogoLib.inf b/Silicon/Phytium/= Library/LogoLib/LogoLib.inf new file mode 100644 index 000000000000..48311ff4e320 --- /dev/null +++ b/Silicon/Phytium/Library/LogoLib/LogoLib.inf @@ -0,0 +1,58 @@ +#/** @file=0D +# General BDS defines and produce general interfaces for platform BDS dri= ver including:=0D +# 1) BDS boot policy interface;=0D +# 2) BDS boot device connect interface;=0D +# 3) BDS Misc interfaces for mainting boot variable, ouput string, etc.=0D +#=0D +# Copyright (C) 2020, Phytium Technology Co, Ltd. All rights reserved.=0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +#=0D +#**/=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x00010019=0D + BASE_NAME =3D LogoLib=0D + FILE_GUID =3D e2a614da-40dc-11eb-a964-cfa221f53ad8= =0D + MODULE_TYPE =3D DXE_DRIVER=0D + VERSION_STRING =3D 1.0=0D + LIBRARY_CLASS =3D LogoLib|DXE_DRIVER UEFI_APPLICATION=0D +=0D +#=0D +# The following information is for reference only and not required by the = build tools.=0D +#=0D +# VALID_ARCHITECTURES =3D IA32 X64 IPF EBC=0D +#=0D +=0D +[Sources]=0D + Logo.c=0D +=0D +[Packages]=0D + MdePkg/MdePkg.dec=0D + MdeModulePkg/MdeModulePkg.dec=0D +=0D +[LibraryClasses]=0D + BaseLib=0D + UefiBootServicesTableLib=0D + MemoryAllocationLib=0D + UefiLib=0D + BaseMemoryLib=0D + DebugLib=0D + PrintLib=0D + PcdLib=0D + DxeServicesLib=0D + BmpSupportLib=0D +=0D +[Guids]=0D + gEfiConsoleOutDeviceGuid=0D +=0D +[Protocols]=0D + gEfiGraphicsOutputProtocolGuid # PROTOCOL SOMETIMES_CONSU= MES=0D + gEfiUgaDrawProtocolGuid |PcdUgaConsumeSupport # PROTOCOL SOMETIMES_CONSU= MES=0D + gEfiBootLogoProtocolGuid # PROTOCOL SOMETIMES_CONSU= MES=0D + gEfiUserManagerProtocolGuid # PROTOCOL CONSUMES=0D +=0D +[FeaturePcd]=0D + gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport=0D +=0D +[Pcd]=0D diff --git a/Silicon/Phytium/Library/LogoLib/Logo.c b/Silicon/Phytium/Libra= ry/LogoLib/Logo.c new file mode 100644 index 000000000000..c56c9c2671bf --- /dev/null +++ b/Silicon/Phytium/Library/LogoLib/Logo.c @@ -0,0 +1,133 @@ +/** @file=0D + Phytium Logo Library.=0D +=0D + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
= =0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +=0D +/**=0D + Enabled the quiet boot.=0D +=0D + @param[in] LogoFile The guid of logofile.=0D +=0D + @retval EFI_SUCCESS Fuction executed successfully.=0D + @retval EFI_UNSUPPORTED Protocol or logofile not found.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +EnableQuietBoot (=0D + IN EFI_GUID *LogoFile=0D + )=0D +{=0D + EFI_STATUS Status;=0D + UINT32 SizeOfX;=0D + UINT32 SizeOfY;=0D + UINTN ImageSize;=0D + UINTN BltSize;=0D + UINTN Height;=0D + UINTN Width;=0D + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt =3D NULL;=0D + UINT8 *ImageData =3D NULL;=0D + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;=0D +=0D + DEBUG((DEBUG_INFO, "EnableQuietBoot()\n"));=0D +=0D + Status =3D gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutp= utProtocolGuid, (VOID **) &GraphicsOutput);=0D + if (EFI_ERROR (Status)) {=0D + return EFI_UNSUPPORTED;=0D + }=0D +=0D + gST->ConOut->EnableCursor (gST->ConOut, FALSE);=0D + SizeOfX =3D GraphicsOutput->Mode->Info->HorizontalResolution;=0D + SizeOfY =3D GraphicsOutput->Mode->Info->VerticalResolution;=0D + DEBUG((DEBUG_INFO, "Gop:%lX %d x %d\n", (UINT64)(UINTN)GraphicsOutput, S= izeOfX, SizeOfY));=0D +=0D + Status =3D GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **) = &ImageData, &ImageSize);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG((DEBUG_INFO, "Logo File Not Found!\n"));=0D + Status =3D EFI_UNSUPPORTED;=0D + goto ProcExit;=0D + }=0D +=0D + Status =3D TranslateBmpToGopBlt (=0D + ImageData,=0D + ImageSize,=0D + &Blt,=0D + &BltSize,=0D + &Height,=0D + &Width=0D + );=0D + if (EFI_ERROR (Status)) {=0D + Status =3D EFI_UNSUPPORTED;=0D + goto ProcExit;=0D + }=0D +=0D + Status =3D GraphicsOutput->Blt (=0D + GraphicsOutput,=0D + Blt,=0D + EfiBltBufferToVideo,=0D + 0,=0D + 0,=0D + (UINTN) (SizeOfX - Width) / 2,=0D + (UINTN) (SizeOfY - Height) / 2,=0D + Width,=0D + Height,=0D + Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)=0D + );=0D +=0D + DEBUG((DEBUG_INFO, "Draw %d x %d: %r\n", Width, Height, Status));=0D +=0D +ProcExit:=0D + if(ImageData !=3D NULL){=0D + FreePool(ImageData);=0D + }=0D +=0D + if(Blt!=3DNULL){=0D + FreePool(Blt);=0D + }=0D +=0D + return Status;=0D +}=0D +=0D +=0D +/**=0D + Use SystemTable Conout to turn on video based Simple Text Out consoles. = The=0D + Simple Text Out screens will now be synced up with all non video output = devices=0D +=0D + @param[in] None.=0D +=0D + @retval EFI_SUCCESS UGA devices are back in text mode and synced up.= =0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +DisableQuietBoot (=0D + VOID=0D + )=0D +{=0D + //=0D + // Enable Cursor on Screen=0D + //=0D + gST->ConOut->EnableCursor (gST->ConOut, TRUE);=0D + return EFI_SUCCESS;=0D +}=0D diff --git a/Silicon/Phytium/Logo/PhytiumLogo.bmp b/Silicon/Phytium/Logo/Ph= ytiumLogo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c920dbe3bbba395cd2e6aa9b40= e849e6a8aa7b6 GIT binary patch literal 32454 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 literal 0 HcmV?d00001 --=20 2.25.1