/proc/interrupts

本文介绍了一个用于测试 PCA6416 GPIO 中断的 Linux 驱动程序。该驱动程序实现了 GPIO 请求、中断处理和释放的过程,并展示了如何在 /proc/interrupts 中观察到这些变化。代码详细说明了 GPIO 的初始化、中断请求和处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/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");

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值