disable_irq_wake函数功能描述:disable_irq_wake( )在实现过程中调用了函数irq_set_irq_wake( ),在调用时disable_irq_wake( )传递的第二个参数是0。disable_irq_wake( )使中断处于不可唤醒的中断状态,减少其唤醒深度wake_depth的值。
disable_irq_wake文件包含
#include<linux/interrupt.h>
disable_irq_wake函数定义
在内核源码中的位置:linux-3.19.3/include/linux/interrupt.h
函数定义格式:
static inline int disable_irq_wake(unsigned int irq)
{
return irq_set_irq_wake(irq, 0);
}
disable_irq_wake输入参数说明
此函数的参数是int型变量,代表操作中断对应的中断号,与数组irq_desc中元素的下标相对应,根据它查找对应设备的中断服务例程,其取值范围是0~NR_IRQS-1,其中NR_IRQS的值是16640。
disable_irq_wake返回参数说明
此函数的返回值是整数,代表执行的结果,可能的取值是-6、0。返回-6说明当前中断号对应的irq_desc[]数组中元素的chip字段set_wake字段值为NULL,此时函数的相应的功能无法实现,即函数既不改变中断唤醒的深度也不改变当前中断的状态。对于函数disable_irq_wake( )返回0有两种情况:
- 当前中断的唤醒深度是0,其函数作用没有实现,作用与返回-6相同;
- 当前的唤醒深度是1,则其作用全部实现,即函数既改变了中断唤醒的深度,也改变了当前中断的状态。
disable_irq_wake实例解析
编写测试文件:disable_irq_wake.c
头文件引用及全局变量定义:
#include<linux/module.h>
#include<linux/interrupt.h>
MODULE_LICENSE("GPL");
static int irq=3; //定义中断号
中断处理函数定义:
// 自定义中断处理函数,在此只有显示功能
static irqreturn_t irq_handler(int data, void *dev_id)
{
printk("the data is :%d\n", data);
printk("in the interrupt handler function\n");
return IRQ_NONE;
}
模块加载函数定义及验证函数调用:
static int __init disable_irq_wake_init(void)
{
int result=0, result1=0;
printk("into disable_irq_wake_init\n");
result=request_irq(irq, irq_handler, IRQF_DISABLED, "A_New_Device", NULL);
// 申请中断
result1=disable_irq_wake(irq); //调用disable_irq_wake( )函数更改中断的状态及唤醒深度
printk("the request_irq result is: %d\n", result); //显示函数request_irq调用结果
printk("the disable_irq_wake result is :%d\n", result1);
// 显示函数disable_irq_wake调用结果
printk("out disable_irq_wake_init\n");
return 0;
}
模块卸载函数定义:
static void __exit disable_irq_wake_exit(void)
{
free_irq(irq, NULL); //释放申请的中断
printk("Goodbye disable_irq_wake\n");
return;
}
模块加载及卸载函数调用:
module_init(disable_irq_wake_init);
module_exit(disable_irq_wake_exit);
实例运行结果及分析:
编译模块,执行命令insmod disable_irq_wake.ko插入内核模块,然后输入命令dmesg -c,出现如图A
所示的结果。
在删除模块之前输入命令cat /proc/interrupts查看文件/proc/interrupts内容,出现如图B
所示的结果。
结果分析:
图A
是函数disable_irq_wake( )执行时输出的信息,因为当函数执行时,中断的唤醒深度为0,所以函数的功能没有实现,在此只是显示一些调试信息。函数disable_irq_wake( )的返回值是0,此时的情况正好满足返回参数说明中返回值是0的第一种情况。由图B
可以判断申请中断成功,但是对应的中断处理函数并没有被调用。