EFI 在设计之初就考虑了多语言的支持,使用HII可以轻松的实现汉字的显示。本篇文章介绍获得汉字字形的其他方法,掌握这种方法之后可以在没有HII支持的情况下显示汉字。当然,程序只是为了演示原理,介绍如何读取16x16的汉字字形信息,没有转为图形。
比如:“宋”字查询到的区位码是4346 【参考3】[......]
标签: Shell
Step to UEFI (79) -----取得字形
我们可以通过EFI_HII_FONT_PROTOCOL【参考1】 中的 GetGlyph来取得一些字符的字形定义。
GetGlyph 的原型可以在 \MdePkg\Include\Protocol\HiiFont.h 中找到:
/** Convert the glyp[......]
Step to UEFI (78) -----SERIAL_IO_PROTOCOL
串口是非常有效和廉价的Debug手段,在开发中,几乎所有的UEFI 主板都会支持串口,本文介绍如何在Shell下面实现 串口通讯。
与之相关的是 EFI_SERIAL_IO_PROTOCOL,这个 Protocol 的定义可以在 UEFI Spec【参考1】中看到:
代码如下:[......]
Step to UEFI (77) -----改造 Stall和 MV
我们在 EDK2 的代码中能看到 Shell下部分命令的代码,这里介绍如何把这样的代码提取出来做成能够独立编译和运行的程序。简单起见,以 Stall 命令和 MV 命令为例。
经过试验,这些命令中使用到的大部分函数都可以在 ShellLib.h 中找到,我们要做的只是把这个文件copy一份到[......]
Step to UEFI (76) -----Dump ACPI DSDT
前面介绍了如何在 Shell下 Dump 系统中各种 ConfigurationTable的方法,这里介绍一下如何取得 ACPI 的 DSDT Table。
简单说一下原理:
1. 在ConfigurationTable中查找 GUID 为 ACPI_TABLE_GUID 和 EFI_ACP[......]
Step to UEFI (75) -----取得 ConfigurationTable
EFI_SYSTEM_TABLE 中定义了 EFI_CONFIGURATION_TABLE *ConfigurationTable;
这个结构体定义如下:
typedef struct{ EFI_GUID VendorGuid; VOID *VendorTable; } EF[......]
Step to UEFI (74) ----- 通过 OpenVolume访问FSx上的文件
题目有点绕口,简单的说目标就是:我打算用 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL 中的 OpenVolume 打开 FsX: 上面的文件怎么办?
实现的思路是:
1. 查找系统中所有支持 FS Protocol的Device
2. 对于每一个有 FS Proto[......]
Step to UEFI ----- TIPs
每次编译 Application 之后生成的 efi 文件都在
\Build\AppPkg\DEBUG_MYTOOLS\IA32\AppPkg\Applications\APPNAME\APPNAME 这样的目录中,每次需要手工 copy 到虚拟出来的目录下,这样比较麻烦。
经过研究[......]
Step to UEFI (72) ----- MP_Service_Protocol 获得CPU信息
UEFI本身不支持多线程,据说主要原因是:UEFI设计本身是为了启动硬件,做一些比较简单的事情,如果支持多线程会使得设计复杂度直线上升,出现问题也不容易调试。
不过UEFI本身是有对应的Protocol 的,称作 EFI_MP_SERVICES_PROTOCOL 。 具体的这个 Protocol[......]
Step to UEFI (71) ----- 获得 USB 设备的 PID 和 VID
一个问题:如何获得 Shell 下面所有 USB 设备的 PID 和 VID ?
首先在网上搜索一下,找到【参考1】,上面使用了 USBIO Protocol。
typedef struct _EFI_USB_IO_PROTOCOL { EFI_USB_IO_CONTROL_TRANS[......]