/proc/interrupts

/proc/interrupts中的字段依次是逻辑中断号、中断在各CPU上发生的次数,中断所属父设备名称、硬件中断号、中断触发方式(电平或边沿)、中断名称
/proc/interrupts的具体实现查看代码kernel/irq/proc.c中函数show_interrupts
/proc/interrupts_第1张图片

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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 ");
MODULE_DESCRIPTION("pca6416 gpio test driver");
MODULE_LICENSE("GPL v2");

/proc/interrupts_第2张图片

你可能感兴趣的:(linux驱动)