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、中断号,如何在系统里面去找。