iTop4412驱动开发之五:中断处理驱动

    技术2024-07-31  71

    #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h> #include <linux/slab.h> #include <linux/delay.h> #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/gpio.h> #include <plat/gpio-cfg.h> #include <mach/gpio.h> #include <mach/gpio-exynos4.h> #include <linux/platform_device.h> #include <mach/regs-gpio.h> #include <asm/io.h> #include <linux/regulator/consumer.h> #define DRIVER_NAME "irq_test" static int led_gpios[] = { EXYNOS4_GPL2(0), EXYNOS4_GPK1(1), }; #define LED_NUM 2 static irqreturn_t eint9_interrupt(int irq, void *dev_id) { printk("%s-%d\n", __FUNCTION__, __LINE__); if (gpio_get_value(led_gpios[0])) { gpio_set_value(led_gpios[0], 0); } else { gpio_set_value(led_gpios[0], 1); } return IRQ_HANDLED; } static irqreturn_t eint10_interrupt(int irq, void *dev_id) { printk("%s-%d\n", __FUNCTION__, __LINE__); if (gpio_get_value(led_gpios[1])) { gpio_set_value(led_gpios[1], 0); } else { gpio_set_value(led_gpios[1], 1); } return IRQ_HANDLED; } static int irq_probe(struct platform_device *pdev) { int ret, i; char *banner = "irq_test init.\n"; printk(banner); //初始化LED控制GPIO for (i = 0; i < LED_NUM; i++) { ret = gpio_request(led_gpios[i], "LED"); s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT); gpio_set_value(led_gpios[i], 0); } //初始化按键GPIO为复用中断功能 ret = gpio_request(EXYNOS4_GPX1(1), "EINT9"); s3c_gpio_cfgpin(EXYNOS4_GPX1(1), S3C_GPIO_SFN(0XF)); s3c_gpio_setpull(EXYNOS4_GPX1(1), S3C_GPIO_PULL_UP); gpio_free(EXYNOS4_GPX1(1)); ret = gpio_request(EXYNOS4_GPX1(2), "EINT10"); s3c_gpio_cfgpin(EXYNOS4_GPX1(2), S3C_GPIO_SFN(0XF)); s3c_gpio_setpull(EXYNOS4_GPX1(2), S3C_GPIO_PULL_UP); gpio_free(EXYNOS4_GPX1(2)); //申请中断号 ret = request_irq(IRQ_EINT(9), eint9_interrupt, IRQ_TYPE_EDGE_FALLING, "eint9", pdev); ret = request_irq(IRQ_EINT(10), eint10_interrupt, IRQ_TYPE_EDGE_FALLING, "eint9", pdev); return 0; } static int irq_remove(struct platform_device *pdev) { return 0; } static struct platform_driver irq_driver = { .probe = irq_probe, .remove = irq_remove, .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, } }; struct platform_device irq_dev = { .name = DRIVER_NAME, .id = -1, }; static int __init irq_test_init(void) { platform_device_register(&irq_dev); platform_driver_register(&irq_driver); } static void __exit irq_test_exit(void) { platform_driver_unregister(&irq_driver); platform_device_unregister(&irq_dev); } module_init(irq_test_init); module_exit(irq_test_exit); MODULE_LICENSE("Dual BSD/GPL");
    Processed: 0.013, SQL: 9