Linux设备树入门
0.参考资料
[1]Linux:设备树学习篇(1)
[2]初学LINUX(4):Linux的设备树
[3]Linux 设备树 DTS 与 DTSI 入门指南
[4]详解Linux设备树源码DTS格式
[5]camera驱动开发 之 DTS
1.什么是设备树
设备树是一种数据结构,它通过特有的语法格式描述片上片外的设备信息。由BootLoader传递给kernel,kernel进行解析后形成和驱动程序关联的dev结构供驱动代码使用。
描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。
树的主干就是系统总线,IIC 控制器、GPIO 控制器、SPI 控制器等都是接到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上接了 FT5206 和 AT24C02这两个 IIC 设备,IIC2 上只接了 MPU6050 这个设备。DTS 文件的主要功能就是按照图所示的结构来描述板子上的设备信息。
2.为什么要使用设备树来替代传统的总线设备驱动模型
传统的总线设备驱动是将设备信息描述在C代码中,当需要修改驱动相关的硬件信息时,就得修改具体的代码文件,再全编译内核。整个操作繁琐且不利于代码的维护和移植。
设备树的方式将驱动和设备完全分离开。将驱动程序设计成硬件无关的类型,一切设备资源(比如memory,interrupt,clk,pinctrl)在设备树文件中定义。内核来适配驱动和设备信息。将有效的设备信息通过参数传递给驱动的probe函数,再进行具体硬件的初始化。这样当硬件出现变更时(各公司基于芯片公版单独设计PCB等情况),只需要去修改对应的设备树文件,而完全不用去更改驱动代码。驱动的通用性也会大大提供。这样多个系列芯片只需要共用同一套驱动代码,差分设备树文件就可以。
3.DTS、DTB 和 DTC
设备树的代码文件是dts文件和dtsi文件。
- dts 是设备树源码文件:
- dtsi文件类似include头文件,可以被dts文件包含;
- dtb是将 dts编译以后得到的二进制文件。
dts文件会被dtc(设备树编译器)编译为dtb(device tree block)的二进制文件。该文件会被烧写到内存的特定地址(由BootLoader指定,原则上随意,只要不覆盖了boot和kernel的内容就好)。再由BootLoader将地址通过参数传递给kernel。kernel根据dtb文件的特定格式解析出有效的设备信息,从而传递给驱动代码。
dtc 工具源码在 Linux 内核的 scripts/dtc 目录下:

DTC 工具依赖于 dtc.c、flattree.c、fstree.c 等文件,最终编译出 DTC 这个主机文件。如果要编译 DTS 文件的话只需要进入到 Linux 源码根目录下,然后执行如下命令:make all 或者 make dtbs。
4. DTS 语法
4.1 .dtsi 头文件
和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi。与此同时,.dts 文件也可以引用 C 语言中的.h 文件,甚至也可以引用.dts 文件。
一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围,比如 UART、IIC 等等。
4.2 设备节点
设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设 备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。
设备树的基本单元是节点,由根节点(/)和其子节点(name@addr)组成,子节点也可以有子节点,形成一个树状结构。
/include/ "spear3xx.dtsi"
/ {
ahb {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges = <0x60000000 0x60000000 0x50000000
0xd0000000 0xd0000000 0x30000000>;
pinmux@99000000 {
compatible = "st,spear300-pinmux";
reg = <0x99000000 0x1000>;
};
clcd@60000000 {
compatible = "arm,pl110", "arm,primecell";
reg = <0x60000000 0x1000>;
interrupts = <30>;
status = "disabled";
};
fsmc: flash@94000000 {
compatible = "st,spear600-fsmc-nand";

6304

被折叠的 条评论
为什么被折叠?



