zephyr邪修笔记(9)最简化自定义板子-定制化第一步
作为板佬搞项目的时候必须遇到第一个问题就是将开发板转为产品板之后的适配debug过程。对于zephyr这种逻辑代码和硬件描述高度解耦的RTOS来说,最大的难点就在其有复杂逻辑且有点啰嗦的硬件描述了。一旦掌握以后,就进入到定制化的新坑了。
对于如何定制自己的生产板,可以采用邪修最简化的方式来入门。因为作原型的时候已经是基于某个开发板来做设计的,只是说引脚、IOMUX需要重新自己配置而已,这个时候是用overlay不就可以了么?显示情况不是的。因为,实际生产的时候选用的芯片有可能用同一个系列不同参数不同型号的不同封装的芯片,IOMUX就会需要自己在overlaoy重新配置了。其实zephyr对于支持的芯片已经预先整理好了dtsi,没有必要在overlay里面大费周章。另外,对于已经固定的引脚配置,写在自定义板子里面的dts/dtsi里面,这样既可以简化overlay的编写工作,又可以减少代码的复杂程度,所以说,对于实际项目来说,是有必要按照zephyr的逻辑来自定义自己项目板子的硬件描述的。
按照官方的概念板佬们日常用的接触的最多的是蓝色这里的Board这里。
接下来设定自定板总共分三步:
一、建立文件结构
二、准备硬件描述的文件
三、如何调用自定义的板描述文件
一、建立文件结构
按照官方文档的的说法:
https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html#board-porting-guide
文件结构应当如下:
boards/<VENDOR>/plank
├── board.yml
├── board.cmake
├── CMakeLists.txt
├── doc
│ ├── plank.webp
│ └── index.rst
├── Kconfig.plank
├── Kconfig.defconfig
├── plank_<qualifiers>_defconfig
├── plank_<qualifiers>.dts
└── plank_<qualifiers>.yaml
plank就是你自己给板子起的名字,VENDOR统一用custom这个方便区分。vendor这个只是用来作为区分使用的,到了程序、驱动、内核等环节是没有任何影响的。如果你不喜欢用custom这个名字,可以随意换成自己习惯的名字,如:companyboard 等等。
文件结构里面核心不可缺少的文件只有3个
board.yml:描述你的板的核心信息,方便编译器和内核去调用资源和编译
plank_<qualifiers>.dts:设备树文件。当然你也可以在这里自己编写板级的dtsi文件。
Kconfig.plank:用来确定在Kconfig中调用具体那个Soc的基本驱动用的。
剩下的的文件
board.cmake:用来配置烧录和debug的设置的,这个可以直接用开发板的,直接copy
Kconfig,kconfig.defconfig:在Kconfig中,用来设置对应的外设功能,比如启动I2C驱动等,在menuconfig中会用到。
plank_defconfig , plank_<qualifiers>_defconfig:给具体的项目中的prj.conf添加一些预设的设定,一般是外设驱动等,这个常用。
CMakeLists.txt:用来引用其他额外的源文件的。
plank_<qualifiers>.yaml:这是用在TestRunner(twister)中的yaml文件
doc文件夹里面的你的板的一些描述,如果不想发布在主线项目中的话,可以不用管。
二、准备硬件描述的文件
这里其实主要的是写dts文件,dts文件主要是注意引用不同型号的dtsi和具体的引脚的自己修改。
比如:我用ch32v006的一个mcu做个小项目,为了体积和手工焊接的方便,选用了ch32v006f8p这个芯片型号,和其他的E8(QFN24)K8(QFN32)有差异。因此需要自己做一个板子描述。
其实在zephyr里面已经对这些不同封装的mcu做了dtsi,只需要我们自行引用就行。
原厂的开发板ch32v006evt用的型号是k8u,所以在zephyr/boards里面引用的就是ch32v006k8u.dtsi
那我用的是 F8P,所以自然我的板子也就引用对应的dtsi
其他的文件,可以参考zephyr/boards里面对应开发板的来写就OK了。
三、如何调用自定义的板描述文件
默认情况下,west build -b 这个命令指向的是zephyr/boards里面的板级文件的。你可以选择把自定义的板级文件放在里面,不过考虑到zephyr仍在一个高速迭代的时段,所以放在工作区另外一个地方会是一个更好的选择。
如果直接用:west build -b ch32v006nano(我给自己板命名为ch32v006nano),那肯定是报错的,必须是提示找不到板子的。
这个时候其实只要将你自己的boards的路径传递进去给cmake 就ok了,具体参数为 -DBOARD_ROOT = 绝对路径或者相对路径。关键是文件结构要跟规范的来设置 /boards/custom/ch32v006nano 。我这里用的是相对路径。这样你把路径告诉给zephyr的编译器。那就可以顺利的编译成功了。
(完)
