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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试中问你查看日志的命令,可不能只说tail,cat,more

首选&#xff0c;如何查看日志&#xff1a; 很多初级测试人员&#xff0c;在进行执行测试用例这个步骤时&#xff0c;发现bug&#xff0c;不能更加的准确去定位bug&#xff0c;在这样的情况下就可以打开Linux服务器&#xff0c;敲命令查看操作进行中的实时日志&#xff0c;当系…

内网穿透Neutrino-Proxy, 中微子代理

中微子代理&#xff08;neutrino-proxy&#xff09;是一个基于netty的、开源的java内网穿透项目。技术栈&#xff1a;Solon、MybatisPlus、Netty遵循MIT许可&#xff0c;因此您可以对它进行复制、修改、传播并用于任何个人或商业行为。官网地址1&#xff1a;https://neutrino-p…

【干货】散射光场调控方法及应用

摘要&#xff1a;散射是一种在自然界中普遍存在的现象&#xff0c;散射光场调控的研究在光学成像、光通信、非线性光学、量子光学、生物医疗等领域具有极其重要的科学意义和应用价值。波前整形方法可以改变入射光的相位模式分布来补偿由于散射引起的相位畸变&#xff0c;使得散…

图片太模糊我们怎么提高清晰度呢

在数字时代&#xff0c;图片是我们日常生活中不可或缺的一部分。然而&#xff0c;有时候由于各种原因&#xff0c;我们得到的图片清晰度可能并不理想。这篇文章将介绍三款软件&#xff0c;帮助你提高图片的清晰度&#xff0c;让你的图片更加生动、清晰。 一、水印云 水印云是…

慢查询定位

慢查询 使用工具 mysql自带慢日志 默认没有开启需要手动开启 查看慢日志中的文件 总结

Go 爬虫之 colly 从入门到不放弃指南

文章目录 概要介绍如何学习官方文档如何安装快速开始如何配置调试分布式代理层面执行层面存储层面存储多收集器配置优化持久化存储启用异步加快任务执行禁止或限制 KeepAlive 连接扩展总结如果想用 GO 实现爬虫能力,该如何做呢?抽时间研究了 Go 的一款爬虫框架 colly。 概要…

实战讲解|Trino 在袋鼠云数栈的探索与实践

当前随着企业内外部数据源的不断扩展和积累&#xff0c;数据呈现出大规模、多样化、质量参差不齐等显著特征。如何有效激活这些结构复杂且类型多样的数据资产&#xff0c;挖掘其深层价值&#xff0c;已成为众多企业亟待解决的实际挑战。 袋鼠云数栈作为新一代一站式大数据基础…

【分布式监控】zabbix与grafana连接

1.在zabbix- server服务端安装grafana&#xff0c;并启动服务 先在官网下载软件 https://grafana.com/grafana/download/9.4.7?editionenterprise&pggraf&plcmtdeploy-box-1#可以翻译成中文介绍&#xff0c;很详细的教程 yum install -y https://dl.grafana.com/ent…

SDL2 连续帧图像显示

QT使用SDL多窗口显示视频&#xff08;linux&#xff0c;ubuntu&#xff09;_linux qt sdl-CSDN博客 QT使用SDL播放YUV视频 - C - QT SDL调用OPENGL渲染图像 - C - 心得 C 使用SDL显示RGB图像数据_c sdl-CSDN博客 SDL库入门&#xff1a;掌握跨平台游戏开发和多媒体编程_sdl开…

MySQL篇—性能压测工具mysqlslap介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

gh0st远程控制——客户端界面编写(一)

1、新建一个基于对话框的MFC程序 ghost内核对unicode支持不好&#xff0c;所以不要勾选 在静态库使用MFC有助于我们的代码供别人使用 2、设置窗口可最大最小化 对话框 》右键属性 3、 为对话框添加列表 一个代表列表框架&#xff0c;一个代表日志框架 分别为2个控件添加唯…

SQL Povit函数使用及实例

PIVOT函数常用于数据的行转列&#xff0c;同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下&#xff1a; -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…

Maxwell介绍

一、介绍 介绍&#xff1a;它读取MySQL binlog并将数据更改作为JSON写入Kafka、Kinesis和其他流媒体平台&#xff08;目前支持&#xff1a;kafka、RabbitMQ、Redis、file、Kinesis、Nats、Google Cloud Pub/Sub、Google Cloud Bigquery、SNS&#xff09; 版本&#xff1a;从v1.…

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen问题

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen 问题 1. 问题复现 在近期公司使用模拟器(网易MuMu)进行项目演示时&#xff0c;在进入存在百度地图(Android版本 7.4.2版本)之后&#xff0c;页面出现奔溃&#xff0c;后台日志为&#xf…

域环境权限提升

Windows系统配置错误 在Windows系统中&#xff0c;攻击者通常会通过系统内核溢出漏来提权&#xff0c;但是如果碰到无法通过系统内核溢出漏洞法国提取所在服务器权限的情况&#xff0c;就会系统中的配置错误来提权。Windows系统中常见哦欸之错误包括管理员凭证配置错误&#x…

Linux7 安装 Oracle 19C RAC 详细图文教程

实战篇&#xff1a;Linux7 安装 Oracle 19C RAC 详细图文教程 本文是按照&#xff1a;https://www.modb.pro/db/154424的思路进行编写 一、安装前规划 安装RAC前&#xff0c;当然要先做好规划。具体包含以下几方面&#xff1a; 节点主机版本主机名实例名Grid/Oracle版本Publi…

【论文简介】个性化真实人像生成方法(2024.01.15发布,即将开源)

零样本身份保留生成方法&#xff1a;声称效果好于PhotoMaker&#xff08;即将开源&#xff09; 2401.InstantID: Zero-shot Identity-Preserving Generation in Seconds &#xff1a; 项目主页&#xff1a;https://instantid.github.io/ 一、简介 本文的主要内容是介绍了一种…

【MATLAB】SVMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SVMD-LSTM神经网络时序预测算法是一种结合了单变量经验模态分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09…

十年很短,编程很难

前天冲浪看到的一篇文章&#xff0c;深有感触&#xff0c;翻译给大家一起看看吧 许多年前&#xff0c;当我仍是一名主修计算机科学的高年级学生时&#xff0c;我整天浏览各种在线招聘信息&#xff0c;希望能找到适合程序员的实习职位 除了实习职位&#xff0c;我偶尔也会点击一…

统计学R语言实验8 :线性回归

统计学R语言实验8 &#xff1a;线性回归 一、实验目的 1. 掌握理解线性回归的相关概念。 2. 掌握理解线性回归的相关方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 完成教材P132的第2题 散点图 将 shouru 向量作为 x 轴&#xff0c;zhichu 向量作为 y 轴…