Linux 设备树

ops/2024/12/18 18:29:23/

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

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

  • 很多把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.ppmy.cn/ops/142976.html

相关文章

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤: 一、定义自定义组件 使用Component注解:为了注册一个组件,使其能够在其他文件中被引用,你需要使用Component…

牛客周赛72:B:JAVA

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小红定义一个字符串是好串,当且仅当该字符串任意一对相邻字符都不同。 现在小红拿到了一个01串,请你帮小红求出有多少个长度不小于2的连续子串是好串。 输…

运行 Mongodb Server

如何使用 mongod 命令通过配置文件启动 MongoDB Server 适用于通过 Homebrew 安装的 MongoDB Server 如果您的 MongoDB Server 是通过 Homebrew 安装的,则安装过程中会自动创建必要的文件夹和配置文件(如 mongod.conf)。您可以直接使用以下…

MVC前后端交互案例--留言板

API-约定前后端交互接⼝ 约定 " 前后端交互接⼝ " 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API(Application Programming Interface), 我们⼀般讲到 接⼝或者 API, 指的都是同⼀个东西。 是指应⽤程序对外提供的服务的描述, ⽤于 交换信息和执…

登陆harbor发现证书是错误的, 那么如何更新harbor的证书呢

Error response from daemon: Get "https://172.16.21.35/v2/": tls: failed to verify certificate: x509: certificate is valid for 127.0.0.1, ::1, 172.16.21.30, not 172.16.21.35 版本 v2.10.1-b7b88476 不需要从头看, 直接看最下面的成功的证书创建 这里面首…

23.DDD与微服务

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现,也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

el-select多选设置默认值且默认值不可删除

需求 <el-select>多选时&#xff0c;需要设置默认值&#xff0c;且默认值不可删除&#xff0c;但手动勾选的值可以删除。 实现原理 在el-select框中隐藏默认值的el-tag后面的叉在option中置灰默认值的选项使其不可被操作 代码实现 新建一个自定义指令&#xff0c;并在<…

学习笔记071——Java中的【线程】

文章目录 1、基础2、进程和线程3、什么是多线程4、Java 中线程的使用5、Java 中创建线程的方式5.1、继承 Thread 类5.2、实现 Runnable 接口5.3、继承 Thread 和实现 Runnable 接口的区别5.4、实现 Runnable 接口的优化 6、线程的状态7、线程调度7.1、线程休眠7.2、线程合并7.3…