摘要:Overlay 是 Zephyr 中不修改板级 DTS 即可定制硬件描述的核心机制。本文讲解 Overlay 的作用、放置位置、常见用法(新增节点、修改属性、添加别名、配置 GPIO/SPI/UART),并厘清 Overlay 与 Kconfig 的分工:Kconfig 决定编译哪些驱动,Overlay 决定驱动对应哪些硬件实例。最后通过两个 STM32 Nucleo-F303RE 实验(修改 USART2 波特率、添加自定义 Alias)演示 Overlay 的调试方法——查看
build/zephyr/zephyr.dts与devicetree_generated.h确认生效。
09-Overlay(DeviceTree Overlay)
这是Zephyr DeviceTree系列中最重要的一课。
1. 什么是 Overlay?
前一课我们修改的是 Board 自带的 DTS。
例如
boards/st/nucleo_f303re/nucleo_f303re.dts
但是:
千万不要去改 SDK 里的 DTS!
原因:
升级 Zephyr 后全部丢失。
所以 Zephyr 提供了
app.overlay或者
<board>.overlay编译时自动叠加进去。
例如
nucleo_f303re.overlay编译时实际上就是
Board DTS + Overlay ↓ 最终 DeviceTree所以 Overlay 可以理解成
DeviceTree 的补丁(Patch)
2. Overlay 的位置
例如:
hello_world/ │ ├── src/ ├── CMakeLists.txt ├── prj.conf └── nucleo_f303re.overlay如果编译
west build-b nucleo_f303reZephyr 会自动找到
nucleo_f303re.overlay无需任何配置。
3. Overlay 可以做什么?
几乎所有 DeviceTree 修改都可以放进去。
例如:
增加 LED
/{aliases{myled=&led0;};};增加 Button
/{aliases{mybutton=&button0;};};增加 SPI Device
&spi1{status="okay";my_sensor@0{compatible="mycompany,my-sensor";reg=<0>;};};增加 UART
&usart2{status="okay";};全部不用修改 Board DTS。
4. Overlay 修改已有节点
例如:
Board DTS&usart2{current-speed=<115200>;};Overlay
&usart2{current-speed=<9600>;};最终结果
9600Overlay 覆盖原来的属性。
5. 新增节点
例如:
/{mynode{compatible="demo";};};编译后
DT_NODELABEL(mynode)即可获得。
6. 修改 GPIO
例如:
&gpioa{status="okay";};或者
&gpioa{myled{gpios=<...>;};};7. Overlay 最常见用途——添加自己的设备
例如:
&spi1{imu@0{compatible="bosch,bmi270";reg=<0>;};};驱动里
DT_INST_FOREACH_STATUS_OKAY(...)即可找到。
所以:
Overlay 是 Driver 与 Hardware 的桥梁。
8. Overlay 与 Kconfig 的关系
很多初学者容易混淆:
Kconfig
决定
编译什么代码
例如
CONFIG_UART=yCONFIG_SPI=yCONFIG_SENSOR=yOverlay
决定
硬件长什么样
例如
SPI1 ↓ 挂了 BMI270因此:
Kconfig ↓ Driver 编译Overlay ↓ Driver 实例化两者缺一不可。
9. 查看 Overlay 是否生效
编译:
west build-bnucleo_f303re查看生成文件:
build/zephyr/zephyr.dts这里就是:
Board DTS + Overlay最终结果。
例如搜索:
my_sensorgrepmy_sensor build/zephyr/zephyr.dts或者
grepcurrent-speed build/zephyr/zephyr.dts下面是 Overlay 从编写到生效的完整流程: