Linux驱动层学习:Linux 设备树

设备树是一种数据结构,包含多个节点,用于描述硬件设备及其配置信息,它通常用于嵌入式系统中,尤其是在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_DR(GPIO数据寄存器)0X0209C004 0X04   // GPIO1_GDIR(GPIO方向寄存器)
>;
作用:列出控制这个LED所需的所有寄存器地址和长度(单位:字节)。逐项解释:CCM_CCGR1 (0X020C406C)
控制时钟的开关。LED所在的GPIO模块需要时钟才能工作,类似“总电源开关”。SW_MUX_GPIO1_IO03 (0X020E0068)
配置引脚功能。比如将某个引脚设置为“GPIO模式”而非其他功能(如UART)。SW_PAD_GPIO1_IO03 (0X020E02F4)
配置引脚的电气属性,如上拉/下拉电阻、驱动强度等。GPIO1_DR (0X0209C000)
GPIO数据寄存器。写01控制引脚输出电平(低电平亮/灭,高电平反之)。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引脚 };

内核会自动处理时钟、复用等配置,无需手动写寄存器地址。

文档写法是**“底层直操作”**,通常用于特定需求或学习目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金蝶云星空与钉钉高效数据集成案例分享

金蝶云星空数据集成到钉钉的技术案例分享 在企业信息化系统中&#xff0c;数据的高效流动和实时反馈是提升业务效率的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空的数据集成到钉钉&#xff0c;并实现审核状态的回传提示。 本次集成方案名为“…

图形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan简介

1.Skia —— 2D 图形库 Skia 是一个 2D 图形库&#xff0c;它的作用是为开发者提供一个高层次的绘图接口&#xff0c;方便他们进行 2D 图形渲染&#xff08;比如绘制文本、形状、图像等&#xff09;。Skia 本身不直接管理 GPU 或进行底层的渲染工作&#xff0c;而是通过 底层图…

GIT提错分支,回滚提交

1. 准备示例 假设我们有三次提交&#xff1a; test1&#xff1a;需要在 master 分支提交test2、test3&#xff1a;需要在 develop 分支提交 远端线上记录 2. 步骤 选择需要回退的记录&#xff1a; 选中需要回退的 commit&#xff0c;选择 Reset Current Branch to Here...。…

【原创】在ubuntu中搭建gradle开发环境

检查Linux版本 rootwww:~# hostnamectlStatic hostname: www.0x88.comIcon name: computer-vmChassis: vmMachine ID: 30fa955a36be492ca459599ef20bc508Boot ID: 37084dbe36f44adaa075e8f9a98f132eVirtualization: kvm Operating System: Ubuntu 22.04.5 LTSKernel: Linux 5.…

【JavaEE进阶】MyBatis入门

目录 &#x1f334;前言 &#x1f332;什么是MyBatis? &#x1f333;准备工作 &#x1f6a9;创建工程 &#x1f6a9;配置数据库连接字符串 &#x1f6a9;数据准备 &#x1f6a9;编写持久层代码 &#x1f343;单元测试 &#x1f334;前言 在应⽤分层学习时,我们了解到…

以太网详解(八)传输层协议:TCP/UDP 协议

文章目录 传输层协议概述为什么需要传输层&#xff1f;传输层功能网络层与传输层在实现 “端到端” 传输的异同两类服务:面向连接/无连接服务 传输控制协议 TCPTCP 协议数据单元格式TCP 的重传机制快重传和快恢复快重传举例快恢复算法 用户数据报协议 UDPUDP 概述UDP 基本工作过…

Electron 客户端心跳定时任务调度库调研文档 - Node.js 任务调度库技术调研文档

Electron 客户端心跳定时任务调度库调研文档 - Node.js 任务调度库技术调研文档 本文将对七个流行的定时任务调度库&#xff1a;node-cron、rxjs、bull、node-schedule、agenda、bree、cron。这些库都可以用来处理定时任务&#xff0c;但它们的特点和适用场景有所不同。我们将从…

DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法

近几天DeepSeek开放平台无法充值目前已经关闭状态&#xff0c;大家都是忙着接入DeepSeek模型 &#xff0c;很多人想使用DeepSeek怎么办&#xff1f; 当然还有改用其他平台API调用方法&#xff0c;本文以本站的提供chatgpt系统为例&#xff0c;如何修改DeepSeek-chat模型API接口…

pix2text 使用经验

给同行打鸡血 &#x1f60a; 构建结构化的数理领域知识库&#xff1a; 提高可访问性和可搜索性 Markdown和LaTeX格式&#xff1a;这两种格式易于在线发布和共享&#xff0c;有助于提高数学内容的可访问性。搜索引擎优化&#xff1a;将PDF内容转换为标记语言&#xff0c;可以…

Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)

安装前检查服务器glibc版本&#xff0c;下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好&#xff0c;下载地址&#xff1a;https://pan.quark.cn/s/3137acc814c0&#xff0c;下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好&#xff0c;下载地址…

6.2.图的存储结构-邻接矩阵法

一.邻接矩阵法存储不带权图&#xff1a; 结点不带权值&#xff1a; 1.左图的无向图中&#xff0c;A到B直达的有一条路&#xff0c;所以A行B列的值为1&#xff1b; 左图的无向图中&#xff0c;A到F没有直达的路&#xff0c;所以A行F列的值为0&#xff1b; 结论&#xff1a;无…

【VB语言】EXCEL中VB宏的应用

【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、EXCEL-VB 1.实验过…

用deepseek学大模型05逻辑回归

deepseek.com:逻辑回归的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xff0c;及如何改进解决及改进方法数据推导。…

2025年02月17日Github流行趋势

项目名称&#xff1a;OmniParser 项目地址url&#xff1a;https://github.com/microsoft/OmniParser 项目语言&#xff1a;Jupyter Notebook 历史star数&#xff1a;8971 今日star数&#xff1a;969 项目维护者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kris…

RocketMQ 5.0安装部署

0.前言 在微服务架构逐渐成为主流的今天&#xff0c;消息队列如同数字世界的快递员&#xff0c;承担着系统间高效通信的重要使命。 Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余…

Ubuntu 22.04.5 LTS 安装企业微信,(2025-02-17安装可行)

一、依赖包(Ubuntu 20.04/Debian 11) 点击下载https://www.spark-app.store/download_dependencies_latest 1、 下载最新的依赖包。 请访问星火应用商店依赖包下载页面, 下载最新的依赖包。2、解压依赖包 </

如何使用 HPjtune 分析 Java GC 日志并优化 JVM 性能

HPjtune 是一款用于分析 Java 应用程序垃圾回收&#xff08;GC&#xff09;日志的工具&#xff0c;主要用于优化 JVM 性能。虽然 HPjtune 本身并不直接生成 HTML 格式的报告&#xff0c;但可以通过结合其他工具或方法将分析结果导出为 HTML 格式。以下是实现这一目标的步骤和方…

国产FPGA开发板选择

FPGA开发板是学习和开发FPGA的重要工具&#xff0c;选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展&#xff0c;淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售&#xff0c;本文将对国产FPGA和相关店铺做个简单梳理&#xff0c;帮助有需要使用…

Java高频面试之SE-22

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中的Optional了解多少&#xff1f; 在 Java 中&#xff0c;Optional 是 Java 8 引入的一个容器类&#xff0c;用于显式处理可能为 null 的…

使用OBS和nginx实现直播流

使用OBS和nginx实现直播流&#xff0c;如 1&#xff0c;下载OBS OBS用于视频录制和直播的免费开源软件。在 Windows、Mac 或 Linux 上快速轻松地下载并开始流式传输。官网下载 2&#xff0c;下载nginx 注意nginx需要下载带gryghon版本&#xff0c;这个才有rtmp模块&#xff0…