设备树(1)-设备树是什么?设备树基础概念及语法

2024-01-20 02:04

本文主要是介绍设备树(1)-设备树是什么?设备树基础概念及语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简介

设备树:device tree
DTS:设备树源码文件,采用树形结构描述板级信息,例如IIC、SPI等接口接了哪些设备
DTSI:设备树头文件,描述SOC级信息,例如几个CPU、主频多少、各个外设控制信息等
DTB:DTS编译后得到的二进制文件
DTC:设备树工具
image.png

2.设备树使用

DTC工具源码: scripts/dtc目录
DTC工具编译:make all或make dtbs

每款芯片所编译的dtb设备树二进制文件,可以在arch/arm/boot/dts/Makefile中找到,例如IMX6ULL:

dtb-$(CONFIG_SOC_IMX6ULL) += \imx6ull-14x14-ddr3-arm2.dtb \imx6ull-14x14-ddr3-arm2-adc.dtb \imx6ull-14x14-ddr3-arm2-cs42888.dtb \imx6ull-14x14-ddr3-arm2-ecspi.dtb \imx6ull-14x14-ddr3-arm2-emmc.dtb \imx6ull-14x14-ddr3-arm2-epdc.dtb \imx6ull-14x14-ddr3-arm2-flexcan2.dtb \imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \imx6ull-14x14-ddr3-arm2-lcdif.dtb \imx6ull-14x14-ddr3-arm2-ldo.dtb \imx6ull-14x14-ddr3-arm2-qspi.dtb \imx6ull-14x14-ddr3-arm2-qspi-all.dtb \imx6ull-14x14-ddr3-arm2-tsc.dtb \imx6ull-14x14-ddr3-arm2-uart2.dtb \imx6ull-14x14-ddr3-arm2-usb.dtb \imx6ull-14x14-ddr3-arm2-wm8958.dtb \imx6ull-14x14-evk.dtb \imx6ull-14x14-evk-btwifi.dtb \imx6ull-14x14-evk-emmc.dtb \imx6ull-14x14-evk-gpmi-weim.dtb \imx6ull-14x14-evk-usb-certi.dtb \imx6ull-9x9-evk.dtb \imx6ull-9x9-evk-btwifi.dtb \imx6ull-9x9-evk-ldo.dtb

当宏 CONFIG_SOC_IMX6ULL打开,则会将对应的dts文件编译为dtb文件。当实际项目开发时,如果需要新增设备树源码文件,直接加入其中即可

3.设备树语法

3.1头文件包含

#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"

3.2设备节点

label:node-name@unit-address
label:可选项。标签,如果有可以直接通过&label访问,例如&cpu0
node-name:节点名
unit-address:可选项,设备地址

3.3属性赋值

字符串/字符串列表:
compatible = “arm,cortex-a7”; compatible = “fsl,imx6ull-gpmi-nand”, “fsl, imx6ul-gpmi-nand”;
整数/整数列表:
reg = <0> reg = <0 0x123456 100>;

3.4标准属性

1) compatible 属性
兼容性属性,用于将设备和驱动绑定
compatible = " “fsl,imx6ull-gpmi-nand”; fsl代表厂商,coteimx6ull-gpmi-nand代表驱动模块名

	sound {compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

例如如上这一段,sound设备的驱动为飞思卡尔厂商,sound设备首先在内核中查找驱动名imx6ul-evk-wm8960,如果找不到则查找下一个imx-audio-wm8960。
一般驱动程序的文件中会有一个of匹配表(struct of_device_id ),保存compatible值,如果相等,则代表使用这个驱动。例如sound/soc/fsl/imx-wm8960.c中。代表使用该platform驱动

static const struct of_device_id imx_wm8960_dt_ids[] = {{ .compatible = "fsl,imx-audio-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,},.probe = imx_wm8960_probe,.remove = imx_wm8960_remove,
};
module_platform_driver(imx_wm8960_driver);

2)model属性
设备模块属性
model = “wm8960-audio”;
3)status属性
表示设备状态
status = “okay”;
image.png
4) #address-cells 和#size-cells 属性
#address-cells:代表reg属性起始地址的字长,32位机的1字长为32位
#size-cells :代表reg属性 地址长度的字长
reg:描述地址空间资源信息
reg = <0x02200000 0x100000>; 起始地址为0x02200000,地址长度为0x100000

5)ranges属性
地址映射转换表
ranges = <0x0 0xe0000000 0x00100000>;
<child-bus-address,parent-bus-address,length>
child-bus-address:子总线地址空间物理地址,父节点的#address-cells 确定此物理地址占用字长
**parent-bus-address **: 父总线地址空间的物理地址 ,父节点的#address-cells 确定此物理地址占用字长
length:子地址空间长度, 父节点的#size-cells 确定此地址长度占用字长

如果ranges属性为空,则子地址空间和父地址空间完全相同,不需要转换

soc {compatible = "simple-bus";#address-cells = <1>;#size-cells = <1>;ranges = <0x0 0xe0000000 0x00100000>;serial {device_type = "serial";compatible = "ns16550";reg = <0x4600 0x100>;clock-frequency = <0>;interrupts = <0xA 0x8>;interrupt-parent = <&ipic>;};
};

如上,则代表soc的子地址空间物理起始地址是0x0,父进程空间物理起始地址为0xe0000000,子设备节点serial串口设备节点中串口设备驱动名为ns16550,起始地址为0x4600,长度为0x100,则串口设备节点的物理地址为0xe0004600也就是寄存器可读写地址,长度为0x100。

6)name属性
记录节点名字,为字符串。

7)device_type属性
描述设备的FCode,只能用于cpu节点或者memory节点。例如device_type = “serial”;

8) 根节点 compatible 属性
匹配SOC对应的使用设备
根节点该属性设置为 compatible = “fsl,imx6ull-14x14-evk”, “fsl,imx6ull”;
arch/arm/mach-imx/mach-imx6ul.c中dt_compat的值与兼设置的容性值相等,则代表Linux内核支持此设备。若不相符,则无法正常启动Linux内核

static const char *imx6ul_dt_compat[] __initconst = {"fsl,imx6ul","fsl,imx6ull",NULL,
};DT_MACHINE_START(IMX6UL, "Freescale i.MX6 Ultralite (Device Tree)").map_io		= imx6ul_map_io,.init_irq	= imx6ul_init_irq,.init_machine	= imx6ul_init_machine,.init_late	= imx6ul_init_late,.dt_compat	= imx6ul_dt_compat,
MACHINE_END

兼容性字段匹配过程:
image.png

4.修改设备节点

设备节点追加或修改的语法格式为:

&i2c1 {/* 要追加或修改的内容 */
};

当需要新增一个硬件设备时,则相当于增加一个设备树的节点,例如在iic1硬件设备上,增加一个子节点,但同时不能影响soc级的其他设备,所以不能在共有的imx6ull.dtsi设备树头文件添加,需要有一个自己的设备树文件例如这里是:imx6ull-alientek-emmc.dts。
原先imx6ull.dtsi中的i2c1节点内容为:

i2c1: i2c@021a0000 {#address-cells = <1>;#size-cells = <0>;compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";reg = <0x021a0000 0x4000>;interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_I2C1>;status = "disabled";
};

加入新设备节点后,在imx6ull-alientek-emmc.dts中的内容为:

&i2c1 {clock-frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c1>;status = "okay";mag3110@0e {compatible = "fsl,mag3110";reg = <0x0e>;position = <2>;};ap3216c@1e {compatible = "ap3216c";reg = <0x1e>;};
};

clock-frequency:设置为100KHz
status:由disable值改为okay

至此便完成了一个设备节点独立的适配修改,重新编译并烧录dtb文件即可

这篇关于设备树(1)-设备树是什么?设备树基础概念及语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624473

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数