深入描述dts和dtsi的区别
QA:dts和dtsi的区别
在嵌入式 Linux 系统中,DTS(Device Tree Source)和 DTSI(Device Tree Source Include)是描述硬件设备树的文件格式。它们本质上是同一种语法的文件,但在使用上有一定区别。以下是两者的主要差异和用途:
1. 文件类型和用途
-
DTS (Device Tree Source)
DTS 文件是设备树的主文件,描述了一个具体设备或板子的硬件配置。每个具体的硬件设备都会有一个对应的 DTS 文件,它是系统用来解析设备硬件结构的主要输入。
例如:board.dts
。 -
DTSI (Device Tree Source Include)
DTSI 文件是设备树的包含文件,通常是一个共享的硬件描述片段,供多个 DTS 文件引用。DTSI 文件中定义的是通用或模块化的硬件配置,目的是实现代码复用。
例如:chip.dtsi
。
2. 内容层次
-
DTS
通常定义特定板级硬件相关的配置,例如 GPIO 引脚分配、外设启用等。/dts-v1/; /include/ "chip.dtsi"/ {model = "Custom Board";compatible = "custom,board";aliases {serial0 = &uart0;};chosen {stdout-path = &uart0;}; };
-
DTSI
通常定义 SoC(芯片)级或通用硬件部分的配置,适用于多个设备树文件。/dts-v1/;/ {soc {uart0: serial@10000000 {compatible = "ns16550";reg = <0x10000000 0x1000>;clock-frequency = <24000000>;};}; };
3. 继承和覆盖
DTS 文件通过 /include/
指令包含 DTSI 文件中的内容,然后可以覆盖其中的属性。
例如:
- 在
chip.dtsi
中定义了 UART 外设; - 在
board.dts
中可以基于chip.dtsi
,启用或修改 UART 的配置。
继承示例
chip.dtsi
:
/include/ "chip.dtsi"&uart0 {status = "okay"; // 覆盖为启用
};
board.dts
:
/include/ "chip.dtsi"&uart0 {status = "okay"; // 覆盖为启用
};
4. 文件组织
- DTSI 通常由芯片厂商或 SoC 开发人员提供,用于定义通用部分,例如 CPU、外设等。
- DTS 通常由板级开发人员创建,用于描述特定开发板或产品的具体硬件配置。
5. 总结对比
属性 | DTS | DTSI |
---|---|---|
用途 | 定义具体设备或板级配置 | 定义共享或通用硬件配置 |
作用 | 具体化设备树描述 | 模块化、复用 |
包含关系 | 可引用多个 DTSI 文件 | 通常不引用其他文件 |
适用范围 | 针对单个设备/板子 | 针对芯片级或通用配置 |
通过这种分层结构,可以实现设备树文件的模块化和复用,从而简化开发和维护工作。
QA:如果我是板级工程师,那么我不应该修改dtsi文件,而是只能新增或者修改dts文件?
是的,作为板级工程师,一般不建议直接修改 DTSI 文件,而是通过新增或修改 DTS 文件来完成硬件描述。这样做的原因如下:
为什么不建议修改 DTSI 文件?
-
DTSI 文件通常由芯片厂商或 BSP 提供
- DTSI 文件一般描述的是芯片级(SoC 级)的硬件资源和特性,这些内容是通用的,适用于多种不同的开发板或设备。修改 DTSI 可能会影响其他使用相同芯片的项目。
- 如果您修改了 DTSI 文件,在后续升级厂商提供的 BSP(Board Support Package)时,可能会导致冲突,甚至丢失修改内容。
-
分层设计的目的
- DTSI 文件的作用是描述通用硬件资源,而 DTS 文件是为具体板级定制的。通过继承和覆盖,可以避免直接修改通用内容,从而维护良好的分层结构。
-
方便维护和协作
- 当多个工程师协作开发时,如果每个人都能随意修改 DTSI 文件,会导致难以追踪改动来源,增加协作复杂度。
- 如果只修改 DTS 文件,改动是板级特有的,容易维护和调试。
正确的做法:通过 DTS 文件实现定制化
如果需要在板级启用或修改某些硬件资源,可以在 DTS 文件中通过继承和覆盖的方式实现。以下是常见情况的处理方式:
1. 启用某些外设
DTSI 文件中通常将外设状态设置为 "disabled"
,您可以在 DTS 文件中将其改为 "okay"
。
/include/ "chip.dtsi"&uart0 {status = "okay"; // 启用 UART0pinctrl-names = "default";pinctrl-0 = <&uart0_pins>;
};
2. 添加板级特有的外设
如果板子上有芯片厂商未定义的外设,比如额外的传感器或定制模块,可以直接在 DTS 文件中新增节点,而无需修改 DTSI 文件。
&i2c1 {status = "okay";temp_sensor@48 {compatible = "mycompany,temp-sensor";reg = <0x48>;};
};
3. 覆盖特定配置
如果板级需要调整某些硬件资源(例如 GPIO 引脚或时钟频率),可以在 DTS 中覆盖 DTSI 的默认配置:
&spi0 {status = "okay";cs-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; // 修改片选引脚
};
如果修改 DTSI 是必需的情况
尽管一般不建议修改 DTSI 文件,但在以下情况下,可以考虑调整:
-
厂商提供的 DTSI 文件存在错误
如果您确认芯片厂商的 DTSI 文件有问题(如硬件地址或属性错误),可以修复后在项目内使用。 -
特定项目的定制需求
如果您确定该 DTSI 文件仅用于当前项目,且不会影响其他设备或板子,可以直接修改,但需要清楚记录原因。 -
实验性调试
如果某些问题需要快速验证,您可以临时修改 DTSI,但在正式实现时应将更改移到 DTS 文件中。
总结建议
- 优先修改 DTS 文件:通过覆盖或新增节点实现板级定制。
- 尽量避免修改 DTSI 文件:保持芯片级硬件描述的通用性。
- 如需修改 DTSI 文件:确保原因充分,并明确记录,以便后续维护。
通过这种方式,可以既满足项目需求,又维持代码的模块化和可维护性。
QA:有人说dts和dtsi的关系就像.c文件和.h文件的include关系。这样的说法准确吗?
网上将 DTS 和 DTSI 的关系类比为 .c 文件和 .h 文件的关系,并不完全准确。这种类比可能有助于初学者快速理解它们的引用方式,但实际上两者的作用和结构存在显著差异。
为什么类比不准确?
1. .h 文件与 .c 文件的分工明确
- .h 文件:主要是接口声明,定义函数、变量或结构体的原型。它不包含具体实现。
- .c 文件:主要是实现具体功能,编写函数的逻辑代码。
这种分工明确的方式在 DTS 和 DTSI 中并不存在,因为 DTSI 文件不仅包含“声明”内容,还包含许多具体配置(属性和硬件节点),可以直接被系统解析和使用。
2. DTSI 文件包含具体实现
DTSI 文件并不是简单的“声明文件”,而是包含大量具体硬件配置。例如:
uart0: serial@10000000 {compatible = "ns16550";reg = <0x10000000 0x1000>;clock-frequency = <24000000>;status = "disabled";
};
以上代码实际上已经定义了 UART 的硬件地址、寄存器大小和时钟频率,这些是完整的硬件描述,直接参与设备树解析,并非简单的“接口声明”。
3. DTS 和 DTSI 的关系是“继承与覆盖”
DTS 文件从 DTSI 文件中“继承”节点配置,并可以通过覆盖来调整具体的属性值。这种行为更接近面向对象编程中的“继承”关系,而不是简单的“引用”关系。
更贴切的类比是什么?
将 DTSI 比作一个“父类”或“模板”,将 DTS 比作一个“子类”可能更恰当:
- DTSI 定义了通用的硬件节点和默认配置,相当于父类提供的通用功能和默认属性。
- DTS 则在继承 DTSI 内容的基础上,进一步细化或修改配置,相当于子类对父类进行扩展或覆盖。
示例(继承与覆盖关系)
// chip.dtsi
soc {uart0: serial@10000000 {compatible = "ns16550";reg = <0x10000000 0x1000>;clock-frequency = <24000000>;status = "disabled"; // 默认禁用};
};
// board.dts
/include/ "chip.dtsi"&uart0 {status = "okay"; // 覆盖为启用
};
在这个例子中:
chip.dtsi
定义了通用的 UART 硬件节点和属性;board.dts
继承了chip.dtsi
中的内容,并根据具体板级需求调整状态。
总结:为什么网上的类比有局限性?
- DTSI 文件不仅仅是“声明”性质,它包含具体实现,而 .h 文件不包含实现。
- DTS 文件不是从零开始实现所有功能,而是基于 DTSI 的内容进行扩展或覆盖。
- 它们的关系更接近“模板(父类)”与“实例(子类)”,而不是“接口与实现”。
因此,用 继承与覆盖 来描述 DTS 和 DTSI 的关系,比简单的 .c
和 .h
文件类比更准确,也更符合设备树的实际用法。
相关文章:
深入描述dts和dtsi的区别
QA:dts和dtsi的区别 在嵌入式 Linux 系统中,DTS(Device Tree Source)和 DTSI(Device Tree Source Include)是描述硬件设备树的文件格式。它们本质上是同一种语法的文件,但在使用上有一定区别。…...
京准时钟:一种北斗卫星校时器的结构设计
京准时钟:一种北斗卫星校时器的结构设计 京准时钟:一种北斗卫星校时器的结构设计 1、有关时间的一些基本概念: 时间与频率之间互为倒数关系,两者密不可分,时间标准的基础是频率标准,由晶体振荡器决定时间…...

【WiFi】ubuntu20.4 WiFi6 无线抓包环境搭建及使用
环境说明 笔记本电脑,无线网卡AX200,安装ubuntu20.04 安装无线网卡工具aircrack-ng sudo apt-get install aircrack-ng 安装wireshark sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt -y install wireshark sudo apt -…...

《Java核心技术 卷I》用户界面AWT事件继承层次
AWT事件继承层次 EventObject类有一个子类AWTEvent,它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象,都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件:表示用户的动作事件&…...
蓝牙 HFP 协议详解及 Android 实现
文章目录 前言一、什么是蓝牙 HFP 协议?HFP 的核心功能HFP 的核心功能HFP 在 Android 中的典型应用场景 二、HFP 协议的工作流程HFP 的连接流程 三、HFP 在 Android 的实现1. 检查蓝牙适配器状态2. 发现并检测支持 HFP 的设备3. 获取 BluetoothHeadset 服务4. 连接设…...

sqli-labs靶场17-20关(每日四关)持续更新!!!
Less-17 打开靶场,发现页面比之前多了一行字 翻译过来就是,密码重置,大家肯定会想到,自己平时在日常生活中怎么密码重置,肯定是输入自己的用户名,输入旧密码,输入新密码就可以了,但…...

动态规划-完全背包问题——518.零钱兑换II
1.题目解析 建议先看 322.零钱兑换可以 更加轻松的理解本题 题目来源 518.零钱兑换——力扣 测试用例 2.算法原理 1.状态表示 本题要求返回所有情况,所以dp值就代表所有的方法数,即 dp[i][j]:在[1,i]个硬币中选择不同面值的硬币,…...
[模板总结] - 单向链表LinkedList操作
题目汇总 Leetcode 21, 82, 160, 206, 237, 268 Leetcode 21. 合并两个有序链表 归并排序的思路,创建一个哨兵节点从两个链表中按大小插入即可。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(…...

fastadmin多个表crud连表操作步骤
1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…...

山西省网络建设与运维第十八届职业院校技能大赛(样题)
集团计划把部分业务由原有的 X86 架构服务器 上迁移到 ARM 架构服务器上,同时根据目前的部分业务需求进行了部分 调整和优化。 一、 X86 架构计算机安装与管理 1、PC1系统为 ubuntu-desktop-amd64 系统,登录用户为 xiao,密码为 Key-1122。在对…...

服务端高并发分布式结构进阶之路
序言 在技术求知的旅途中,鉴于多数读者缺乏在中大型系统实践中的亲身体验,难以从宏观角度把握某些概念,因此,本文特选取“电子商务应用”作为实例,详细阐述从百级至千万级并发场景下服务端架构的逐步演变历程。同时&am…...
分布式微服务项目,同一个controller不同方法间的转发导致cookie丢失,报错null pointer异常
源码: /***添加商品进入购物车*/ GetMapping("/addToCart") public String addToCart(RequestParam("num") Integer num, RequestParam("skuId") Long skuId, RedirectAttributes redirectAttributes) {System.out.println("nu…...

STM32 ADC --- 任意单通道采样
STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改:应用 使用cubeMX生成HAL工程 需求:有多个通道需要进行ADC采样,实现每次采样只采样一个通道,且可以随时采样不同通道的功能。 cubeMX配置 这里我们…...

vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-
1.前提: VScode中的git组件执行任何合并动作的时候需要提交远程合并的commit信息,然后编辑器自动打开的是nano文本编辑器 2.nano编辑器说明: 1.保存文件:按 Ctrl O,然后按 Enter 来保存文件。 2.退出编辑器…...

蓝桥杯每日真题 - 第7天
题目:(爬山) 题目描述(X届 C&C B组X题) 解题思路: 前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组 a,其中 a[i] 表示从第 1 个元素到第 i 个元素的…...
【Git】Git Clone 指定自定义文件夹名称:详尽指南
目录 引言一、git clone 基本语法二、默认行为:没有指定文件夹名称时三、如何指定自定义文件夹名称四、高级使用技巧:动态文件夹名称4.1 基于日期命名文件夹4.2 基于版本标签(Tag)动态命名文件夹4.1 基于日期命名文件夹4.2 基于版…...
终端快捷键学习笔记
以下是优化润色后的内容: 终端快捷键学习笔记 前言 终端(Terminal)是开发者、系统管理员以及技术人员常用的重要工具,它为我们提供了直接与操作系统交互的方式。不同操作系统中的终端使用体验存在差异,尤其在 Linux、…...
Go语言24小时极速学习教程(四)MySQL数据库的增删改查
通过前几篇想必你已经知道该如何使用Go语言写一些简单的程序了,那么从这一篇开始,我们开始探究如何用go语言能够写真正的企业级应用。第一步我们实现先能让程序对数据库进行增删改查,这里以MySQL为例。 1. 导入必要的包 首先需要导入databa…...

04 - Clickhouse-21.7.3.14-2单机版安装
目录 一、准备工作 1、确定防火墙处于关闭状态 2、CentOS 取消打开文件数限制 3、安装依赖 4、CentOS取消SELINUX 二、单机安装 2.1、下载安装 2.2、安装这4个rpm包 2.3、修改配置文件 2.4、启动服务 2.5、关闭开机自启 2.6、使用Client连接server 一、准备工作 1…...

多项式回归
以多元线性回归和特征工程的思想来想出一种称为多项式回归的新算法,它可以让您拟合曲线,非线性函数,您的数据。假设你有一个住房看起来像这样的数据集,其中特征x是以平方英尺为单位的大小。它看起来不像一条直线非常适合这个数据集…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...