跳转至

在 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 到桌面,要补齐哪些软件,按什么顺序验证?

答案:补三样东西,从下往上逐层验证

  1. 显示控制器的 KMS 驱动:让内核能把一帧画面送到屏幕上。和 GPU 无关,现在就能做。
  2. Mali G2-Ultra NX 的 GPU 驱动(内核驱动 + 用户态 EGL/GLES 驱动):让 Hyprland 能用 GPU 合成画面。这是关键路径。
  3. Omarchy 用户态:Arch Linux ARM 加 Omarchy 软件包,按“通用 aarch64”平台安装。前两样通了,这一步基本是装包。

下面按 4+1 视图展开:场景视图讲启动顺序,逻辑视图讲软件分层,物理视图讲 SoC 上的硬件分工, 最后把“一帧画面怎么上屏”拆到第二层,列出每一步的硬性要求。开发视图与本题无关,不画。

场景视图:从上电到桌面要走七步,GPU 从第三步起才用到

场景视图:从上电到 Omarchy 桌面的七个步骤

  1. 内核启动,按设备树加载显示控制器驱动和 Mali 驱动。
  2. systemd 启动 udev 和 logind。udev 创建 /dev/dri/* 设备节点,logind 负责把屏幕和输入设备分给登录的用户。你现在停在这一步之后。
  3. sddm.service 先起一个 Hyprland,专门给登录界面用(Omarchy 的 etc/sddm.conf.d/10-wayland.conf)。从这里开始必须有 GPU 驱动,否则 Hyprland 起不来,屏幕一直黑。
  4. SDDM 的登录界面是 QML 写的,由 Qt Quick 画在这个 Hyprland 上。
  5. 登录后,uwsm 以用户身份再起一个 Hyprland,作为 systemd 用户服务运行(default/wayland-sessions/omarchy.desktop)。
  6. Hyprland 读取 Omarchy 的 Lua 配置:环境变量、快捷键、显示器设置。
  7. Hyprland 自启动 omarchy-launch-shell,拉起 omarchy-shell。状态栏出现,桌面就绪。

逻辑视图:桌面建在六层软件上,要补的三块都在底下两层

逻辑视图:Omarchy 显示栈的六层结构

  • ① 应用和 ② 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 配成一对

物理视图:SoC 上 Mali 与显示控制器的分工

  1. CPU 上的 Hyprland 和应用通过驱动给 Mali 提交渲染命令。
  2. Mali 把画好的一帧写进 DDR 里的缓冲区(dma-buf)。
  3. 显示控制器按屏幕刷新率从 DDR 读出这块缓冲区。
  4. 显示控制器经 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 产品页