Exynos4412按键中断驱动

1 什么是中断?
中断是指 CPU 在执行程序的过程中,出现突发事件去处理,CPU 需要停止当前程序的执
行,转去处理突发事件,处理完成之后再返回原程序部分。

2 什么是中断源?
引发中断的原因

3 硬件中断和软件中断
硬件中断一般指外设发出的中断请求以及内部硬件产生的中断(计算溢出,除数为 0,掉
电等)

4 硬件中断的分类
内部中断:内部硬件产生的中断(例如:除数为 0)
外部中断:外设产生的中断(重点)

5 外部中断的触发方式
上升沿触发和下降沿触发
电平触发

6 中断优先级
系统根据中断事件的重要性和紧迫程度,将中断源分为若干个等级,优先级高的先执行。

7 中断处理函数
中断产生之后执行的一段代码。

8 中断向量号
中断源的识别标志,是跳往中断程序的“入口地址”。

9 中断向量和非中断向量
硬件提供中断处理函数的地址
软件通过判断之后,提供中断处理函数的最终地址

10 向量中断和非向量中断的判断方法
一般一个中断号对应一个中断函数就是向量中断(独立按键)
多个中断函数共用一个中断号(矩阵键盘)

11 中断处理程序架构
操作系统中会产生很多中断,如果每一个中断都全部处理完之后再向后执行,是不可能的,
所以就将中断处理程序分解为上半部和下半部。
例如给 PC 插入 U 盘会产生中断,接收之后,硬件会马上响应,中断操作会很快执行上半
部分,然后就向上半部分通知系统调用对应的驱动程序。后面调用驱动的这个过程可以称之为
下半部分。上半部一般是和硬件紧密相关的代码,下半部一般是耗时的一些操作。

12 中断申请函数 request_irq(unsigned int irq, irq_handler_t handler,unsigned long flags,const char *name, void *dev)
有下面几个参数。
参数 unsigned int irq:irq 是中断号
参数 irq_handler_t handler:handler 是向系统登记的处理函数
参数 unsigned long flags:irqflags 是触发标志位
参数 const char *name:devname 是中断名称,可以通过注册之后可以通过“cat /proc/interrupts”查看
参数 void *dev:dev_id 是设备

13 中断释放函数 extern void free_irq(unsigned int, void *);的参数如下。
参数 1:irq 是中断号
参数 2:dev_id 是设备

14 产生中断之后,会调用中断处理函数 irqreturn_t,这个函数也是在头文件
“include/linux/interrupt.h”中如下图所示。
如上图所示,该函数为 extern irqreturn_t no_action(int cpl, void *dev_id);
中断函数类型为 irqreturn_t
参数 int cpl:中断号

参数 void *dev_id:设备

15 按键中断驱动程序

 
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/fs.h>
  5. #include <mach/gpio.h>
  6. #include <plat/gpio-cfg.h>
  7. #include <linux/miscdevice.h>
  8. #include <linux/platform_device.h>
  9. //#include <mach/gpio-bank.h>
  10. #include <mach/regs-gpio.h>
  11. #include <asm/io.h>
  12. #include <linux/regulator/consumer.h>
  13. //#include "gps.h"
  14. #include <linux/delay.h>
  15. //中断头文件 IRQ_EINT
  16. #include <linux/irq.h>
  17. #include <linux/interrupt.h>
  18. #define DPRINTK(x...) printk("keyirq DEBUG:" x)
  19. #define DRIVER_NAME "keyirq"
  20. static irqreturn_t eint9_interrupt(int irq,void *dev_id)
  21. {
  22. printk("receive a interrupt 9!\n");
  23. return IRQ_HANDLED;
  24. }
  25. static irqreturn_t eint10_interrupt(int irq,void *dev_id)
  26. {
  27. printk("receive a interrupt 10!\n");
  28. return IRQ_HANDLED;
  29. }
  30. static int keyirq_probe(struct platform_device *pdev)
  31. {
  32. //int ret, i;
  33. char *banner = "keyirq Initialize\n";
  34. printk(banner);
  35. //注册中断
  36. request_irq(IRQ_EINT(9),eint9_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint9",pdev);
  37. request_irq(IRQ_EINT(10),eint10_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint10",pdev);
  38. return 0;
  39. }
  40. static int keyirq_remove (struct platform_device *pdev)
  41. {
  42. free_irq(IRQ_EINT(9),pdev);
  43. free_irq(IRQ_EINT(10),pdev);
  44. return 0;
  45. }
  46. static int keyirq_suspend (struct platform_device *pdev, pm_message_t state)
  47. {
  48. DPRINTK("keyirq suspend:power off!\n");
  49. return 0;
  50. }
  51. static int keyirq_resume (struct platform_device *pdev)
  52. {
  53. DPRINTK("keyirq resume:power on!\n");
  54. return 0;
  55. }
  56. static struct platform_driver keyirq_driver = {
  57. .probe = keyirq_probe,
  58. .remove = keyirq_remove,
  59. .suspend = keyirq_suspend,
  60. .resume = keyirq_resume,
  61. .driver = {
  62. .name = DRIVER_NAME,
  63. .owner = THIS_MODULE,
  64. },
  65. };
  66. static void __exit keyirq_exit(void)
  67. {
  68. platform_driver_unregister(&keyirq_driver);
  69. }
  70. static int __init keyirq_init(void)
  71. {
  72. return platform_driver_register(&keyirq_driver);
  73. }
  74. module_init(keyirq_init);
  75. module_exit(keyirq_exit);
  76. MODULE_LICENSE("Dual BSD/GPL");

Exynos4412是三星电子生产的一款高性能处理器,其中包含了一组GPIO(通用输入输出)引脚,可以进行输入和输出的控制。而GPIO中断是指当GPIO引脚状态发生变化时,可以通过配置中断来实现相应的处理。 在Exynos4412中,GPIO中断的使用非常灵活。首先,需要选择特定的GPIO引脚作为中断触发引脚,并进行相应的设置。可以通过配置引脚的工作模式、电平触发方式、上拉/下拉电阻等来实现中断的触发条件。 一旦设置完毕,当GPIO引脚的状态发生变化时,如从低电平到高电平或从高电平到低电平,硬件会自动检测到这个变化,并触发相应的中断。在中断发生时,处理器会停止当前的任务,转而执行中断服务程序(ISR)来处理中断事件。 中断服务程序可以是预定义的,也可以由开发人员自行编写。在ISR中,可以执行一些特定的操作来响应中断,例如读取或写入IO口的状态、发送或接收数据等。处理完成后,处理器会回到之前的任务继续执行,保证系统的正常运行。 综上所述,Exynos4412的GPIO中断功能可以帮助开发者在硬件状态发生变化时及时做出响应,实现灵活的输入输出控制。通过适当的配置和编程,可以利用GPIO中断来实现各种应用,例如实时监测外部设备状态、按键的响应、连接外部传感器等。这为Exynos4412的应用开发提供了更多的灵活性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值