【LINUX驱动学习】按键中断

(一)关于LINUX中的中断
中断是一个处理器的稀缺资源,在系统中非常重要,通过中断能够及时高效的响应外部事件,提高系统的响应能力,增加系统吞吐量。
在驱动中使用中断,其实比较简单,先申请中断号,并注册一个中断中断处理程序,在中断程序实现对外部事件的处理。
(二)在内核态实现按键对于LED灯的控制

代码实现

#include <linux/init.h>
#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>

//#include <mach/gpio-bank.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
#include <linux/delay.h>
/*中断头文件*/
#include <linux/irq.h>
#include <linux/interrupt.h>

#include <linux/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio-exynos4.h>

#define DPRINTK(x...) printk("KEYIRQ_CTL DEBUG:" x)


#define DRIVER_NAME "pollkey_ctl"

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("YY");

static int led0_status=0;
static int led1_status=0;


static void changeled0(void)
{
   printk("led0 changed\n");
   led0_status=!led0_status;
   printk(KERN_EMERG"LED0 is be setted\n");
   gpio_set_value(EXYNOS4_GPL2(0),led0_status);
}

static void changeled1(void)
{
   printk("led1 changed\n");
   led1_status=!led1_status;
   printk(KERN_EMERG"LED1 is be setted\n");
   gpio_set_value(EXYNOS4_GPK1(1),led1_status);
}

static irqreturn_t eint9_handler(int irq,void *dev_id)
{
	mdelay(5);
	printk("THE KEY HOME HAS BEEN PRESSED\n");
	changeled0();
	return IRQ_HANDLED;
}

static irqreturn_t eint10_handler(int irq,void *dev_id)
{
	mdelay(5);
	printk("THE KEY BACK HAS BEEN PRESSED\n");
	changeled1();
	return IRQ_HANDLED;
}


static int keyirq_probe(struct platform_device *pdev)
{
	printk("IRQ PROBE SUCCESS\n");
	request_irq(IRQ_EINT(9),eint9_handler,IRQ_TYPE_EDGE_FALLING,"my_eint9",pdev);
	request_irq(IRQ_EINT(10),eint10_handler,IRQ_TYPE_EDGE_FALLING,"my_eint10",pdev);
	return 0;	
}

static int keyirq_remove (struct platform_device *pdev)
{
	/*中断卸载函数*/
	free_irq(IRQ_EINT(9),pdev);
	free_irq(IRQ_EINT(10),pdev);
	return 0;
}

static int keyirq_suspend (struct platform_device *pdev, pm_message_t state)
{
	DPRINTK("keyirq suspend:power off!\n");
	return 0;
}

static int keyirq_resume (struct platform_device *pdev)
{
	DPRINTK("keyirq resume:power on!\n");
	return 0;
}

static struct platform_driver keyirq_driver = {
	.probe = keyirq_probe,
	.remove = keyirq_remove,
	.suspend = keyirq_suspend,
	.resume = keyirq_resume,
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
	},
};

static void __exit keyirq_exit(void)
{
	platform_driver_unregister(&keyirq_driver);
}

static int __init keyirq_init(void)
{
	return platform_driver_register(&keyirq_driver);
}

module_init(keyirq_init);
module_exit(keyirq_exit);



在这里无需测试代码,此时按下按键HOME,BACK发现LED0,LED1 发生翻转
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

与光同程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值