Zephyr Device Tree简介

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323G1UJVT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券