当前位置: 首页 > news >正文

Linux驱动学习(八)设备树

什么是设备树?

平台总线内容的学习中, 我们使用 platform_device 结构体来对硬件设备进行描述, 这是一种传统的平台总线设备描述方式。 每个 platform_device 结构表示一个特定的硬件设备, 并通过注册到平台总线上来使得内核能够与该设备进行通信和交互。 该结构包含设备的名称、 资源(如内存地址、 中断号等) 、 设备驱动程序等信息。

然而, 随着时间的推移, Linux 内核中的 ARM 部分存在着大量的平台相关配置代码, 这些代码通常是杂乱而重复的, 导致了维护的困难和工作量的增加。

为了应对这一挑战, ARM 社区开始探索新的硬件描述机制, 并逐渐形成了设备树的概念。设备树提供了一种更加灵活和可移植的描述硬件的机制, 将设备的描述信息转移到设备树中。设备树使用一种结构化的数据格式, 通过描述设备节点、 属性和连接关系等信息, 使得硬件的描述与具体的平台无关, 同时允许多个平台共享相同的设备树描述。

设备树逐渐成为了嵌入式系统和 Linux 内核中描述硬件的标准方式。 它
不仅在 ARM 架构上得到了广泛应用, 也被扩展到其他架构和平台上。

关于设备树的名词

DTS

DTS 是设备树的源文件, 采用一种类似于文本的语法来描述硬件设备的结构、 属性和连接关系。DTS 文件以.dts 为扩展名, 通常由开发人员编写。 它是人类可读的形式, 用于描述设备树的层次结构和属性信息。

DTSI

DTSI 文件是设备树源文件的包含文件。 它扩展了 DTS文件的功能, 用于定义可重用的设备树片段。 DTSI 文件以.dtsi 为扩展名, 可以在多个 DTS 文件中包含和共享。 通过使用 DTSI, 可以提高设备树的可重用性和可维护( 和 C 语言中头文件的作用相同)

DTB

DTB 是设备树的二进制表示形式。 DTB 文件是通过将 DTS 或 DTSI
文件编译而成的二进制文件, 以.dtb 为扩展名。

DTC

DTC 是设备树的编译器。 它是一个命令行工具, 用于将 DTS和 DTSI 文件编译成 DTB 文件。

设备树语法结构

以ft5x06 触摸中断设备树为例讲解设备树的的语法

/dts-v1/; //版本信息#include "dt-bindings/pinctrl/rockchip.h"
#include "dt-bindings/interrupt-controller/irq.h"
/{	// '/'根节点开头标识符model = "This is my devicetree!";ft5x06@38 {compatible = "edt,edt-ft5206";interrupt-parent = <&gpio0>;interrupts = <RK_PB5 IRQ_TYPE_EDGE_RISING>;};
};

准备:

ft5x06 的中断引脚号芯片引脚图:触摸引脚网络标TP_INT_L_GPIO0_B5, 对应的 SOC管脚为 GPIO0_B5
在这里插入图片描述
在内核源码目录下的“include/dt-bindings/pinctrl/rockchip.h” 头文件中, 定义了 RK 引脚名和 gpio 编号的宏定义
在这里插入图片描述
选择edt,edt-ft5206
1、/dts-v1/:版本信息(可选)

2、#include “dt-bindings/pinctrl/rockchip.h”
用于定义 Rockchip 平台的引脚控制器相关的绑定。定义在内核源码目录下:include/dt-bindings/pinctrl/rockchip.h

3、#include “dt-bindings/interrupt-controller/irq.h”
用于定义中断控制器相关的绑定,同样也在内核源码目录下(头文件目录)

4、model = “This is my devicetree!”
指定了设备树的模型名称, 描述为 “This is my devicetree!”

5、compatible = “edt,edt-ft5206”
指定了设备节点的兼容性字符串,表示该设备与 “edt,edt-ft5206” 兼容。

6、interrupt-parent = <&gpio3>
指定了中断的父节点,即中断控制器所在的节点。这里使用了一个引用(&gpio0)来表示父节点

7、interrupts = <RK_PA5 IRQ_TYPE_EDGE_RISING>
指定了中断信号的配置。RK_PB5 表示中断信号的引脚编号,IRQ_TYPE _EDGE_RISING 表示中断类型为上升沿触发

http://www.lryc.cn/news/611137.html

相关文章:

  • 《手撕设计模式》系列导学目录
  • 防火墙安全策略练习
  • Dot1x认证原理详解
  • LeetCode 面试经典 150_数组/字符串_H 指数(9_274_C++_中等)(排序后再进行判断)(计数)
  • 三坐标测量技术解析:从基础原理到斜孔测量难点突破
  • 智慧城市SaaS平台|市容环卫管理系统
  • 微服务—OpenFeign
  • 基于PD控制器的四旋翼无人机群飞行控制系统simulink建模与仿真
  • Crawl4AI:开源的AI友好型网页爬虫与数据抓取工具
  • MyBatis实现SQL
  • DM8日常运维命令总结(四)
  • jenkins插件Active Choices的使用通过参数动态控制多选参数的选项
  • 聚焦智能穿戴“下一代消费终端”之争,Meta/微美全息借AI+AR积淀定义行业未来
  • Swift 实战:用队列巧解 LeetCode 346 数据流中的移动平均数
  • 【RabbitMQ】高级特性—持久性、重试机制详解
  • 栈的输入与输出方式
  • 《算法导论》第 4 章 - 分治策略
  • Python Day23程序、进程、线程及多线程实现全解析 例题分析
  • 星图云开发者平台赋能商储油安全管控数字化转型
  • 为什么要选择时序数据库IoTDB?
  • Python爬虫08_Requests聚焦批量爬取图片
  • Pandas 入门:数据分析的得力工具
  • 嵌入式硬件中运放内部底层分析
  • 基于深度学习的医学图像分析:使用CycleGAN实现医学图像风格转换
  • 后量子时代已至?中国量子加密技术突破与网络安全新基建
  • 关于npx react-native run-android下载进程缓慢以及进程卡壳等问题的解决方案。
  • Java 大视界 -- Java 大数据在智能医疗电子病历数据分析与临床决策支持中的应用(382)
  • iOS混淆工具有哪些?技术演进与选型趋势全景解析
  • 企业如何用现代数仓架构挖掘新业务盈利点?AllData产品从目标、路径、结果给出答案
  • Go语言实战案例:使用sync.Mutex实现资源加锁