Linux设备树语法详解

linux内核从3.x开始引入设备树的概念 , 用于实现驱动代码与设备信息相分离 。在设备树出现以前 , 所有关于设备的具体信息都要写在驱动里 , 一旦外围设备变化 , 驱动代码就要重写 。引入了设备树之后 , 驱动代码只负责处理驱动的逻辑 , 而关于设备的具体信息存放到设备树文件中 , 这样 , 如果只是硬件接口信息的变化而没有驱动逻辑的变化 , 驱动开发者只需要修改设备树文件信息 , 不需要改写驱动代码 。比如在ARM Linux内 , 一个.dts(device tree source)文件对应一个ARM的machine , 一般放置在内核的"arch/arm/boot/dts/"目录内 , 比如exynos4412参考板的板级设备树文件就是"arch/arm/boot/dts/exynos4412-origen.dts" 。这个文件可以通过$make dtbs命令编译成二进制的.dtb文件供内核驱动使用 。
基于同样的软件分层设计的思想 , 由于一个SoC可能对应多个machine , 如果每个machine的设备树都写成一个完全独立的.dts文件 , 那么势必相当一些.dts文件有重复的部分 , 为了解决这个问题 , Linux设备树目录把一个SoC公用的部分或者多个machine共同的部分提炼为相应的.dtsi文件 。这样每个.dts就只有自己差异的部分 , 公有的部分只需要"include"相应的.dtsi文件, 这样就是整个设备树的管理更加有序 。我这里用`Linux4.8.5源码自带的dm9000网卡为例来分析设备树的使用和移植 。这个网卡的设备树节点信息在"Documentation/devicetree/bindings/net/davicom-dm9000.txt"有详细说明 , 其网卡驱动源码是"drivers/net/ethernet/davicom/dm9000.c" 。

Linux设备树语法详解

文章插图
 
设备树框架设备树用树状结构描述设备信息 , 它有以下几种特性
  1. 每个设备树文件都有一个根节点 , 每个设备都是一个节点 。
  2. 节点间可以嵌套 , 形成父子关系 , 这样就可以方便的描述设备间的关系 。
  3. 每个设备的属性都用一组key-value对(键值对)来描述 。
  4. 每个属性的描述用;结束
所以 , 一个设备树的基本框架可以写成下面这个样子
/{//根节点node1{//node1是节点名 , 是/的子节点key=value;//node1的属性...node2{//node2是node1的子节点key=value;//node2的属性...}}//node1的描述到此为止node3{key=value;...}}节点名理论个节点名只要是长度不超过31个字符的ASCII字符串即可 , 此外Linux内核还约定设备名应写成形如<name>[@<unit_address>]的形式 , 其中name就是设备名 , unit_address就是设备地址 , 如果有应该写上 , 下面就是典型节点名的写法
 
Linux设备树语法详解

文章插图
 
 
Linux中的设备树还包括几个特殊的节点 , 比如chosen , chosen节点不描述一个真实设备 , 而是用于firmware传递一些数据给OS , 比如bootloader传递内核启动参数给内核
Linux设备树语法详解

文章插图
 
引用当我们找一个节点的时候 , 我们必须书写完整的节点路径 , 这样当一个节点嵌套比较深的时候就不是很方便 , 所以 , 设备树允许我们用下面的形式为节点标注引用(起别名) , 借以省去冗长的路径 。这样就可以实现类似函数调用的效果 。编译设备树的时候 , 相同的节点的不同属性信息都会被合并到设备节点中 , 而相同的属性会被覆盖 , 使用引用可以避免移植者四处找节点 , 直接在板级.dts增改即可 。
Linux设备树语法详解

文章插图
 
下面的例子中就是直接引用了dtsi中的一个节点 , 并向其中添加/修改新的属性信息
Linux设备树语法详解

文章插图
 
KEY在设备树中 , 键值对是描述属性的方式 , 比如 , Linux驱动中可以通过设备节点中的"compatible"这个属性查找设备节点 。Linux设备树语法中定义了一些具有规范意义的属性 , 包括:compatible, address, interrupt等 , 这些信息能够在内核初始化找到节点的时候 , 自动解析生成相应的设备信息 。此外 , 还有一些Linux内核定义好的 , 一类设备通用的有默认意义的属性 , 这些属性一般不能被内核自动解析生成相应的设备信息 , 但是内核已经编写的相应的解析提取函数 , 常见的有 "mac_addr" , "gpio" , "clock" , "power" 。"regulator" 等等 。


推荐阅读