7回答

1收藏

[Linux] S3C2440如何按键中断 去抖

嵌入式系统 嵌入式系统 3054 人阅读 | 7 人回复 | 2016-07-11

  /*****************************************************
  功能:
  能实现按键中断。
  实现去抖动功能,按键基本准确。
  ******************************************************/
  #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/

分享到:
回复

使用道具 举报

回答|共 7 个

倒序浏览

沙发

adeechan36

发表于 2016-7-12 14:41:14 | 只看该作者

不错,天嵌还在不断出教程,以前就是用天嵌的2440学习的。
板凳

sally_cheng

发表于 2016-7-12 14:53:55 | 只看该作者

回帖,代表我已看完
地板

张晓然

发表于 2016-7-13 11:44:29 | 只看该作者

2440的资料还是很不错的,谢谢分享
5#

lzh2

发表于 2016-7-13 17:26:43 | 只看该作者

好帖,必须得顶哈
6#

yanhaijian

发表于 2016-7-22 14:59:57 | 只看该作者

最近我也在重拾TQ2440。
7#

embedsky007

发表于 2016-7-25 14:49:10 | 只看该作者

yanhaijian 发表于 2016-7-22 14:59
最近我也在重拾TQ2440。

加油加油加油
8#

sanqima

发表于 2016-11-7 22:02:14 | 只看该作者

很好的资源,有参考价值。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条