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

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景: