Embedsky007的個(gè)人空間 http://selenalain.com/space-uid-114045.html [收藏] [復制] [RSS]

博客

S3C2440如何按鍵中斷 去抖

熱度 4已有 2240 次閱讀2016-7-11 14:13 |個(gè)人分類(lèi):技術(shù)文章| S3C2440, 嵌入式, 開(kāi)發(fā)板, 中斷, 板卡

  /*****************************************************

  功能:

  能實(shí)現按鍵中斷。

  實(shí)現去抖動(dòng)功能,按鍵基本準確。

  ******************************************************/

  #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的分享!

  供貨情況:

  天嵌科技提供專(zhuān)業(yè)嵌入式板卡和行業(yè)解決方案。如有需要,可以聯(lián)系天嵌科技的銷(xiāo)售人員。

  銷(xiāo)售電話(huà):020-38219416 38373101

  技術(shù)支持:020-38219416轉807 820

  網(wǎng)址:http://www.embedsky.com

  官方淘寶:https://embedsky.taobao.com/


路過(guò)

雞蛋
1

鮮花

握手

雷人

剛表態(tài)過(guò)的朋友 (1 人)

發(fā)表評論 評論 (4 個(gè)評論)

回復 adeechan36 2016-7-12 14:39
2440的資料還是比較多的,適合學(xué)習。
回復 sally_cheng 2016-7-12 14:54
謝謝樓主的分享
回復 張曉然 2016-7-13 11:42
2440資料豐富,非常不錯,謝樓主!
回復 lzh8 2016-7-13 17:28
值得分享

facelist

您需要登錄后才可以評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
返回頂部
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页