一、设备树是什么?
设备树是一种描述计算机特定硬件设备信息的数据结构,以便于操作系统的内核可以管理和使用这些硬件,包括CPU、内存、总线、中断控制器等。描述设备树的文件叫做 DTS,这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息。设备树文件可以通过设备树编译器(DTC)编译成二进制文件(DTB),供内核使用。Linux内核使用DTS和DTB来描述嵌入式设备的硬件结构。DTS是机器可读的文本文件,其中包含设备树的节点和属性,DTB是由DTS编译器生成的二进制文件。在Linux内核启动时,会使用bootloader将DTB加载到内存中,并在内核启动时将DTB解析成设备树形式,会解析设备树中各个节点的信息,并且在根文件系统的/proc/device tree 目录下根据节点名字创建不同文件夹。
二、更新设备树操作
在设备树中,节点和属性都是用DTS语言编写的。我们可以仿照着其他已经写好的程序仿写。如果想好好学习驱动开发的话可以深入学习,像系统调度,内核裁剪都是很热门的方向。
我就是为了实现相应功能(扩充PWM输出引脚),所以没有深入了解。
打开原设备源文件扩展dts,在iomuxc 节点下添加引脚信息,向PWM节点追加内容(我这里是增加了PWM输出功能。需要指定输出引脚节点,设置时钟),屏蔽掉其他复用IO。再打开设备树头文件dtsi,描述外部内设信息,根据系统需要添加引脚信息。
将编译出来的 Linux 镜像文件 zImage 和设备树文件放在NFS挂载共享文件夹中,启动Linux内核。
注:
- DTS是一个用于描述嵌入式硬件的语言,经过编译后可以得到二进制的DTB文件。DTS文件包含了设备树的节点和属性,用于描述嵌入式设备的硬件结构和属性。
- DTSI文件是一个头文件格式的文件,用于存储设备树节点和属性的公共部分,并可以在其他DTS文件中包含这个文件。这种方式使得DTS文件可以重用一些公共的设备树节点和属性定义,从而简化了设备树文件的编写和维护。
- DTC是一个用于将DTS文件编译成DTB二进制文件的工具。
- DTB是经过DTC编译后的二进制设备树文件,它描述了硬件平台上所有的硬件设备的信息,并在Linux内核启动时从引导程序中加载。
三、代码实现
此处是我实现PWM输出的伪代码
&pwm3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm3>;
clocks = <&clks IMX6UL_CLK_PWM3>,
<&clks IMX6UL_CLK_PWM3>;
status = "okay";
};
四、为什么要使用设备树
设备树的主要作用是在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的设备树源文件(DTS)即可。设备树文件描述了设备的结构和属性,包括设备节点、寄存器地址、中断信息等。
使用设备树具有以下优势:
- 可移植性好:设备树可以描述硬件设备的结构和属性,从而使得嵌入式系统的驱动程序更加具有可移植性,可以在不同的平台、不同的SOC上使用相同的驱动程序。
- 软件与硬件分离:设备树将硬件设备的结构和属性描述从内核空间分离出来,使得嵌入式系统开发过程中,软件和硬件开发可以并行进行,方便软硬件团队之间的协作。
- 系统配置灵活:设备树允许系统构建者在不改变内核源代码的情况下,动态更新硬件设备的配置信息,能够提高软件开发和调试的效率。
- 设备驱动开发方便:设备树将硬件设备的应用接口、中断和DMA信息等全部包含在内,驱动程序开发者可以通过使用设备树中的信息来快速开发驱动程序。
- 系统启动更快:传统的Linux内核启动时需要通过读取ATAG结构体等方式获取硬件信息,开销较大,而使用设备树可以快速地获取硬件信息并进行设备驱动程序的加载,能够提高系统启动的速度。
总结
总的来说,使用设备树可以使得嵌入式系统开发更加灵活、方便和效率化,降低硬件开发成本,提高软硬件协作的效率。