设备树知识小全(三)

简介: 设备树知识小全(三)

内容来自宋老师《Linux设备驱动开发》

上一篇学习了DTS,这里来看看它老婆DTC

1、DTC(Device Tree Compiler)

DTC是将.dts编译为.dtb的工具。

DTC的源代码位于内核的scripts/dtc目录中,在Linux内核使能了设备树的情况下,编译内核的时候主机工具DTC会被编译出来,对应于scripts/dtc/Makefile中“hostprogs-y:=dtc”这一hostprogs的编译目标。

当然,DTC也可以在Ubuntu中单独安装,命令如下:

sudo apt-get install device-tree-compiler

在Linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来,如与VEXPRESS对应的.dtb包括:(哪儿都跑不掉的makefile)

dtb-$(CONfiG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
vexpress-v2p-ca9.dtb \
vexpress-v2p-ca15-tc1.dtb \
vexpress-v2p-ca15_a7.dtb \
xenvm-4.2.dtb

在Linux下,我们可以单独编译设备树文件。当我们在Linux内核下运行make dtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都会由对应的.dts编译出来,因为arch/arm/Makefile中含有一个.dtbs编译目标项目。

DTC除了可以编译.dts文件以外,其实也可以“反汇编”.dtb文件为.dts文件,其指令格式为:

./scripts/dtc/dtc -I dtb -O dts -o xxx.dts arch/arm/boot/dts/xxx.dtb

2、DTB(Device Tree Blob)

文件.dtb是.dts被DTC编译后的二进制格式的设备树描述,可由Linux内核解析,当然U-Boot这样的bootloader也是可以识别.dtb的。(至于谁用,得看启动流程,或者都用)

通常在我们为电路板制作NAND、SD启动映像时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导内核的过程中,会先读取该.dtb到内存。

Linux内核也支持一种变通的模式,可以不把.dtb文件单独存放,而是直接和zImage绑定在一起做成一个映像文件,类似cat zImage xxx.dtb>zImage_with_dtb的效果。当然内核编译时候要使能CONFIG_ARM_APPENDED_DTB这个选项,以支持“Use appended device tree blob to zImage”(见Linux内核中的菜单)。(单独整个镜像)

3、绑定(Binding)

对于设备树中的节点和属性具体是如何来描述设备的硬件细节的,一般需要文档来进行讲解,文档的后缀名一般为.txt。

在这个.txt文件中,需要描述对应节点的兼容性必需的属性可选的属性

这些文档位于内核的Documentation/devicetree/bindings目录下,其下又分为很多子目录。譬如,Documentation/devicetree/bindings/i2c/i2c-xiic.txt描述了Xilinx的I2C控制器,其内容如下:

Xilinx IIC controller:
Required properties:
- compatible : Must be "xlnx,xps-iic-2.00.a"
- reg : IIC register location and length
- interrupts : IIC controller unterrupt
- #address-cells = <1>
- #size-cells = <0>
Optional properties:
- Child nodes conforming to i2c bus binding
Example:
        axi_iic_0: i2c@40800000 {
compatible = "xlnx,xps-iic-2.00.a";
interrupts = < 1 2 >;
reg = < 0x40800000 0x10000 >;
                #size-cells = <0>;
                #address-cells = <1>;
        };

(我想解析,第一步这里知道了寄存器的含义,下一步找到我要解析的寄存器,学习怎么去解析读取就好诶)

基本可以看出,设备树绑定文档的主要内容包括:

  • ·关于该模块最基本的描述。
  • ·必需属性(Required Properties)的描述。
  • ·可选属性(Optional Properties)的描述。
  • ·一个实例。

Linux内核下的scripts/checkpatch.pl会运行一个检查,如果有人在设备树中新添加了compatible字符串,而没有添加相应的文档进行解释,checkpatch程序会报出警告:UNDOCUMENTED_DT_STRINGDT compatible string xxx appears un-documented,因此程序员要养成及时写DT Binding文档的习惯。

4、Bootloader

Uboot设备从v1.1.3开始支持设备树,其对ARM的支持则是和ARM内核支持设备树同期完成。为了使能设备树,需要在编译Uboot的时候在config文件中加入:

#define CONfiG_OF_LIBFDT

在Uboot中,可以从NAND、SD或者TFTP等任意介质中将.dtb读入内存,假设.dtb放入的内存地址为0x71000000,之后可在Uboot中运行fdt addr命令设置.dtb的地址,如:

UBoot> fdt addr 0x71000000

fdt的其他命令就变得可以使用,如fdt resize、fdt print等。

对于ARM来讲,可以通过bootz kernel_addr initrd_address dtb_address的命令来启动内核,即dtb_address作为bootz或者bootm的最后一次参数,第一个参数为内核映像的地址,第二个参数为initrd的地址,若不存在initrd,可以用“-”符号代替。

(Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。)

(可惜关于bootloader这里没有整个具体例子讲讲,保持这种感觉欠那么一点的感觉继续学习。)

目录
相关文章
|
Linux
设备树知识小全(一)
设备树知识小全(一)
264 0
|
存储 缓存 安全
U-BOOT小全(五):BootLoader源码(SPL-UBoot 2)
U-BOOT小全(五):BootLoader源码(SPL-UBoot 2)
724 0
|
人工智能 搜索推荐 程序员
AI神器Deepseek:3分钟搞定一篇爆款文案!
大家好,我是小米,一个31岁、热爱分享技术的自媒体人。本文将介绍如何使用Deepseek写文案。Deepseek是一款基于AI的文案生成工具,能快速生成高质量文案,支持多种语言风格,帮助提高写作效率。文中通过具体案例——为咖啡店新品“焦糖玛奇朵”撰写推广文案,详细讲解了从明确目标到发布文案的全过程,并提供了优化和应用技巧。如果你还在为写文案发愁,不妨试试Deepseek,它将成为你的得力助手!
2288 23
|
安全 Linux 数据安全/隐私保护
linux root登陆,密码正确但,错误提示su: Authentication failure
通过系统化的排查和解决方案,可以有效应对 `su: Authentication failure` 问题,确保系统安全和用户权限的正确管理。
7635 36
|
Linux SoC
Linux设备树(DTS)介绍
**设备树(DTS)是Linux中用于描述硬件信息的文本文件,旨在减少内核与平台相关代码的耦合。DTS文件包含静态硬件配置,不支持动态变更。它被编译成DTB二进制文件,供内核在启动时解析以了解硬件布局。设备树解决了ARM体系结构代码维护的复杂性问题,通过解耦实现vendor修改的独立和共二进制目标。设备树overlay允许对配置进行增量修改,遵循特定规则,如dts覆盖dtsi,先引用后修改。调试时,可使用内置工具反编译dtb或dtbo映像为dts文本以检查内容。**
1450 7
|
Linux C语言 SoC
设备树知识小全(二)
设备树知识小全(二)
815 0
|
Ubuntu Linux 芯片
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
1027 1
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
969 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
|
机器学习/深度学习 数据采集 人工智能
提升深度学习模型性能的实用技巧
【5月更文挑战第30天】在深度学习领域,构建一个高性能的模型需要超越直觉和经验。本文将深入探讨一系列实用的技术技巧,用于优化神经网络的训练过程和结构设计,进而提高模型的准确性和效率。我们将从数据预处理、网络结构调整、正则化手段以及超参数调优等方面入手,提供一套系统化的方法论,帮助研究人员和工程师们在面对各种复杂任务时,能够有效地提升其深度学习模型的性能。
|
网络协议 Ubuntu Linux
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
1420 0

热门文章

最新文章

下一篇
开通oss服务