/proc/interrupts中的字段依次是逻辑中断号、中断在各CPU上发生的次数,中断所属父设备名称、硬件中断号、中断触发方式(电平或边沿)、中断名称

/proc/interrupts的具体实现查看代码kernel/irq/proc.c中函数show_interrupts

/proc/interrupts_linux

添加一个中断函数后/proc/interrupts的变化

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/gpio/driver.h>
#include <linux/gpio/consumer.h>

int gpio_index;

static irqreturn_t handler_gpio(int irq, void *arg)
{
printk("%s\n", __func__);

return IRQ_HANDLED;
}

static int __init gpio_test_int_init(void)
{
int irq;
int ret;

/* gpio 504 correspond to P0_4/EXP_IO2 of PCA6416 */
gpio_index = 504;
if(gpio_is_valid(gpio_index)) {
ret = gpio_request_one(gpio_index, GPIOF_DIR_IN, "tca6416");
if (ret) {
printk("gpio_request for %d fail\n", gpio_index);
return -EIO;
}

irq = gpio_to_irq(gpio_index);
printk("irq is %d\n", irq);

ret = request_any_context_irq(irq, handler_gpio,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_SHARED,
"gpio_x", &gpio_index);
if (ret < 0) {
printk("request_irq for %d fail, ret=%d\n", irq, ret);
goto err;
}
} else {
printk("gpio %d is not valid, do nothing\n", gpio_index);
}

printk("%s ok\n", __func__);
return 0;

err:
gpio_free(gpio_index);
return -1;
}

static void __exit gpio_test_int_exit(void)
{
int irq = gpio_to_irq(gpio_index);

free_irq(irq, &gpio_index);
gpio_free(gpio_index);

printk("%s\n", __func__);
}
module_init(gpio_test_int_init);
module_exit(gpio_test_int_exit);
MODULE_AUTHOR("Frank Wang <lei.wang_15@nxp.com>");
MODULE_DESCRIPTION("pca6416 gpio test driver");
MODULE_LICENSE("GPL v2");

/proc/interrupts_设备名_02