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

发布时间:2026/9/29 2:07:47

用 LVGL 给 UEFI Setup 换一套图形界面:架构、实现与 QEMU 验证
一、为什么做这件事用过 UEFI 固件设置界面的人都知道UiApp里的 Setup 页面是典型的文本式交互标题栏、提示/取值两栏布局、帮助面板、底部快捷键一行字。它由 EDK II 的DisplayEngineDxe文本渲染引擎SetupBrowserDxe表单浏览器协作完成几十年来样式几乎没有变化。本文介绍一个实验性项目把 LVGL 当作 UEFI 下的一个普通库用它替换DisplayEngineDxe的渲染实现为 Setup 界面带来图形化能力——卡片式行布局、主题化配色、开关控件、品牌化页头页脚。关键点在于只替换渲染层UiApp、SetupBrowserDxe、HII 数据库、IFR 表达式求值器、现有 VFR 表单包全部保持不变。LVGL 版本9.4.0vendor 到LvglPkg/ThirdParty/lvglupstream commitc016f72EDK2 版本b03a21a63e3bd001f52c527e5a57feddb53a690bedk2-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/FormExitSetupBrowser 调它时传入 HII 句柄与表单 ID返回时带回用户操作提交/放弃/跳转等。因此替换是接口级的HII 数据库、IFR 求值、SetupBrowserDxe的行为如BROWSER_ACTION_REQUEST_RECONNECT三态对话框语义原样保留。2. 输入与帧缓冲LvglUefiPortLib显示拿到 GOP 模式后把帧缓冲注册为 LVGL 的lv_display支持 partial buffer见补丁 0001LvglUefiPortRefresh触发刷新。输入把SimpleTextInEx按键与 QEMU USB 触控板事件统一桥接成lv_indev事件Modern 布局下鼠标右键/Esc 在状态对话框中等价于忽略。内存lv_conf.h里LV_MEM_SIZE 64KB走 EDK2 内存分配补丁 0002/0004 对齐整数类型并加固分配器。3. IFR → 模型LvglVfrAdapterLibVFR 表单里同一份 statement 会被多次访问取值、校验、提交但 LVGL 是一次性建对象、整页重建的模型。适配器在首次构建时把 IFR 语句转移成轻量视图提示文本、帮助文本、类型、可选择性、默认值并负责所有权页面销毁时统一释放避免 DisplayEngine 侧重复解析。4. 双布局 profileDEFAULT 与 MODERNLVGL_UI_LAYOUT环境变量在构建时选择写入LvglBuildInfo.txtDEFAULT复刻传统 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_LAYOUTMODERN# 或 DEFAULTbashScripts/build-ovmf-lvgl.sh full产物OVMF_CODE.fd可直接启动 QEMU固件体积与原生 OVMF 相当LVGL 图形引擎替换文本引擎模块级增量约 4KBFV 对齐后总体积不变。六、现状与下一步当前 v0.1 基线默认与现代双布局、IFR 全控件类型Checkbox/OneOf/Numeric/String/Password/Date/Time/OrderedList/REF/Reset、标准协议语义提交/放弃/重置/重连三态对话框与原生 SetupBrowser 一致、三分辨率全部验证。下一步方向实机平台移植把LvglUefiPortLib的 GOP/输入对接换成目标平台实现、控件交互增强Numeric 步进器独立点击区。附运行截图QEMU 验证环境经典布局LVGL_UI_LAYOUTDEFAULT复刻传统 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 一致。

相关新闻

04-MySQL 扩展学习资料

04-MySQL 扩展学习资料

2026/8/24 6:21:13

04-MySQL 扩展学习资料 面向「能用、也懂原理」之后,向架构、运维、云与工程化方向扩展的开发者 / 技术负责人。涵盖高可用、云数据库、框架集成、安全合规、监控运维、生态工具与学习路线。 编程资源 https://pan.quark.cn/s/7f7c83756948 更多资源 https://pan.qu…

Android开发构建工具链版本对齐:AGP、Gradle、JDK与Android Studio兼容性全解析

Android开发构建工具链版本对齐:AGP、Gradle、JDK与Android Studio兼容性全解析

2026/9/27 16:27:18

1. 项目概述:为什么版本对齐是Android开发的“第一课”如果你刚开始接触Android开发,或者刚从其他技术栈转过来,可能会觉得有点懵:为什么我新建一个项目,光是等Gradle构建完成就要好几分钟?为什么照着网上的…

网约车平台分账架构实践:网约车小程序如何解决司机结算、二清与延迟分账难题

网约车平台分账架构实践:网约车小程序如何解决司机结算、二清与延迟分账难题

2026/8/9 11:56:56

近几年大量区域网约车、城际顺风车、聚合运力服务商,选择以网约车小程序作为业务载体,轻量化获客、快速上线业务。在做网约车后台开发的时候,绝大多数团队优先完成下单、派单、计价、司机端订单管理模块,资金结算经常作为后置模块…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/28 16:01:49

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/28 16:01:48

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/28 16:01:48

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…