设备树(Device Tree)
DTS(Device Tree Source) : 描述设备树的文件
DTS文件采用 树形结构描述板级设备
如:CPU数目,内存基地址,IIC接口的设备,SPI接口的设备
树干:系统总线
树支:IIC控制器,GPIO控制器,SPI控制器,SDMMC控制器,PCI总线
IIC分 :IIC1 和 IIC2
IIC1 接 FT5206 和 AT24C02
IIC2 接 MPU6050
设备树:描述板级硬件信息的文件,扩展名:.dts
.dts:描述板级信息(IIC设备,SPI设备)
.dtsi:描述SOC级信息(CPU,主频,外设控制器)
DTS DTB DTC
DTS 是设备树源码文件
DTB 是 DTS 编译后的二进制文件
DTC 工具 编译 DTB文件
# linux-5.5.4\linux-5.5.4\scripts\dtc\Makefile
# SPDX-License-Identifier: GPL-2.0
# scripts/dtc makefile
# SPDX许可证标识符:GPL-2.0
# 脚本 /dtc 生成文件
hostprogs-y := dtc
always := $(hostprogs-y)
# DTC工具依赖编译文件 .c
dtc-objs:= dtc.o flattrree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o util.o
dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
# ...
//Linux源码根文件
make all //编译所有源码
make dtbs //编译设备树
ARM 架构的 SOC 有很多种,每个板子都有一个对应的 DTS 文件
# linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\Makefile
# SPDX-License-Identifier: GPL-2.0
dtb-$(CONFIG_ARCH_ALPINE) += \
alpine-db.dtb
dtb-$(CONFIG_MACH_ARTPEC6) += \
artpec6_devboard.dtb
dtb-$(CONFIG_MACH_ASM9260) += \
# Keep at91 dtb files sorted alphabetically for each SoC
# 为每个SoC保留91个 按字母顺序排序的dtb文件
# 德州仪器
dtb-$(CONFIG_ARCH_OMAP3) += \
am3517-craneboard.dtb \
# ...
dtb-$(CONFIG_ARCH_STM32) += \
stm32f429-disco.dtb \
#...
# 全志
dtb-$(CONFIG_MACH_SUN7I) += \
sun7i-a20-bananapi.dtb \
# ...
# 三星
dtb-$(CONFIG_ARCH_S5PV210) += \
s5pv210-aquila.dtb \
# ...
# 三星
dtb-$(CONFIG_ARCH_EXYNOS4) += \
exynos4210-origen.dtb \
# ...
# 飞思卡尔
dtb-$(CONFIG_SOC_IMX6UL) += \
imx6ul-14x14-evk.dtb \
# ...
# 德州仪器
dtb-$(CONFIG_SOC_TI81XX) += \
am3874-iceboard.dtb \
# ...
# 赛灵思
dtb-$(CONFIG_ARCH_ZYNQ) += \
zynq-cc108.dtb \
# ...
当选中 xxx SOC ,后(CONFIG_SOC_xxx=y),所有用到这个 SOC 的板子对应的 .dts 文件会编译为 .dtb
新板子,需要建 新板子 对应的.dts 文件,然后将对应的.dtb 文件名添加到 dtb-$(CONFIG_SOC_xxx)下,编译设备树时会将对应的.dts 编译为二进制的.dtb文件
DTS 语法
.dtsi 头文件
设备树支持头文件,设备树的头文件扩展名为.dtsi
//linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\s5pv210-smdkv210.dts
// SPDX-License-Identifier: GPL-2.0
/*
* Samsung's S5PV210 SoC device tree source
*
* Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
*
* Mateusz Krawczuk <[email protected]>
* Tomasz Figa <[email protected]>
*
* Board device tree source for YIC System SMDV210 board.
*
* NOTE: This file is completely based on original board file for mach-smdkv210
* available in Linux 3.15 and intends to provide equivalent level of hardware
* support. Due to lack of hardware, _no_ testing has been performed.
*/
/dts-v1/;
// #include 来引用.h .dtsi .dts 文件
#include <dt-bindings/input/input.h>
#include "s5pv210.dtsi"
//...
.dtsi 文件 描述 SOC 的内部外设信息 (CPU架构 主频 外设寄存器地址范围)
// linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\s5pv210.dtsi
// SPDX-License-Identifier: GPL-2.0
/*
* Samsung's S5PV210 SoC device tree source
*
* Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
* 版权所有(c)2013-2014三星电子有限公司
*
* Mateusz Krawczuk <[email protected]>
* Tomasz Figa <[email protected]>
*
* Samsung's S5PV210 SoC device nodes are listed in this file. S5PV210
* based board files can include this file and provide values for board specfic
* bindings.
* 三星的S5PV210 SoC设备节点列在这个文件中
* 基于S5PV210的板文件可以包含此文件并为板特定绑定提供值
*
* Note: This file does not include device nodes for all the controllers in
* S5PV210 SoC. As device tree coverage for S5PV210 increases, additional
* nodes can be added to this file.
* 注意:此文件不包括S5PV210 SoC中所有控制器的设备节点
* 随着S5PV210的设备树覆盖率的增加,可以向该文件添加额外的节点
*/
#include <dt-bindings/clock/s5pv210.h>
#include <dt-bindings/clock/s5pv210-audss.h>
/ { // 根节点 /
#address-cells = <1>;
#size-cells = <1>;
aliases { //子节点
csis0 = &csis0;
//...
};
cpus { //子节点
#address-cells = <1>;
#size-cells = <0>;
cpu@0 { // cpus 的子节点
device_type = "cpu";
compatible = "arm,cortex-a8"; //架构信息
// reg 属性为 0,数据形式:32 位无符号整数
reg = <0>;
};
};
soc {
// : 前为 节点标签(label)
// :后为 节点名 是 ASCII 字符串
// @ 后为 设备的地址 或 寄存器首地址
// 可 &spi0 访问该节点
spi0: spi@e1300000 {
// compatible 属性为 "samsung,s5pv210-spi",数据形式:字符串
compatible = "samsung,s5pv210-spi";
// reg属性为 一组值
reg = <0xe1300000 0x1000>;
interrupt-parent = <&vic1>;
interrupts = <15>;
dmas = <&pdma0 7>, <&pdma0 6>;
dma-names = "tx", "rx";
clocks = <&clocks SCLK_SPI0>, <&clocks CLK_SPI0>;
clock-names = "spi", "spi_busclk0";
pinctrl-names = "default";
pinctrl-0 = <&spi0_bus>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
};
//...
};
#include "s5pv210-pinctrl.dtsi"
标准属性
节点是很多属性组成,节点是具体的设备
不同的设备有属性不同,用户可自定义属性
compatible 属性
static const struct of_device_id imx_wm8960_dt_ids[] = //匹配表
{
{
// compatible 属性 也叫 “兼容性”属性
// compatible 属性将 设备 和 驱动 绑定起来
// 厂商:fsl
// 驱动名字:imx-dudio-wm8960
.compatible = "fsl, imx-dudio-wm8960", //配置值
},
{
/*sentinel*/
}
};
MODULE_DEVICE_TABLE(of, imx_wm8960_dt_ids);
static struct platform_driver imx_wm8960_driver =
{
.driver =
{
.name = "imx-wm8960",
.pm = &snd_soc_pm_ops,
.of_match_table = imx_wm8960_dt_ids, //platform_driver驱动模式,使用OF匹配表
},
.probe = imx_wm8960_probe,
.remore = imx_wm8960_remore,
};
model属性
model = "wm8960-audio"; //设备模块信息
status 属性
表示 设备的状态信息
值 | 描述 |
“okay” | 设备可操作 |
"disabled" | 设备不可操作,具体看设备绑定文件 |
"fail" | 设备不可操作,检测一系列的错误 |
"fail-sss" | sss:检测错误内容 |
#address-cells #size-cells 属性