jz2440 的中断中的底半部机制

来源:互联网 发布:网络语打卡的意思 编辑:程序博客网 时间:2024/05/21 06:44

改的别人的代码,稍微拓展了一下。主要是运用tasklet和工作队列两种方法。

tasklet的代码

 #include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/irq.h>#include <asm/uaccess.h>#include <asm/irq.h>#include <asm/io.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>#include<linux/interrupt.h>   /*这个头文件是必须加的 和这个函数 DECLARE_TASKLET有关*/static struct class *thirddrv_class;static struct class_device*thirddrv_class_dev;/*一般就这么写*/void key_do_tasklet(unsigned long );DECLARE_TASKLET(key_tasklet,key_do_tasklet,0);/*底半部真正的处理函数*/void key_do_tasklet(unsigned long date)  /*这里需要一个参数*/{printk("  dibanbu  \n");printk(" this is key_do_work \n");}/*顶半部 名义上的处理函数*/                                                                                                                                                                                                                                                                                                                     static irqreturn_t buttons_irq(int irq, void *dev_id){printk("  dingbanbu  press ed \n");//printk("irq += %d \n",irq);tasklet_schedule(&key_tasklet);  /*注意这里的参数是队列名字*/  return IRQ_RETVAL(IRQ_HANDLED);} static int third_drv_open(struct inode *inode, struct file *file){request_irq(IRQ_EINT0,  buttons_irq, IRQT_BOTHEDGE, "S2", 1);request_irq(IRQ_EINT2,  buttons_irq, IRQT_BOTHEDGE, "S3", 2);request_irq(IRQ_EINT11, buttons_irq, IRQT_BOTHEDGE, "S4",3);request_irq(IRQ_EINT19, buttons_irq, IRQT_BOTHEDGE, "S5", 4);/*初始化工作队列  把工作队列与处理函数绑定*///INIT_WORK(&key_wq,(void (*)(void *)) key_do_work);return 0;}ssize_t third_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){//num++;//printk("num = %d\n",num);return 1;}int third_drv_close(struct inode *inode, struct file *file){free_irq(IRQ_EINT0, 1);free_irq(IRQ_EINT2, 2);free_irq(IRQ_EINT11, 3);free_irq(IRQ_EINT19, 4);return 0;}static struct file_operations sencod_drv_fops = {    .owner   =  THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */    .open    =  third_drv_open,     .read =third_drv_read,   .release =  third_drv_close,   };int major;static int third_drv_init(void){major = register_chrdev(0, "third_drv", &sencod_drv_fops);thirddrv_class = class_create(THIS_MODULE, "third_drv");thirddrv_class_dev = class_device_create(thirddrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); /* /dev/buttons */return 0;}static void third_drv_exit(void){unregister_chrdev(major, "third_drv");class_device_unregister(thirddrv_class_dev);class_destroy(thirddrv_class);return 0;}module_init(third_drv_init);module_exit(third_drv_exit);MODULE_LICENSE("GPL");

下面的运用 工作队列的机制的代码

 #include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/irq.h>#include <asm/uaccess.h>#include <asm/irq.h>#include <asm/io.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>static struct class *thirddrv_class;static struct class_device*thirddrv_class_dev;int num = 0;/*定义工作队列和关联的函数*/struct work_struct key_wq;void key_do_work(unsigned long);void key_do_work(unsigned long){printk(" this is key_do_work \n");printk(" fuck you hhaa \n");}                                                                                                                                                                                                                                                                                                                                    static irqreturn_t buttons_irq(int irq, void *dev_id){printk("press ed \n");printk("irq += %d \n",irq);schedule_work(&key_wq);  return IRQ_RETVAL(IRQ_HANDLED);} static int third_drv_open(struct inode *inode, struct file *file){request_irq(IRQ_EINT0,  buttons_irq, IRQT_BOTHEDGE, "S2", 1);request_irq(IRQ_EINT2,  buttons_irq, IRQT_BOTHEDGE, "S3", 2);request_irq(IRQ_EINT11, buttons_irq, IRQT_BOTHEDGE, "S4",3);request_irq(IRQ_EINT19, buttons_irq, IRQT_BOTHEDGE, "S5", 4);/*初始化工作队列  把工作队列与处理函数绑定*/INIT_WORK(&key_wq,(void (*)(void *)) key_do_work, NULL);return 0;}ssize_t third_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){//num++;printk("num = %d\n",num);return 1;}int third_drv_close(struct inode *inode, struct file *file){free_irq(IRQ_EINT0, 1);free_irq(IRQ_EINT2, 2);free_irq(IRQ_EINT11, 3);free_irq(IRQ_EINT19, 4);return 0;}static struct file_operations sencod_drv_fops = {    .owner   =  THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */    .open    =  third_drv_open,     .read =third_drv_read,   .release =  third_drv_close,   };int major;static int third_drv_init(void){major = register_chrdev(0, "third_drv", &sencod_drv_fops);thirddrv_class = class_create(THIS_MODULE, "third_drv");thirddrv_class_dev = class_device_create(thirddrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); /* /dev/buttons */return 0;}static void third_drv_exit(void){unregister_chrdev(major, "third_drv");class_device_unregister(thirddrv_class_dev);class_destroy(thirddrv_class);return 0;}module_init(third_drv_init);module_exit(third_drv_exit);MODULE_LICENSE("GPL");


0 0
原创粉丝点击