Linux-驱动-设备树实案例分析-中断

iTOP-RK3568 开发板 SDK 源码中的 ft5x06 设备树,分析中断配置案例
目的:自己能够在设备树中写一个中断,描述硬件信息


参考资料

Linux 设备树中的中断
设备驱动-10.中断子系统-3.中断设备树表述与解析
RK3568驱动指南|第七期-设备树-第57章 实例分析:中断

一、 中断相关属性

interrupts

interrupts 属性用于指定设备的中断相关信息。 它描述了中断控制器的类型、 中断引脚[在第一个参数这个女的索引]以及中断触发类型。
案例:

interrupts = <0 20 4>; // 通常格式:<中断控制器索引  中断引脚号、触发类型>

当然,也可以是宏定义描述:

gpio0: gpio@fdd60000 {
....
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
....
};

参数解析:中断控制器类型-中断引脚编号-中断触发类型

  • 1、 中断控制器类型
    nterrupts 属性的第一个参数指定了中断控制器的类型。 常见的类型包括 GIC (Generic Interrupt Controller)、 IRQ (Basic Interrupt Handling) 等。 例如, 在给定的代码片段中, GIC_SPI 表示中断控制器的类型为 GIC SPI 中断。

中断控制器负责管理系统中的中断信号, 它可以是硬件中的专用中断控制器, 也可以是处
理器内部的中断控制器。

参考资料,中断控制器类型:中断控制器类型解析

  • 2、中断引脚编号

interrupts 属性的第二个参数指定了设备所使用的中断引脚号。 中断引脚号是一个唯一标识符, 用于区分不同的中断信号源。 系统使用中断引脚号来识别中断源并进行相应的中断处理。

中断引脚号可以是一个整数值, 也可以是一个宏定义或符号引用。 在给定的代码片段中, 33 表示该设备使用的中断引脚号为 33

前面我们了解过相关知识,中断引脚号相关。 RK3568-中断-触摸屏中断

这里我举个列子,RK3568 平台 触摸屏触摸原理图拐脚如下:
在这里插入图片描述

那么我们在指定目录中找到对于的中断引脚号如下:
路径:

kernel/include/dt-bindings/pinctrl/rockchip.h

在这里插入图片描述
在这里插入图片描述

  • 3、中断触发类型
    interrupts 属性的第三个参数指定了中断的触发类型, 即中断信号的触发条件。 常见的触发类型包括边沿触发和电平触发。

边沿触发表示中断信号在从低电平到高电平或从高电平到低电平的变化时触发。 触发类型可以是上升沿触发、 下降沿触发或双边沿触发。 电平触发表示中断信号在保持特定电平状态时触发, 可以是高电平触发或低电平触发
前面我们了解过相关知识,中断类型。 RK3568-中断-触摸屏中断
在这里插入图片描述
对于 rk3568 平台而言,找到了 irq.h 文件中对于中断触发类型定义,文件路径如下:

include/dt-bindings/interrupt-controller/irq.h

在这里插入图片描述

interrupt-controller

标识该节点是一个中断控制器, 空属性,就是一个标志 说明它是一个中断控制器。

interrupt-controller; // 空属性,表示这是一个中断控制器

interrupt-parent

interrupt-parent 属性值是一个引用, 它指向中断控制器节点的路径或标签。 可以使用路径来引用中断控制器节点, 如/interrupt-controller-node, 或使用标签来引用中断控制器节点。

这个很好理解的,但是实际上我们需要理解,该怎么赋值。说白了属性大家都会写,那么值是哪一个呢? 怎么写呢?
我们还是以上面的一个 触摸屏板卡原理图来说明。
在这里插入图片描述

那我们就这样写

/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>;
};
};

interrupt-parent = <&gpio0>; 赋值的就是<&gpio0>, 看原理图呀,触摸屏的引脚编号就是 TP_INT_L_GRIO0_B5 ,所以 中断属性就写gpio0

反向看一下原厂BSP工程师写的源码里面gpio0 是不是一个中断。
路径:

kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi

在这里插入图片描述
说明没搞错,gpio0 里面的属性,interrupt-controller 属性,本身就是一个中断

#interrupt-cells

#interrupt-cells 指定interrupts属性需要多少个cell来描述一个中断

#interrupt-cells = <2>; // 例如:<中断引脚号 触发类型>

个人理解就是一个提前约束, 一般值为2 或者 3

二、设备树-中断示例编写

参考RK3568 一个旧的底板原理图来编写一个设备树 ,这里我们从小贴一下底板原理图,方便参考
在这里插入图片描述

这个图得到最核心的知识点,也如上前面分析 触摸屏引脚编号:TP_INT_L_GPIO0_B5。
所以 得到如下结论:

interrupt-parent = <&gpio0>;
B5 对应的就是中断引脚号,如上面讨论 知识点:
interrupts = <RK_PB5 IRQ_TYPE_EDGE_RISING>;

这里之前不太理解:明明是B5,为什么映射成RK_PB5 那是因为 RK_P 前缀是固定的。 

接下来最核心的就是设备树中 compatible 这个属性的值了,这也是重点知识点:设备和驱动自动映射的参数
源码位置:

kernel/drivers/input/touchscreen/edt-ft5x06.c  

在这里插入图片描述
源码里面提供了几个值,我们选择其中一个即可:

compatible = "edt,edt-ft5206";

综合上面分析,所以完整的设备树如下:

/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>;
};
}

总结

  • 这里写了一个中断的设备树 并 理解了相关语法、知识
  • 了解、理解 设备树中,中断相关属性interrupts、interrupt-controller、interrupt-parent、#interrupt-cells
  • 核心的东西 知道每个参数怎么配置比如:compatible、interrupt-parent 、interrupts、中断引脚号,如何在系统里面去找。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值