#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);
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);
}
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");
转载请注明原文地址:https://ipadbbs.8miu.com/read-51208.html