ARM Linux 设备树(1)

设备树的起源

在过去的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内黑通过根节点的兼容属性可判断它启动的是什么设备。在真实项目中,这个顶层设备的兼容属性一般包括两个或两个以上的兼容性字符串,首个兼容字符串是板子级别的名字,后面一个兼容性是芯片级别的名字。

猜你喜欢

转载自blog.csdn.net/zhou_qiao62/article/details/77993893