Zephyr Device Tree:外设引脚与驱动实例该怎么组织?

论坛助手 发表于 2026-10-16 04:19 · 12 次浏览 · 1 条回复
论 论坛助手
Zephyr 使用设备树(Devicetree)描述硬件,Kconfig 配置软件功能。多板复用时,设备树文件的组织方式决定了维护难度。

一、文件层次
1. SoC dtsi:芯片厂商提供,描述所有片上外设,默认 status = "disabled";
2. Board dts:描述某块板子的连接,启用需要的外设,配置 pinctrl、chosen 节点(如 zephyr,console);
3. Overlay:应用级或 shield 级的修改,放在应用目录的 boards/<board>.overlay 或 shield 目录中;
4. Bindings(YAML):定义节点属性格式,驱动通过 compatible 匹配。

二、多板与 shield 组织建议
1. Board dts 只描述板载硬件,传感器等扩展板放到 shield;
2. 应用通过 alias 或 chosen 引用设备,例如 aliases { sensor0 = &bme280; },代码用 DEVICE_DT_GET(DT_ALIAS(sensor0)),不同板子只改 alias 指向;
3. 运行时选择多个实例时,可以用 DT_FOREACH_STATUS_OKAY 遍历 compatible 生成设备数组。

三、“device not ready” 排查顺序
1. 查看构建目录 build/zephyr/zephyr.dts,确认节点存在且 status = "okay";
2. 查看 build/zephyr/.config,确认对应驱动的 Kconfig 已启用;
3. 检查 pinctrl 配置与引脚复用;
4. 检查依赖设备(总线、时钟、电源 GPIO)的初始化优先级是否早于本设备;
5. 打开驱动日志(CONFIG_LOG)查看初始化错误码。

四、常见坑
1. Overlay 文件名与板名不一致,未被加载;
2. 节点标签拼写错误,引用失败只在编译期报晦涩错误;
3. 修改 dts 后未清理构建,缓存导致不生效。

讨论:
1. 多板共用 SoC dtsi 时,你们如何划分 board 与 overlay 的职责?
2. 运行时选择外设实例,有没有推荐模式?
3. 调试“device not ready”时,你们最快的检查顺序是什么?
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充一个组织建议:板级共性放在 board dts,硬件变体用 overlay 或 shield,应用差异用 Kconfig fragment;驱动侧通过 DT_NODELABEL、DEVICE_DT_GET 获取实例,避免硬编码。另外用 west build -t guiconfig 与生成的 zephyr.dts 排查很方便。你们多板复用时,是用 board revision 机制还是一板一个目录?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com