网站快速排名,简述网站建设主要流程,电商网站建设需求,个人博客网站模板素材设备树是一种数据结构#xff0c;包含多个节点#xff0c;用于描述硬件设备及其配置信息#xff0c;它通常用于嵌入式系统中#xff0c;尤其是在Linux操作系统中#xff0c;帮助操作系统识别和管理硬件资源#xff0c;设备树不是代码#xff0c;而是一种用数据描述硬件信…设备树是一种数据结构包含多个节点用于描述硬件设备及其配置信息它通常用于嵌入式系统中尤其是在Linux操作系统中帮助操作系统识别和管理硬件资源设备树不是代码而是一种用数据描述硬件信息的方式
设备树通常是以一种树形结构来表示硬件各个部分的层次关系
设备树(Device Tree)将这个词分开就是“设备”和“树”描述设备树的文件叫做 DTS(Device Tree Source)这个 DTS 文件采用树形结构描述板级设备也就是开发板上的设备信息比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等 树的主干就是系统总线IIC 控制器、GPIO 控制器、SPI 控制器等都是接 到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种其中 IIC1 上接了 FT5206 和 AT24C02这两个 IIC 设备IIC2 上只接了 MPU6050 这个设备。DTS 文件的主要功能就是按图所示的结构来描述板子上的设备信息DTS 文件描述设备信息是有相应的语法规则要求的
设备树的结构 设备树的结构采用类似树形结构包含多个节点每个节点代表一个硬件设备或设备的某些特性。每个节点可以包含一些属性描述该设备的详细信息。 例如: 节点:代表硬件设备比如CPU、内存、串口、存储、网络接口等。 属性:描述该设备的特性或配置信息如设备的地址、类型、IRQ(中断请求)、驱动程序等。
设备树的语法 设备树通常使用一种简洁的描述语言(Device Tree Source简称DTS)来表示。DTS文件是纯文本文件后缀通常为.dts它们被编译成二进制的设备树二进制格式(Device Tree Blob简称DTB)该二进制文件会被操作系统加载和使用。 简单的设备树示例:
为什么要有设备树
1、硬件和内核解耦 以前硬件信息比如CPU型号、内存地址、外设位置直接写在内核代码里。换一块硬件板子就得重新改内核、重新编译。设备树把硬件信息抽离出来变成一个单独的文件.dts内核只需读取这个文件就能适配不同硬件。
2、支持多种硬件平台 比如树莓派3和树莓派4的硬件不同但可以用同一个内核不同的设备树文件启动内核无需为每块板子单独写代码。
3、方便维护 厂商更新硬件时只需修改设备树文件描述硬件不用动内核代码驱动逻辑。
设备树的作用 1、告诉内核硬件在哪里 比如“CPU是四核的”、“内存从地址0x80000000开始”、“I2C控制器在地址0x40005000连着触摸屏和温度传感器”。
2、描述硬件之间的关系 比如“USB控制器挂载在PCI总线的第3个插槽”、“GPIO引脚12连接了LED灯”。
3、配置硬件参数 比如“屏幕分辨率是1920x1080”、“以太网MAC地址是00:11:22:33:44:55”。
假设嵌入式板子上有一个LED灯连接在GPIO的第5个引脚没有设备树时需要在驱动代码里硬编码gpio5换到gpio6就得改代码、重新编译内核 有设备树时设备树文件里写gpios gpio 5 0; 驱动代码只需读取设备树中的gpios属性自动适配到gpio5。换引脚时只需改设备树内核代码不用动
设备树就像硬件的“身份证”“说明书”让内核能动态识别硬件而不是把硬件信息写死在内核里。它的核心作用解耦硬件配置和内核代码让Linux能灵活适配不同硬件
示例代码 alphaled 节点 alphaled { #address-cells 1; #size-cells 1; compatible atkalpha-led; status okay; reg 0X020C406C 0X04 /* CCM_CCGR1_BASE */ 0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */ 0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */ 0X0209C000 0X04 /* GPIO1_DR_BASE */ 0X0209C004 0X04 ; /* GPIO1_GDIR_BASE */ }; 这个节点描述的是一个LED灯的硬件控制信息 它需要告诉内核“LED灯的位置在哪里如何配置硬件寄存器才能控制它亮灭” 就像给内核一张 “LED操作手册” 说明控制这个LED需要操作哪些寄存器开关。
#address-cells 1;
#size-cells 1;
作用指定“地址”和“长度”用几个数字表示单位是32位即4字节。
这里都用1个数字。类比假设你要描述一本书的位置地址 书架编号1个数字长度 占用的格子数1个数字为何重要后续的 reg 属性依赖这两个值来解析地址和长度。compatible atkalpha-led;
作用匹配内核中的驱动程序内核会寻找支持 atkalpha-led
的驱动来操作这个设备。类比告诉内核“这个LED要用说明书编号为‘atkalpha-led’的驱动来操作”。关键点驱动代码里必须有对应的兼容性标识否则设备无法被识别status okay;
作用启用这个设备。如果设为 disabled内核会忽略它。类比给设备通电okay或断电disabled。reg 0X020C406C 0X04 // CCM_CCGR1时钟控制寄存器0X020E0068 0X04 // SW_MUX_GPIO1_IO03引脚复用控制0X020E02F4 0X04 // SW_PAD_GPIO1_IO03引脚电气属性配置0X0209C000 0X04 // GPIO1_DRGPIO数据寄存器0X0209C004 0X04 // GPIO1_GDIRGPIO方向寄存器
;
作用列出控制这个LED所需的所有寄存器地址和长度单位字节。逐项解释CCM_CCGR1 (0X020C406C)
控制时钟的开关。LED所在的GPIO模块需要时钟才能工作类似“总电源开关”。SW_MUX_GPIO1_IO03 (0X020E0068)
配置引脚功能。比如将某个引脚设置为“GPIO模式”而非其他功能如UART。SW_PAD_GPIO1_IO03 (0X020E02F4)
配置引脚的电气属性如上拉/下拉电阻、驱动强度等。GPIO1_DR (0X0209C000)
GPIO数据寄存器。写0或1控制引脚输出电平低电平亮/灭高电平反之。GPIO1_GDIR (0X0209C004)
GPIO方向寄存器。设置引脚为输入0或输出1这里需设为输出模式。类比你要控制一台电视需要知道电源开关位置CCM_CCGR1遥控器配对方式SW_MUX音量默认设置SW_PAD换台按钮GPIO_DR按钮功能分配GPIO_GDIR为什么需要这么多寄存器
硬件控制是精细活
在嵌入式系统中控制一个LED可能需要多个步骤开时钟GPIO模块需要时钟信号才能工作。配引脚功能确保这个引脚被用作GPIO而不是其他功能比如串口。配电气属性避免信号干扰确保稳定。设GPIO方向输出模式才能控制电平。写数据寄存器输出高/低电平控制LED亮灭。 通常Linux内核提供了更简洁的GPIO控制方法比如 led { compatible “gpio-leds”; led-gpios gpio1 3 GPIO_ACTIVE_LOW; // 直接指定GPIO引脚 }; 内核会自动处理时钟、复用等配置无需手动写寄存器地址。
文档写法是**“底层直操作”**通常用于特定需求或学习目的。