歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OK6410中斷按鍵 混雜設備驅動

平台:交叉工具鏈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.         
  18.     #define DEVICE_NAME "button_irq"    
  19.         
  20.     static int button_irq_open(struct inode *inode,struct file *filp)    
  21.     {    
  22.         return 0;    
  23.     }    
  24.     static int button_irq_release(struct inode *inode,struct file *filp)    
  25.     {    
  26.         return 0;    
  27.     }    
  28.     static irqreturn_t  button_irq_inter(int nr,void *devid)  //中斷處理函數  
  29.     {    
  30.         static int count=0;    
  31.         count ++;    
  32.         printk("The button1 is sucessed! count= %d\n",count);    
  33.         return IRQ_RETVAL(IRQ_HANDLED);    
  34.     }    
  35.     static int button_irq_init()    
  36.     {    
  37.         unsigned int ret;    
  38.         ret = request_irq(IRQ_EINT(0),button_irq_inter,IRQF_TRIGGER_FALLING,"KEY0",NULL);  //中斷請求  
  39.     if(ret==0)  
  40.         printk("request_irq was sucessed!\n");  
  41.         return 0;    
  42.     }    
  43.     static struct file_operations dev_fops =    
  44.     {    
  45.         .owner = THIS_MODULE,    
  46.         .open = button_irq_open,    
  47.         .release = button_irq_release,    
  48.         
  49.     };    
  50.     static struct miscdevice misc =    
  51.     {    
  52.         .minor = MISC_DYNAMIC_MINOR,    
  53.         .name = DEVICE_NAME,    
  54.         .fops = &dev_fops,    
  55.     };    
  56.     static int __init dev_init()    
  57.     {    
  58.         int ret=0;    
  59.         ret = misc_register(&misc);    
  60.         printk("dev_init return ret:%d\n",ret);     
  61.         button_irq_init();    
  62.         return 0;    
  63.     }    
  64.     static void __exit dev_exit()    
  65.     {    
  66.         misc_deregister(&misc);    
  67.         free_irq(IRQ_EINT(0),NULL);    
  68.     }    
  69.         
  70.     module_init(dev_init);    
  71.     module_exit(dev_exit);    
  72.         
  73.     MODULE_LICENSE("GPL");    
  74.     MODULE_AUTHOR("MUGE0913");    

Makefile

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