自己组装过游戏主机的应该都有看到过,进入BIOS设置,酷炫的界面便呈现在眼前,而很多BIOS,使用的还是标准的界面。现在有个趋势,phoenix和insyde也在慢慢朝这种GUI界面发展,而AMI的使用C++编写的界面已经非常完善,之前一直想自己动手试试,现在刚好成行。
先拿LVGL动手,其实我一直想拿GUILite开刀,所以后面如果有这方面的更新,基本就是GUILite了,LVGL只是移植而已,移植完就不打算深入研究下去了。(LVGL开源的,并且可以免费商用,貌似只要你给开源做点贡献就行,哪怕写写移植文档)
爱影博客 - UEFI开发学习8 – LVGL GUI库的移植
可以看看这篇文章,这篇文章讲了很多,这篇文章讲的很好,只是最后讲的输入设备有点出入,让人有些难以理解,在移植的过程中,我直接使用LVGL8.2的版本进行了移植。
移植过程中,主要遇到的就是导入StdLib遇到的编译问题以及导入LVGL遇到的编译问题,这些问题已经全部解决,我使用的是OvmfPkg,在Linux环境下使用GCC/X64进行编译,编译完成后在Windows下通过Qemu模拟器运行。
关于编译的问题,我会将代码暂时通过网盘上传,基础代码是我的仓库里面的代码,对上述两套代码进行比较即可,还是更改了比较多的内容的(OvmfPkg里面导入了Redfish的内容,不用管,别打开定义就行,不然不开机,可能redfish代码不能通过Ovmf运行)。
输入设备前的内容我就不重复造轮子了,代码以及APP也有了,有编译环境的可以下载自己尝试一下。首先我们先实现界面的内容:
这里serial打开,代码中DEBUG_ON_SERIAL_PORT是要打开的,进入fs0,打开LvglTest.efi
可以看到界面:
这个界面的代码在Lvgl8.2代码的demos下的keypad_encoder,我直接给他放进C文件中了,LVGL的移植没问题,编译是能通过的,但是按键输入没反应,如果按键没反应,这界面就少了很多乐趣,经过我的研究,发现这个键盘输入还需要初始化才行。
GitHub - lvgl/lv_drivers at dev这里面的indev下面有个keyboad.C和H文件,都拿出来,放到src/indev下面,keyboard.c文件里面的keyboard_init函数本来是个空的,我加入了一些代码:
bool keyboard_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
void keyboard_init(void)
{
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /*Basic initialization*/
indev_drv.type =LV_INDEV_TYPE_KEYPAD ; /*See below.*/
indev_drv.read_cb =keyboard_read;
lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv);
}
其他的函数与爱影博客描述的一样不变,这个代码是我在文档中找到的:
Input device interface(输入设备接口) — 百问网LVGL中文教程文档 文档
他是这么说的:
最后我将这个keyboard_init函数在App的C文件中进行调用,便完美的实现了键盘的输入问题:
可以看到,界面已经与前面的不同了,因为已经可以正常操作界面了,移植LVGL,界面元素能正常使用,输入也能正常输入,基本上问题不大了,当然还有个鼠标,原理是一样的,看一参看文档手册。完成了上述的内容,咱们就可以写一些自己的界面程序了,比如更新BIOS,你可以设置一个酷炫界面,整个酷炫的进度条,完全是没问题的。
整体的代码:
链接:https://pan.baidu.com/s/1G6Ck342ns7w7RH9pp4qOTw
提取码:c79h