完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 tqwuping 于 2016-7-11 14:15 编辑
/***************************************************** 功能: 能实现按键中断。 实现去抖动功能,按键基本准确。 ******************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "driver_button" static volatile int ev_press = 0; static volatile int dev_num=0; static volatile int press_cnt [] = {0, 0, 0, 0}; static volatile int flag_press[] = {0, 0, 0, 0}; static DECLARE_WAIT_QUEUE_HEAD(button_waitq); static irqreturn_t irq_interrupt(int irq, int dev_id) { // //disable_irq(IRQ_EINT0); ???????????????????????????ú // //printk("dev_id= %dn",dev_id); dev_num=dev_id; ev_press=1; switch( dev_num) { case 1: flag_press[0]=1;break; case 2: flag_press[1]=1;break; case 3: flag_press[2]=1;break; case 4: flag_press[3]=1;break; default: break; } wake_up_interruptible(&button_waitq); //enable_irq(IRQ_EINT0); return IRQ_RETVAL(IRQ_HANDLED); } // ------------------- OPEN ------------------------ ssize_t button_open (struct inode * inode ,struct file * file) { request_irq(IRQ_EINT0, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY1", 1); request_irq(IRQ_EINT1, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY2", 2); request_irq(IRQ_EINT2, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY3", 3); request_irq(IRQ_EINT4, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY4", 4); printk("-----------------drive button open ok----------------n"); return 0; } // ------------------- RELEASE/CLOSE --------------- ssize_t button_release (struct inode * inode ,struct file * file) { free_irq(IRQ_EINT0, 1); free_irq(IRQ_EINT1, 2); free_irq(IRQ_EINT2, 3); free_irq(IRQ_EINT4, 4); return 0; } // ------------------- READ ------------------------ ssize_t button_read (struct file * file ,char * buf, size_t count, loff_t * f_ops) { wait_event_interruptible(button_waitq, ev_press); /* ???????????±??ev_press????1?????ü??0 */ ev_press = 0; msleep(200); if(flag_press[0]) { press_cnt[0]++; } else if(flag_press[1]) { press_cnt[1]++; } else if(flag_press[2]) { press_cnt[2]++; } else if(flag_press[3]) { press_cnt[3]++; } flag_press[0]=0; flag_press[1]=0; flag_press[2]=0; flag_press[3]=0; printk("------------device read --------------------n"); printk("press_cnt[0]= %dn",press_cnt[0]); copy_to_user( buf,(const void *)press_cnt,sizeof(press_cnt) ); return 0; } // ------------------- WRITE ----------------------- ssize_t button_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops) { return 0; } // ------------------- IOCTL ----------------------- ssize_t button_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg) { return 0; } // ------------------------------------------------- static struct file_operations button_ops ={ .owner = THIS_MODULE, .open = button_open, .read = button_read, .write = button_write, .ioctl = button_ioctl, .release = button_release, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &button_ops, }; static int __init init_button_init(void) { int ret; ret = misc_register(&misc); printk("-----------------drive button init ok----------------n"); return 0; } static void __exit exit_button_ctl(void) { misc_deregister(&misc); } module_init(init_button_init); module_exit(exit_button_ctl); MODULE_LICENSE("GPL"); #include #include #include #include // open() close() #include // read() write() #define DEVICE_NAME "/dev/driver_button" //------------------------------------- main --------------------------------------------- int main(int argc, char **argv) { int fd,ret; int cnt=0; unsigned int key_val[4]; fd = open(DEVICE_NAME, O_RDWR); if (fd == -1) { printf("can't open device mknod %s c zhu ci n",DEVICE_NAME); return 0; } while(1) { read(fd,key_val,sizeof(key_val)); printf(" key_val= %d %d %d %dn",key_val[0],key_val[1],key_val[2],key_val[3]); } // close ret = close(fd); printf ("close gpio_led_driver testn"); return 0; }// end main 感谢chen4013874的分享! 供货情况: 天嵌科技提供专业嵌入式板卡和行业解决方案。如有需要,可以联系天嵌科技的销售人员。 销售电话:020-38219416 38373101 技术支持:020-38219416转807 820 网址:http://www.embedsky.com 官方淘宝:https://embedsky.taobao.com/ |
|
相关推荐
|
|
功能:
能实现按键中断。 实现去抖动功能,按键基本准确。 感谢群主分享,这个功能不错! |
|
|
|
|
|
去抖的帖子,也可以关注一下我的去抖帖子,关于AM335X,S5P4418和AM3359的板子,也有关于按键去抖的驱动介绍
|
|
|
|
|
|
去抖的帖子,也可以关注一下我的去抖帖子,关于AM335X,S5P4418和AM3359的板子,也有关于按键去抖的驱动介绍
|
|
|
|
|
|
728 浏览 0 评论
ElfBoard ELF 1板卡-开发板启动后打印random: nonblocking pool is initialized
484 浏览 0 评论
G2D图像处理硬件调用和测试-基于米尔-全志T113-i开发板
2996 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡- 减少uboot阶段的等待时间
1481 浏览 0 评论
嵌入式学习-飞凌ElfBoard ELF 1板卡 - 重新打包文件系统发现ftp无法正常连接
1813 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 09:21 , Processed in 0.589370 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号