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
- jz2440 的中断中的底半部机制
- JZ2440的中断控制器
- jz2440的中断处理流程
- jz2440 中断体系结构
- JZ2440 中断分析
- JZ2440 中断分析
- JZ2440 中断学习
- Windows CE中的中断机制
- Linux中的中断机制 2
- linux内核机制中的中断
- 八。内核中的中断机制
- Linux中的中断处理机制
- linux的中断机制
- S3C2440的中断机制
- 操作系统的中断机制
- 中断机制的引入
- 内核的中断机制
- linux的中断机制
- UVALive 5033 I'm Telling the Truth 二分图匹配
- C语言之指针
- My brief introduction to K-SVD
- Json简介
- Linux驱动学习——中断、定时器
- jz2440 的中断中的底半部机制
- hdu hdu-2111-Saving HDU
- 【BFS】uva11624Fire!
- 重构获取异常栈信息--printStackTrace
- C语言之动态内存分布
- UVA1508-Equipment(状态压缩+暴力枚举)
- UVa11478 - Halum(差分约束)
- contos安装lnmp
- Qt Quick 中QMessageBox Class的使用学习笔记