Linux 设备树

学习设备树之前你需要知道什么?

  • 因为设备树描述了整个芯片和开发板等所有硬件信息内容,所以他的信息量是非常庞大的,RK的linux的设备树算下来大概就有九千多行,大家不要被这个数字给吓到,这些内容都是原厂工程师写的,我们只需要掌握基本语法,能够看懂和对着模板修改就行。也不用想着全局掌握,设备树只是写配置的地方,真正使用他的地方还是在内核中,要弄懂整体框架还要结合后面的驱动来。

  • 很多把stm32或者51过来的同学可能感觉莫名其妙学的很浅的感觉,大家一样想每个点甚至每个寄存器都弄的明明白白清清楚楚所以花了非常非常大的力气,Linux整体太庞大了集齐了多少开源大佬的智慧,随便一个小点拎出来都比我们以往写的main复杂,SOC也不同MCU,寄存器以及复杂度都不是一个量级的,如果强行自己全局把控面面俱细,那将会是一种痛苦,我们要做的是先玩起来,改设备树一点简单的驱动基础应用就是最快的玩起来方式。随着后面的深入大家会碰到很多问题,跟随着这些问题我们边玩边深入。坚持下去你将会快乐的成为大佬。

通俗的讲设备树就是用于描述硬件信息的一个配件文件,因为他描述的时候的拓扑结构很像树,所以就叫做设备树。详细的讲设备树是一种树状的结构,由节点(Node)和属性(Property)组成。每个节点描述一个硬件设备或资源,节点通过父子关系和兄弟关系进行连接。如下所示以一个根节点开始。根节点可以包含一些全局属性和设备节点。每个设备节点以一个路径标识符(例如/cpu@0)和多个属性(键值对)组成。设备节点可以包含子节点,形成嵌套的层次结构。属性描述了设备的特性,例如设备的名称、类型、寄存器地址、中断信息等。设备节点的路径和属性组合在一起提供了设备树的完整描述,以描绘硬件系统中各个设备的层次结构和配置信息。

常见的设备树术语:

  1. 设备树(Device Tree):一种用于描述硬件设备和资源连接的数据结构,是一种中立、可移植的设备描述方法。

  2. DTS(设备树源文件 Device Tree Source):设备树的源码文件,可以理解成c语言的.c文件。

  3. DTSI (设备树包含文件 Device Tree Include):包含了设备树源文件中的可重复使用的部分,可以通过 #include 指令在其他设备树源文件中引用。通常用于共享公共的设备树定义和配置,可以理解成c语言的.h文件。

  4. DTC(设备树编译器 Device Tree Compiler):用于将设备树源文件(DTS)编译成设备树二进制文件(DTB)的工具,可以理解成c语言的gcc编译器。

  5. DTB(设备树二进制文件 Device Tree Blob):设备树源文件编译生成的二进制文件,可以理解成c语言的.hex或者bin。

  6. 节点(Node):在设备树中用来描述硬件设备或资源的一个独立部分。每个节点都有一个唯一的路径和一组属性。

  7. 属性(Property):用于描述节点的特征和配置信息,包括设备的名称、地址、中断号、寄存器配置等。

  8. 属性值(Property Value):属性中的具体数据,可以是整数、字符串、布尔值等各种类型。

  9. 父节点和子节点(Parent Node and Child Node):在设备树中,每个节点都可以有一个父节点和多个子节点,用于描述设备之间的连接关系。

我们通常使用.dts(设备树源文件)或.dtsi(设备树源文件包含文件)来写设备树。编写完成以后通过DTC工具编译生成 .dtb(设备树二进制)文件,内核在启动时加载这个二进制文件来获得必要的硬件信息。DTS、DTSI、DTC、DTB之间的关系如下图:

比如我们使用的泰山派使用的是瑞芯微的主控,我们可以在下面目录找到瑞芯微64位的所有处理器与所有板子相关的设备树其中也包括了泰山派的:

泰山派SDK/kernel/arch/arm64/boot/dts/rockchip$
泰山派SDK/kernel/arch/arm64/boot/dts/rockchip$ ls -a
Makefile                                    
rk3326-863-lp3-v10.dts                       rk3566-box-demo-v10-android9.dts
rk3326-863-lp3-v10.dtsi                      rk3566-box-demo-v10.dts
rk3326-863-lp3-v10-rkisp1.dts                rk3566-box-demo-v10.dtsi
rk3326-86v-v10.dts                           rk3566-box.dtsi
rk3326.dtsi                                  rk3566.dtsi
rk3326-evb-ai-va-v10.dts                     rk3566-eink.dtsi
rk3326-evb-ai-va-v11.dts                     rk3566-evb1-ddr4-v10.dts
rk3326-evb-ai-va-v11-i2s-dmic.dts            rk3566-evb1-ddr4-v10.dtsi
rk3326-evb-ai-va-v12.dts                     rk3566-evb1-ddr4-v10-linux.dts
rk3326-evb-ext-sii902x-rgb-to-hdmi-v10.dtsi  rk3566-evb1-ddr4-v10-lvds.dts
rk3326-evb-lp3-v10-avb.dts                   rk3566-evb2-lp4x-v10.dts
rk3326-evb-lp3-v10.dts                       rk3566-evb2-lp4x-v10.dtsi
rk3326-evb-lp3-v10.dtsi                      rk3566-evb2-lp4x-v10-edp.dts
rk3326-evb-lp3-v10-linux.dts                 rk3566-evb2-lp4x-v10-eink.dts
rk3326-evb-lp3-v10-robot-linux.dts           rk3566-evb2-lp4x-v10-i2s-mic-array.dts
rk3326-evb-lp3-v10-robot-no-gpu-linux.dts    rk3566-evb2-lp4x-v10-linux.dts
rk3326-evb-lp3-v11-avb.dts                   rk3566-evb2-lp4x-v10-pdm-mic-array.dts
rk3326-evb-lp3-v11.dts                       rk3566-evb3-ddr3-v10.dts
rk3326-evb-lp3-v12-linux.dts                 rk3566-evb3-ddr3-v10.dtsi
rk3326-linux.dtsi                            rk3566-evb3-ddr3-v10-linux.dts
rk3328-android.dtsi                          rk3566-evb5-lp4x-v10.dts
rk3328-box-liantong-avb.dts                  rk3566-evb5-lp4x-v10.dtsi
rk3328-box-liantong.dts                      rk3566-evb.dtsi
rk3328-box-liantong.dtsi                     rk3566-evb-mipitest-v10.dts
rk3328-box-plus-dram-timing.dtsi             rk3566-evb-mipitest-v10.dtsi
rk3328-dram-2layer-timing.dtsi               rk3566-rk817-eink.dts
rk3328-dram-default-timing.dtsi              rk3566-rk817-eink-w103.dts
rk3328.dtsi                                  rk3566-rk817-eink-w6.dts
rk3328-evb-android-avb.dts                   rk3566-rk817-tablet.dts
rk3328-evb-android.dts                       rk3566-rk817-tablet-k108.dts
rk3328-evb-android.dtsi                      rk3566-rk817-tablet-rkg11.dts
rk3328-evb.dts                               rk3566-rk817-tablet-v10.dts
rk3328-roc-cc.dts                            rk3568-amp.dtsi
rk3328-rock64-android-avb.dts                rk3568-android9.dtsi
rk3328-rock64-android.dts                    rk3568-android.dtsi
rk3328-rock64-android.dtsi                   rk3568-dram-default-timing.dtsi
rk3328-rock64.dts                            rk3568.dtsi
rk3358.dtsi                                  rk3568-evb1-ddr4-v10-android9.dts
rk3358-evb-ddr3.dtsi                         rk3568-evb1-ddr4-v10.dts
rk3358-evb-ddr3-v10-linux.dts                rk3568-evb1-ddr4-v10.dtsi
rk3358-linux.dtsi                            rk3568-evb1-ddr4-v10.dtsi3
rk3358m-vehicle-ddr3.dtsi                    rk3568-evb1-ddr4-v10-linux.dts
rk3358m-vehicle-v10.dts                      rk3568-evb1-ddr4-v10-linux-spi-nor.dts
rk3368-808.dtsi                              rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts
rk3368-808-evb.dts                           rk3568-evb2-lp4x-v10.dts
rk3368a-817-tablet-bnd.dts                   rk3568-evb2-lp4x-v10.dtsi
rk3368a-817-tablet.dts                       rk3568-evb4-lp3-v10.dts
rk3368-android.dtsi                          rk3568-evb5-ddr4-v10.dts
rk3368-cif-sensor.dtsi                       rk3568-evb5-ddr4-v10.dtsi
rk3368-dram-default-timing.dtsi              rk3568-evb6-ddr3-v10.dts
rk3368.dtsi                                  rk3568-evb6-ddr3-v10.dtsi
rk3368-evb-act8846.dts                       rk3568-evb6-ddr3-v10-linux.dts
rk3368-evb.dtsi                              rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
rk3368-geekbox.dts                           rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts
rk3368-lion.dtsi                             rk3568-evb6-ddr3-v10-rk630-bt656-to-cvbs.dts
rk3368-lion-haikou.dts                       rk3568-evb7-ddr4-v10.dts
rk3368-orion-r68-meta.dts                    rk3568-evb.dtsi
rk3368-p9-avb.dts                            rk3568-iotest-ddr3-v10.dts
rk3368-p9.dts                                rk3568-iotest-ddr3-v10-linux.dts
rk3368-p9.dtsi                               rk3568-linux.dtsi
rk3368-px5-evb-android.dts                   rk3568-nvr-demo-v10.dts
rk3368-px5-evb.dts                           rk3568-nvr-demo-v10.dtsi
rk3368-r88-dcdc.dts                          rk3568-nvr-demo-v10-linux.dts
rk3368-r88.dts                               rk3568-nvr-demo-v10-linux-spi-nand.dts
rk3368-sheep.dts                             rk3568-nvr-demo-v12.dtsi
rk3368-sheep-lvds.dts                        rk3568-nvr-demo-v12-linux.dts
rk3368-sziauto-rk618.dts                     rk3568-nvr-demo-v12-linux-spi-nand.dts
rk3368-tablet.dts                            rk3568-nvr.dtsi
rk3368-xikp-avb.dts                          rk3568-nvr-linux.dtsi
rk3368-xikp.dts                              rk3568-pinctrl.dtsi
rk3368-xikp.dtsi                             rk630.dtsi
rk3399-android.dtsi                          rk630-rk3568-ddr3-v10.dts
rk3399-box.dtsi                              rockchip-pinconf.dtsi
rk3399-box-rev1.dts                          tspi-rk3566-core-v10.dtsi
rk3399-box-rev2.dts                          tspi-rk3566-csi-v10.dtsi
rk3399-dram-default-timing.dtsi              tspi-rk3566-dsi-v10.dtsi
rk3399.dtsi                                  tspi-rk3566-edp-v10.dtsi
rk3399-early-opp.dtsi                        tspi-rk3566-gmac1-v10.dtsi
rk3399-evb-cros.dtsi                         tspi-rk3566-hdmi-v10.dtsi
rk3399-evb.dts                               tspi-rk3566-user-v10-linux.dtb
rk3399-evb.dtsi                              .tspi-rk3566-user-v10-linux.dtb.cmd
rk3399-evb-ind.dtsi                          .tspi-rk3566-user-v10-linux.dtb.d.dtc.tmp
rk3399-evb-ind-lpddr4-android-avb.dts        .tspi-rk3566-user-v10-linux.dtb.d.pre.tmp
rk3399-evb-ind-lpddr4-android.dts            .tspi-rk3566-user-v10-linux.dtb.dts.tmp
rk3399-evb-ind-lpddr4-linux.dts              .tspi-rk3566-user-v10-linux.dtb.dts.tmp.domain
rk3399-evb-ind-lpddr4-v13-android-avb.dts    tspi-rk3566-user-v10-linux.dts
rk3399-evb-rev1-android.dts

前面我们讲了dts和dtsi就类比c语言的.c和.h的关系,大家都知道c语言是有调用关系的所以对于我们的设备树也有调用关系,下先从tspi-rk3566-user-v10.dts文件开始下手可以得出调用关系,这里牵扯到include的用法我们后面深入讲解目前大家就理解成c语言include就行:

tspi-rk3566-user-v10.dtsrk3566.dtsirk3568.dtsirk3568-dram-default-timing.dtsirk3568-android.dtsitspi-rk3566-core-v10.dtsitspi-rk3566-edp-v10.dtsitspi-rk3566-dsi-v10.dtsitspi-rk3566-hdmi-v10.dtsitspi-rk3566-csi-v10.dtsitspi-rk3566-gmac1-v10.dtsi

如果大家全编译过泰山派开发板的SDK固件的话就会发现SDK/kernel/arch/arm64/boot/dts/rockchip路径下生成了一个tspi-rk3566-user-v10-linux.dtb文件,这就是我们设备树编译器的功劳,我们全编译的时候首先去编译生成了DTC编译器,然后在用这个编译器去编译我们的设备树,我们可以在SDK/kernel/scripts/dtc目录下找到我们的dtc编译器源码和源码生产的dtc编译器执行文件。以通过pwd记录一下这个目录的绝对路径,后面我们通过绝对路径使用dtc来编译测试。

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

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

相关文章

pytorch_fid 安装笔记

目录 torch安装: pytorch_fid安装 torch安装: pip install torch2.5.0 --index-url https://download.pytorch.org/whl/cu121 pytorch_fid安装 pip install pytorch_fid 安装后,torch也会自动安装,导致torch引用报错。

IoTDB 如何修改测点类型

问题 时序数据库 IoTDB 如果在数据插入时未指定属性值的类型,而后期需要将原本推断为 INT32 类型的数据强制转换为 TEXT 类型,应如何处理?如果字段类型不支持直接修改,是否有其他方案可以实现字段类型的调整?如何将设…

虚幻引擎内各个组件的关系

1. GameMode: 关系: GameMode 是游戏规则的制定者和管理者,GameState 则是游戏状态的记录者和同步者。GameMode 通常负责创建和初始化 GameState。 交互: GameMode 可以直接访问和修改 GameState 的属性,例如更新游戏分数、切换游戏阶段等。GameState 的变化会通过 GameMode …

力扣刷题TOP101: 32.BM39 序列化二叉树

目录: 目的 思路 复杂度 记忆秘诀 python代码 目的: 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 思路…

MySQL有哪些高可用方案?

大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

An error happened while trying to locate the file on the Hub and we cannot f

An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链: 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如,一个网站可能拥有独特的图片素材,为了防止其他网站通过直接链接图片URL的方式访问这些图片,网站管理员会采…

深度学习:CPU和GPU算力

一、算力 “算力”(Computing Power)通常是指计算机或计算系统执行计算任务的能力。它是衡量系统处理数据、运行算法以及执行计算任务效率的重要指标。根据上下文,算力可以在以下几种场景中具体化: 1. 单机算力 CPU算力&#x…

【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset参考:kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容:构建自己的EDA&#xff08…

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom: dataZoom: [{type: inside, // inside 鼠标左右拖图表,滚轮缩放; slider 使用滑动条start: 0, // 左边的滑块位置,表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…

pytest -s执行的路径

pytest -s执行的路径: 直接写pytest -s,表示从当前路径下开始执行全部.py的文件。 执行具体指定文件:pytest -s .\testXdist\test_dandu.py 下面这样执行pytest -s 会报找不到文件或没权限访问, 必须要加上具体文件路径pytest -s…

AP AUTOSAR网络管理——Network Management R24-11

AP AUTOSAR——Network Management 1.网络管理 网络管理(Network Management,NM)的定义: NM是自适应平台服务中的一个功能集群,主要管理每个网络节点(包括物理网络和部分网络)在正常运行模式和总线关闭睡眠模式之间的转换。NM的操作独立于所使用的通信网络绑定。直接网…

预处理器Stylus的介绍及使用,并同Less、Sass进行对比(简单介绍)

目录 一、安装与配置 安装Node.js: 安装Stylus: 配置Webpack: 二、编写Stylus代码 定义变量: 使用变量: 嵌套语法: 混合(Mixins): 函数: 6.关键字参…

内网跨“边界”

背景 “边界”通常是指内网与外网之间的那条边界,在内网中,边界也包括各个区域之间的边界。本篇文章主要介绍在内网各种环境中的shell反弹、内网穿透及文件传输方面常用的一些方法和工具,利用这些方法来跨越内网中的层层边界。 当我们获取到…

Docker的镜像

目录 1. 镜像是什么??2. 镜像命令详解2.1 镜像命令清单2.2 docker rmi命令2.3 docker save命令2.4 docker load命令2.5 docker history命令2.6 docker import命令2.7 docker image prune命令2.8 docker build命令 3. 镜像的操作4. 离线迁移镜像5. 镜像存…

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据,axios是一个基于promise的HTTP库,使用npm i axios。在main.js中引入,需要绑定在Vue的prototype属性上,并重命名。   (1)main.js文件引用 imp…

【合作原创】使用Termux搭建可以使用的生产力环境(六)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(五)-CSDN博客我们讲到了如何美化xfce4桌面,达到类似于Windows的效果,这一篇将继续在上一篇桌面的基础上给我们的系统装上必要的软件,让它做到真正可以使…

Java学习教程,从入门到精通,Java Stack(堆栈)语法知识点及语法知识点(58)

Java Stack(堆栈)语法知识点详解 一、概述 栈(Stack)是一种后进先出(Last In First Out, LIFO)或先进后出(First In Last Out, FILO)的数据结构,它只允许在一端&#x…

stm32 hal使用sysTick定时器非阻塞延时方法

简介 一种在stm32 hal库中实现非阻塞任务处理扫描的方式。 stm32f1xx_it.c /* USER CODE BEGIN 0 */ uint8_t Time_1ms 0; uint8_t Time_10ms 0;/* USER CODE END 0 *//*** brief This function handles System tick timer.*/ void SysTick_Handler(void) {/* USER CODE B…

docker简单私有仓库的创建

1:下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2:开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…