T5 设备树
Posted MHDSG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T5 设备树相关的知识,希望对你有一定的参考价值。
1.设备树
1.1设备树引入背景
-
Linux社区的大牛们参考了PowerPC等体系架构中使用的Flattened Device Tree(FDT),也采用了Device Tree结构,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码
-
设备树是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码
-
设备树由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在设备树中,可描述的信息包括(原先这些信息大多被hard code到kernel中):
- CPU的数量和类别
- 内存基地址和大小
- 总线和桥
- 外设连接
- 中断控制器和中断使用情况
- GPIO控制器和GPIO使用情况
- Clock控制器和Clock使用情况
- 一句话,设备树的引入是为了给内核瘦身
1.2设备树组成
- 设备树文件分为dts和bindings
bindings:设备树用到的所有宏定义都放到bingings目录下
dts:分为dts与dtsi文件,dts是板级文件(xx开发板,如itop4412开发板),dtsi是平台文件(某样板文件,如exynos4412平台)
Tips:使用文档在Documentation/devicetree/下面
- 最终在内核根目录下执行
make dtbs
命令将dts文件编译生成dtb文件
1.3设备树源码分析
- 首先打开板级文件(itop4412开发板)
exynos4412-itop-elite.dts
,如下.其中包含平台文件exynos4412-itop-scp-core.dtsi
//宏定义bindings
#include <dt-bindings/pwm/pwm.h>
#include <dt-bindings/sound/samsung-i2s.h>
//平台文件
#include "exynos4412-itop-scp-core.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
...
- 打开平台文件
exynos4412-itop-scp-core.dtsi
,如下.其中描述了时钟,电源相关信息
#if 0
#include <dt-bindings/clock/samsung,s2mps11.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include "exynos4412.dtsi"
#include "exynos4412-ppmu-common.dtsi"
#include "exynos-mfc-reserved-memory.dtsi"
...
#else
//4系列,芯片厂商提供
#include "exynos4.dtsi"
//引脚相关,芯片厂商提供
#include "exynos4412-pinctrl.dtsi"
//CPU相关,芯片厂商提供
#include "exynos4-cpu-thermal.dtsi"
...
- 打开
exynos4.dtsi
文件,如下.保存设备树宏定义
#include <dt-bindings/clock/exynos4.h>
#include <dt-bindings/clock/exynos-audss-clk.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include "exynos-syscon-restart.dtsi"
...
- 打开
dt-bindings/gpio/gpio.h
,注意,其保存路径在include之下,在内核根目录下使用vim include/dt-bindings/gpio/gpio.h
指令打开如下
#ifndef _DT_BINDINGS_GPIO_GPIO_H
#define _DT_BINDINGS_GPIO_GPIO_H
/* Bit 0 express polarity */
#define GPIO_ACTIVE_HIGH 0
#define GPIO_ACTIVE_LOW 1
/* Bit 1 express single-endedness */
#define GPIO_PUSH_PULL 0
#define GPIO_SINGLE_ENDED 2
/* Bit 2 express Open drain or open source */
#define GPIO_LINE_OPEN_SOURCE 0 //开漏
#define GPIO_LINE_OPEN_DRAIN 4
/*
* Open Drain/Collector is the combination of single-ended open drain interface.
* Open Source/Emitter is the combination of single-ended open source interface.
*/
#define GPIO_OPEN_DRAIN (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN)
#define GPIO_OPEN_SOURCE (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_SOURCE)
/* Bit 3 express GPIO suspend/resume persistence */
#define GPIO_SLEEP_MAINTAIN_VALUE 0
#define GPIO_SLEEP_MAY_LOOSE_VALUE 8
#endif
1.4官方文档
/Documentation/devicetree/usage-model.txt
/Documentation/devicetree/bindings/gpio/gpio-samsung.txt
2.设备树基本构造
2.1示例
gpa0: gpio-controller@11400000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "samsung,exynos4-gpio";
reg = <0x11400000 0x20>;
#gpio-cells = <4>;
gpio-controller;
};
2.2节点与根节点
- 使用
{}
框起来的部分叫节点 /{}
在dts中最开头的位置的叫根节点- 节点的标准结构是
xxx@yyy{...};
,其中xxx是节点的名字,yyy则非必须,其值代表节点的地址(寄存器地址或者其他地址) - 节点包含属性与子节点
2.3属性
- 学习的主要部分,包含:设备树文件中属性的配置,驱动文件中调用设备树中的属性
属性包括:
compatible(类似设备名称),reg,label,gpios,pwms,status等
2.4官方文档学习
- 设备树的引入有如下三个目的
1.描述平台信息
2.运行时的配置
3.保存所有设备信息
Linux uses DT data for three major purposes:
- platform identification,
- runtime configuration, and
- device population.
- 平台信息:通过根节点的compatible属性来确认平台信息,例如
exynos4412-itop-elite.dts
设备树下根节点,描述的是该开发板是基于三星猎户座4系列下的4412芯片制作,最终开发板名称为讯为4412精英板
/ {
model = "TOPEET iTop 4412 Elite board based on Exynos4412";
compatible = "topeet,itop4412-elite", "samsung,exynos4412", "samsung,exynos4";
...
- 运行环境配置:大多数是根据chosen节点来描述,例如
chosen {
bootargs = "root=/dev/mmcblk0p2 rw rootfstype=ext4 rootdelay=1 rootwait";
stdout-path = "serial2:115200n8";
};
...
- 描述所有设备:当内核启动的时候会将设备树信息解析之后再传入内核
以上是关于T5 设备树的主要内容,如果未能解决你的问题,请参考以下文章