设备树(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;为构建绿色、环保、节约型校园奠定基础。 一、系统概述 校园水电抄表…

力扣 | 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;}双指针解法…

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;土生土长北…

制作一个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项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

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、异步和同步 浏览器访…

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

背景 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等…

通讯录管理系统

文章目录 1.系统需求2.创建项目3.菜单功能4.退出功能实现5.添加联系人5.1设计联系人结构体5.2设计通讯录结构体5.3main函数中创建通讯录 6.显示联系人6.1封装显示联系人函数6.2测试显示联系人功能 7.删除联系人7.1封装检测联系人是否存在7.2封装删除联系人函数7.3测试删除联系人…

学习【Git项目管理工具】这一篇就够了

目录 1. Git概述2. Git代码托管服务3. Git常用命令3-1. Git全局配置设置用户信息查看配置信息 3-2. 获取Git仓库本地初始化仓库克隆远程仓库 3-3. 基本概念工作区文件状态 3-4. 本地仓库操作git reset 操作 3-5. 远程仓库操作查看远程仓库添加远程仓库推送远程仓库拉取远程仓库…

实战之-Redis商户查询缓存

一、什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器",防止过高…

AWTK 开源智能串口屏方案视频介绍

强大的界面设计器 AWStudio。 基于 AWTK 实现强大的 GUI 功能&#xff08;多窗口、输入法、动画和各种控件&#xff09;。 基于 AWTK-MVVM 实现低代码开发&#xff08;编写绑定规则即可实现常见应用程序&#xff09;。 支持在 PC 上模拟运行&#xff0c;并提供 MCU 模拟器模…

SRC实战 | EDU通用漏洞分享

本文由掌控安全学院 - 叴龙 投稿 又是没事干的一天&#xff0c;写一下之前挖的两个通用漏洞。 1.信息搜集 首先就是信息搜集&#xff0c;挖edu没账号怎么办呢&#xff1f;sg不行&#xff0c;咱就找能自己注册的站。 Hunter&#xff1a;web.title”XX大学”&&web.bod…

2024 Google material-design-icons助力你创建更好的Material风格应用

2024 Google material-design-icons助力你创建更好的Material风格应用 Material Icons / Material Symbols 这是谷歌推出的两个不同的官方图标集&#xff0c;它们使用相同的基础设计。Material Icons是经典的图标集&#xff0c;而Material Symbols是在2022年4月引入的&#x…

Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile 我们首先需要知道的是&#xff0c;make是一个命令&#xff0c;Makefile是一个文件&#xff0c;Makefile中包含了依赖关系和依赖方法。 从上面的文件以及指令中我们可以看到&#xff0c;我们可以在Makefile文件中写入依赖关系以及对应的依赖方法&…