美文网首页
Linux 驱动开发: GPIO 中断

Linux 驱动开发: GPIO 中断

作者: wjundong | 来源:发表于2022-08-16 16:36 被阅读0次
#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>


/** variable contains pin number o interrupt controller to which GPIO 17 is mapped to */
unsigned int irq_number;

/**
 * @brief Interrupt service routine is called, when interrupt is triggered
 */
static irq_handler_t gpio_irq_handler(unsigned int irq, void *dev_id, struct pt_regs *regs) {
    printk("gpio_irq: Interrupt was triggered and ISR was called!\n");
    return (irq_handler_t) IRQ_HANDLED; 
}

/**
 * @brief This function is called, when the module is loaded into the kernel
 */
static int __init ModuleInit(void) {
    printk("qpio_irq: Loading module... ");

    /* Setup the gpio */
    if(gpio_request(17, "rpi-gpio-17")) {
        printk("Error!\nCan not allocate GPIO 17\n");
        return -1;
    }

    /* Set GPIO 17 direction */
    if(gpio_direction_input(17)) {
        printk("Error!\nCan not set GPIO 17 to input!\n");
        gpio_free(17);
        return -1;
    }

    /* Setup the interrupt */
    irq_number = gpio_to_irq(17);

    if(request_irq(irq_number, (irq_handler_t) gpio_irq_handler, IRQF_TRIGGER_RISING, "my_gpio_irq", NULL) != 0){
        printk("Error!\nCan not request interrupt nr.: %d\n", irq_number);
        gpio_free(17);
        return -1;
    }

    printk("Done!\n");
    printk("GPIO 17 is mapped to IRQ Nr.: %d\n", irq_number);
    return 0;
}

/**
 * @brief This function is called, when the module is removed from the kernel
 */
static void __exit ModuleExit(void) {
    printk("gpio_irq: Unloading module... ");
    free_irq(irq_number, NULL);
    gpio_free(17);

}

module_init(ModuleInit);
module_exit(ModuleExit);


MODULE_LICENSE("GPL");

相关文章

网友评论

      本文标题:Linux 驱动开发: GPIO 中断

      本文链接:https://www.haomeiwen.com/subject/ikajgrtx.html