赞
踩
/proc/interrupts中的字段依次是逻辑中断号、中断在各CPU上发生的次数,中断所属父设备名称、硬件中断号、中断触发方式(电平或边沿)、中断名称
/proc/interrupts的具体实现查看代码kernel/irq/proc.c中函数show_interrupts
添加一个中断函数后/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");
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。