linux设备树
一、什么是设备树
从前充斥在ARM社区的板级大量代码,为了优化2011~2012年进行大量修整。从此,ARM linux开始围绕设备树展开。
设备树源文件.dts,编译后得到.dtb,Bootloader在引导Linux内核时将.dtb地址告知内核。之后内核展开设备树并创建和注册相关设备,因此arch/arm/mach-xxx和arch/arm/plat-xxx中注册platform等板级信息被删除,驱动以新的方式在.dts中定义的设备节点进行匹配。
设备树由一系列节点(Node)和属性(Property)组成。节点本身包含子节点,属性可描述的内容如:
CPU的数量和类别;
内存及地址和大小;
总线和桥;
外设连接;
中断控制器;
GPIO控制器;
时钟控制器;
二、linux设备树详细
2.1 DTS、DTC、DTB的概念
首先,DTS是存在arch/arm/boot/dts/目录下基于ASCII文本格式的设备树源文件,和c语言头文件概念类似的dtsi文件,可以被其他dts或者dtsi引用。
第二要介绍DTC,将dts编译成dtb的工具被称作dtc。DTC源码位于scripts/dtc目录,linux下可单独编译设备树,如make
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tl570x-evm.dtb。
第三要介绍DTB,由dts被编译后的二进制格式文件,可由linux内核解析,当然u-boot的bootloader也可以识别.dtbo。在启动时bootloader在引导内核过程中,会先读.dtb到内存。
2.1.1 Labels and Reference
标签和引用是为了方便编写dts文件,当标签用于节点时开发人员可在任意地方引用该标签而不用关注该标签的全路径;当标签应用于属性时,开发人员可以在其他属性中引用该标签,避免重复的工作。
2.1.2 interrupts
interrupts 对于一个硬件的描述怎么会少了中断那,设备树为中断提供了几种属性:
interrupt-controller 一个空属性用来声明这个node接收中断信号,即这个node是一个中断控制器。
interrupt-cells,是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中"interrupts"属性使用了父节点中的interrupts属性的具体的哪个值。一般,如果父节点的该属性的值是3,则子节点的interrupts一个cell的三个32bits整数值分别为:<中断域 中断 触发方式>,如果父节点的该属性是2,则是<中断 触发方式>
1、interrupt-parent,标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的;
2、interrupts,一个中断标识符列表,表示每一个中断输出信号;
2.1.3 常用OF API
of_find_node_by_path();//按路径查找 of_find_compatible_node();//按属性查找
device_property_read_string();
evice_property_read_string_array(); device_property_read_u32();
device_property_read_u32_array(); device_property_read_u8_array();
绑定,设备树的节点和属性是如何描述设备硬件细节,内核介绍设备树文档
/Document/devicetree/bindings
2.2 DTB的使用
U-boot从v1.1.3版本开始支持设备树,为使能设备树要在U-boot config文件中增加:
#define CONFIG_OF_LIBFDT
U-boot可以从SD、NAND flash、TFTP获取并读取dtb到内存,若将dtb存放到内存0x7100 0000,则可以用fdt addr命令设置dtb的地址,如:
Uboot> fdt addr 0x7100 0000
ARM系统可以通过命令来启动内核:
bootz kernel_addr initrd_address dtb_address
2.3 兼容属性
根节点兼容属性:即Soc间实现兼容
设备节点兼容属性:即相同设备兼容不通Soc