存档2022年4月25日

基于飞腾uefi ,添加protocol实战

本文主要基于飞腾提供的开放uefi,在源码中添加一个DXE 驱动,并安装protocol,可供其余接口进行下查询。

具体uefi原理可以自行百度。

代码实现:

1 在dsc dec fdf中添加相关文件路径与guid

在edk2-for-support/PhytiumPkg/PhytiumD2000Pkg/PhytiumD2000Pkg.dec文件的[Protocols]中添加guid

 gCsdnGoodProtocolGuid   = {0xf8dec080, 0x22a3, 0x4d51, {0x90, 0x1a, 0x81, 0x2a, 0xae, 0x79, 0x59, 0xf8}}

2 在PhytiumD2000Pkg.dsc与PhytiumD2000Pkg.fdf中分别添加自己写的DXE驱动路径

  $(PLATFORM_PACKAGE)/Drivers/CsdnDxe/CsdnDxe.inf

3 添加在PhytiumPkg/PhytiumD2000Pkg/Include/Protocol/文件中新建一个头文件CsdnGood.h

在头文件内部添加

#ifndef _CSDN_GOOD_
#define  _CSDN_GOOD_
#include
typedef struct _CSDN_GOOD_PROTOCOL  CSDN_GOOD_PROTOCOL;
extern EFI_GUID         gCsdnGoodProtocolGuid;
struct _CSDN_GOOD_PROTOCOL {
  UINT8             version;
  UINT8             number;
};
#endif
4 在对应Drivers文件夹下面添加一个CsdnDxe文件夹中添加inf文件与C文件

inf文件

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = CsdnDxe
  FILE_GUID                      = 4fcc8ea6-9b61-11ec-bea6-8bff64d45a7a
  MODULE_TYPE                    = DXE_DRIVER
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain
[Sources]
  CsdnDxe.c
[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec
  PhytiumPkg/PhytiumD2000Pkg/PhytiumD2000Pkg.dec
[LibraryClasses]
  BaseLib
  IoLib
  BaseMemoryLib
  UefiDriverEntryPoint
  UefiBootServicesTableLib
  UefiRuntimeServicesTableLib
  DebugLib
  MemoryAllocationLib
  DxeServicesLib
  ArmSmcLib
  ArmLib
  DevicePathLib
  UefiLib
[Pcd]
[FixedPcd]
[Guids]
[Protocols]
gCsdnGoodProtocolGuid
[Depex]
TRUE

C文件:

#include <Protocol/CsdnGood.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
    EFI_STATUS    Status;
    CSDN_GOOD_PROTOCOL  *mCsdnGoodProtocol;
    mCsdnGoodProtocol = AllocatePool (sizeof (CSDN_GOOD_PROTOCOL));
    DEBUG ((EFI_D_INFO, “ly_test_csdn \n));
    mCsdnGoodProtocol->version = 0;
    mCsdnGoodProtocol->number =1;
    Status = gBS->InstallProtocolInterface(
                &ImageHandle,
                &gCsdnGoodProtocolGuid,
                EFI_NATIVE_INTERFACE,
                &mCsdnGoodProtocol
                );
    ASSERT_EFI_ERROR (Status);
    DEBUG ((EFI_D_INFO, \
“ly_test_csdn mCsdnGoodProtocol->version:%d \n,mCsdnGoodProtocol->version));
    CSDN_GOOD_PROTOCOL *gCsdnGoodProtocol;
    Status = gBS->LocateProtocol (&gCsdnGoodProtocolGuid,
                                       NULL,
                             (VOID **) &gCsdnGoodProtocol);
    if (!EFI_ERROR (Status)){
         if(gCsdnGoodProtocol != NULL)
       {
        gCsdnGoodProtocol->version = 1;
       }
  }
 DEBUG ((EFI_D_INFO, \
“ly_test_csdn gCsdnGoodProtocol->version:%d \n,gCsdnGoodProtocol->version));
}
 
6 最终实现效果: