歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OK6410中斷按鍵 混雜設備驅動

OK6410中斷按鍵 混雜設備驅動

日期:2017/3/1 10:10:46   编辑:Linux編程

平台:交叉工具鏈arm-linux-gcc 4.3.2 linux2.6.28

request_irq的作用是申請使用IRQ並注冊中斷處理程序。
request_irq()函數的原型如下:
/* kernel/irq/manage.c */
int request_irq(
unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id );

當使用內核共享中斷時,request_irq必須要提供dev_id參數,並且dev_id的值必須唯一

將使用該中斷處理程序的設備結構體傳遞給該中斷處理程序:
首先看兩個基礎條件:
1) 內核中的各個設備結構體肯定是唯一的,因此滿足dev_id唯一這個要求
2) dev_id參數會在發生中斷時傳遞給該中斷的服務程序。
典型的中斷服務程序定義如下:

static irqreturn_t intr_handler(int irq, void *dev_id, struct pt_regs *regs);

即request_irq的dev_id參數會傳遞給該中斷服務程序的dev_id。因此也可以將驅動程序的設備結構體通過dev_id傳遞給中斷服務程序。

button1.c

  1. #include <linux/fs.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/kernel.h>
  5. #include <linux/irq.h>
  6. #include <asm/irq.h>
  7. #include <asm/io.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/miscdevice.h>
  10. #include <linux/cdev.h>
  11. #include <asm/uaccess.h>
  12. #include <mach/hardware.h>
  13. #include <linux/platform_device.h>
  14. // #include <mach/regs-gpio.h>
  15. // #include <mach/gpio-bank-n.h>
  16. #include <plat/gpio-cfg.h>
  17. #define DEVICE_NAME "button_irq"
  18. static int button_irq_open(struct inode *inode,struct file *filp)
  19. {
  20. return 0;
  21. }
  22. static int button_irq_release(struct inode *inode,struct file *filp)
  23. {
  24. return 0;
  25. }
  26. static irqreturn_t button_irq_inter(int nr,void *devid) //中斷處理函數
  27. {
  28. static int count=0;
  29. count ++;
  30. printk("The button1 is sucessed! count= %d\n",count);
  31. return IRQ_RETVAL(IRQ_HANDLED);
  32. }
  33. static int button_irq_init()
  34. {
  35. unsigned int ret;
  36. ret = request_irq(IRQ_EINT(0),button_irq_inter,IRQF_TRIGGER_FALLING,"KEY0",NULL); //中斷請求
  37. if(ret==0)
  38. printk("request_irq was sucessed!\n");
  39. return 0;
  40. }
  41. static struct file_operations dev_fops =
  42. {
  43. .owner = THIS_MODULE,
  44. .open = button_irq_open,
  45. .release = button_irq_release,
  46. };
  47. static struct miscdevice misc =
  48. {
  49. .minor = MISC_DYNAMIC_MINOR,
  50. .name = DEVICE_NAME,
  51. .fops = &dev_fops,
  52. };
  53. static int __init dev_init()
  54. {
  55. int ret=0;
  56. ret = misc_register(&misc);
  57. printk("dev_init return ret:%d\n",ret);
  58. button_irq_init();
  59. return 0;
  60. }
  61. static void __exit dev_exit()
  62. {
  63. misc_deregister(&misc);
  64. free_irq(IRQ_EINT(0),NULL);
  65. }
  66. module_init(dev_init);
  67. module_exit(dev_exit);
  68. MODULE_LICENSE("GPL");
  69. MODULE_AUTHOR("MUGE0913");

Makefile

  1. ifneq ($(KERNELRELEASE),)
  2. obj-m := button1.o
  3. else
  4. KDIR := /home/ok6410/linux2.6.28/linux2.6.28
  5. all:
  6. make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=arm-linux-
  7. clean:
  8. rm -f *.ko *.o *.mod.o *.mod.c *.symvers
  9. endif
Copyright © Linux教程網 All Rights Reserved