设备树(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

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

JavaScript装饰器从基础到实战教程

《JavaScript装饰器从基础到实战教程》装饰器是js中一种声明式语法特性,用于在不修改原始代码的情况下,动态扩展类、方法、属性或参数的行为,本文将从基础概念入手,逐步讲解装饰器的类型、用法、进阶... 目录一、装饰器基础概念1.1 什么是装饰器?1.2 装饰器的语法1.3 装饰器的执行时机二、装饰器的

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent