BIOS实战之读取文件--BMP图片显示

本节直接贴主要的代码:

#include "DisplayBmpTest.h"

EFI_STATUS
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
  EFI_STATUS                       Status;
  EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput = NULL;
  UINT8                            *DataBuffer;
  UINTN                           DataSize;
  EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Blt = NULL;
  UINTN                            BltSize;
  UINTN                            Height;
  UINTN                            Width;

  Status = gBS->LocateProtocol (
                  &gEfiGraphicsOutputProtocolGuid,
                  NULL,
                  (VOID **)&GraphicsOutput
                  );
  if (EFI_ERROR (Status)) {
    GraphicsOutput = NULL;
    Print (L"locate protocol gEfiGraphicsOutputProtocolGuid is error!\n");
    return Status;
  }

 Status = ReadFile (Argv[1], &DataBuffer, &DataSize);
  if (EFI_ERROR (Status)) {
    Print (L"Read bmp file to buffer is error!\n");
    return Status;
  }

  Status = TranslateBmpToGopBlt (
             (VOID *)DataBuffer,
             DataSize,
             &Blt,
             &BltSize,
             &Height,
             &Width
             );
  if (EFI_ERROR (Status)) {
    if (Blt != NULL) {
      FreePool (Blt);
    }
    Print (L"TranslateBmpToGopBlt is error!\n");
    return Status;
  }
  
  Status = GraphicsOutput->Blt (
                             GraphicsOutput,
                             Blt,
                             EfiBltBufferToVideo,
                             0,
                             0,
                             0x0,
                             0x0,
                             Width,
                             Height,
                             Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                             );
  if (EFI_ERROR (Status)) {
    Print (L"GraphicsOutput Blt is error!\n");
    return Status;
  }
  if (Blt != NULL)
    FreePool (Blt);

  Status = gST->ConOut->EnableCursor(gST->ConOut,TRUE);

  return Status;
}

运行后,我们就能读取自己想要显示的图片,并进行显示:

 这里存放了两个位置,一个根目录,一个自己创建的目录,都能正常显示,进行BIOS更新也是同样的道理,读取文件后,进行SPI FLASH的擦写,擦写要注意一点,最小擦写为4k,也就是0x1000。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值