设备树的起源
在过去的arm linux中,arch/arm/plat-xxx中mach-xxx中充满大量垃圾代码,多是描述板级细节的信息,在linus 一声怒喝之后,设备树衍生而出。
设备树的组成和结构
- 描述设备硬件信息的文本
- 编译该文本的工具
- bootloader需要支持将编译后的设备树传递给linux内核
DTS文件
- ASCII文本格式的设备树描述
- 一般一个。dts文件对应一个ARM设备
- 通常放在arch/arm/boot/dts目录中
- 现大部分主控芯片都支持设备树
- 内核为了简化,对于设备共同的部分提炼为。dtsi文件(类似c的头文件)
- 文件。dts的基本元素为节点和属性
DTC
- dtc是将dts编译为dtb的工具
- 源码位于scripts/dtc目录中,在内核使能了设备树的情况下,编译内核时主机工具dtc会被编译出来
- scripts/dtc/Makefile中的hostprogs-y:=dtc
dtc也可以在ubuntu中单独安装
sudo apt-get install device-tree-compiler
- 在arch/arm/boot/dts/Makefile中描述了当某个soc被选中后,哪些dtb文件会被编译出来
dtc除了可以编译dts文件生成dtb文件,还可以反汇编dtb文件为dts文件:
dtc -I dtb -O dts -o xxx.dts xxxx.dtb
dtb
- 编译后生成的二进制格式的设备树文件
- 由linux内核解析
- 内核也支持dtb和zImage绑定在一起做成一个映像文件,内核编译时使能CONFIG_ARM_APPENDED_DTB这个选项,以支持
binding
- 内核documentation/device/bindings目录下txt文件描述节点和属性具体如何来表述硬件信息。
- 主要内容包括:
- 关于该模块的最基本的描述
- 必需属性的描述
- 可选属性的描述
- 一个实例
- scripts/checkpatch.pl会运行一个检查,对有人在设备树中添加了compatible字符串,二没添加相应的文档进行解释,会报出警告
bootloader
uboot设备从1.1.3开始支持设备树,为了使能设备树,需要在编译uboot的时候在config文件中加入:
#define CONFIG_OF_LIBFDT
- 可从nand、sd或tftp将dtb读入内存
- 可在uboot中运行fdt addr 命令设置dtb的位置如:
uboot》 fdt addr 0x71000000
- * 对于arm来讲,可以通过bootz kernel_addr initrd_address dtb_address 的命令来启动内核,既dtb_address作为bootz或bootm的最后一次参数,第一个参数为内核映像的地址,第二个为rootfs的地址 若不存在iniitrd,可以用-代替。(三者顺序不能乱)*
根节点兼容性
- 根节点/的兼容属性compatible= ”“,定义了整个系统(设备级别)的名称,组织形式为,
- linux内黑通过根节点的兼容属性可判断它启动的是什么设备。在真实项目中,这个顶层设备的兼容属性一般包括两个或两个以上的兼容性字符串,首个兼容字符串是板子级别的名字,后面一个兼容性是芯片级别的名字。