嵌入式linux驱动开发篇之设备树

什么是设备树?

在这里插入图片描述

设备树(Device Tree)是一种用于描述嵌入式系统硬件组件及其连接关系的数据结构。它被广泛用于嵌入式 Linux 系统,尤其是针对使用多种不同架构和平台的嵌入式系统。它是一种与硬件描述相关的中间表示形式,将硬件信息抽象成一种可移植的格式,使得操作系统和引导加载程序能够在不同的硬件平台上运行,而无需硬编码特定的硬件配置信息。

树状结构:设备树是一个层次结构,由节点和属性组成。节点可以有子节点,形成树状结构。
节点类型:设备节点(device node)描述硬件组件,属性(property)提供有关硬件配置的详细信息。

设备树的主要作用包括:

描述硬件设备信息:将硬件设备的属性和配置信息以标准格式描述出来,包括设备类型、地址、中断等。
实现硬件平台的可移植性:将硬件描述与操作系统和引导加载程序分离,使得相同的软件可以在不同的硬件平台上运行。
简化内核配置和维护:通过设备树,内核可以动态地识别和管理硬件设备,而不需要硬编码在内核中,简化了内核的配置和维护工作。

设备树的一些知识点

DTS、DTB 和 DTC区别

DTS 是设备树源码文件,DTB 是将DTS 编译以后得到的二进制文件。将.dts 编译为.dtb需要用到 DTC 工具,DTC 工具源码在 Linux 内核的 scripts/dtc 目录下。

在arch/arm/boot/dts/Makefile

dtb-$(CONFIG_SOC_IMX6SLL) += \
imx6sll-lpddr2-arm2.dtb \
imx6sll-lpddr3-arm2.dtb \

在此处添加自己的设备树文件
要编译 DTS 文件的话只需要进入到 Linux 源码根目录下,然后执行如下命令:

make all
#或者
make dtbs

和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi,.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围。比如串口,SPI等等。imx6ull.dtsi文件部分内容如下

#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"

/ {
	aliases {
		can0 = &flexcan1;
		can1 = &flexcan2;
		ethernet0 = &fec1;
		ethernet1 = &fec2;
		gpio0 = &gpio1;
		gpio1 = &gpio2;
		gpio2 = &gpio3;
		gpio3 = &gpio4;
		gpio4 = &gpio5;
		i2c0 = &i2c1;
		i2c1 = &i2c2;
		i2c2 = &i2c3;
		i2c3 = &i2c4;
		mmc0 = &usdhc1;
		mmc1 = &usdhc2;
		serial0 = &uart1;
		serial1 = &uart2;
		serial2 = &uart3;
		serial3 = &uart4;
		serial4 = &uart5;
		serial5 = &uart6;
		serial6 = &uart7;
		serial7 = &uart8;
		spi0 = &ecspi1;
		spi1 = &ecspi2;
		spi2 = &ecspi3;
		spi3 = &ecspi4;
		usbphy0 = &usbphy1;
		usbphy1 = &usbphy2;
	};

	cpus {
		#address-cells = <1>;
		#size-cells = <0>;

		cpu0: cpu@0 {
			compatible = "arm,cortex-a7";
			device_type = "cpu";
			reg = <0>;
			clock-latency = <61036>; /* two CLK32 periods */
			operating-points = <
				/* kHz	uV */
				996000	1275000
				792000	1225000
				528000	1175000
				396000	1025000
				198000	950000
			>;
			fsl,soc-operating-points = <
				/* KHz	uV */
				996000	1175000
				792000	1175000
				528000	1175000
				396000	1175000
				198000	1175000
			>;
			fsl,low-power-run;
			clocks = <&clks IMX6UL_CLK_ARM>,
				 <&clks IMX6UL_CLK_PLL2_BUS>,
				 <&clks IMX6UL_CLK_PLL2_PFD2>,
				 <&clks IMX6UL_CA7_SECONDARY_SEL>,
				 <&clks IMX6UL_CLK_STEP>,
				 <&clks IMX6UL_CLK_PLL1_SW>,
				 <&clks IMX6UL_CLK_PLL1_SYS>,
				 <&clks IMX6UL_PLL1_BYPASS>,
				 <&clks IMX6UL_CLK_PLL1>,
				 <&clks IMX6UL_PLL1_BYPASS_SRC>,
				 <&clks IMX6UL_CLK_OSC>;
			clock-names = "arm", "pll2_bus",  "pll2_pfd2_396m", "secondary_sel", "step",
				      "pll1_sw", "pll1_sys", "pll1_bypass", "pll1", "pll1_bypass_src", "osc";
		};
	};
....

设备节点

设备节点是Linux系统中一个重要的概念,它是用户程序和内核驱动之间的纽带。设备节点通常位于/dev目录下,并以文件的形式存在,每个设备节点都对应着一个特定的设备。通过打开设备节点,用户程序可以获取设备的句柄,从而与设备进行通信和控制。

标准属性

节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性。
compatible 属性
compatible 属性也叫做“兼容性”属性,这是重要的属性。compatible 属性的值是一个字符串列表,compatible 属性用于将设备和驱动绑定起来。格式如下

"manufacturer,model"

I.MX6U-ALPHA 开发板上的音频芯片采用的欧胜(WOLFSON)出品的 WM8960,sound 节点的 compatible 属性值如下:

compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

model 属性
model 属性值也是一个字符串,一般 model 属性描述设备模块信息。

model = "wm8960-audio";

status 属性
status 属性是和设备状态有关的,status 属性值也是字符串。

描述
disabled表明设备是可操作的
okay表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档
fail表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
fail-sss含义和“fail”相同,后面的 sss 部分是检测到的错误内容
reg 属性
reg 属性的值一般是(address,length)对。reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。

ranges 属性
ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵。
ranges 属性每个项目由子地址、父地址和地址空间长度
这三部分组成:child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。parent-bus-address:父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。length:子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。

在Linux设备树中增加设备节点的步骤通常包括以下几个步骤:

确定设备信息:包括设备的名称、兼容性、模型等。这些信息通常在设备规格书或数据手册中可以找到。
编辑设备树源文件:设备树的信息通常存储在一个设备树源文件(.dts)中。你需要打开这个文件,并在适当的位置添加你的设备节点。设备节点通常包含设备的名称、兼容性、模型以及任何特定于设备的属性或子节点。
编译设备树:一旦你添加了设备节点并保存了设备树源文件,你需要使用设备树编译器(dtc)将其编译为设备树二进制文件(.dtb)。这个文件可以在引导时被内核使用。
更新引导加载程序:需要将新的设备树二进制文件添加到引导加载程序(如U-Boot)的配置中,以便在引导时加载它。具体的步骤取决于你使用的引导加载程序。
更新内核配置:可能还需要更新内核的配置,以启用对新设备的支持。这通常涉及编辑内核配置文件(.config),然后重新编译内核。
测试:最后,需要在目标硬件上测试更改,以确保新设备能够正确识别并工作。

  • 30
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

稚肩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值