本文主要基于飞腾提供的开放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));
}