Yocto构建树莓派3系统中自定义平台驱动未生效问题排查
排查步骤:设备树与Platform驱动匹配失败问题
1. 确认驱动是否被编译并加载
- 检查Yocto构建产物:在build目录的
tmp/work/<machine>/<your-driver-package>/<version>/image/lib/modules/<kernel-version>/extra/路径下,确认是否存在驱动的.ko文件 - 系统启动后执行
lsmod,查看驱动是否被加载;若未加载,尝试手动执行insmod my_driver.ko,观察是否有依赖缺失、符号未定义等报错 - 检查Yocto配方是否配置了
KERNEL_MODULE_AUTOLOAD += "my_driver",确保驱动会被自动加载
2. 验证设备树与驱动的兼容字符串匹配
- 执行
cat /sys/firmware/devicetree/base/<your-node-path>/compatible,确认输出严格等于my_driver(注意大小写敏感,不能有多余空格或换行) - 检查驱动代码中的匹配表是否正确:
确保static const struct of_device_id my_driver_of_match[] = { { .compatible = "my_driver", }, { /* Sentinel */ } }; MODULE_DEVICE_TABLE(of, my_driver_of_match); static struct platform_driver my_driver_driver = { .probe = my_driver_probe, .remove = my_driver_remove, .driver = { .name = "my_driver", .of_match_table = my_driver_of_match, }, };.compatible字段与设备树完全一致,且MODULE_DEVICE_TABLE宏正确注册了匹配表
3. 检查驱动的注册与probe逻辑
- 确认驱动代码中正确调用了
platform_driver_register(&my_driver_driver);,且注册逻辑没有提前返回错误 - 给
probe函数添加基础日志(比如pr_info("my_driver probe triggered\n");),即使未创建设备文件,probe触发时也会有日志输出
4. 验证设备树节点状态
- 执行
cat /sys/bus/platform/devices/<your-node-name>/status,确认节点状态为okay(无status属性则默认生效) - 执行
cat /sys/bus/platform/devices/<your-node-name>/driver,查看该节点是否被其他驱动抢先绑定
5. 检查内核配置
- 通过
bitbake -c menuconfig virtual/kernel打开内核配置界面,确认开启了CONFIG_PLATFORM_DEVICES=y和CONFIG_OF=y - 若驱动为模块化,确认
CONFIG_MY_DRIVER=m(若编译进内核则设为y)
6. 查看内核详细日志
- 执行
dmesg | grep -i platform过滤Platform总线相关日志,查找类似platform my_driver: no driver found或platform my_driver: registered的信息 - 可在启动参数中添加
loglevel=7提升日志级别,获取更详细的启动过程记录
7. 检查Yocto配方正确性
- 确认配方中添加了
DEPENDS += "virtual/kernel"以依赖内核头文件 - 检查
SRC_URI是否正确包含驱动源码及必要补丁 - 确认编译安装逻辑正确,比如:
do_compile() { oe_runmake -C ${STAGING_KERNEL_DIR} M=${S} modules } do_install() { oe_runmake -C ${STAGING_KERNEL_DIR} M=${S} modules_install INSTALL_MOD_PATH=${D} }
内容的提问来源于stack exchange,提问作者zupoluzu
相关产品推荐
相关产品推荐

