和笔者新人,正在跟着正点原子的驱动指南自学Linux驱动开发。
一、什么是设备树
设备树,在Linux内核3.x版本以后,新增了支持设备树的功能。那么设备树到底是什么呢?
从图上可以看到, 树的主干就是系统总线, IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上接了 FT5206 和 AT24C02这两个 IIC 设备, IIC2 上只接了 MPU6050 这个设备。
所以,不难发现,通过设备树就可以了解到当前SOC上所支持哪些外设;设备树可以来面熟板子上的设备信息。
二、DTS、DTB、DTC
在进行开发时总能看到一些以xxxx.dts和xxxxx.dtb为后缀的文件。
DTS:(Device Tree Source)表示当前文件是设备树的源文件
DTB:表示当前文件是由dts文件通过dtc工具编译而成的设备树文件的二进制文件。
DTC: 将.dts 编译为.dtb的工具,DTC 工具源码在 Linux 内核的 scripts/dtc 目录下,
scripts/dtc/Makefile
在工具中可能会需要将dtb和dts文件进行反编译,指令为:
dtbf反编译生成dts:
dtc -I dtb -O dts -o xxxxx.dts xxxx.dtb
dtc -I fs -O dts /proc/device-tree/ > xxxxx.dts
dts编译生成dtb:
dtc -I dts -O dtb -o xxxxxx.dtb xxxxx.dts
三、设备树的语法
1,支持头文件包含
和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi
如下例子,既可以包含.h文件,dts文件。
我们在编写设备树头文件的时候最好选择.dtsi 后缀。
#include "imx6ull-14x14-evk.dts"
#include <dt-bindings/gpio/gpio.h>
#include "skeleton.dtsi"
一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围,比如 UART、 IIC 等等。
2.设备节点
设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键值对。