设备树是一种描述计算机特定硬件设备信息的数据结构,以便于操作系统的内核可以管理和使用这些硬件,包括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内核。
注:
此处是我实现PWM输出的伪代码
&pwm3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm3>;
clocks = <&clks IMX6UL_CLK_PWM3>,
<&clks IMX6UL_CLK_PWM3>;
status = "okay";
};
设备树的主要作用是在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的设备树源文件(DTS)即可。设备树文件描述了设备的结构和属性,包括设备节点、寄存器地址、中断信息等。
使用设备树具有以下优势:
总的来说,使用设备树可以使得嵌入式系统开发更加灵活、方便和效率化,降低硬件开发成本,提高软硬件协作的效率。