UEFI--03.ReadCmos
1.cmos.c
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/IoLib.h>
#define CMOS_INDEX 0x70
#define CMOS_DATA 0x71
INTN
EFIAPI
ShellAppMain (
IN UINTN Argc,
IN CHAR16 **Argv
)
{
UINT8 Value = 0;
UINT8 Index = 0xFF;
while (Index) {
IoWrite8 (CMOS_INDEX, 0xFF - Index);
Value = IoRead8 (CMOS_DATA);
Print (L"%02x ", Value);
if ((0xFF - Index + 1) % 0x10 == 0)
Print (L"\n");
Index--;
}
IoWrite8 (CMOS_INDEX, 0xFF);
Print (L"%02x\n", IoRead8 (CMOS_DATA));
return EFI_SUCCESS;
}
2.cmos.inf
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = 02_cmos
FILE_GUID = dc72d2c7-a48a-42fd-80b6-9d234d9017c8
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = ShellCEntryLib #不同于HelloWorld,入口函数变了
[Sources]
cmos.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
UefiLib
ShellCEntryLib
IoLib
3.EDK2包路径修改
3.1 新建工程文件
新建或者拷贝,同HelloWorld
MdeModulePkg\Application
3.2 EDK2包路径修改
修改MdeModulePkg\MdeModule.dsc文件
在Components加入cmos.inf的路径:MdeModulePkg/cmos/cmos.inf
PS:可以不用修改EmulatorPkg\EmulatorPkg.dsc文件,不用在里面添加cmos.inf的路径,会在edk2\Build下生成MdeModule文件夹,里面会生成02_cmos.efi文件
原因:生成的cmos.efi文件在模拟器Winhost.exe里运行会闪退,应该是因为模拟器的问题,无法读取实际机器的CMOS(RTC)的值,需要拷贝cmos.efi到实际机器上面去运行读取
要修改EmulatorPkg\EmulatorPkg.dsc的话需要加cmos.inf的路径在components,build完会报错,需要加上Libraryclasses
这些库可以在edk2\ShellPkg\ShellPkg.dsc里面找
4.编译运行
输入 edksteup.bat rebuild,编译后输入build即可,build完会在edk2\Build\MdeModule\DEBUG_VS2019\X64下生成02_cmos.efi
拷贝efi文件到实际机器上运行即可