聚焦
galcore
模块,从设备树绑定到驱动注册、再到用户空间验证,逐步带你掌握 GPU 驱动调试思路。
一、问题背景与现象
我们在 Yocto 镜像中启用了 GPU,理论上应该:
/dev/galcore
存在- 启动
weston
后可看到 GUI - 能正常运行
/opt/imx-gpu-sdk
示例程序
但有些场景下,遇到以下现象:
问题现象 | 可能原因 |
---|---|
galcore probe 不触发 | 设备树匹配失败 |
weston 启动失败 | g2d 渲染器加载失败 |
无法运行 GLES 示例 | 用户态库不兼容 |
GPU probe 报错 | 电源域或时钟未准备好 |
我们以第一种典型问题:驱动 probe 不触发或失败 为例,展开逐步调试。
二、确认设备树绑定
1. GPU 节点位置
查看设备树源(.dts
):
gpu: gpu@38000000 {
compatible = "fsl,imx8mp-gpu";
reg = <0x38000000 0x4000>;
clocks = <&clk IMX8MP_CLK_GPU3D_CORE>;
...
};
其中 compatible = "fsl,imx8mp-gpu"
是关键匹配点。
2. 驱动中匹配表
static const struct of_device_id gpu_dt_ids[] = {
{ .compatible = "fsl,imx8mp-gpu" },
{ /* sentinel */ }
};
驱动主结构为:
static struct platform_driver gpu_driver = {
.driver = {
.name = "galcore",
.of_match_table = gpu_dt_ids,
},
.probe = gpu_probe,
};
三、验证 probe 是否触发
方法 1:查看串口日志
dmesg | grep -i galcore
如没有任何输出,说明 probe 根本没被触发。
方法 2:插桩日志打印
编辑 drivers/gpu/arm2d/vivante/galcore/main.c
:
static int gpu_probe(...) {
pr_info(">>> galcore: probe entered\n");
...
}
重编内核或模块,部署后再次启动查看串口是否打印。
四、进一步排查 probe 不触发原因
1. 检查设备树是否被编译进 dtb
可反编译 dtb 文件查看:
dtc -I dtb -O dts -o decompiled.dts /boot/imx8mp-evk.dtb
grep gpu@ decompiled.dts -A 10
确认节点存在,并且 compatible 字符串正确。
2. 检查驱动模块是否加载成功
lsmod | grep galcore
modinfo galcore
确保模块存在或已集成进内核,并能成功加载。
五、probe 触发但执行失败怎么办?
查看 dmesg
:
galcore: probe entered
galcore: failed to register misc device
galcore: probe failed with error -EINVAL
常见失败点:
失败位置 | 原因 |
---|---|
注册 misc 设备失败 | /dev/galcore 已被占用或资源未释放 |
时钟获取失败 | devm_clk_get() 返回 NULL |
寄存器映射失败 | devm_ioremap_resource() 失败 |
中断请求失败 | devm_request_irq() 返回错误码 |
power domain 未就绪 | pm_runtime_enable() 报错 |
建议继续插桩调试:
pr_info(">>> clk_get returned %p\n", clk);
pr_info(">>> request_irq returned %d\n", ret);
六、查看设备注册情况
1. platform device
ls /sys/bus/platform/devices/ | grep gpu
应有形如 38000000.gpu
的设备
2. 是否绑定成功
ls /sys/bus/platform/drivers/galcore/
cat /sys/bus/platform/drivers/galcore/bind
七、验证 /dev/galcore 是否出现
ls -l /dev/galcore
出现说明 misc_register()
成功
也可以使用:
cat /proc/devices | grep galcore
八、用户态验证 GPU 是否工作
执行:
/opt/imx-gpu-sdk/GLES2/Blit
或:
weston --renderer=g2d
观察是否报错:
failed to load g2d-renderer.so
failed to create gbm device
这些问题大多数都指向:
- 权限问题(需使用
seatd
或 root) - 用户态动态库未正确链接(缺
libGAL.so
,libVSC.so
等) - Weston 没有链接正确的
libgbm_imx.so
九、总结:调试 GPU 驱动的关键抓手
步骤 | 方法 |
---|---|
是否 probe? | 插桩 / dmesg / grep galcore |
probe 为何失败? | 查看每一步资源获取是否成功 |
是否创建了 /dev/galcore? | 确认 misc_register 调用结果 |
用户态是否正常? | weston + imx-gpu-sdk 示例验证 |
Weston 是否支持? | 看是否加载 g2d 渲染器 |
权限问题排查? | seat 权限 + systemd 日志 |
十、练习题
- 请在你的 i.MX8MP 系统中查找设备树中 GPU 的地址和 compatible 字符串,并验证是否绑定驱动。
- 编写一段
galcore
插桩代码,输出 probe 中的 reg 地址、irq 号、时钟名。 - 若 probe 成功但
/dev/galcore
不存在,请列出可能原因及排查思路。
下一期预告
Day 3:GPU 加速 Weston 无效?g2d-renderer.so 加载失败的全流程解析(含权限与 seatd)
视频教程请关注 B 站:“嵌入式 Jerry”
欢迎留言讨论你在 i.MX 平台调试 GPU 时遇到的坑,我来一一还原并讲解!