在 Mali G2-Ultra NX 的 SoC 上点亮 Omarchy:先打通 GPU 驱动¶
结论:Omarchy 的桌面软件不用为 Mali 改一行代码,要补的只有两个内核驱动和一个 GPU 用户态驱动。 其中 Mali G2-Ultra NX 的驱动是唯一的硬骨头:上游开源驱动(panthor + Mesa)目前还不支持这一代 GPU, 短期只能用 Arm 闭源的 Mali DDK,长期再切回上游。显示控制器驱动和 GPU 无关,可以先单独打通。
问题界定¶
| 现状 | SoC 已能启动到 Linux shell,没有任何图形界面;GPU 是 Arm Mali G2-Ultra NX。 |
|---|---|
| 期望 | 开机进入 Omarchy 的登录界面,登录后出现 Hyprland 桌面和 Omarchy 状态栏。 |
| 问题 | 从 shell 到桌面,要补齐哪些软件,按什么顺序验证? |
答案:补三样东西,从下往上逐层验证¶
- 显示控制器的 KMS 驱动:让内核能把一帧画面送到屏幕上。和 GPU 无关,现在就能做。
- Mali G2-Ultra NX 的 GPU 驱动(内核驱动 + 用户态 EGL/GLES 驱动):让 Hyprland 能用 GPU 合成画面。这是关键路径。
- Omarchy 用户态:Arch Linux ARM 加 Omarchy 软件包,按“通用 aarch64”平台安装。前两样通了,这一步基本是装包。
下面按 4+1 视图展开:场景视图讲启动顺序,逻辑视图讲软件分层,物理视图讲 SoC 上的硬件分工, 最后把“一帧画面怎么上屏”拆到第二层,列出每一步的硬性要求。开发视图与本题无关,不画。
场景视图:从上电到桌面要走七步,GPU 从第三步起才用到¶
- 内核启动,按设备树加载显示控制器驱动和 Mali 驱动。
- systemd 启动 udev 和 logind。udev 创建
/dev/dri/*设备节点,logind 负责把屏幕和输入设备分给登录的用户。你现在停在这一步之后。 sddm.service先起一个 Hyprland,专门给登录界面用(Omarchy 的etc/sddm.conf.d/10-wayland.conf)。从这里开始必须有 GPU 驱动,否则 Hyprland 起不来,屏幕一直黑。- SDDM 的登录界面是 QML 写的,由 Qt Quick 画在这个 Hyprland 上。
- 登录后,uwsm 以用户身份再起一个 Hyprland,作为 systemd 用户服务运行(
default/wayland-sessions/omarchy.desktop)。 - Hyprland 读取 Omarchy 的 Lua 配置:环境变量、快捷键、显示器设置。
- Hyprland 自启动
omarchy-launch-shell,拉起 omarchy-shell。状态栏出现,桌面就绪。
逻辑视图:桌面建在六层软件上,要补的三块都在底下两层¶
- ① 应用和 ② Omarchy 桌面:都只是 Wayland 客户端,各自用 GPU 把画面画好,再交给合成器。
- 新版 Omarchy 的状态栏、菜单、通知、锁屏,全部由一个 Quickshell 进程(omarchy-shell)负责,已不再用 waybar、mako、walker。
- Quickshell 和 SDDM 登录界面都基于 Qt Quick,所以 Qt 也需要 GPU 驱动能用。
- ③ 合成器:Hyprland 负责把所有窗口用 GLES 叠成一帧。它的 Aquamarine 后端负责三件事:通过 DRM/KMS 送屏、通过 libinput 读输入、通过 libseat 向 logind 申请设备。
- ④ 图形与输入库:除 GPU 用户态驱动外都是现成的发行版软件包。GPU 用户态驱动要么是 Arm DDK,要么是 Mesa panfrost。
- ⑤ 内核驱动:显示控制器 KMS 驱动和 Mali 内核驱动要自己打通;dma-buf、sync_file、evdev 是内核标准功能,打开配置即可。
- ⑥ 硬件:Mali 只负责渲染,不管显示输出;显示输出由 SoC 里独立的显示控制器负责。
物理视图:渲染和出图是两个独立设备,要靠 GBM 配成一对¶
- CPU 上的 Hyprland 和应用通过驱动给 Mali 提交渲染命令。
- Mali 把画好的一帧写进 DDR 里的缓冲区(dma-buf)。
- 显示控制器按屏幕刷新率从 DDR 读出这块缓冲区。
- 显示控制器经 HDMI 或 DSI 把画面送到屏幕。
这两个设备在内核里是两个驱动,各有各的设备节点:
- 显示控制器是 /dev/dri/card0,只能出图;
- Mali 用 panthor 时是 /dev/dri/renderD128,用 DDK 时是 /dev/mali0,只能渲染。
Hyprland 只打开 card0,靠 GBM/EGL 这一层把两边配成一对:
- 用 Mesa 时,由 kmsro 完成配对。Mesa 必须认得你的显示控制器驱动名,否则 GBM 建不起来。没有收录的驱动要给 Mesa 加一行(Mesa panfrost 文档说这很简单)。
- 用 Arm DDK 时,由 DDK 自带的 libgbm 完成配对。要确认它支持你的显示控制器。
第二层拆解:一帧画面上屏要过五道检查¶
“合成器”那一层讲得太粗,看不出 Hyprland 到底要求驱动提供什么。下图按一帧画面的路径拆开,虚线框里是 Hyprland 和 Aquamarine 源码里的硬性检查。
| 要求 | 谁来提供 | 缺了会怎样 | 源码位置 |
|---|---|---|---|
| GLES 3.2 上下文,不行退到 3.0 | Mali 用户态驱动 | Hyprland 直接退出 | Hyprland src/render/OpenGL.cpp |
EGL_KHR_platform_gbm 或 EGL_EXT_platform_device |
Mali 用户态驱动 | 直接退出 | 同上 |
EGL_ANDROID_native_fence_sync(eglDupNativeFenceFDANDROID 等三个函数) |
Mali 用户态驱动 + 内核 sync_file | 直接退出 | 同上 |
GL_EXT_texture_format_BGRA8888 |
Mali 用户态驱动 | 直接退出 | 同上 |
EGL_EXT_image_dma_buf_import(_modifiers) |
Mali 用户态驱动 | 只告警,窗口导入变慢 | 同上 |
DRM_CAP_PRIME 支持导入 |
显示控制器驱动 | 这块显卡被弃用,没有输出 | Aquamarine src/backend/drm/DRM.cpp |
DRM_CAP_CRTC_IN_VBLANK_EVENT |
显示控制器驱动 | 同上 | 同上 |
| atomic 提交 | 显示控制器驱动 | 退回 legacy 接口,功能变少 | 同上 |
Hyprland 没有纯 CPU 渲染的路径,GPU 驱动不通时它跑不起来。显示控制器可以先用 Weston 的 pixman(CPU)渲染器单独验证,见下面的检查点 2。
Mali G2-Ultra NX 的驱动现状:上游还不支持,短期只能走 DDK¶
社区资料把 G2 系列归为 Mali 第 15 代架构(v15)。这个对应关系不是 Arm 官方说法,先在你的芯片上确认架构号:DDK 的 kbase 驱动加载时会在 dmesg 里打印 GPU_ID。
截至 2026-11-01 的上游状态:
| 组件 | 支持到哪一代 | v15(G2)进展 |
|---|---|---|
| 内核 panthor(Linux 7.3 主线) | v10~v14(G1 系列) | Arm 在 2026-09-22 向 dri-devel 发了 v15 的内核接口补丁(邮件),未合入 |
| Mesa panfrost(GLES) | v14,型号表最新是 G1-Ultra/Premium/Pro | MR !41366 草稿,依赖上面的内核补丁,2026-10-28 仍在更新 |
| Mesa 新编译器 Kraid | Valhall 以后的架构 | MR !44172 加 v15 支持,未合入 |
所以有两条路:
| 路线 | 做法 | 优点 | 风险 |
|---|---|---|---|
| A. Arm Mali DDK(推荐先走) | 用 Arm 授权的 kbase 内核驱动加闭源 libEGL/libGLESv2/libgbm | 现在就有 v15 支持,性能和功能完整 | 必须拿到 Wayland + GBM 窗口系统的版本,并逐项满足上表的 EGL/GL 扩展;Arch 软件包默认链接 Mesa 和 libglvnd,DDK 要能以 glvnd 厂商库的方式接进来,否则要重新打包 |
| B. 上游 panthor + Mesa | 给内核打 v15 补丁,Mesa 用 !41366 分支自己编译 | 开源,和 Omarchy、Arch 的软件包天然兼容 | 补丁未合入、接口还会变;Mali 驱动的 Vulkan 部分(PanVK)还要设 PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1 才肯加载 |
建议先用 A 出界面,同时跟进 B。等 v15 进入内核主线和 Mesa 正式版后,再切回 B。
推进步骤:六个检查点,每个通过再做下一个¶
| # | 检查点 | 怎么验证 | 通过标准 |
|---|---|---|---|
| 1 | 显示控制器 KMS 驱动加载 | ls /dev/dri;modetest -M <驱动名> -c |
有 card0,屏幕所在的连接器显示 connected,能列出分辨率 |
| 2 | 不用 GPU 也能出图 | modetest -M <驱动名> -s <连接器>@<CRTC>:<分辨率> 出彩条;再用 weston --backend=drm --renderer=pixman(旧版 Weston 用 --use-pixman)起一个 CPU 渲染的桌面 |
屏幕出彩条,Weston 桌面可见、鼠标能动。到这一步,显示控制器、设备树、屏幕时序都已验证,和 GPU 无关 |
| 3 | Mali 内核驱动加载 | dmesg \| grep -iE 'mali\|panthor';DDK 路线看 /dev/mali0,上游路线看 /dev/dri/renderD128 |
驱动打印出 GPU 型号,没有固件或电源报错 |
| 4 | GPU 用户态驱动满足 Hyprland 要求 | eglinfo -B -p gbm;eglinfo -p gbm 里逐项查上表的扩展;kmscube -D /dev/dri/card0 |
GLES 版本 ≥ 3.0,上表要求的扩展都在,kmscube 的立方体在屏幕上转 |
| 5 | Hyprland 裸跑 | 接上键盘,在屏幕前的本地终端(不是串口或 ssh)登录后运行 start-hyprland;看 $XDG_RUNTIME_DIR/hypr/*/hyprland.log |
出现 Hyprland 默认桌面;默认配置下 Super+Q 打开 kitty 终端(需先装 kitty) |
| 6 | 装 Omarchy | Arch Linux ARM 用户态上按通用 aarch64 平台(generic-aarch64)安装 Omarchy |
开机出现 SDDM 登录界面,登录后状态栏出现 |
几个容易卡住的地方:
- 第 5 步不能从串口或 ssh 起 Hyprland。 这类登录没有分到 seat,libseat 拿不到屏幕和输入设备。要么在本地终端登录,要么装 seatd 改用它管理设备。
- Qt 出问题时先判断是不是 GPU 的锅。 设
QT_QUICK_BACKEND=software让 Qt Quick 改用 CPU 绘制:能显示,就说明是 GPU 驱动的问题;还是不显示,就是 Qt 或 Wayland 的问题。 - DDK 路线要防止 Mesa 被装回来。 Arch 的
hyprland、qt6-base、chromium都会拉 Mesa 的库。装完用ldd $(which Hyprland) | grep -E 'EGL|GLES|gbm'确认链接的是 DDK 的库。
参考¶
- Omarchy 源码 basecamp/omarchy
d367a56(2026-10-31):install/omarchy-aarch64*.packages、etc/sddm.conf.d/10-wayland.conf、default/hypr/autostart.lua、docs/omarchy-shell.md - Hyprland hyprwm/Hyprland
ecbcfe6:src/render/OpenGL.cpp - Aquamarine hyprwm/aquamarine
eac1b82:src/backend/drm/DRM.cpp、docs/env.md - Linux 7.3
drivers/gpu/drm/panthor/panthor_hw.c(panthor_hw_match只到 v14) - Mesa
src/panfrost/model/pan_model.c(型号表最新为 G1);Panfrost 文档 - Arm Mali G2-Ultra NX 产品页