设备树(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文件即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue列表飞入效果

效果 实现代码 <template><div><button click"add">添加</button><TransitionGroup name"list" tag"ul"><div class"list-item" v-for"item in items" :key"item.id">{{ i…

校园水电抄表系统

校园水电抄表系统是一种现代化的水电管理方式&#xff0c;它通过高科技手段实现对校园内水电使用情况的实时监测和数据化管理&#xff0c;从而提高水电资源的利用效率&#xff0c;降低管理成本&#xff0c;为构建绿色、环保、节约型校园奠定基础。 一、系统概述 校园水电抄表…

K8S---NetworkPolicy

一、简介 在操作系统中,服务器有出口流量和入口流量,可以为服务器设置网络策略,允许哪些ip可以访问本机器的哪些端口,设置本机器可以访问哪些其他机器;在K8S系统类似,pod如同服务器,可以设置哪些其他pod可以访问本pod的哪些端口,也可以设置本pod可以访问外部哪些pod的…

力扣 | 11. 盛最多水的容器

双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…

vue动画(transition)

Vue动画&#xff08;transition&#xff09; 动画列表&#xff08;选择其中一个即可&#xff09; /* fade */ .fade-enter-active, .fade-leave-active {transition: opacity 0.28s; } ​ .fade-enter, .fade-leave-active {opacity: 0; } /* fade */ ​ /* fade-transform */…

ARP相关

ARP报文格式&#xff1a; 目的以太网地址&#xff0c;48bit&#xff0c;发送ARP请求时&#xff0c;目的以太网地址为广播MAC地址&#xff0c;即0xFF.FF.FF.FF.FF.FF。 源以太网地址&#xff0c;48bit。 帧类型&#xff0c;对于ARP请求或者应答&#xff0c;该字段的值都为0x08…

怎么剪切视频中的一部分?看完你就知道了

怎么剪切视频中的一部分&#xff1f;随着自媒体的兴起&#xff0c;越来越多的人开始关注视频编辑和后期制作。在众多自媒体平台上&#xff0c;我们经常可以看到一些精彩的短视频&#xff0c;而这些视频往往都是经过精心编辑和剪切的。那么&#xff0c;怎么剪切视频中的一部分呢…

刘阳,定格历史,守护中华文化!

2021年2月24日&#xff0c;#圆明园365张珍贵老照片#的话题凭3.7亿阅读量冲上热搜。这批时代跨越80年的老照片仿佛重启记忆的按钮&#xff0c;让人梦回“夏宫”&#xff1b;少有人知道&#xff0c;它们的拥有者&#xff0c;却是一位不折不扣的80后。 刘阳&#xff0c;土生土长北…

springboot多数据源支持自定义连接池

背景 springboot 多数据源网上的文章很多&#xff0c;但大多都是互相抄袭&#xff0c;虽然可以实现多数据源的效果&#xff0c;但都是使用的默认的连接池&#xff0c;如果盲目使用可能会导致自定义的连接池参数没生效从而引发数据库连接问题。下面是参考官方文档多数据源支持自…

制作一个Python聊天机器人

我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人&#xff0c;该库实现了各种机器学习算法来生成响应对话&#xff0c;还是挺不错的 什么是聊天机器人 聊天机器人也称为聊天机器人、机器人、人工代理等&#xff0c;基本上是由人工智能驱动的软件程序&#xff0…

情人节专属--HTML制作情人节告白爱心

💕效果展示 💕html展示 <!DOCTYPE html> <html lang="en" > <head>

基于springboot+vue的旅游网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Kotlin 类型别名

Kotlin 提供 给 已存在的类型 取 别名的功能&#xff0c;称为 类型别名&#xff08;Type Aliases&#xff09;。 语法&#xff1a; typealias <别名> <类型或函数>对 简化 长类名 和 泛型类型名 很有用&#xff0c;比如&#xff1a; typealias FileTable<K&…

Spring MVC学习之——上传文件

在Spring MVC中加入上传文件的功能 1.添加依赖 <!--文件上传--> <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version> </dependency>2.配置文件…

Java 类与对象(对象的分配机制、对象的创建过程、匿名对象)

面向对象 面向对象编程&#xff08;Object-Oriented Programming 简称 OOP&#xff09;是一种程序设计思想和编码架构。 Java 是完全面向对象的&#xff0c; 必须熟悉 OOP 才能够编写 Java 程序。 面向对象的程序是由对象组成的&#xff0c;每个对象包含对用户公开的特定功能…

深入解析与实践:Ajax异步请求在Web开发中的应用指南

一、概述 1、定义 ​ Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;异步请求是现代Web开发中不可或缺的技术组件&#xff0c;它允许网页在不刷新整个页面的情况下从服务器获取并更新数据&#xff0c;从而实现动态、流畅的交互体验。 2、异步和同步 浏览器访…

【主题广范|见刊快】2024年海洋工程与测绘遥感国际学术会议(ICOESRS 2024)

【主题广范|见刊快】2024年海洋工程与测绘遥感国际学术会议(ICOESRS 2024) 2024 International Conference Ocean Engineering and Surveying Remote Sensing(ICOESRS 2024) 一、【会议简介】 随着人类对海洋的认识和开发不断深入&#xff0c;海洋工程和测绘遥感技术的研究和应…

C生万物呀

1、快捷键 快捷键描述ctrl滚轮字体变大小ctrlKC注释ctrlKU取消注释home行首end行末 2、C语言标准库函数 stdio.h&#xff1a;包含了输入输出相关的函数&#xff0c;如printf()、scanf()、fgets()等。 stdlib.h&#xff1a;包含了通用工具函数&#xff0c;如malloc()、free()…

计数排序(线性时间排序)

背景 1954年由 Harold H. Seward 提出 基本思想&#xff1a; 假设&#xff1a;计数排序假设n个输入元素中的每一个都是介于0到k之间的整数 举例&#xff1a;10 个年龄不同的人&#xff0c;统计出有 8 个人的年龄比 A 小&#xff0c;那 A 的年龄就排在第 9 位,用这个方法可以…

本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程连接

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…