Linux驱动开发基础_在设备树中指定中断以及在代码中获得中断

news2024/11/18 17:44:27

目录

1 设备树里中断节点的语法

1.1 设备树里的中断控制器

1.2 设备树里使用中断

2  设备树里中断节点的示例

3 在代码中获得中断

3.1 对于 platform_device 

3.2  对于 I2C 设备、SPI 设备

3.3  调用 of_irq_get 获得中断号

3.4 对于 GPIO 


1 设备树里中断节点的语法

参考文档:内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt

1.1 设备树里的中断控制器

中断的硬件框图如下:

 在硬件上,“中断控制器”只有 GIC 这一个,但是我们在软件上也可以把上图中的“GPIO”称为“中断控制器”。很多芯片有多个 GPIO 模块,比如 GPIO1、GPIO2 等等。所以软件上的“中断控制器”就有很多个:GIC、GPIO1、GPIO2 等等。 
GPIO1 连接到 GIC,GPIO2 连接到 GIC,所以 GPIO1 的父亲是 GIC,GPIO2的父亲是 GIC。 

假设 GPIO1 有 32 个中断源,但是它把其中的 16 个汇聚起来向 GIC 发出一个中断,把另外 16 个汇聚起来向 GIC 发出另一个中断。这就意味着 GPIO1 会用到 GIC 的两个中断,会涉及 GIC 里的 2 个 hwirq。 

这些层级关系、中断号(hwirq),都会在设备树中有所体现。 在设备树中,中断控制器节点中必须有一个属性:interrupt-controller,表明它是“中断控制器”。 
还必须有一个属性:#interrupt-cells,表明引用这个中断控制器的话需要多少个 cell。 
#interrupt-cells 的值一般有如下取值: 
⚫  #interrupt-cells=<1> 
别的节点要使用这个中断控制器时,只需要一个 cell 来表明使用“哪一个中断”。 
⚫  #interrupt-cells=<2> 
别的节点要使用这个中断控制器时,需要一个 cell 来表明使用“哪一个中断”; 还需要另一个 cell 来描述中断,一般是表明触发类型: 

第 2 个 cell 的 bits[3:0] 用来表示中断触发类型(trigger type and level flags): 
1 = low-to-high edge triggered,上升沿触发 
2 = high-to-low edge triggered,下降沿触发 
4 = active high level-sensitive,高电平触发 
8 = active low level-sensitive,低电平触发 

示例如下: 

vic: intc@10140000 { 
  compatible = "arm,versatile-vic"; 
  interrupt-controller; 
  #interrupt-cells = <1>; 
  reg = <0x10140000 0x1000>; 
}; 

如 果 中 断 控 制 器 有 级 联 关 系 , 下 级 的 中 断 控 制 器 还 需 要 表 明 它 的“ interrupt-parent ” 是 谁 , 用 了 interrupt-parent ” 中 的 哪 一 个“interrupts”。

1.2 设备树里使用中断

一个外设,它的中断信号接到哪个“中断控制器”的哪个“中断引脚”,这个中断的触发方式是怎样的? 
这 3 个问题,在设备树里使用中断时,都要有所体现。 
⚫  interrupt-parent=<&XXXX> 
你要用哪一个中断控制器里的中断? 
⚫  interrupts 
你要用哪一个中断? 
Interrupts 里要用几个 cell,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有“#interrupt-cells”属性,它指明了要用几个 cell来描述中断。 
比如: 

i2c@7000c000 { 
  gpioext: gpio-adnp@41 { 
    compatible = "ad,gpio-adnp"; 
 
    interrupt-parent = <&gpio>; 
    interrupts = <160 1>; 
 
    gpio-controller; 
    #gpio-cells = <1>; 
 
    interrupt-controller; 
    #interrupt-cells = <2>; 
  }; 
...... 
}; 

⚫  新写法:interrupts-extended 
一个“interrupts-extended”属性就可以既指定“interrupt-parent”,也指定“interrupts”,比如: 

interrupts-extended = <&intc1 5 1>, <&intc2 1 0>; 

2  设备树里中断节点的示例

 从设备树反推 IMX6ULL 的中断体系,如下,比之前的框图多了一个“GPC INTC”:

 GPC  INTC 的 英 文 是 : General  Power  Controller,  Interrupt Controller。它提供中断屏蔽、中断状态查询功能,实际上这些功能在 GIC 里也实现了,个人觉得有点多余。除此之外,它还提供唤醒功能,这才是保留它的原因。 

3 在代码中获得中断

 之 前 我 们 提 到 过 , 设 备 树 中 的 节 点 有 些 能 被 转 换 为 内 核 里 的platform_device,有些不能,回顾如下:

  • 根节点下含有 compatile 属性的子节点,会转换为 platform_device 
  • 含有特定 compatile 属性的节点的子节点,会转换为 platform_device 如果一个节点的 compatile 属性,它的值是这 4 者之一:"simple-bus","simple-mfd","isa","arm,amba-bus",  那么它的子结点(需含 compatile 属性)也可以转换为 platform_device。
  • 总线 I2C、SPI 节点下的子节点:不转换为 platform_device 某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为 platform_device。 

3.1 对于 platform_device 

一个节点能被转换为 platform_device,如果它的设备树里指定了中断属性,那么可以从 platform_device 中获得“中断资源”,函数如下,可以使用下列函数获得 IORESOURCE_IRQ 资源,即中断号: 

/** 
 * platform_get_resource - get a resource for a device 
 * @dev: platform device 
 * @type: resource type   // 取哪类资源?IORESOURCE_MEM、IORESOURCE_REG 
*                      // IORESOURCE_IRQ 等 
 * @num: resource index  // 这类资源中的哪一个? 
 */ 
struct resource *platform_get_resource(struct platform_device *dev, 
unsigned int type, 
unsigned int num); 

3.2  对于 I2C 设备、SPI 设备

对于 I2C 设备节点,I2C 总线驱动在处理设备树里的 I2C 子节点时,也会处理其中的中断信息。一个 I2C 设备会被转换为一个 i2c_client 结构体,中断号会保存在 i2c_client 的 irq 成员里,代码如下(drivers/i2c/i2c-core.c): 

 对于 SPI 设备节点,SPI 总线驱动在处理设备树里的 SPI 子节点时,也会处理其中的中断信息。一个 SPI 设备会被转换为一个 spi_device 结构体,中断号会保存在 spi_device 的 irq 成员里,代码如下(drivers/spi/spi.c):

 3.3  调用 of_irq_get 获得中断号

如果你的设备节点既不能转换为 platform_device,它也不是 I2C 设备,不是 SPI 设备,那么在驱动程序中可以自行调用 of_irq_get 函数去解析设备树,得到中断号。

3.4 对于 GPIO 

可以使用 gpio_to_irq 或 gpiod_to_irq 获得中断号。 举例,假设在设备树中有如下节点:

gpio-keys { 
    compatible = "gpio-keys"; 
    pinctrl-names = "default"; 
 
    user { 
        label = "User Button"; 
        gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>; 
        gpio-key,wakeup; 
        linux,code = <KEY_1>; 
    }; 
}; 

那么可以使用下面的函数获得引脚和 flag: 
button->gpio = of_get_gpio_flags(pp, 0, &flags); 
bdata->gpiod = gpio_to_desc(button->gpio); 
再去使用 gpiod_to_irq 获得中断号: 
irq = gpiod_to_irq(bdata->gpiod); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OVN实验----L3互通

概述 物理拓扑 如上一个实验OVN实验----L2互通 逻辑拓扑 按照上个实验OVN实验----L2互通 的操作方式&#xff0c;再配置一组容器blue&#xff0c;网段192.168.2.0/24 配置完成后可以在central上ovn-sbctl show看到如下4个绑定接口 此时&#xff0c;red和blue两个网段内是可…

EasyTrans,一个注解搞定数据翻译,减少30%SQL代码量

介绍easy trans适用于3种场景1 有userId/idCardNo(身份证号码-唯一键场景) 需要 userName&#xff0c;无需联表查询。2 有gender code 0 需要 男。3 枚举指定属性给前端亮点1 缓存支持2 跨微服务翻译支持(User和Order 是2个不同微服务&#xff0c;order里面有userId 需要userNa…

strapi系列--如何自定义非界面化的接口,定制化自己的业务逻辑

为什么要进行后端定制呢&#xff1f; 在实际开发过程中&#xff0c;项目中有些需求是不需要创建界面化接口的&#xff0c;需要我们定制化自己的业务逻辑&#xff0c;那么我们该如何处理这个需求呢&#xff1f;本文以图文并茂的形式&#xff0c;定制一个我们自己的业务逻辑接口…

blender 应用物体变换的作用

编辑模式和物体模式操作的区别 旋转 在物体模式下旋转时物体旋转值会发生变换** 在编辑模式下旋转时物体不会发生变化** 缩放 在物体模式下缩放会导致缩放尺寸发生变化 在编辑模式下缩放时&#xff0c;缩放属性不会发生变化 应用物体变换 把物体模式下的缩放旋转变换应…

Android---TabLayout

目录 TabLayout TabItem ​编辑 演示效果的xml TabLayout TabLayout 在开发中一般作为选项卡使用&#xff0c;常与 ViewPager2 和 Fragment 结合起来使用。 常用属性&#xff1a; app:tabBackground 设置 TabLayout 的背景色&#xff0c;改变整个TabLayout 的颜色&#xf…

绪论的习题

刘佳瑜*&#xff0c;王越 *, 黄扬* , 张钊* (淮北师范大学计算机科学与技术学院&#xff0c;安徽 淮北) *These authors contributed to the work equllly and should be regarded as co-first authors. &#x1f31e;欢迎来到机器学习的世界 &#x1f308;博客主页&#xff1…

idea调试常用的快捷键

一、F7 步入调试&#xff0c;进入当前函数内部。 说明&#xff1a; 如果步入的是自己编的函数&#xff0c;可读性会好很多。 如果是系统函数&#xff0c;我个人目前水平&#xff0c;觉得很难读。而且idea系统已编写好的函数&#xff0c;除非是研究源码&#xff0c;否则感觉…

javaweb08 javaweb、tomcat、maven简介、servlet原理和实例、Mapping映射、请求转发和读取properties文件

文章目录一、javaweb简介二、Tomcat三、Maven四、Servlet简介和HelloWorld五、Servlet原理六、Mapping映射七、ServletContext八、请求转发九、读取资源文件properties一、javaweb简介 在java中&#xff0c;动态web资源开发的技术成为javaweb 人们访问到的任何一个网页和资源…

C语言字符串库函数模拟实现

字符串检验 strlen 函数原型 /// brief 返回给定空终止字符串的长度&#xff0c;即首元素为 str 所指&#xff0c;且不包含首个空字符的字符数组中的字符数 /// param str 指向要检测的字符串的指针 /// return 字符串 str 的长度 size_t strlen( const char *str );空终止字…

C语言实现通讯录静态版本

通讯录中首先要有人的信息&#xff0c;然后是存放多少个人的信息 再丰富一下通讯录的功能&#xff0c;例如增删查改、显示、排序。 我们分三个文件来实现。 1、实现简易的菜单&#xff0c;通讯录的整体逻辑 #include"contact.h"void menu() {printf("*****…

900页文档比对只需5分钟?鸿翼InWise文档比对,以人工智能撬动办公效率杠杆

在日常办公中&#xff0c;多份文件间的检查、纠错、复核工作不可避免&#xff0c;这类工作往往具有很强的重复性&#xff0c;占用了大量的工作时间。鸿翼InWise平台文档比对能够赋能企业极速完成海量文档、图片的高精度比对&#xff0c;以人工智能撬动企业生产力提升。 随着数字…

MySQL调优-MySQL索引深入总结

目录 MySQL索引深入总结 InnoDB中的索引复习 聚集索引/聚簇索引 问题&#xff1a;如果我们没有定义主键呢&#xff1f; 问题&#xff1a;分析一下B树三层和四层的性能差异&#xff1f; 辅助索引/二级索引 回表 问题&#xff1a;为什么我们还需要一次回表操作呢?直接把完…

亚马逊云科技:小鹏汽车拓展全球市场,跑出“加速度”

汽车产业变革走向下半场&#xff0c;智能汽车的市场份额之争也从国内走向国际&#xff0c;出海之战讲求速战速决&#xff0c;小鹏汽车携手亚马逊云科技拓展海外市场&#xff0c;完成海外布局。 扩大“鹏”友圈&#xff0c;迈进欧洲市场 近年来&#xff0c;小鹏汽车不断推进全…

数字人民币年度总结:支付变革未停、试点之风再起

文/尹宁出品/陀螺研究院数字人民币&#xff0c;无疑是近年来热度最高的词汇之一&#xff0c;作为我国法币的数字形式&#xff0c;至其出世伊始&#xff0c;不论是资金溯源的透明追踪、零售更新的消费用途&#xff0c;还是跨境结算的雄图大略&#xff0c;围绕其推广与意义的讨论…

关于 国产麒麟系统上长时间运行Qt程序根目录/下磁盘空间占用100%导致无法写入 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128671382 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

LeetCode 129. 求根节点到叶节点数字之和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 129. 求根节点到叶节点数字之和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名…

4.6 集成运放的使用

一、使用时必做的工作 1、集成运放的外引线&#xff08;管脚&#xff09; 目前集成运放的常见封装方式有金属壳封装和双列直插式封装&#xff0c;外形如图4.6.1所示&#xff0c;以后者居多。双列直插式有 8、10、12、14、16 管脚等种类&#xff0c;虽然它们的外引线排列日趋标…

laravel JWT 用户认证 实现API认证

JWT 是 JSON Web Token 的缩写&#xff0c;它是一个规范&#xff0c;让用户和服务器之间传递安全可靠的信息。 JWT介绍 JWT 由头部&#xff08;header&#xff09;、载荷&#xff08;payload&#xff09;与签名&#xff08;signature&#xff09;组成 { “typ”:“JWT”, “a…

python的8大核心语句,你确定不来看看嘛,那格局就小啦

Python 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点&#xff0c;并附上详细的实例代码。如能在实战…

学习使用 Clion 第一次使用Clion开发Qt的hello world

为什么使用Clion之前在window上开发软件基本上是使用VS2022,使用Clion在windows上开发并不是嫌弃VS2022不好用,相反我依然觉得VS是世界上最好用的IDE没有之一.没有其他的理由,这是我第一款使用的IDE,而且已经很使用的熟练.那为什么还要学习使用Clion了,其实是考虑到跨平台.VS有…