国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Embedsky007的個人空間 http://www.qingdxww.cn/space-uid-114045.html [收藏] [復制] [RSS]

博客

S3C2440如何按鍵中斷 去抖

熱度 4已有 2218 次閱讀2016-7-11 14:13 |個人分類:技術文章| S3C2440, 嵌入式, 開發板, 中斷, 板卡

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

  功能:

  能實現按鍵中斷。

  實現去抖動功能,按鍵基本準確。

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

  #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/


路過

雞蛋
1

鮮花

握手

雷人

剛表態過的朋友 (1 人)

發表評論 評論 (4 個評論)

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

facelist

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

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
返回頂部
主站蜘蛛池模板: 成zzzwww日本免费 | www.日本高清.com | 亚洲国产欧美日韩一区二区三区 | 亚洲成人手机在线观看 | 国产玖玖玖精品视频 | 美女操操操 | 日本精品一区二区在线播放 | 亚洲成年网站在线观看 | 日韩草逼| 国产精品视频一区麻豆 | 四虎国产精品4hu永久 | 欧美视频一区在线观看 | 色综合成人丁香 | 亚洲欧美日韩天堂在线观看 | 亚洲高清视频在线观看 | 欧美v日本 | 久月婷婷| 66成人 | 亚欧洲精品在线视频免费观看 | 欧美香蕉爽爽人人爽观看猫咪 | 老外一级毛片免费看 | xx在线视频 | 野外做受三级视频 | 91影视永久福利免费观看 | 亚洲视频综合 | 毛片在线播放视频 | 国产精品v欧美精品∨日韩 国产精品va在线观看一 | 九九视频精品全部免费播放 | 手机在线欧美 | 四虎影视色费永久在线观看 | 久久福利免费视频 | 成都4片p高清完整版hd免费 | 国产短视频精品区第一页 | 成人黄色在线观看 | 久久黄色免费网站 | 欧美日韩一区二区中文字幕视频 | 四虎永久在线观看视频精品 | 亚洲日本中文 | 久久精品国产精品亚洲婷婷 | 91大神大战丝袜美女在线观看 | 日韩高清在线播放不卡 |