内核调试高手养成实战 · Day 2:i.MX8MP 实战调试 Vivante GPU 驱动

聚焦 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 日志

十、练习题

  1. 请在你的 i.MX8MP 系统中查找设备树中 GPU 的地址和 compatible 字符串,并验证是否绑定驱动。
  2. 编写一段 galcore 插桩代码,输出 probe 中的 reg 地址、irq 号、时钟名。
  3. 若 probe 成功但 /dev/galcore 不存在,请列出可能原因及排查思路。

下一期预告

Day 3:GPU 加速 Weston 无效?g2d-renderer.so 加载失败的全流程解析(含权限与 seatd)


视频教程请关注 B 站:“嵌入式 Jerry”
欢迎留言讨论你在 i.MX 平台调试 GPU 时遇到的坑,我来一一还原并讲解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值