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

相关文章

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变