HII 对大部分工程师可能比较陌生,因为是纯软件的概念。
先解释一下package 是什么
HII 数据库协议 是以包列表(package list) 为单位管理HII相关的数据结构。
目前支持的包类型有:
//
// A package list can contain only one or less than one device path package.
// This rule also applies to image package since ImageId can not be duplicate.
//
typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE {
EFI_HII_PACKAGE_LIST_HEADER PackageListHdr;
LIST_ENTRY GuidPkgHdr;
LIST_ENTRY FormPkgHdr;
LIST_ENTRY KeyboardLayoutHdr;
LIST_ENTRY StringPkgHdr;
LIST_ENTRY FontPkgHdr;
HII_IMAGE_PACKAGE_INSTANCE *ImagePkg;
LIST_ENTRY SimpleFontPkgHdr;
UINT8 *DevicePathPkg;
} HII_DATABASE_PACKAGE_LIST_INSTANCE;
说人话就是 字体包,简单字体包 ,字符串包, 映像包, 设备路径包, 键盘布局包,表格包。
hii package list 是build time 产生的数据,里面包含formset 的声明(IFR),通过InstallPackageList
可以将driver 制作的formset 安装的hii database
然后就可以使用sendform 这个函数去画出某个formset.
如果要更新数据库就要使用
Status = mHiiDb->RemovePackageList ( mHiiDb, mHiiHandle );
Status = mHiiDb->NewPackageList ( mHiiDb, NewPackageList, mHiiDriverHandle, &mHiiHandle );
他们必须成对出现。
安装的时候,会触发callback 函数。
所有callback 函数都是由第一个图中的RegisterPackageNotify去注册的。
任何driver 都可以通过调用RegisterPackageNofity去安装callback. 至此,这个协议中的三个关键函数就关联起来了。