linux IRQ Management(六)- DTS及调试

article/2025/11/7 7:03:35
  • 了解DTS Interrupt 设置方式。

1.DTS 中 interrupt 描述

  • interrupt-controller - 一个空的属性定义, 该节点作为一个接收中断信号的设备。

  • #interrupt-cells - 这是一个中断控制器节点的属性。它声明了该中断控制器的中断指示符中 cell 的个数(类似于 #address-cells 和 #size-cells)。

  • interrupt-parent - 这是一个设备节点的属性,包含一个指向该设备连接的中断控制器的 phandle。那些没有 interrupt-parent 的节点则从它们的父节点中继承该属性。

  • interrupts - 一个设备节点属性,包含一个中断指示符的列表,对应于该设备上的每个中断输出信号。

2.中断控制器interrupt-controller

  一个中断控制器节点必须含有 interrupt-controller 属性,该属性是一个 bool 属性, 其值必须为空。也就是说,只要节点中含有 interrupt-controller 属性,那么这个节点 就是中断控制器。中断控制器节点必须含有 #interrupt-cells 属性,该属性定义节点中中断标识的 cell 数量。以下是三种 cell 中断表示的例子:

2.1.One cell

  中断控制器中,#interrupt-cells 属性设置为 1,此时节点中的中断标识只含有一个 cell,该 cell 用于指明中断在中断控制器内的偏移

Example:vic: interrupt@10140000 {compatible = "arm,versatile-vic";interrupt-controller;    		//此设备是一个中断控制器#interrupt-cells = <1>;reg = <0x10140000 0x1000>;};sic: intc@10003000 {compatible = "arm,versatile-sic";interrupt-controller;     //此设备是一个中断控制器#interrupt-cells = <1>;reg = <0x10003000 0x1000>;interrupt-parent = <&vic>;interrupts = <31>;					 /* Cascaded to vic */};

  本例中 vic,sic 都是中断控制器的节点,其中 vic 控制器定义了 cell 数为 1,那么 所有以它为父节点的节点,中断标识只含有一个 cell。如上 sic 也是一个中断控制器, 其以 vic 为父节点,所有 sic 的 interrupts 属性就只能含有一个 cell,sic 使用的 中断在 vic 中的偏移是 31。

2.2.Two Cell

  中断控制器中,#interrupt-cell 属性设置为 2,此时节点中的中断标识含有两个 cell:

  • 第一个 cell 用于指明在中断控制器内的偏移;
  • 第二个 cell 用于指明触发方式和级别;
bits[3:0] 触发类型和级别标志:1 = low-to-high edge triggered2 = high-to-low edge triggered4 = active high level-sensitive8 = active low level-sensitiveExample:i2c@7000c000 {gpioext: gpio-adnp@41 {compatible = "ad,gpio-adnp";reg = <0x41>;intrrupt-parent = <&gpio>;interrupts = <160 1>;gpio-controller;#gpio-cells = <1>;interrupt-controller;#interrupt-cells = <2>;nr-gpios = <64>;};sx8634@2b {compatible = "smtc,sx8634";reg = <0x2b>;interrupt-parent = <&gpioext>;interrupts = <3 0x8>;#address-cells = <1>;#size-cells = <0>;threshold = <0x40>;sensitivity = <7>;};};

2.3.Three Cell

GIC中断控制器:

Example:gic: interrupt-controller@d000 {compatible = "arm,cortex-a9-gic";interrupt-controller;#interrupt-cells = <3>;#size-cells = <0>;reg = <0xd000 0x1000>, <0xc100 0x1000>;};

  #interrupt-cells 属性由于指明中断源中 cell 的数量,GIC 中 interrupt-cells 的值为 3。每个 cell 的含义如下:

  • 第一个 cell 代表中断类型。
    • GIC_SPI:0;
    • GIC_PPI:1 ;
  • 第二个 cell 代表不同类型中断的中断号。
    • SPI 中断号的范围从 0 到 987;
    • PPI 中断号 从 0 到 15。
  • 第三个 cell 代表中断标识。

  各标识含义如下:

    bits[3:0] 代表触发类型1 = 上升沿 IRQ_TYPE_EDGE_RISING2 = 下降沿 IRQ_TYPE_EDGE_FALLING4 = 高电平有效 IRQ_TYPE_LEVEL_HGIH8 = 低电平有效 IRQ_TYPE_LEVEL_LOWbits[15:8] PPI 中断 CPU 掩码

3.操作interrupt APIs

include/linux/of_irq.h:45 extern int of_irq_count(struct device_node *dev);46 extern int of_irq_get(struct device_node *dev, int index);                                               47 extern int of_irq_get_byname(struct device_node *dev, const char *name);48 extern int of_irq_to_resource_table(struct device_node *dev,49         struct resource *res, int nr_irqs);50 extern struct device_node *of_irq_find_parent(struct device_node *child);51 extern struct irq_domain *of_msi_get_domain(struct device *dev,52                         struct device_node *np,53                         enum irq_domain_bus_token token);54 extern struct irq_domain *of_msi_map_get_device_domain(struct device *dev,55                                u32 rid);56 extern void of_msi_configure(struct device *dev, struct device_node *np);57 u32 of_msi_map_rid(struct device *dev, struct device_node *msi_np, u32 rid_in);

4.中断调试方法

  • /sys/kernel/debug/irq
  • /sys/kernel/debugirq_domain_mapping

4.1.查看系统信息

  开机后,从/proc/interrupts中看到当前的中断资源申请信息:

[root@tq2440 ]# cat /proc/interrupts CPU0       7:        926  s3c-eint   7 Edge      eth08:          0       s3c   8 Edge      s3c2410-rtc tick13:     567308       s3c  13 Edge      samsung_time_irq26:          0       s3c  26 Edge      ohci_hcd:usb127:          4       s3c  27 Edge      54000000.i2c       //I2C30:          0       s3c  30 Edge      s3c2410-rtc alarm32:         53  s3c-level  32 Level     50000000.serial   //UART0 RXD33:        230  s3c-level  33 Level     50000000.serial   //UART0 TXD59:          0  s3c-level  59 Edge      53000000.watchdog

上面这些参数的含义:
在这里插入图片描述
相关代码:

  • kernel/irq/debugfs.c
  • kernel/irq/irqdomain.c
  • kernel/fs/proc.c
  • fs/proc/interrupts.c

查看具体irq:

  • cat /proc/irq/27

5.案例

5.1.内核中断

/*
* Interrupt on DTS
*
* (C) 2018.11.14 <buddy.zhang@aliyun.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*//*
*        demo: demo2@2 {
*                compatible = "demo,demo_intr";
*                reg = <2>;
*                interrupt-parent = <&gpio0>;
*                interrupts = <11 2>;
*                status = "okay";
*        };
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/irq.h>
#include <linux/interrupt.h>#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>/* define name for device and driver */
#define DEV_NAME "demo_intr"
static int irq;static irqreturn_t demo_irq_handler(int irq, void *dev_id)
{printk("Hello World\n");return IRQ_HANDLED;
}/* probe platform driver */
static int demo_probe(struct platform_device *pdev)
{struct device_node *np = pdev->dev.of_node;int ret;/* Obtain interrupt ID from DTS */irq = of_irq_get(np, 0);/* Request irq handler */ret = request_threaded_irq(irq, NULL, demo_irq_handler,IRQF_ONESHOT | IRQF_TRIGGER_FALLING, "demo", NULL);if (ret) {printk("Failed to acquire irq %d\n", irq);return -EINVAL;}return 0;
}/* remove platform driver */
static int demo_remove(struct platform_device *pdev)
{/* Release Interrupt */free_irq(irq, NULL);return 0;
}static const struct of_device_id demo_of_match[] = {{ .compatible = "demo,demo_intr", },{ },
};
MODULE_DEVICE_TABLE(of, demo_of_match);/* platform driver information */
static struct platform_driver demo_driver = {.probe  = demo_probe,.remove = demo_remove,.driver = {.owner = THIS_MODULE,.name = DEV_NAME, .of_match_table = demo_of_match,},
};module_platform_driver(demo_driver);

5.2.gpio中断案例

arch/arm/boot/dts/imx6q-novena.dts:
268     touch: stmpe811@44 {
269         compatible = "st,stmpe811";
270         reg = <0x44>;
271         irq-gpio = <&gpio5 13 GPIO_ACTIVE_HIGH>;
 drivers/mfd/stmpe.c:       1292     pdata->irq_gpio = of_get_named_gpio_flags(np, "irq-gpio", 0,1293                 &pdata->irq_trigger);1371     ret = devm_gpio_request_one(ci->dev, pdata->irq_gpio, GPIOF_DIR_IN, "stmpe");1378     stmpe->irq = gpio_to_irq(pdata->irq_gpio);1404     if (stmpe->irq >= 0) {1405         ret = stmpe_irq_init(stmpe, np);1408 1409         ret = devm_request_threaded_irq(ci->dev, stmpe->irq, NULL,1410                 stmpe_irq, pdata->irq_trigger | IRQF_ONESHOT,1411                 "stmpe", stmpe);1417     }

参考:
https://biscuitos.github.io/blog/DTS-interrupt/


http://chatgpt.dhexx.cn/article/TJFs6JgK.shtml

相关文章

Linux IRQ number和中断描述符

一、前言 本文主要围绕IRQ number和中断描述符&#xff08;interrupt descriptor&#xff09;这两个概念描述通用中断处理过程。第二章主要描述基本概念&#xff0c;包括什么是IRQ number&#xff0c;什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述…

irqbalance

http://www.bubuko.com/infodetail-1129360.html irqbalance 理论上&#xff1a; 启用 irqbalance 服务&#xff0c;既可以提升性能&#xff0c;又可以降低能耗。 irqbalance 用于优化中断分配&#xff0c;它会自动收集系统数据以分析使用模式&#xff0c;并依据系统负载状况…

linux irq 接口,Linux内核API irq_set_irq_type

irq_set_irq_type函数功能描述&#xff1a;此函数用于设置中断处理函数触发的类型&#xff0c;被操作的中断描述符保存在数组irq_desc中&#xff0c;对应的下标为参数irq的值&#xff0c;设置的中断触发类型为参数type所代表的类型。 irq_set_irq_type文件包含 irq_set_irq_typ…

Linux Irq domain

本节学习下什么是irq domain, 以及irq domain的作用。可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期的系统只存在一个interrupt-controller的时候&#xff0c;而且中断数目也不多的时候&#xff0c;一个很简单的做法就是一个中断号对应到interrupt-contoller的…

linux IRQ Management(四)- IRQ Domain

了解IRQ Domain(中断控制器) 1.如何理解中断号&#xff1f; 每个IRQ同时有"irq"和"hwirq"两个编号。 "hwirq"是硬件中断号&#xff08;物理中断号&#xff09;&#xff0c;即芯片手册上写的号码&#xff0c;Interrupt controller用hwirq来标识…

linux设备驱动:中断处理中的hardirq与softirq详细流程

中断处理的整体框架&#xff1a; 内核用于标识中断上下文(in_interrupt())的变量preempt_count的布局&#xff1a; 按照x86处理器在外部中断发生时的硬件逻辑&#xff0c;在do_IRQ被调用时&#xff0c;处理器已经屏蔽了对外部中断的响应。在图中我们看 到中断的处理大体上被…

Java 字段封装快捷键

快捷键:shift alt s 选择&#xff1a;

Java封装阿里云对象存储OSS

Java封装阿里云对象存储OSS 阿里云对象存储OSS官网 本篇博客简单封装了阿里云的OSS存储中的建立连接&#xff1b;本地文件&#xff0c;输入流和URL三种方式上传文件&#xff0c;获取文件的输入流&#xff0c;删除文件&#xff0c;获取所有文件列表等功能。 OSS官方Api OSSp…

java 枚举 封装操作方法

前言&#xff1a; 由于刚转java项目&#xff0c;所以对于java语言比较陌生&#xff0c;尤其是lambda和一些诸如&#xff08;一个java文件只能有一个public class&#xff09;等等的零散知识点之类。。。 使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨…

Java封装和封装的案例

Java封装和封装的案例 目录 一、Java封装知识点简介 二、Java程序中的包 三、static关键字、代码块 四、封装的综合应用案例&#xff1a; 一、Java封装知识点简介 1、面向对象三大特性之封装的概念&#xff1a; 隐藏类的某些内部细节&#xff0c;不允许外部程序直接访问…

Java的封装方法

在面向对象程式设计方法中&#xff0c;封装&#xff08;英文名称&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的…

Java封装如何封装 封装的好处是什么?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、封装的作用是什么&#xff1f;二、封装的好处三、封装的步骤 1.引入库2.private的应用总结 前言 我要看电视&#xff0c;只需要按一下开关和换台就可以了。…

15、JAVA入门——封装

目录 一、封装 1、封装概述 2、封装的步骤 二、Java里的包 1、包的概述 2、包的定义 3、包的使用 4、注意事项 三、Java访问修饰符 1、类和类成员的访问控制 2、类的访问修饰符 3、类成员的访问修饰符 四、static关键字 1、static特点 2、static修饰属性 3、static修饰方法 4、…

初学java封装

封装 初识java封装 封装的用处&#xff1a; 1.提高程序的安全性&#xff0c;保护数据 2.隐藏代码的实现细节 3.统一接口 4.增加系统可维护性 这里创建一个类 public class Package {//属性私有private String name;//名字private int age; //年龄private int sex;//性别//1.…

java如何实现封装_java如何实现封装

Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。 java封装类通过三个步骤实现: (1)修改属性的可见性,限制访问。 (2)设置属性的读取方法。 (3)在读取属性的方法中,添加对属性读取的限制。 Java中什么叫封装呢? 继…

java封装dll文件_java类封装成dll

1&#xff0c;建立测试类&#xff0c;注意英文注释部分&#xff0c;用汉语直接编译会乱码 public classHello {//native method is used for call other language procedure//if use chinese here then Compile would be gibberish public native voidprintHello();static{ Sys…

java之封装

1.封装 1. 封装 1.1 private关键字 private是一个修饰符&#xff0c;可以用来修饰成员&#xff08;成员变量&#xff0c;成员方法&#xff09; 被private修饰的成员&#xff0c;只能在本类进行访问&#xff0c;针对private修饰的成员变量&#xff0c;如果需要被其他类使用&…

【JavaScript】js中非常常见的面试题

文章目录 1、手动实现防抖和节流2、let、const、var 的区别3、箭头函数与普通函数区别4、Promise5、数据类型6、检测数据类型的常用方法1 .typeof2 . instanceof3 .constructor4 . 使用 Object.prototype.toString.call()检测对象类型⭐5 . 自己封装函数6、isArray 7、数组的常…

JS的100道经典面试题(一)只看这四篇就够了,收藏起来以后偷偷看

年轻人你不讲武德&#xff0c;耗子尾汁~~~ 总结就是为了形成自己的js知识网&#xff0c;提升自己&#xff0c;加油&#xff01; 开始干 1、介绍js的基本数据类型   答&#xff1a; Undefined、Null、Boolean、Number、String 2、js有哪些内置对象&#xff1f;  答&…

大前端JS部分基础面试题(含答案)

1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型&#xff1a;Undefined、Null、Boolean、Number、String 值类型&#xff1a;数值、布尔值、null、undefined。 引用类型&#xff1a;对象、数组、函数。 堆栈数据结构&#xff1a;是一种支…