RK3568驱动指南|第七期-设备树-第57章 实例分析:中断

2023-10-20 18:13

本文主要是介绍RK3568驱动指南|第七期-设备树-第57章 实例分析:中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第七期_设备树_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第57章 实例分析:中断

57.1 中断相关属性

57.1.1 RK ft5x06设备树节点

下面展示的是iTOP-RK3568开发板SDK源码中的ft5x06设备树,其中蓝色字体部分就是关于中断相关的描述,包括了interrupts、 interrupt-controller、#interrupt-cells、interrupt-parent四种常见属性:

gpio0: gpio@fdd60000 {compatible = "rockchip,gpio-bank";reg = <0x0 0xfdd60000 0x0 0x100>;interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;clocks = <&pmucru PCLK_GPI00>, <&pmucru DBCLK_GPI00>;gpio-controller;#gpio-cells = <2>;gpio-ranges = <&pinctrl 0 0 32>;interrupt-controller;#interrupt-cells = <2>;
};ft5x06: ft5x06@38 { status = "disabled";compatible = "edt,edt-ft5306";reg = <0x38>;touch-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_RISING>;interrupt-parent = <&gpio0>;interrupts = <RK_PB5 IRQ_TYPE_LEVEL_LOW>;reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;touchscreen-size-x = <800>;touchscreen-size-y = <1280>;touch_type = <1>;
};

其中gpio0节点是在内核源码的“/arch/arm64/boot/dts/rockchip/rk3568.dtsi”设备树的3549-3560行定义的,而ft5x06: ft5x06@38触摸芯片节点是在内核源码的“/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi”设备树的301-313行定义的。接下来将会对设备树常见的四个中断属性进行介绍。

57.1.2 interrupts 

interrupts 属性用于指定设备的中断相关信息。它描述了中断控制器的类型、中断号以及中断触发类型。下面将对interrupts 属性的各个方面进行介绍。

在第一小节中列举的设备树源码中的gpio0节点和ft5x06节点都涉及到了interrupts 属性,如下所示:

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

gpio0节点的interrupts具有三个参数,分别表示中断控制器类型、中断号和中断触发类型,每个参数的具体描述如下所示:

1中断控制器类型:

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

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

2中断号:

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

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

3中断触发类型:

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

边沿触发表示中断信号在从低电平到高电平或从高电平到低电平的变化时触发。触发类型可以是上升沿触发、下降沿触发或双边沿触发。电平触发表示中断信号在保持特定电平状态时触发,可以是高电平触发或低电平触发。

在给定的代码片段中,IRQ_TYPE_LEVEL_HIGH 表示中断的触发类型为高电平触发。触发类型的宏定义在内核源码“include/dt-bindings/interrupt-controller/irq.h”目录下,具体内容如下所示:

#define IRQ_TYPE_NONE           0   // 无中断触发类型
#define IRQ_TYPE_EDGE_RISING    1   // 上升沿触发
#define IRQ_TYPE_EDGE_FALLING   2   // 下降沿触发
#define IRQ_TYPE_EDGE_BOTH    (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)// 双边沿触发
#define IRQ_TYPE_LEVEL_HIGH     4   // 高电平触发
#define IRQ_TYPE_LEVEL_LOW      8   // 低电平触发

而在ft5x06节点中只有中断号和中断触发类型两个参数,这是为什么呢,带着疑问我们继续学习下面的几个属性。

57.1.3 interrupt-controller

interrupt-controller 属性是设备树中用于描述中断控制器的属性之一。它提供了关于中断控制器的相关信息,以便操作系统和其他设备能够正确配置和使用中断系统。
interrupt-controller 属性用于标识当前节点所描述的设备是一个中断控制器。中断控制器是硬件或软件模块,负责管理和分发中断信号。它接收来自各种设备的中断请求,并根据优先级和配置规则分发中断给相应的处理器或设备。
interrupt-controller属性本身没有特定的属性值,只需出现在节点的属性列表中即可。出现该属性的存在即表示该节点描述的设备是中断控制器。

57.1.4 interrupt-parent

interrupt-parent 属性是设备树中用于建立中断信号源与中断控制器之间关联的属性。它指定了中断信号源所属的中断控制器节点,以确保正确的中断处理和分发。
interrupt-parent属性用于指定中断信号源所属的中断控制器。中断信号源是产生中断的设备或其他中断源节点。通过指定中断控制器,操作系统可以正确地将中断请求传递给相应的中断控制器节点进行处理和分发。
interrupt-parent属性值是一个引用,它指向中断控制器节点的路径或标签。可以使用路径来引用中断控制器节点,如/interrupt-controller-node,或使用标签来引用中断控制器节点,如 &interrupt-controller-label,在第一小节例子中的 ft5x06就是通过中断控制器节点和gpio0中断控制器建立了联系,如下所示:

ft5x06: ft5x06@38 { ....interrupt-parent = <&gpio0>;
};

中断信号源节点(例如设备节点或其他中断源节点)中的 interrupt-parent 属性用于指定中断信号源所属的中断控制器节点。这样,中断信号源就可以将中断请求传递给正确的中断控制器进行处理。中断信号源节点的 interrupts 属性中的中断号和其他相关信息将与指定的中断控制器关联起来。
在某些情况下,中断控制器可以形成多级结构,其中一个中断控制器节点可能是另一个中断控制器的父节点。在这种情况下,interrupt-parent 属性可以用于指定层次结构中的上级中断控制器。

57.1.5 #interrupt-cells

#interrupt-cells属性用于描述中断控制器中每个中断信号源的中断编号单元的数量。中断编号单元是指用于表示中断号和其他相关信息的固定大小的单元。通过指定中断编号单元的数量,操作系统可以正确解析和处理中断信息,并将其与中断控制器和中断信号源进行关联。
#interrupt-cells属性的值是一个整数,表示中断编号单元的数量。通常,这个值是一个正整数,例如 1、2 或 3,取决于中断控制器和设备的要求。

在gpio0的中断控制器为gic,在gic节点中#interrupt-cells属性被设置为3,这也就是为什么在gpio0节点中interrupts 属性有三个值,而ft5x06的中断控制器为gpio0,在gpio0节点中#interrupt-cells属性被设置为2,所以ft5x06节点的interrupts 属性只有两个值。

57.2 中断实例编写

在上一个小节中对设备树中断要用到的属性进行了讲解,而在本小节将会编写一个在RK3568上的ft5x06触摸中断设备树。

首先确定ft5x06的中断引脚号,由于iTOP-RK3568有1.2和1.7两个版本,所以这里展示了两个版本的原理图:

第一张图为V1.2版本的原理图,触摸引脚网络标号为TP_INT_L_GPIO0_B5,对应的SOC管脚为GPIO0_B5,第二张图为V1.7版本的原理图,触摸引脚网络标号为TP_INT_L_GPIO3_A5,对应的SOC管脚为GPIO3_A5。

然后来查看内核源码目录下的“drivers/input/touchscreen/edt-ft5x06.c”文件,这是ft5x06的驱动文件,找到compatible匹配值相关的部分,如下(图 57-3)所示:

这里的compatible匹配值都可以选择,作者选择的是edt,edt-ft5206,选择其他compatible也是可以的。

在内核源码目录下的“include/dt-bindings/pinctrl/rockchip.h”头文件中,定义了RK引脚名和gpio编号的宏定义,如下图(57-4)所示:

可以看到RK已经将GPIO组和引脚编号写成了宏定义的形式,通过宏定义可以减少在编写设备树的过程中换算的时间,并且帮助大家进行理解。

至此,关于编写ft5x06设备树的前置内容就查找完成了,接下来进行设备树的编写。

   编写完成的设备树如下所示:
V1.2

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

V1.7 

/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 = <&gpio3>;interrupts = <RK_PA5 IRQ_TYPE_EDGE_RISING>;};
};

第1行: 设备树文件的头部,指定了使用的设备树语法版本。

第3行:用于定义 Rockchip 平台的引脚控制器相关的绑定。

第4行:用于定义中断控制器相关的绑定。

第5行:表示设备树的根节点开始。

第6行:指定了设备树的模型名称,描述为 "This is my devicetree!"。

第9行:指定了设备节点的兼容性字符串,表示该设备与 "edt,edt-ft5206" 兼容。

第10行:指定了中断的父节点,即中断控制器所在的节点。这里使用了一个引用(&gpio0)来表示父节点。

第11行:指定了中断信号的配置。RK_PB5 表示中断信号的引脚编号,IRQ_TYPE_EDGE_RISING 表示中断类型为上升沿触发。

至此,关于ft5x06的设备树就讲解完成了。

57.3 其他SOC设备树对比

而无论使用的是瑞芯微SOC还是恩智浦、三星的SOC,在设备树关于中断相关的描述都离不开上面提到的四个属性,关于在恩智浦和三星源码中的ft5x06设备树如下所示:

恩智浦

gpio1: gpio@0209c000 {compatible = "fsl,inx6ul-gpio", "fsl,imx35-gpio";reg = <0x0209c000 0x4000>;interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;edt-ft5x06@38 {compatible = "edt,edt-ft5306", "edt,edt-ft5x06", "edt,edt-ft5406";pinctrl-names = "default";pinctrl-0 = <&ts_int_pin &ts_reset_pin>;reg = <0x38>;interrupt-parent = <&gpio1>;interrupts = <9 0>;reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;status = "disabled";};
};

三星

gpio_c: gpioc {compatible = "gpio-controller";#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;
};ft5x06: ft5x06038 {compatible = "edt,edt-ft5406";reg = <0x38>;pinctrl-names = "default";#if defined(RGB_1024x600) || defined(RGB_800x480)pinctrl-0 = <&tsc2007_irq>;interrupt-parent = <&gpio_c>;interrupts = <26 IRQ_TYPE_EDGE_FALLING>;#endif#if defined(LvDs_800×1280) || defined(LvDS_1024x768)pinctrl-0 = <&gt911_irq>;interrupt-parent = <&gpio_b>;interrupts = <29 IRQ_TYPE_EDGE_FALLING>;#endifreset-gpios = <&gpio_e 30 0>;
};

对比之后会发现,不同厂商对于中断属性的配置都是类似的,只是里面的参数有些许区别,如果大家在之后遇到了其他平台,只需要稍加区分即可。


这篇关于RK3568驱动指南|第七期-设备树-第57章 实例分析:中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248831

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud