dxe communication 之variable and pcd

dxe driver 之间也可以通过variable来通讯。
EFI_STATUS
ReadAndWriteVariable (
IN CHAR16
*Name,
IN EFI_GUID
*VendorGuid,
)
{
EFI_STATUS Status;
UINTN
BufferSize;
VOID
*Buffer;
Buffer = NULL;

BufferSize = 0;
Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize,
Buffer);

if (Status != EFI_BUFFER_TOO_SMALL) {
return Status;
}

Buffer = AllocateZeroPool (BufferSize);
ASSERT (Buffer != NULL);

Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize,
Buffer);
if (EFI_ERROR (Status)) {
BufferSize = 0;
}

Status = gRT->SetVariable (
Name,
VendorGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS |
EFI_VARIABLE_NON_VOLATILE,
BufferSize,
Buffer
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}
例如这段sample code中通过调用gRT->GetVariable 来得到variable ,通过gRT->SetVariable 来写variable。其中的第一个参数name就是要读或者要写的变量,每个变量和一个guid对应.
GetVariable和SetVariable也是在mdemodulepkg/core/dxe/dxemian中赋值的
EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {

  (EFI_GET_VARIABLE)                CoreEfiNotAvailableYetArg5,   // GetVariable
  (EFI_SET_VARIABLE)                CoreEfiNotAvailableYetArg5,   // SetVariable

};

dxe driver 之间也可以通过PCD 来通讯
例如  mLegacyModeMask      = PcdGet16 (Pcd8259LegacyModeMask);
这些PcdGetxx 都是在pcdlib.h 中定义,而Pcd8259LegacyModeMask 一般都是在dsc文件中定义好的,例如下面在这段定义了PcdFirmwareVendor = “ARM Versatile Express”
[PcdsFixedAtBuild.common]
  gArmPlatformTokenSpaceGuid.PcdFirmwareVendor|"ARM Versatile Express"
这样在c code中就可以通过下面的方式取得这个字符串
  if (FixedPcdGetPtr(PcdFirmwareVendor) != NULL)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值