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:

  1. platform identification,
  2. runtime configuration, and
  3. 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 设备树的主要内容,如果未能解决你的问题,请参考以下文章

Linux SPI通过设备树文件添加设备

COCI2020.11 T5

2021-10-03

谷歌T5

c_cpp 快速代码片段,用于在统计(阻止)/ dev / rdsk中的设备时验证fstat64和stat64的行为。

Linux设备树语法详解