Linux设备树

本文介绍了设备树在内核编程中的重要性,特别是在LED驱动程序中如何通过设备树指定GPIO引脚。通过举例和解释设备树文件的语法、节点、属性如compatible、reg和status的使用,展示了设备树如何帮助管理和配置硬件资源,以及在内核启动过程中的作用。
摘要由CSDN通过智能技术生成

设备树的引入与作用

以LED驱动为例,如果要更换LED所用的GPIO引脚,需要修改驱动程序源码,重新编译驱动,重新加载驱动。

在内核中,使用同一个芯片的板子,它们所用的外设资源也不一样,比如A板使用GPIO A,B板使用GPIO B。
而GPIO的驱动程序既支持GPIO A,也支持GPIO B,需要指定使用哪一个引脚,怎么指定?在C代码中指定。

随着ARM芯片流行,内核中针对这些ARM板保存有大量的、没有技术含量的文件。

设备树是用来给内核里的驱动程序指定硬件的信息。
比如LED驱动,在内核的驱动程序里去操作寄存器,但是操作哪一个引脚?由设备树指定。

/sys/firmware/devicetree目录下是以目录结构呈献的dtb文件,根节点对应base目录,每一个节点对应一个目录,每一个属性对应一个文件。

这些属性的值如果是字符串,可以使用cat命令把它打印出来;对于数值,可以用hexdump把它打印出来。

一个单板启动时,u-boot先运行,它的作用是启动内核。U-boot会把内核和设备树文件都读入内存,然后启动内核。
在启动内核时会把设备树在内存中的地址告诉内核。

设备树的语法

在这里插入图片描述
我们需要编写设备树文件(dts:device tree source),它需要编译为dtb(device tree blob)文件,内核使用的是dtb文件。

dts文件是根本,它的语法很简单。
在这里插入图片描述
在这里插入图片描述

/dts-v1/;   //表示版本
/{
};

设备树中的基本单元,被称为node

[label:]node-name[@unit-address]{
	[properties definitions]
	[child nodes]
};

label是标号,可以省略。label的作用是为了方便引用node。

/dts-v1/;
/{
	uart0:uart@fe001000{
		compatible = "ns16550";
		reg=<0x80908090 0x100>;
	};
};

可以使用2种方法修改uart@fe001000这个node。

//在根节点之外使用label引用node
&uart0{
	status = "disabled";
};

//或在根节点之外使用全路径
&{/uart@fe001000}{
	status = "disabled";
};

properties的格式
简单地说,properties就是"name=value",value有很多种取值方式。

dts文件包含dtsi文件

设备树文件不需要我们从零写出来,内核支持某款芯片比如imx6ull,在内核的arch/arm/boot/dts目录下就有了能用的设备树模板,一般命名为xxx.dtsi,i表示include,被别的文件引用的。

我们使用某款芯片制作出了自己的单板,所用资源跟xxxx.dtsi是大部分相同,小部分不同,所以需要引用xxxx.dtsi并修改。

dtsi文件跟dts文件的语法是完全一样的。
dts中可以包含.h头文件,也可以包含dtsi头文件,在.h头文件中可以定义一些宏。

/dts-v1/;
#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"

/{
};

常用的属性

#address-cells、#size-cells

  • cell指一个32位的数值
  • address-cells:address要用多少个32位数来表示
  • size-cells:size要用多少个32位数来表示。
/{
#address-cells = <1>;
#size-cells = <1>;
memory{
	reg =  <0x80000000 0x20000000>;
};
}

compatible表示兼容,对于某个LED,内核中可能有A、B、C三个驱动都支持它,那可以这样写:

led{
compatible = "A","B","C";
};

内核启动时,就会为这个LED按这样的优先顺序找到驱动程序。

根节点下也有compatible属性,用来选择哪一个“machine desc”:一个内核可以支持machine A,也支持machine B,内核启动后会根据根节点的compatible属性找到对应的machine desc结构体,执行其中的初始化函数。

compatible的值,建议取这样的形式:“manufacture,model”,即“厂家名,模块名”。

model
compatible属性是一个字符串列表,表示可以兼容A、B、C等驱动。
model准确地定义这个硬件是什么。

根节点中可以这样写:

{
	compatible =  "samsung,smdk2440", "samsung,mini2440";
	model = "jz2440_v3";
};

它表示这个单板,可以兼容内核中的“smdk2440”,也兼容“mini2440”。

status
dtsi文件中定义了很多设备,但是在你的板子上某些设备是没有的。这时可以给这个设备节点添加一个status属性,设置为“disabled”。

&usart1{
	status = "disabled";
};

reg

reg的本意是register,表示寄存器地址。
但是在设备树里,它可以用来描述一段空间。
反正对于ARM系统,寄存器和内存是统一编址的,即访问寄存器时用某块地址,访问内存时用某块地址,在访问方法上没有区别。

reg属性的值,是一系列的“address size”,用多少个32位的数来表示address和size,由其父节点的#address-cells、#size-cells决定。

name

name表示节点的名字,在跟platform_driver匹配时,优先级最低。
compatible属性在匹配过程中,优先级最高。device_type优先级为中。

常用的节点(node)——根节点

/dts-v1/;
/{
model = "SMDK2440";
compatible = "samsung,smdk2440";
#address-cells = <1>;
#size-cells = <1>;
};

chosen节点

可以通过设备树文件给内核传入一些参数,这要在chosen节点中设置bootargs属性。

chosen {
bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
};

在内核中直接make

设置ARCH、CROSS_COMPILE、PATH这三个环境变量后,进入ubuntu上板子内核源码的目录,执行如下命令即可编译dtb文件

make dtbs V=1
  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设备树(Device Tree)是一种描述嵌入式系统硬件设备的文件格式,用于在Linux内核中动态配置和管理硬件。设备树采用树形结构,描述了开发板上的各种设备信息,比如CPU数量、内存基地址、接口上连接的设备等。设备树文件的扩展名为.dts,编译后得到.dtb文件。在引导Linux内核时,Bootloader会将.dtb文件的地址传递给内核,内核会根据设备树文件中描述的信息创建和注册相关设备。通过设备树,开发者可以在不修改内核源代码的情况下配置和管理硬件设备。在编译Linux源码时,可以使用"make dtbs"命令来单独编译设备树文件,而不是编译整个源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 设备树](https://blog.csdn.net/m0_69211839/article/details/130601344)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [linux设备树](https://blog.csdn.net/qq_27094347/article/details/121012569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值