设备树引入

一、设备树的基本知识

1、什么是设备树?为什么会有设备树?

        2011年,Linux之父Linus Torvalds发现这个问题后,就通过邮件向ARM-Linux开发社区发了一封邮件,不禁的发出了一句“This whole ARM thing is a f*cking pain in the ass”。之后ARM Linux社区引入了设备树。为什么LinusTorvalds会爆粗口呢?
        平台总线模型是把驱动分成了俩个部分,一部分是device,一部分是driver,设备信息和驱动分离这个设计非常的好。device部分是描述硬件的。一般device部分的代码会放在内核源码中arch/arm/plat-xxx和arch/arm/mach-xxx下面。但是随着Linux支持的硬件越来越多,在内核源码下关于硬件描述的代码也越来越多。并且每修改一下就要编译一次内核。长此以往Linux内核里面就存在了大量“垃圾代码”,而且非常多,这里说的“垃圾代码”是关于对硬件描述的代码。从长远看,这些代码对Linux内核本身并没有帮助,所以相当于Linux内核是“垃圾代码”。但是并不是说平台总线这种方法不好。

        为了解决这个问题,设备树就被引入到了Linux上。使用设备树来剔除相对内核来说的“垃圾代码”,既用设备树来描述硬件信息,用来替代原来的device部分的代码。虽然用设备树替换了原来的device部分,但是平台总线模型的匹配和使用基本不变。并且对硬件修改以后不必重新编译内核。直接需要将设备树文件编译成二进制文件,在通过bootloader传递给内核即可。

        所以设备树就是用来描述硬件资源的文件

2、设备树的基本概念

①为什么叫设备树?

设备树是描述硬件的文本文件,因为语法结构像树一样。所以叫设备树.

如下图:

②基本名词解释

<1>DT:DeviceTree //设备树
<2>FDT:Flattened Device Tree //开放设备树,起源于OpenFirmware(OF)
<3>DTS:DeviceTree source的缩写 //设备树源码
<4>DTSI:DeviceTree sourcein Clude的缩写 //通用的设备树源码
<5>DTB:DeviceTree Blob的缩写 //编译设备树源码得到的文件
<6>DTC:DeviceTree Compiler的缩写 //设备树编译器

DTS、DTSI、DTC、DTB之间的关系:

Linux内核通过读取设备树的描述文件(通常是.dtb或.dts文件),来构建一个内存中的表示,内核和驱动程序则使用这个表示来识别和配置硬件设备。设备树文件在编译时从设备树源文件(.dts)转换成二进制形式(.dtb),然后通常被包含在内核映像或者作为独立文件提供给引导加载程序

补充:

dts    

dts文件是一种ASCII文本格式的设备树描述文件,此文件适合人类阅读,主要是给用户看的。 硬件的相应信息都会写在.dts为后缀的文件中,每一款硬件可以单独写一份xxxx.dts,一般在Linux源码中存在大量的dts文件,对于 arm 架构可以在arch/arm/boot/dts找到相应的dts。对于rk3399开发板arch/arm/boot/dts/rk3399-nanopi4-common.dtsi中一般会包含一个公共部分的dtsi文件,如下:#include "rk3399-nanopi4-rkisp1.dtsi"

dtsi    

对于一些相同的dts配置可以抽象到dtsi文件中,然后类似于 C 语言的方式可以include到dts文件中

二、编译设备树 (DTC编译器的使用)

DTC编译器命令格式

编译设备树:dtc -I dts -O dtb -o xxx.dtb xxx.dts
反编译设备树:dtc -I dtb -O dts -o xxx.dts xxx.dtb

三、设备树的基本语法

1、设备树根节点

根节点是设备树必须要包含的节点。根节点的名字是/。

/dts-v1/;      //第一行表示dts文件的版本
/{                //根节点
};

2、设备树子节点格式

格式:

label: node-name @unit-address{
        properties definitions
        child nodes

};

举例:

nodel{                        //子节点,节点名称为nodel
        nodel_child{                //子子节点,节点名称为nodel_child

        }
};

注意:同级节点下节点名称不能相同。不通级节点名称可以相同  

3、节点名称

在对节点进行命名的时候,一般要体现设备的类型,比如网口一般命名成ethernet,串口一般命名成uart,对于名称一般要遵循下面的命令格式。
格式:标签:名称@<设备地址>
其中,[标签]和[@<设备地址>]是可选项,<名称>是必选项。另外,这里的设备地址没有实际意义,只是让节点名称更人性化,更方便阅读。
举例:
uart: serial@02288000
其中,uart就是这个节点标签,也叫别名,serial@02288000就是节点名称。 

4、reg属性

reg属性可以来描述地址信息。比如寄存器的地址。
reg属性的格式如下:
reg =<address1 length1 address2 length2 address3 length3...>
举例:
reg= <0x02200000 0x4000>;

reg= <x022000000x4000
          0x02205000 0x4000>;

5、#address-cell和#size-cells属性

#address-cell和#size-cells用来描述子节点中的reg信息中的地址和长度信息
举例:

nodel{
        #address-cells = <1>;
        #size-cells = <0>;
   nodel-child {
           reg = <0>;

        };

};

6、model属性

model属性的值是一个字符串,一般用model描述一些信息。比如设备的名称,名字等。
举例1:
model ="wm8960-audio”;
举例2:
model = "This is Linux board";

7、status属性

status属性是和设备的状态有关系的,status的属性值是字符串。属性值有下面几个状态可选:

8、compatible属性

compatible属性是非常重要的一个属性。compatible是用来和驱动进行匹配的,匹配成功以后
会执行驱动中的probe函数。

举例:
compatible ="xunwei”, "xunwei-board";
在匹配的时候会先使用第一个值xunwei进行匹配,如果没有就会使用第二个值xunwei-board进行匹配。

示例:

9、设备树特殊节点

aliases

        特殊节点aliases用来定义别名。定义别名的目的就是为了方便引用节点。当然,除了使用aliases来命名别用,也可以在对节点命名的适合添加标签来命名别名。
举例:

aliases{
        mmc0 = &sdmmc0;
        mmcl = &sdmmcl;
        mmc2 = &sdhci;
        serial0 ="/simple@fe000000/serial@llc500”;

};

chosen

chosen节点用来uboot给内核传递参数。重点是bootargs参数。chosen节点必须是根节点的子节点
举例:

chosen{
        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200”; 

}

device_type属性

在某些设备树文件中,可以看到device_type属性,device_type属性的值是字符串,只用于cpu节点或者memory节点进行描述。
举例1:

memory@30000000{
        device_type =“memory”;
        reg =<0x30000000    0x4000000>;

 举例2:

cpu1: cpu@1{
        device_type = "cpu”;
        compatible = "arm,cortex-a35″, "arm, armv8”;
        reg = <0x0  0x1>;

};

自定义属性

设备树中规定的属性有时候并不能满足我们的需求,这时候我们可以自定义属性。
举例:

自定义一个管脚标号的属性pinnum。
pinnum = <0 1 2 3 4>; 

示例:

 

四、DTS基本框架

设备树由一系列被命名的节点(Node)和属性(Property)组成,而节点本身可包含子节点。在设备树中,可描述的信息包括:

·  CPU的数量和类别。

·  内存基地址和大小。

·  总线和桥。

·  外设连接。

·  中断控制器和中断使用情况。

·  GPIO控制器和GPIO使用情况。

·  时钟控制器和时钟使用情况。

基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。

//一级节点:会展开成platfor_device

//内核会把这个节点展开成平台设备,设备名是ff720000.xyd-leds

补充:增加设备树属性信息,可以自动生成设备端代码。

对平台设备驱动模型来说,平台设备代码(platform_device.c)不需要实现,被设备树中设备文件所替代了。

如何添加设备树?

以rk3399作为例子

kernel-rockchip-nanopi4-linux-v4.4.y/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi

需要添加的硬件资源:

xyd-leds@FF720000{

     compatible="xyd-rk3399-leds";

     reg=<0x0 0xFF720000 0x0 0x10000>;

     reg-names="gpio0-reg-for-leds";

     led-total=<1>;

    };

 

编译:在内核源码的顶层目录执行以下命令:

make nanopi4-images -j8    

把生成的resource.img 和 kernel.img 烧写到开发板上。

编写平台驱动模型里面的驱动代码,修改设备树,编译内核kernel.img and resource.img文件烧写到板子上.

最终结果:

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

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

相关文章

【数据标注师】3D标注

目录 一、 **3D标注知识体系框架**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;空间认知筑基&#xff08;2-3周&#xff09;**▶ **阶段2&#xff1a;核心标注技能深化**▶ **阶段3&#xff1a;复杂场景解决方案**▶ **阶段4&#xff1a;领域深度专精▶ **阶段5&#xff1…

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组

Problem: 438. 找到字符串中所有字母异位词 题目&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——&#xff08;解法一&…

PAC 学习框架:机器学习的可靠性工程

PAC&#xff08;Probably Approximately Correct&#xff09; 是机器学习理论的核心框架&#xff0c;用于量化学习算法的可靠性。它回答了一个关键问题&#xff1a; “需要多少训练样本&#xff0c;才能以较高概率学到一个近似正确的模型&#xff1f;” 一、PAC 名称拆解 术语…

嵌入式C语言数组:数组/字符数组

1. 数组 1.1 一维数组 数组是一串连续的地址&#xff1b; 数组名是地址常量&#xff0c;代表数组的起始地址&#xff1b; sizeof&#xff08;数组名&#xff09; 可得出数组的总内存空间&#xff1b; C 语言对数组不做越界检查&#xff0c;使用时应注意&#xff1b; 数组不…

变长字节的数字表示法vb224

开始 数字有大有小&#xff0c;用多少字节表示呢&#xff1f; 本文描述的方案&#xff0c;采用变化的长度。vb是varying bytes的意思&#xff0c;224是表示它特征的一个数。 第一版&#xff1a; 每个字节8比特&#xff0c;最高的1比特用来表示“是否连续”&#xff0c;0表示…

ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)

背景&#xff1a; 现在主流的博客平台AI接入不够完善&#xff0c;如CSDN接入的AI助手不支持多模态数据的交互、稀土掘金的编辑器AI功能似乎还没能很好接入&#xff08;哈哈哈&#xff0c;似乎在考虑布局什么&#xff1f;&#xff09; 痛点分析&#xff1a; 用户常常以截图的形式…

【数据标注师】关键词标注

目录 一、 **理解关键词标注的核心逻辑**1. **三大标注原则**2. **关键词类型体系** 二、 **四阶训练体系**▶ **阶段1&#xff1a;基础规则内化**▶ **阶段2&#xff1a;语义浓缩训练**▶ **阶段3&#xff1a;场景化标注策略**▶ **阶段4&#xff1a;工具效率提升** 三、 **五…

for each循环语句

for each循环语句 for each.....nextFor Each 的案例 for each…next 1、循环对象合集 worksheets workbooks range range("区域")selection (选中的区域)usedrange或者currentregion 返回的单元格区域格式&#xff1a; for each 变量名 in 对象集合(范围)循环内容…

基于LQR控制器的六自由度四旋翼无人机模型simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.参考文献 6.完整工程文件 1.课题概述 四旋翼无人机因其结构简单、机动性强和成本低廉等特点&#xff0c;在航拍测绘、物流运输、灾害救援等领域得到广泛应用。六自由度&#xff08;3维平移3维旋转&#xff0…

vftp centos 离线部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一键安装配置vsftpd脚本&#xff08;开放根目录&#xff0c;禁用chroot&#xff09;# 安装vsftpd RPM包 echo "正在安装vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【数据标注】事件标注1

目录 **一、 深入理解事件标注的核心概念****二、 系统学习&#xff1a;从理论到实践****1. 吃透标注指南****2. 语言学基础补充****3. 事件结构解析训练** **三、 分阶段实践&#xff1a;从简单到复杂****阶段1&#xff1a;基础标注训练****阶段2&#xff1a;进阶挑战****阶段…

在 Ansys Electronics Desktop 中启用额外的 CPU 内核和 GPU

Ansys Electronics Desktop (AEDT) 可以通过利用多个 CPU 内核和 GPU 加速来显著缩短仿真时间。但是,启用其他计算资源除了基本求解器许可证外,还需要适当的高性能计算 (HPC) 许可证。 默认情况下,基本许可证最多允许使用 4 个内核,而无需任何其他 HPC 许可。借助 Ans…

R语言机器学习算法实战系列(二十六)基于tidymodels的XGBoost二分类器全流程实战

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据准备数据探索转换因子查看属性相关性配对图PCA 可视化缺失值、异常值处理 & 特征标准数据分割构建模型与调参模型评估模型可解释性(变量重要性、SHAP、DALEX)变量…

零基础langchain实战一:模型、提示词和解析器

一&#xff0c;使用python调取大模型api 1&#xff0c;获取api_key 获取api_key 在各个大模型的官网中获取。 2&#xff0c;设置api_key 方式一&#xff1a; 在系统环境中可直接执行python代码&#xff1a;这里以deepseek为例 import os os.environ["DEEPSEEK_API_…

Pytorch分布式通讯为什么要求Tensor连续(Contiguous)

参考资料&#xff1a; https://github.com/pytorch/pytorch/issues/73515 https://www.cnblogs.com/X1OO/articles/18171700 由于业务原因&#xff0c;需要在Pytorch代码中使用分布式通讯来把计算负载平均到多张显卡上。在无数次确认我的业务代码没问题之后&#xff0c;我开始把…

关于前端页面上传图片检测

依赖于前文&#xff0c;linux系统上部署yolo识别图片,远程宿主机访问docker全流程(https://blog.csdn.net/yanzhuang521967/article/details/148777650?spm1001.2014.3001.5501) fastapi把端口暴露出来 后端代码 from fastapi import FastAPI, UploadFile, File, HTTPExcep…

第十三章---软件工程过程管理

仅供参考 文章目录 一、Gantt图是做什么的。二、软件配置的概念 一、Gantt图是做什么的。 Gantt 图&#xff08;甘特图&#xff09;是软件项目管理中用于进度安排和可视化管理的重要工具&#xff0c;主要用于展示任务的时间安排、进度状态及任务之间的依赖关系 Gantt 图是一种…

多模态大语言模型arxiv论文略读(140)

SemiHVision: Enhancing Medical Multimodal Models with a Semi-Human Annotated Dataset and Fine-Tuned Instruction Generation ➡️ 论文标题&#xff1a;SemiHVision: Enhancing Medical Multimodal Models with a Semi-Human Annotated Dataset and Fine-Tuned Instruc…

模型预测控制专题:无差拍预测电流控制

前言&#xff1a; 为了进一步深入探索电机控制这个领域&#xff0c;找到了一些志同道合的同学一起来进行知识的分享。最近群里投票后续更新内容&#xff0c;票数最多的方向就是模型预测控制&#xff1b;无论这个方向目前是否还是很火&#xff0c;至少应大家需求&#xff0c;工…