基于Zephyr的自定义板卡与树外驱动/模块整合方案咨询
我基于Nordic nRF和Zephyr开发自定义板卡时,需要引入独立的树外驱动模块,但不想用应用层overlay方案,希望直接整合到板卡文件中。当前目录结构如下:
nrf/ ├── apps/ │ └── monkey │ └── sandpit │ └── test-display │ ├── CMakeLists.txt (原用于应用层设置ZEPHYR_EXTRA_MODULES) │ ├── prj.conf │ └── src/ │ └── main.c │ ├── board-files/ │ └── boards/ │ └── monkey/ │ └── myboard/ │ ├── myboard_nrf9151.dts │ ├── myboard_nrf9151_common.dtsi ← 使用 "myvendor,mydriver" 节点 │ ├── pre_dt_board.cmake │ └── CMakeLists.txt (需配置DTS_ROOT) │ └── drivers/ └── my-display ├── zephyr/ │ └── module.yml (已设置dts_root: .) ├── CMakeLists.txt ├── Kconfig ├── dts/ │ └── bindings/ │ └── display/ │ └── vendor,driveric.yaml ← DTS绑定文件 └── drivers/ ├── CMakeLists.txt ├── Kconfig └── driveric/ ├── CMakeLists.txt ├── Kconfig ├── driveric.c └── driveric.h
以下是无需应用层overlay的整合步骤:
1. 完善驱动模块的module.yml配置
确保drivers/my-display/zephyr/module.yml包含完整的模块声明,让Zephyr正确识别驱动:
name: MY_DISPLAY_DRIVER build: cmake: . kconfig: Kconfig dts_root: .
这个配置会告诉Zephyr:模块的构建入口是当前目录的CMakeLists.txt,Kconfig配置文件在根目录,DTS相关文件的根路径是当前目录。
2. 在板卡预加载阶段引入驱动模块
编辑板卡目录下的pre_dt_board.cmake(board-files/boards/monkey/myboard/pre_dt_board.cmake),添加驱动模块路径:
# 相对路径指向树外驱动目录 list(APPEND ZEPHYR_EXTRA_MODULES ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/my-display)
这样Zephyr在处理板卡DTS之前就会加载驱动模块,确保DTS绑定能被解析。
3. 配置板卡的DTS_ROOT(可选但推荐)
在板卡的CMakeLists.txt(board-files/boards/monkey/myboard/CMakeLists.txt)中指定DTS绑定的根路径,避免解析错误:
set(DTS_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/my-display/dts)
如果驱动的module.yml已经设置了dts_root: .,Zephyr会自动扫描驱动目录下的dts文件夹,但手动指定可以确保优先级。
4. 启用驱动的Kconfig选项
在板卡的默认配置文件(比如新增myboard_nrf9151_defconfig)或者应用的prj.conf中添加驱动启用配置:
CONFIG_MY_DISPLAY_DRIVER=y
这个选项需要在驱动的Kconfig文件中预先定义,比如:
config MY_DISPLAY_DRIVER bool "My Custom Display Driver" default n help Enable support for the custom display driver.
5. 移除应用层的驱动配置
删除应用目录test-display/CMakeLists.txt中关于ZEPHYR_EXTRA_MODULES的设置,因为现在驱动由板卡自动加载。
完成以上步骤后,编译应用时Zephyr会自动从板卡配置中加载树外驱动,DTS节点能正确绑定到驱动实现,无需依赖应用层overlay。
内容的提问来源于stack exchange,提问作者monkey

