irq_set_chip函数功能描述:此函数是为irq_desc数组中对应下标为irq的元素设定irq_chip的值,如果传入的参数chip为NULL,则使用系统定义好的no_irq_chip为它赋值:如果传入的参数chip不为NULL,则用传入的参数赋值。在赋值之前函数会调用函数irq_chip_set_defaults( )对传入的参数chip进行相应的设置处理,处理完之后把参数chip赋值给irq_desc数组中的变量的irq_chip。
irq_set_chip文件包含
函数定义:
在内核源码中的位置:linux-3.19.3/kernel/irq/chip.c
函数定义格式:
irq_set_chip输入参数说明
参数irq是设备对应的中断编号,对应数组irq_desc中元素的下标,此数组的大小为16640。
参数chip是一个struct irq_chip型的结构体变量,是对应的硬件中断描述符的irq_chip字段的值,定义见文件linux-3.19.3/include/linux/irq.h如下:
如果传入的参数chip为NULL,则系统用no_irq_chip进行初始化,no_irq_chip的定义见文件linux-3.19.3/kernel/irq/dummychip.c,如下:
irq_set_chip返回参数说明
此函数的返回结果是int型变量,可能的取值是0、-22,如果返回0说明设置字段chip的值成功,如果返回-22说明设置字段chip的值失败,设置失败的原因是与irq对应的数组中的元素不存在。
irq_set_chip实例解析
编写测试文件:irq_set_chip.c头文件引用及全局变量定义:
中断处理函数定义及中断线程处理函数定义:
模块加载函数定义及验证函数调用:
模块退出函数定义:
模块加载、退出函数调用:
实例运行结果及分析:
当设置的中断号为2时,编译模块,执行命令insmod irq_set_chip.ko插入内核模块,然后输入dmesg -c查看内核输出信息,出现如图A
所示的结果。
在卸载模块之前输入命令cat /proc/interrupts查看文件/proc/interrupts的内容,出现如图B
所示的结果。
如果将函数的第一个参数irq设置为1000,插入模块,会出现如图C
所示的结果。
结果分析:
由图A
函数irq_set_chip( )的返回结果可以判断设置中断描述符中的irq_chip字段成功;图B
中中断号2对应的信息可以看到函数irq_set_chip( )执行之后的效果,第六列的内容为none,如果没有函数irq_set_chip( ),此部位的内容应该为IO-APIC-,这是因为传递给函数的第二个参数为NULL,此时中断描述符中的irq_chip字段被设置为no_irq_chip变量的值。
图C
中的显示信息是函数执行失败时的一种情况,显示内核的调试信息,因为传递的参数irq的值超过了数组irq_desc的范围。