设备树与platform

设备树概述

在linux2.6以前,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量重复的、用于描述设备细节的代码。导致内核代码迅速膨胀,linus一声怒吼“This whole ARM thing is a f*cking pain in the ass”,自此ARM开发便开始了使用设备树描述设备细节的时代。

设备树的特点

  1. 设备树可以描述的信息:CPU的数量和类别、总线、外设连接、中断控制器与使用情况使用、GPIO控制器与使用情况、clock控制器与使用等。
  2. 设备树被保存在一个ASCII文本文件中,类似于xml文件;在arm linux中,一个.dts文件对应一个ARM的machine放置在arch/arm/boot/dts目录。
  3. 设备树是一种数据结构,用于描述设备信息的语言。device tree由一系列被命名的节点(node)和属性(property)组成,节点可包含子节点。属性由name和value组成。
  4. 设备树源文件dts被编译成dtb二进制文件,由bootload运行时传递给内核,由内核进行解析为硬件拓扑图,在编程时调用系统提供的接口获取到设备树中的节点和属性信息。
  5. 设备相关文件类型:
    • dts (device tree source) 设备树源文件,类似于.c文件
    • dtsi (device tree source include) 设备树源包含文件,类似于.h文件,将一些通用的设备树结构放置在此文件中,以供其它dtb文件include。
    • dtb (device tree bin) 设备树二进制文件,类似于编译后的可执行文件
  6. 如下图所示,imx6q的设备树源文件
    设备树与platform

设备树的使用

编译设备树

  1. 设备树文件放置在/arch/arm/boot/dts中,该文件夹有一个Makefile,其中定义了设备树的编译条件。如下图所示:
    设备树与platform
  2. 根据编译内核时不同的.config定义来编译指定的设备树文件,如/arch/arm/configs/s3c6400_deconfig中的设备树编译定义:
    设备树与platform
  3. 使用make dtbs命令编译
  4. 拷贝编译好的dtb文件到boot加载目录~/tftpboot
  5. 设置启动参数,set bootcmd tftp 0x410000000 uImage\; tftp 0x420000000 xxx.dtb\; bootm 0x41000000 - 0x42000000。可在uboot中使用pri打印环境信息看到。

内核如何加载dtb

DTS语法

设备树的编程接口和方法