irq_set_irq_type函数功能描述:此函数用于设置中断处理函数触发的类型,被操作的中断描述符保存在数组irq_desc中,对应的下标为参数irq的值,设置的中断触发类型为参数type所代表的类型。
irq_set_irq_type文件包含
irq_set_irq_type函数定义
在内核源码中的位置:linux-3.19.3/kernel/irq/chip.c
函数定义格式:
irq_set_irq_type输入参数说明
参数 unsigned int irq是对应的中断号,与数组irq_desc的下标相对应,数组的大小为16640。
参数unsigned int type是系统定义的中断触发类型,定义见文件linux-3.19.3/include/linux/irq.h,可能的取值定义如下:
IRQ_TYPE_NONE 0x00000000系统默认的没有明确指明类型的触发模式
IRQ_TYPE_EDGE_RISING 0x00000001上升沿触发
IRQ_TYPE_EDGE_FALLING 0x00000002下降沿触发
IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)上升沿下降沿两种触发都行
IRQ_TYPE_LEVEL_HIGH 0x00000004高电平触发
IRQ_TYPE_LEVEL_LOW 0x00000008低电平触发
IRQ_TYPE_SENSE_MASK 0x0000000f以上任何一种条件
IRQ_TYPE_DEFAULT IRQ_TYPE_SENSE_MASK以上任何一种条件
IRQ_TYPE_PROBE 0x00000010在进程中查询
irq_set_irq_type返回参数说明
函数的返回结果是int型变量,返回0或者负数,如果返回结果是负数,说明设置中断触发类型失败;如果返回结果是0,有四种情况:
设置中断触发类型成功;
传入的中断触发类型参数是IRQ_TYPE_NONE,如果传入此参数,函数不会更改中断的触发类型;
数组中与irq对应的元素的chip字段的值为NULL;
数组中与irq对应的元素的chip字段的值不为NULL,但chip字段的set_type字段的值为NULL。
irq_set_irq_type实例解析
编写测试文件:irq_set_irq_type.c
头文件引用及全局变量定义:
中断处理函数及中断线程函数定义:
模块加载函数定义:
模块退出函数定义:
模块加载、退出函数调用:
实例运行结果及分析:
编译模块,执行命令insmod irq_set_irq_type.ko插入内核模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示的信息。
结果分析:
由图可以看出函数irq_set_irq_type( )的返回值是0,并且中断处理函数执行一次。但返回0并不代表设置中断触发类型成功,因为动态申请的中断描述符其字段chip的值为NULL,所以返回0是必然。
如果想设置中断的类型成功,必须满足以下条件:
中断描述符存在数组irq_desc中;
参数type不是IRQ_TYPE_NONE;
中断描述符的chip字段的值不为NULL;
中断描述符的字段chip的字段set_type的值不为NULL。
但是满足以上条件,也不一定能设置成功,还需要看字段set_type代表的函数的实现。