查看: 221|回复: 8

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

[复制链接]

141

主题

1

好友

1743

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    2016-11-9 11:46
  • 签到天数: 80 天

    [LV.6]常住居民II

    发表于 2016-7-11 14:15:07 |显示全部楼层
      /*****************************************************
      功能:
      能实现按键中断。
      实现去抖动功能,按键基本准确。
      ******************************************************/
      #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/

    回复

    使用道具 举报

    无效楼层,该帖已经被删除

    0

    主题

    0

    好友

    43

    积分

    白丁

    Rank: 1

    该用户从未签到

    发表于 2016-7-12 14:41:14 |显示全部楼层
    不错,天嵌还在不断出教程,以前就是用天嵌的2440学习的。
    回复

    使用道具 举报

    0

    主题

    0

    好友

    54

    积分

    童生

    Rank: 2

    该用户从未签到

    发表于 2016-7-12 14:53:55 |显示全部楼层
    回帖,代表我已看完
    回复

    使用道具 举报

    0

    主题

    0

    好友

    57

    积分

    童生

    Rank: 2

    该用户从未签到

    发表于 2016-7-13 11:44:29 |显示全部楼层
    2440的资料还是很不错的,谢谢分享
    回复

    使用道具 举报

    0

    主题

    0

    好友

    61

    积分

    童生

    Rank: 2

  • TA的每日心情
    奋斗
    2016-8-17 17:27
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2016-7-13 17:26:43 |显示全部楼层
    好帖,必须得顶哈
    回复

    使用道具 举报

    8

    主题

    0

    好友

    1101

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 08:26
  • 签到天数: 240 天

    [LV.8]以坛为家I

    发表于 2016-7-22 14:59:57 |显示全部楼层
    最近我也在重拾TQ2440。
    回复

    使用道具 举报

    141

    主题

    1

    好友

    1743

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    开心
    2016-11-9 11:46
  • 签到天数: 80 天

    [LV.6]常住居民II

    发表于 2016-7-25 14:49:10 |显示全部楼层
    yanhaijian 发表于 2016-7-22 14:59
    最近我也在重拾TQ2440。

    加油加油加油
    回复

    使用道具 举报

    0

    主题

    0

    好友

    10

    积分

    白丁

    Rank: 1

  • TA的每日心情
    开心
    2016-11-7 21:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-11-7 22:02:14 |显示全部楼层
    很好的资源,有参考价值。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-10 07:13 , Processed in 0.177639 second(s), 17 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部