Linux内核 -- irq_of_parse_and_map 接口使用详解

irq_of_parse_and_map 接口详解

irq_of_parse_and_map 是 Linux 内核中用于处理设备树(Device Tree)中的中断映射的一个常用接口。它主要用于将设备树中定义的中断资源解析并映射到一个 IRQ 号,以便内核能够识别和管理这些中断。

函数原型

unsigned int irq_of_parse_and_map(struct device_node *dev, int index);

参数详解

  • dev: 这是一个指向设备节点(struct device_node)的指针,代表了设备树中的一个节点。这个节点通常包含了中断控制器相关的信息。
  • index: 这是一个整数,表示在设备树中需要解析的中断号的索引。由于一个设备可能有多个中断,所以使用索引来选择具体的中断。

返回值

  • 成功时,返回一个有效的 IRQ 号。
  • 失败时,返回 0,表示中断映射失败。

工作原理

  1. 解析设备树: irq_of_parse_and_map 函数首先会根据传入的设备节点和索引,查找设备树中相应的中断控制器信息。
  2. 中断映射: 找到中断信息后,函数会调用中断控制器的相关回调函数,将设备树中的中断描述符映射成内核能够处理的 IRQ 号。
  3. 返回 IRQ 号: 映射成功后,函数返回对应的 IRQ 号。这个 IRQ 号可以用于后续的中断处理,比如 request_irq 等。

典型用法

通常在设备驱动程序中使用 irq_of_parse_and_map 函数来解析和映射设备树中的中断信息,例如:

struct device_node *np = of_find_node_by_name(NULL, "my-device");
unsigned int irq = irq_of_parse_and_map(np, 0);
if (!irq) {pr_err("Failed to map IRQ for my-device
");return -ENODEV;
}ret = request_irq(irq, my_irq_handler, 0, "my-device-irq", dev);
if (ret) {pr_err("Failed to request IRQ %u for my-device
", irq);return ret;
}

设备树中的中断描述

设备树使用一种叫做 “Flattened Device Tree” (FDT) 的结构来表示硬件资源。每个硬件设备在设备树中都有一个节点,这个节点可以包含多个属性来描述设备的特性。其中,中断资源通常通过 interruptsinterrupt-parent 属性来描述。

设备树节点示例

假设我们有一个设备树节点描述如下:

my_device: my_device@1000 {compatible = "mycompany,my-device";reg = <0x1000 0x100>;interrupts = <3 1>; /* 中断号3,触发类型1(例如:高电平触发) */interrupt-parent = <&intc>; /* 指向中断控制器 */
};

这里的设备树节点描述了一个名为 my_device 的设备,它在 0x1000 地址处有寄存器区域,并且有一个中断资源。interrupts 属性定义了中断号和触发类型,而 interrupt-parent 属性指定了中断控制器(intc)的引用。

irq_of_parse_and_map 如何与设备树关联

在驱动程序中,通常需要从设备树中读取这个中断信息,并将其映射为内核中的 IRQ 号。使用 irq_of_parse_and_map 就可以做到这一点。

驱动程序中的代码示例

struct device_node *np;
unsigned int irq;/* 找到设备节点 */
np = of_find_node_by_name(NULL, "my_device");
if (!np) {pr_err("Failed to find device node for my_device
");return -ENODEV;
}/* 解析并映射设备树中的中断 */
irq = irq_of_parse_and_map(np, 0);
if (!irq) {pr_err("Failed to map IRQ for my_device
");return -ENODEV;
}/* 请求中断 */
ret = request_irq(irq, my_irq_handler, 0, "my_device_irq", dev);
if (ret) {pr_err("Failed to request IRQ %u for my_device
", irq);return ret;
}

设备树与 irq_of_parse_and_map 的关联

  • 中断描述: 设备树节点中的 interrupts 属性描述了中断号和触发方式,而 interrupt-parent 指定了中断控制器。
  • 中断解析: irq_of_parse_and_map 使用这些信息解析出设备的中断号,并与系统内的中断资源相对应。
  • 设备树的灵活性: 通过设备树,硬件资源和配置从内核代码中解耦出来,使得内核更加通用,并且可以通过设备树轻松适配不同的硬件平台。

总结

irq_of_parse_and_map 是驱动程序中与设备树中断描述紧密相关的重要接口。它通过解析设备树中定义的中断信息,将硬件中断资源映射到内核可识别的 IRQ 号,为设备的正常工作提供了关键支持。在设备驱动开发中,理解设备树的中断定义及其与 irq_of_parse_and_map 的关联,对于正确处理硬件中断至关重要。

of_find_node_by_name 中设备节点名称的使用

在设备树中使用 of_find_node_by_name 函数时,传递给该函数的名字应该是 : 前面的部分,即设备树节点名称,而不是 : 后面的部分。

示例

假设我们有以下设备树节点:

my_device: my_device@1000 {compatible = "mycompany,my-device";reg = <0x1000 0x100>;interrupts = <3 1>;interrupt-parent = <&intc>;
};

在这个示例中,my_device: 是设备节点的标签,my_device@1000 是设备节点的名称。在调用 of_find_node_by_name 时,应该传递节点的名称 my_device@1000,而不是标签 my_device

代码示例

struct device_node *np;/* 查找设备树中的节点,使用节点名称 */
np = of_find_node_by_name(NULL, "my_device@1000");
if (!np) {pr_err("Failed to find device node for my_device@1000
");return -ENODEV;
}

总结

  • : 前的部分: 这是设备树节点的标签,用于在设备树中唯一标识这个节点,通常用于引用。
  • : 后的部分: 这是设备树节点的名称,of_find_node_by_name 应该使用这个名称来查找节点。

在使用 of_find_node_by_name 时,填入的应该是设备树中 : 后面的部分,即节点名称,如 my_device@1000

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

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

相关文章

PyTorch深度学习快速入门教程【土堆】基础知识篇

Juptyer 版本&#xff1a; Python 3.9.19Pytorch 2.4.1 (pytorch0) C:\Users\25694>conda install nb_conda_kernels(pytorch0) C:\Users\25694>jupyter notebook使用conda环境的pytorch&#xff1a; 成功解决python.exe无法找到程序入口 无法定位程序输入点 shifte…

【Python语言初识(一)】

一、python简史 1.1、python的历史 1989年圣诞节&#xff1a;Guido von Rossum开始写Python语言的编译器。1991年2月&#xff1a;第一个Python编译器&#xff08;同时也是解释器&#xff09;诞生&#xff0c;它是用C语言实现的&#xff08;后面&#xff09;&#xff0c;可以调…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

【C++ 学习】多态的基础和原理(10)

目录 前言1. 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数重写2.4 虚函数重写的例外2.4.1 协变2.4.1 析构函数的重写 2.5 多态调用和普通调用2.6 函数重写/函数隐藏/函数重载 的对比2.6.1 函数重写2.6.2 函数隐藏2.6.3 函数重载 2.7 C11 final 和override 3…

领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围&#xff1a; 目前专注java体系&#xff0c;以及…

作为HR,如何考察候选人的沟通能力

如何考察候选人的沟通能力。沟通能力&#xff0c;这个听起来简单&#xff0c;实际上却是一个非常复杂的技能&#xff0c;它关乎到一个人能否有效地传递信息&#xff0c;理解他人&#xff0c;并且在团队中发挥积极的作用。 作为HR&#xff0c;我们应该怎样才能精准地把握住候选…

【Python语言初识(二)】

一、分支结构 1.1、if语句 在Python中&#xff0c;要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词&#xff0c;像if和else就是专门用于构造分支结构的关键字&#xff0c;很显然你不能够使用它作为变量名&#xff08;事实上&#xff0c;用作其他…

网络:UDP协议

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题&#xff0c;也就是交给哪个进程&#xff1f;怎么确定把报文收全了&#xff1f;UDP报头是如何封装的呢&…

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

VM VirtualBox虚拟机装Win11提示这台电脑不符合要求,怎么解决?

环境&#xff1a; VM VirtualBox WIN11 问题描述&#xff1a; VM VirtualBox虚拟机装WIN11提示这台电脑不符合要求 解决方案&#xff1a; 1.进入这个页面 2. 跳过win11安全验证 在键盘上按 Shift F10或者FnShift F10调出命令命令提示符&#xff0c; 键入 Regedit 并…

大数据处理从零开始————3.Hadoop伪分布式和分布式搭建

1.伪分布式搭建&#xff08;不会用&#xff0c;了解就好不需要搭建&#xff09; 这里接上一节。 1.1 伪分布式集群概述 伪分布式集群就是只有⼀个服务器节点的分布式集群。在这种模式中&#xff0c;我们也是只需要⼀台机器。 但与本地模式不同&#xff0c;伪分布式采⽤了分布式…

使用Locust进行接口性能测试:关联与参数化技巧分析

Locust是一款开源的Python性能测试工具&#xff0c;它可以模拟大量并发用户对网站或者其他接口进行压力测试 1. 关联&#xff1a;精确模拟用户操作 在某些场景下&#xff0c;我们需要将之前请求的响应参数关联到后续请求中&#xff0c;以模拟用户操作。这在会话管理&#xff…

数字工厂管理系统与MES系统在实际应用中有哪些区别

随着制造业的数字化转型步伐加快&#xff0c;数字工厂管理系统与制造执行MES系统作为两大关键工具&#xff0c;在实际应用中展现出了明显的差异。本文将从实际应用的角度&#xff0c;详细探讨这两种系统之间的主要区别。 数字工厂管理系统的实际应用 数字工厂管理系统侧重于对…

python检测keycloak证书连接报错问题

最近一直被keycloak的证书问题困扰了很久&#xff0c;老是提示ssl安全连接&#xff0c;由于不会java,只好硬着头皮用python测试。 我这里的证书是自己签注的证书&#xff0c;导入系统的是CA根证书。 from keycloak import KeycloakOpenID# 1. 配置 Keycloak 客户端 keycloak_o…

STM32F407ZGT6驱动sd卡+文件夹 并写入多组实时数据 基于cubemx生成

SD卡介绍 SD卡&#xff0c;全称Secure Digital卡&#xff0c;是一种常见的便携式存储设备&#xff0c;通常用于存储和传输数据。它是一种闪存存储卡。 TF卡&#xff08;TransFlash卡&#xff09; 又称MicroSD卡&#xff0c;MicroSD卡比SD卡小&#xff0c;通常只有SD卡的1/4大小…

LLM(大语言模型)和AIGC入门学习路线图,零基础入门到精通,收藏这一篇就够了

大模型是指网络规模庞大的深度学习模型&#xff0c;其参数量通常在千亿级别。 学习大模型需要具备计算机基础&#xff0c;这一点非常重要&#xff01; 要系统地入门大模型&#xff0c;首先需要学习深度学习的基础知识&#xff0c;包括神经网络&#xff08;NN&#xff09;、卷…

nvm node管理工具常用指令

注&#xff1a;使用nvm之前需要卸载掉原有的node 1.在终端输入 nvm list available&#xff0c; 查看网络可以安装的版本。 点击visit后面的链接可查看完整版本列表 版本区别&#xff1a; CURRENT&#xff1a;当前正在使用的 Node.js 版本。LTS&#xff08;Long Term Suppor…

java踩坑

1.mybatis在idea可以正常运行&#xff0c;但是打jar包后&#xff0c;就报链接超时&#xff0c;可能是参数设置有问题&#xff0c;但是idea自动忽略了。 出问题的配置&#xff1a;&#xff08;圈出来的地方乱码了&#xff0c;idea有纠错能力&#xff0c;它自动调整为正确的&…

电脑录课软件哪个好用,提高教学效率?电脑微课录屏软件推荐

在当今这个数字化时代&#xff0c;教育领域也迎来了翻天覆地的变化。随着远程教学和在线学习的普及&#xff0c;教师们开始寻求更高效、更便捷的教学工具来提升教学质量和学生的学习体验。电脑录课软件&#xff0c;作为现代教育技术的重要组成部分&#xff0c;能够帮助教师轻松…

基于存内计算架构的模型部署与映射优化

先进计算大赛背景&#xff1a; ‘’存内计算”架构通过消除存储与计算单元间的物理距离&#xff0c;突破传统冯诺依曼架构的限制&#xff0c;自2016年起受到广泛关注&#xff0c;被视为国产算力发展的关键技术。 ​ 在存内计算架构中&#xff0c;权重布局对提高存算单元利用率…