如果您正在开发的板子或平台尚未得到Zephyr的支持,则可以在应用程序中添加板子、设备树和SOC定义,而不必将其添加到Zephyr内核源码中。
使用以下目录结构将自定义板子添加到应用程序中。
11.zephyr自定义板子、设备树和SOC - 图1
板子的信息放在boards目录下。
11.zephyr自定义板子、设备树和SOC - 图2
soc目录下放置自定的soc代码。

应用程序自定义板子

boards目录下创建板子的架构目录armx86等。在架构目录下创建我们自己板子的名称目录my_custom_board

my_custom_board目录下可以没有在docsupport目录,但如果提交代码到zephyr时这两个目录是必须存在的。

my_custom_board目录下包含的文件命名如下:
11.zephyr自定义板子、设备树和SOC - 图3
当自定义了板子的目录后,需要通过设置BOARD_ROOT变量为我们自定义的板子的目录,这样zephyr在编译的时候才可以找到我们自定义的板子。
设置BOARD_ROOT变量的方式:

  • 通过在编译时在命令行设置。

    1. # 通过west编译时命令行设置BOARD_ROOT
    2. west build -b <board name> -- -DBOARD_ROOT=<path to boards>
    1. # 通过cmake编译时设置BOARD_ROOT
    2. cmake -B build -GNinja -DBOARD=<board name> -DBOARD_ROOT=<path to boards> .
    3. ninja -C build
  • 通过CMakeLists.txt设置BOARD_ROOT。在CMakeLists.txt文件里在调用find_package(Zephyr ...)之前设置BOARD_ROOT变量。

    通过CMakeLists.txt设置BOARD_ROOT时,必须提供绝对路径,例如:list(APPEND BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/<extra-board-root>)

应用程序自定义SOC

自定义SOC的目录结构如下。
11.zephyr自定义板子、设备树和SOC - 图4
soc目录下需要创建soc所属的架构目录,例如x86arm等。在架构目录下在创建自定义的soc目录名称。
soc目录下需要创建Kconfig文件,该文件中包含soc/架构/自定义soc/Kconfig文件。
最终自定义的soc目录结构如下:
11.zephyr自定义板子、设备树和SOC - 图5
当自定义soc目录结构建立好了之后,可以通过SOC_ROOT的变量来设置寻找自定义soc的目录。
设置SOC_ROOT的方式:

  • 通过编译时在命令行设置。

    1. # 通过west编译时设置SOC_ROOT
    2. west build -b <board name> -- -DSOC_ROOT=<path to soc> -DBOARD_ROOT=<path to boards>
    1. # 通过cmake编译时设置SOC_ROOT
    2. cmake -B build -GNinja -DBOARD=<board name> -DSOC_ROOT=<path to soc> -DBOARD_ROOT=<path to boards> .
    3. ninja -C build
  • 通过在模块中设置SOC_ROOT的变量,这里会在后面介绍模块时介绍。

  • 通过设置CMakeLists.txt设置SOC_ROOT变量。在CMakeLists.txt中设置SOC_ROOT时,必须要放在find_package(Zephyr ...)之前。

    CMakeLists.txt中设置SOC_ROOT时必须使用绝对路径。例如:list(APPEND SOC_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/<extra-soc-root>)

应用程序自定义设备树

自定义设备树可以在APPLICATION_SOURCE_DIRBOARD_DIRZEPHYR_BASE或者DTS_ROOT的目录下发现设备树。
11.zephyr自定义板子、设备树和SOC - 图6
设置DTS_ROOT的方式:

  • 在编译的通过命令行设置。

    1. # 通过west的设置DTS_ROOT
    2. west build -b <board name> -- -DDTS_ROOT=<path to dts root
    1. # 通过cmake设置DTS_ROOT
    2. cmake -B build -GNinja -DBOARD=<board name> -DDTS_ROOT=<path to dts root> .
    3. ninja -C build
  • 通过设置CMakeLists.txt设置DTS_ROOT变量。在CMakeLists.txt中设置DTS_ROOT时,必须要放在find_package(Zephyr ...)之前。

    CMakeLists.txt中设置DTS_ROOT时必须使用绝对路径。例如:list(APPEND DTS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/<extra-soc-root>)

还可以通过CMake缓存变量DTS_EXTRA_CPPFLAGS控制设备树文件的内容。

  1. # 通过west编译设置DTS_EXTRA_CPPFLAGS变量
  2. west build -b <board name> -- -DDTS_EXTRA_CPPFLAGS=-DTEST_ENABLE_FEATURE
  1. # 通过cmake编译设置DTS_EXTRA_CPPFLAGS变量
  2. cmake -B build -GNinja -DBOARD=<board name> -DDTS_EXTRA_CPPFLAGS=-DTEST_ENABLE_FEATURE .
  3. ninja -C build