当前位置: 首页 > web >正文

内核调试高手养成实战 · 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 时遇到的坑,我来一一还原并讲解!

http://www.xdnf.cn/news/8020.html

相关文章:

  • Spring AI 1.0 GA 正式发布
  • 信号量机制:操作系统中的同步与互斥利器
  • openlayer:11点击地图上省份实现overlay提示省份名称并修改对应所点省份区域颜色
  • c++11的auto关键一篇文章打通:基本用法、常见使用场景、最佳食用指南
  • 小刚说C语言刷题—1153 - 查找“支撑数”
  • Docker面试题(1)
  • MinIO纠删码技术解析:数据冗余与高可用的存储密码
  • 命令行关闭特定端口 命令行关闭端口脚本
  • f-string 高效的字符串格式化
  • 【MySQL成神之路】MySQL查询用法总结
  • CASAIM与荣耀达成合作,三维数字化检测技术助力终端消费电子制造实现生产工艺智能优化
  • 医疗行业数据共享新实践:如何用QuickAPI打通诊疗全流程数据壁垒
  • 免费图片处理工具压缩不糊 + 批量加水印兼容多种格式转换
  • 订单导入(常见问题和sql)
  • 架构图 C4 规范简介
  • 力扣-两数之和
  • 鸿蒙开发:应用上架第三篇,配置签名信息打出上架包
  • 安卓基础(代码解析)
  • YOLO11解决方案之VisonEye对象映射
  • 利用 Java 爬虫根据关键词获取某手商品列表
  • 人工智能应用时代:个人成长与职业突围的底层逻辑
  • 黑马+点评常见问题
  • 配电网运行状态综合评估方法研究
  • API测试框架全解析
  • 咽拭子+病毒采样管助力多项呼吸道病原体核酸检测!
  • 2025第一届轩辕杯--Crypto--WriteUp
  • 【Netty】- 入门1
  • 可理解性输入:逛超市
  • git合并多次commit提交
  • RK3588+CODESYS+望获实时Linux - 软PLC运动控制解决方案