Zephyr应用的代码结构--自定义开发板

Creative Commons
本作品采用知识共享署名

本文说明如何将新增的开发板纳入到Zephyr应用的目录下进行管理。

Zephyr应用的代码结构–West提货单一文中已经将zephyr和zephyr外部项目纳入到应用的管理,应用可以基于zephyr的任意开发板进行开发。不过实际的嵌入式应用场景需要对硬件进行定制,这就需要添加新的board,为了方便应用项目代码集中管理,我们希望将新增的board的代码直接纳入app下。

添加board

在app目录下添加boards,添加的方式必须遵从boards/<arch>/<board_name>, 例如我的应用要跑在两种不同的硬件上,增加了使用rt1052和esp32两个芯片的board,那么就要新建arm和xtensa两个arch目录,并分别在其中建立新的开发板文件夹atclock和tclock,目录树如下

1
2
3
4
5
6
7
app
├── CMakeLists.txt
├── boards
│   ├── arm
│   │   └── atclock
│   └── xtensa
│   └── tclock

添加board一般的做法是在zephyr/boards目录下找相同soc的board然后根据硬件对dts和配置文件进行修改,具体添加board的方法可以参考Zephyr添加nrf52-moderate,例如atclock就是从mm_swiftio修改而来,文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
└── atclock
├── CMakeLists.txt
├── Kconfig.board
├── Kconfig.defconfig
├── atclock.dts
├── atclock.yaml
├── atclock_defconfig
├── atclock_flexspi_nor_config.c
├── atclock_flexspi_nor_config.h
├── atclock_sdram_ini_dcd.c
├── board.cmake
├── doc
└── pinmux.c

而tclock是从esp32修改而来,文件如下

1
2
3
4
5
6
7
8
9
10
.
└── tclock
├── CMakeLists.txt
├── Kconfig.board
├── Kconfig.defconfig
├── board.cmake
├── doc
├── tclock.dts
├── tclock.yaml
└── tclock_defconfig

如何使用

zephyr提供了两种方法使用非zephyr目录下的board

1.编译时指定

1
west build -b atclock -- -DBOARD_ROOT=app/ app/

2.Cmake指定

编译时指定需要在每次编译时都指定BOARD_ROOT路径,略显累赘,可以在app/CMakeLists.txt中添加如下内容

1
list(APPEND BOARD_ROOT ${CMAKE_SOURCE_DIR})

CMAKE_SOURCE_DIR表示app的source code目录,也就是app的目录,由于boards在该目录下,因此在编译时就无需再指定board_root,直接执行下面命令即可

1
west build -b atclock app/

第二种方法是应用管理自定义board这种场景下比较推荐的方法。

参考

https://docs.zephyrproject.org/latest/application/index.html#custom-board-devicetree-and-soc-definitions
https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/application_development/out_of_tree_board