当前位置: 首页 > news >正文

用 LVGL 给 UEFI Setup 换一套图形界面:架构、实现与 QEMU 验证

一、为什么做这件事

用过 UEFI 固件设置界面的人都知道,UiApp里的 Setup 页面是典型的文本式交互:标题栏、提示/取值两栏布局、帮助面板、底部快捷键一行字。它由 EDK II 的DisplayEngineDxe(文本渲染引擎)+SetupBrowserDxe(表单浏览器)协作完成,几十年来样式几乎没有变化。

本文介绍一个实验性项目:把 LVGL 当作 UEFI 下的一个普通库,用它替换DisplayEngineDxe的渲染实现,为 Setup 界面带来图形化能力——卡片式行布局、主题化配色、开关控件、品牌化页头页脚。关键点在于:只替换渲染层UiAppSetupBrowserDxe、HII 数据库、IFR 表达式求值器、现有 VFR 表单包全部保持不变。

  • LVGL 版本:9.4.0(vendor 到LvglPkg/ThirdParty/lvgl,upstream commitc016f72
  • EDK2 版本:b03a21a63e3bd001f52c527e5a57feddb53a690b(edk2-stable202605 之后)
  • 集成方式:edk2 侧OvmfPkgX64.dsc/fdf通过LVGL_UI_ENABLE宏把DisplayEngineDxe换成LvglDisplayEngineDxe

二、总体架构

项目以 EDK2 包(LvglPkg)形式组织,核心模块:

LvglPkg/ ├── Universal/ │ ├── LvglDisplayEngineDxe/ # 替换 DisplayEngineDxe 的入口(驱动) │ └── QemuUsbTabletDxe/ # QEMU 下的 USB 触控板输入(验证辅助) ├── Library/ │ ├── LvglUefiPortLib/ # GOP 帧缓冲对接 + 输入事件桥接 + 刷新 │ ├── LvglVfrAdapterLib/ # IFR 语句 → LVGL 控件模型(文本转移+释放) │ ├── LvglFormUiLib/ # 页面拓扑/行组合(Default / Modern 双实现) │ ├── LvglThemeLib/ # 主题度量与样式(颜色/尺寸/档位缩放) │ ├── LvglFontLib/ # 中文字体(生成后的 C 数组,共享) │ ├── LvglUiTextLib/ # 全部界面文案(本地化入口) │ └── LvglCoreLib/ # LVGL 源树编译(含裁剪的 lv_conf.h) ├── Include/ │ ├── lv_conf.h # LVGL 配置(64KB 定制内存分配器) │ └── Dsc/LvglPkgLibraries.dsc.inc # 双布局 profile 选择 ├── Patches/Lvgl/ # 对 LVGL 源码的 0001-0005 补丁系列 └── Test/LvglVfrDemoDxe/ # 演示 VFR 表单(覆盖全部控件类型)

SetupBrowser 的 IFR 表单 → LvglVfrAdapterLib 转成轻量模型 → LvglDisplayEngineDxe 按模型逐行创建 LVGL 对象 → LvglUefiPortLib 把 GOP 帧缓冲交给 LVGL 绘制 → 按键/触摸经输入桥接回 SetupBrowser

三、几个关键点

1. 只替换渲染层,不改浏览器逻辑

LvglDisplayEngineDxe实现的是 EDK2 定义的EFI_DISPLAY_ENGINE_PROTOCOLFormDisplay/FormExit),SetupBrowser 调它时传入 HII 句柄与表单 ID,返回时带回用户操作(提交/放弃/跳转等)。因此替换是"接口级"的:HII 数据库、IFR 求值、SetupBrowserDxe的行为(如BROWSER_ACTION_REQUEST_RECONNECT三态对话框语义)原样保留。

2. 输入与帧缓冲:LvglUefiPortLib

  • 显示:拿到 GOP 模式后把帧缓冲注册为 LVGL 的lv_display(支持 partial buffer,见补丁 0001),LvglUefiPortRefresh触发刷新。
  • 输入:把SimpleTextInEx按键与 QEMU USB 触控板事件统一桥接成lv_indev事件;Modern 布局下鼠标右键/Esc 在状态对话框中等价于"忽略"。
  • 内存:lv_conf.hLV_MEM_SIZE = 64KB,走 EDK2 内存分配(补丁 0002/0004 对齐整数类型并加固分配器)。

3. IFR → 模型:LvglVfrAdapterLib

VFR 表单里同一份 statement 会被多次访问(取值、校验、提交),但 LVGL 是"一次性建对象、整页重建"的模型。适配器在首次构建时把 IFR 语句转移成轻量视图(提示文本、帮助文本、类型、可选择性、默认值),并负责所有权(页面销毁时统一释放),避免 DisplayEngine 侧重复解析。

4. 双布局 profile:DEFAULT 与 MODERN

LVGL_UI_LAYOUT环境变量在构建时选择(写入LvglBuildInfo.txt):

  • DEFAULT:复刻传统 Setup 结构——标题栏、提示/取值两栏、帮助面板、快捷键底栏,作为回归基线;
  • MODERN:图形化布局——品牌页头(Logo 标记 + 产品名 +STANDARD VFR标签)、独立表单列与帮助面板、单列卡片行、Checkbox 轨道开关、底栏快捷键胶囊([Up/Down] Move等)、640×480 紧凑模式自动隐藏帮助面板。

布局与样式完全由LvglFormUiLib/LvglThemeLib两个库实现,且都有 Default/Modern 两份实现——换皮肤不换逻辑

5. 中文字体

CJK 字体由生成脚本把 TTF 转成 LVGL 字体 C 数组(LvglFontLib共享),1280×800 与 640×480 使用不同的字号档位,1920×1080 走 125% 缩放档——三个分辨率下字体自动换档。

四、QEMU 辅助验证环境

开发阶段主要用QEMU + OVMF做验证,它只是一个辅助验证环境:目标是实机移植,QEMU 用于快速、可重复地验证行为与视觉。

  • 启动:qemu-system-x86_64 -machine q35,配bochs-display显式 EDID(精确控制帧缓冲尺寸),-debugcon file:输出日志,QMP socket 做自动化控制;
  • 分辨率:640×480 / 1280×800 / 1920×1080 三档都测

五、构建方法(简要)

# 环境:edk2(版本见文首)已就绪,PACKAGES_PATH 包含本仓库exportEDK2_ROOT=/path/to/edk2exportLVGL_UI_LAYOUT=MODERN# 或 DEFAULTbashScripts/build-ovmf-lvgl.sh full

产物OVMF_CODE.fd可直接启动 QEMU;固件体积与原生 OVMF 相当(LVGL 图形引擎替换文本引擎,模块级增量约 +4KB,FV 对齐后总体积不变)。

六、现状与下一步

当前 v0.1 基线:默认与现代双布局、IFR 全控件类型(Checkbox/OneOf/Numeric/String/Password/Date/Time/OrderedList/REF/Reset)、标准协议语义(提交/放弃/重置/重连三态对话框)与原生 SetupBrowser 一致、三分辨率全部验证。

下一步方向:实机平台移植(把LvglUefiPortLib的 GOP/输入对接换成目标平台实现)、控件交互增强(Numeric 步进器独立点击区)。

附:运行截图(QEMU 验证环境)


经典布局(LVGL_UI_LAYOUT=DEFAULT):复刻传统 Setup 结构——标题栏、提示/取值两栏、右侧 Help 面板、底部快捷键行,Checkbox 仍是文本式[X]


MODERN 布局主界面(1280×800):品牌页头(Logo + LVGL Firmware Setup + STANDARD VFR 标签)、左侧单列卡片表单、右侧帮助面板(圆形 ? 图标 + 标题 + 说明)、底栏 5 个快捷键胶囊。


OneOf 选项对话框:居中模态卡片、蓝色选中边框、选项浅色文字(可读性由逐行像素断言覆盖)。


Modal 类型表单页:独立页面布局,帮助面板随焦点更新当前控件的 Prompt 与 HII Help。


640×480 紧凑模式:自动隐藏帮助面板与品牌副标题,表单占满宽度,快捷键胶囊完整不截字。


1920×1080:字体走 125% 缩放档位,布局与 1280 一致。

http://www.cnnetsun.cn/news/3859122.html

相关文章:

  • 手机网站建设合同如何避坑:从需求梳理到验收交付的完整避指南
  • 亚马逊批量商品图片翻译软件用跨马AI,视频字幕翻译加智能抠图全搞定
  • 揭秘asp网站建设 文献中的那些被忽视的技术细节与实战心得
  • 要做的是个什么项目:一条博客流水线,为什么拆成多个角色
  • 新手必看的免费下载网站建设方案ppt教程与资源汇总
  • GitHub趋势榜揭示AI工程化与边缘智能新趋势:ModelKit、TinyNN、EvalHub深度解析
  • DouK-Downloader:抖音TikTok数据采集与批量下载终极指南
  • 网站建设费计入什么科目深度解析与实操指南:从财务合规到税务筹划的全方位解答
  • 运放输入电容:从概念到实战,解决高频振荡的幽灵负载
  • 揭秘福建省建设局网站背后的数字化变革与便民服务新机遇
  • 从ChatGPT提示词到Shopify商品页:AI模板产品化全链路拆解(含自动交付系统部署脚本)
  • 本地企业网站建设服务如何重塑中小商家线上竞争力与品牌信任度
  • 1元云购网站建设实战指南:如何从0到1搭建稳定运营的平台
  • 登封网站建设指南:中小企业主如何避开陷阱打造高转化率本地网站
  • 南通网站建设优化:如何从草根逆袭,让本地流量不再沉睡
  • 揭秘最低价网站建设背后的真相:为什么便宜可能反而是最贵的消费陷阱?
  • 用LangChain搭FAB问答机器人:踩过的5个坑
  • 黄岛网站建设服务:深耕本土流量与品牌升级的实战指南
  • Python实战:Python虚拟环境(venv)的创建与使用
  • 中小企业如何打破增长瓶颈?揭秘网站建设与销售培训的双轮驱动之道
  • 深度解析北京建设部网站:如何快速获取建筑资质、政策通知及办事指南完整攻略
  • 揭秘商城网站建设模板:为何它成为中小企业快速搭建在线店铺的首选方案
  • HeidiSQL 12.21发布:新增表格索引显示功能,修复多项使用问题
  • tags: [持续交付, 持续集成, 持续部署, DevOps, CALMS, 成熟度模型]
  • 北京网站建设推广那些事儿:从0到1打造高转化流量引擎
  • 网站建设的目标是什么
  • 为什么你的企业需要一家靠谱的邯郸网站建设公司?从草根创业到品牌出海的深度思考
  • 支付宝《灵画师》游戏体验第2天收获
  • 电力系统调度中的源荷不确定性建模与优化实践
  • 深度解析旅游网站建设的意义及其对行业发展的深远影响与核心价值体现