linux --中断管理 -- irq的自动探测机制

2024-01-31 14:36

本文主要是介绍linux --中断管理 -- irq的自动探测机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

irq自动探测机制

如果一个设备的驱动程序无法确定它说管理的设备的软件中断号irq,此时设备驱动程序可以使用irq的自动探测机制来获取其正在使用的irq。

使用自动探测机制的条件

  1. 内核与驱动,必须共同努力才能完成
  2. 只限于非共享中断的情况

探测前,驱动的设备关联到了某个irq,但是因为设备驱动程序还不清楚是哪个irq,因此无法调用request_irq来向该irq安装中断处理例程,所以对应irq的action为空,下面是一个设备驱动程序的使用示例:
在这里插入图片描述
probe_irq_on和probe_irq_off是内核为驱动程序员设计的两个自动探测的接口函数

irq自动探测的原理描述

在这里插入图片描述

probe_irq_on


/***	probe_irq_on	- begin an interrupt autodetect**	Commence probing for an interrupt. The interrupts are scanned*	and a mask of potential interrupt lines is returned.** 开始探测中断,扫描中断并返回潜在中断线的mask*/
unsigned long probe_irq_on(void)
{struct irq_desc *desc;unsigned long mask = 0;int i;/** quiesce the kernel, or at least the asynchronous portion*/async_synchronize_full();mutex_lock(&probing_active);/** something may have generated an irq long ago and we want to* flush such a longstanding irq before considering it as spurious.*/for_each_irq_desc_reverse(i, desc) {raw_spin_lock_irq(&desc->lock);if (!desc->action && irq_settings_can_probe(desc)) {/** Some chips need to know about probing in* progress:*/if (desc->irq_data.chip->irq_set_type)desc->irq_data.chip->irq_set_type(&desc->irq_data,IRQ_TYPE_PROBE);irq_startup(desc);}raw_spin_unlock_irq(&desc->lock);}/* Wait for longstanding interrupts to trigger. */msleep(20);/** enable any unassigned irqs* (we must startup again here because if a longstanding irq* happened in the previous stage, it may have masked itself)*/for_each_irq_desc_reverse(i, desc) {raw_spin_lock_irq(&desc->lock);if (!desc->action && irq_settings_can_probe(desc)) {desc->istate |= IRQS_AUTODETECT | IRQS_WAITING;if (irq_startup(desc))desc->istate |= IRQS_PENDING;}raw_spin_unlock_irq(&desc->lock);}/** Wait for spurious interrupts to trigger*/msleep(100);/** Now filter out any obviously spurious interrupts*/for_each_irq_desc(i, desc) {raw_spin_lock_irq(&desc->lock);if (desc->istate & IRQS_AUTODETECT) {/* It triggered already - consider it spurious. */if (!(desc->istate & IRQS_WAITING)) {desc->istate &= ~IRQS_AUTODETECT;irq_shutdown(desc);} elseif (i < 32)mask |= 1 << i;}raw_spin_unlock_irq(&desc->lock);}return mask;
}
EXPORT_SYMBOL(probe_irq_on);

probe_irq_off

/***	probe_irq_off	- end an interrupt autodetect*	@val: mask of potential interrupts (unused)**	Scans the unused interrupt lines and returns the line which*	appears to have triggered the interrupt. If no interrupt was*	found then zero is returned. If more than one interrupt is*	found then minus the first candidate is returned to indicate*	their is doubt.**	The interrupt probe logic state is returned to its previous*	value.**	BUGS: When used in a module (which arguably shouldn't happen)*	nothing prevents two IRQ probe callers from overlapping. The*	results of this are non-optimal.*/
int probe_irq_off(unsigned long val)
{int i, irq_found = 0, nr_of_irqs = 0;struct irq_desc *desc;for_each_irq_desc(i, desc) {raw_spin_lock_irq(&desc->lock);if (desc->istate & IRQS_AUTODETECT) {if (!(desc->istate & IRQS_WAITING)) {if (!nr_of_irqs)irq_found = i;nr_of_irqs++;}desc->istate &= ~IRQS_AUTODETECT;irq_shutdown(desc);}raw_spin_unlock_irq(&desc->lock);}mutex_unlock(&probing_active);if (nr_of_irqs > 1)irq_found = -irq_found;return irq_found;
}
EXPORT_SYMBOL(probe_irq_off);

这篇关于linux --中断管理 -- irq的自动探测机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth