Zephyr device tree概述
linux下DTS被DTC编译为DTB,DTB被放到Flash内,启动时DTB由bootloader送给kernel使用。但是这套机制太过庞大,不适合Zephyr作为iot终端节点的目标。Zephyr采用buildin的方法来使用DTS,主要步骤如下:
使用DTC将DTS和C头文件一起预编译组合成.dts_compiled文件。
python脚本按照YAML文件指定的一组规则从.dtscompiled文件中提取信息转换为define,合并板级描述的dts.fixup内的define放置在头文件generateddts_board.h中
Zephyr编译时头文件generateddtsboard.h参与编译被buildin入zephyr
Zephyr device tree基本元素说明
Zephyr Device Tree
Zephyr使用Device Tree来描述架构,板子,驱动信息,Device的文件分别放在
Device Tree语法简述
Zephyr device tree遵循EPAPR document. 简要说明如下:
Device Tree
Device tree由node组成,包含根节点和子节点节点node由节点名和节点内容组成,节点内容用{}扩起来
节点
节点node在Device tree中以下面形式出现:
只能有一个根节点root node, 可以有多个子节点sub node。一个node的内容有属性和自己的sub node
节点名
根节点名是/子节点名node-name为长度小于31的字符串。对不同的device,EPAPR document有推荐的node-name(非强制)当node有寄存器时,unit-address是第一个寄存器的地址。如果node没有寄存器,则无@unit-address
节点属性
属性用表达式以下面形式出现,分为属性名和属性值
属性名
属性名分为标准属性名和非标属性名,对于非标属性名EPAPR document建议加前缀以示区分,例如
注意以上只有3个属性名,属性名当中是允许出现 , 的
属性值
属性值有7种类型
空,没有值
big-endian 32bit符号整形
big-endian 64bit符号整形,由两个32bit组成
字符串
任意数量的array
节点引用
字符串列表
标准属性
常用标准属性共12种:
compatible
model
phandle
status
#address-cells
#size-cells
reg
virtual-reg
ranges
dma-ranges
name
device_type
另外有6种中断用的属性
interrupts
interrupt-parent
#interrupt-cells
interrupt-controller
interrupt-map
interrupt-map-mask
属性名内容繁多,具体参考EPAPR document,后文QEMUCORTEXM3 Device Tree分析会做一些简要说明
YAML
YAML它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言.Zephyr 使用YAML来定义Device tree转化为#define的生成规则,dts/bindings/device_node.yaml.template 是一个yaml的模板, zephyr的yaml放在
Python Script
将Dts转化为头文件的脚本放在scripts\dts下。目前也还不计划阅读这部分。
QemuCortexm3 device tree分析
DTS文件组成
由下面文件include组成
boards/arm/qemucortexm3/qemucortexm3.dts #include
dts/arm/ti/lm3s6965.dtsi #include
dts/arm/armv7-m.dtsi #include "skeleton.dtsi"
dts/common/skeleton.dtsi
将上面4个文件合并后如下分析:
Yaml组成
Qemucortexm3使用的yaml有,生成规则待分析(可能要分析python script才能知道),目前能知道转换结果就不会影响Zephyr代码的分析了
boards/arm/qemucortexm3/qemucortexm3.yaml
dts/bindings/interrupt-controller/arm,v7m-nvic.yaml
dts/bindings/serial/ti,stellaris-uart.yaml
dts/bindings/serial/uart.yaml
转换结果
基本上可以看出就是将dts内的信息转换成device信息的#define,供Zephyr的代码使用
参考
http://docs.zephyrproject.org/devices/dts/devicetree.htmlhttp://events17.linuxfoundation.org/sites/events/files/slides/Zephyr%20Device%20Tree%20-%20ELC2017.pdfhttps://elinux.org/images/b/b8/DTWorkshop2017Zephyr.pdfhttps://www.devicetree.org/downloads/devicetree-specification-v0.1-20160524.pdf
领取专属 10元无门槛券
私享最新 技术干货