void enable_irq(unsigned int irq) 用于使能一个irq。
void disable_irq(unsigned int irq)则用于禁止一个irq 其使用的例程如下:
static void cp_poll_controller(struct net_device *dev)
{
struct cp_private *cp = netdev_priv(dev);
const int irq = cp->pdev->irq; disable_irq(irq);
cp_interrupt(irq, dev);
enable_irq(irq);
}
从本例中可以看到这个函数一般和disable_irq 配合使用。
其源码分析如下:
void enable_irq(unsigned int irq)
{
unsigned long flags;
#根据irq得到其对应的中断描述符
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
#描述符为null,则直接退出.
if (!desc)
return;
#中断描述符如果没有对应的chip,则打印error 信息,并退出
if (WARN(!desc->irq_data.chip,
KERN_ERR "enable_irq before setup/request_irq: irq %u\n", irq))
goto out;
#继续调用__enable_irq 使能中断
__enable_irq(desc);
out:
irq_put_desc_busunlock(desc, flags);
} void __enable_irq(struct irq_desc *desc)
{
switch (desc->depth) {
case :
err_out:
WARN(, KERN_WARNING "Unbalanced enable for IRQ %d\n",
irq_desc_get_irq(desc));
break;
#正常情况下第一个调用enable_irq的时候desc->depth 应该是1,如果是0的话,后面进行--操作的话就成负数了
case : {
#如果正处于suspend的过程中,则直接退出
if (desc->istate & IRQS_SUSPENDED)
goto err_out;
这三个函数后面详细分析
/* Prevent probing on this irq: */
irq_settings_set_noprobe(desc);
#通过chip来使能irq
irq_enable(desc);
check_irq_resend(desc);
/* fall-through */
}
#从这里可以知道enable_irq 是可以嵌套的,即同一个irq 可以多次调用enable_irq
default:
desc->depth--;
}
} static inline void irq_settings_set_noprobe(struct irq_desc *desc)
{
#只是或上一个_IRQ_NOPROBE flag
desc->status_use_accessors |= _IRQ_NOPROBE;
} void irq_enable(struct irq_desc *desc)
{
irq_state_clr_disabled(desc);
#正常情况下回调用chip来使能irq
if (desc->irq_data.chip->irq_enable)
desc->irq_data.chip->irq_enable(&desc->irq_data);
else
desc->irq_data.chip->irq_unmask(&desc->irq_data);
irq_state_clr_masked(desc);
}

来源:https://blog.csdn.net/tiantao2012/article/details/78908163

最新文章

  1. [WPF系列]-Layout
  2. 关于iOS10的允许访问用户数据产生的问题
  3. 技能获取与C语言学习情况
  4. Grid画边框
  5. PHP框架Yii2.0安装(基础版、高级版)
  6. JSP 页面打印
  7. C#获取数据库中的Instance
  8. 《C和指针》 读书笔记 -- 第10章 结构和联合
  9. TCP/IP协议全解析 三次握手与四次挥手[转]
  10. DB2开发系列之一——基本语法
  11. Java的参数传递是「值传递」还是「引用传递」?
  12. Fiddler原理~知多少?
  13. Java 学习笔记 二维数组和对象数组
  14. FORTH 虚拟机内部结构
  15. rsyslog和logrotate服务
  16. mac connect to host localhost port 22: Connection refused
  17. Filter过滤器介绍
  18. 解决maltab的中文和英文字体问题,中文乱码
  19. SpringBoot开发使用@ImportResource注解影响拦截器
  20. mysql的头文件

热门文章

  1. hadoop 编译自己的jar包并运行
  2. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)-转载
  3. 此请求的查询字符串的长度超过配置的 maxQueryStringLength 值
  4. 函数式编程-只用"表达式",不用"语句"()
  5. Paper Reading: Relation Networks for Object Detection
  6. Uncaught TypeError: Cannot read property 'offsetTop' of undefined at VueComponent.handleScroll
  7. [arc067f]yakiniku restaurants
  8. BZOJ 2141 排队(CDQ分治)
  9. ActiveMQ:JMS开源框架入门介绍
  10. nginx.conf.default