历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2018年11月26日 | tq2440 按键中断 去抖

2018-11-26 来源:eefocus

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


推荐阅读

史海拾趣

DYMO公司的发展小趣事

为了扩大市场份额,DYMO公司积极寻求与各大零售商和办公用品供应商的合作。通过与这些合作伙伴建立紧密的合作关系,DYMO公司的产品得以更广泛地进入市场,并被更多的消费者所熟知。此外,DYMO公司还积极开拓国际市场,将其产品销往全球各地。

泰科天润(GPT)公司的发展小趣事

为了扩大市场份额,DYMO公司积极寻求与各大零售商和办公用品供应商的合作。通过与这些合作伙伴建立紧密的合作关系,DYMO公司的产品得以更广泛地进入市场,并被更多的消费者所熟知。此外,DYMO公司还积极开拓国际市场,将其产品销往全球各地。

Festo公司的发展小趣事

近年来,Festo在中国的发展步伐进一步加快。2021年4月,Festo济南全球生产中心正式全面投入运营。这个生产中心整合了本地的生产、研发、销售、物流等全价值链,形成了“研产销一体化”的格局。通过引进先进的生产设备和工艺,以及优化生产流程和管理体系,Festo济南全球生产中心在保障产品质量的同时,也大大提高了生产效率和响应速度。这一生产中心的建立不仅为Festo在中国市场的进一步发展提供了强有力的支持,也进一步巩固了Festo在全球气动自动化领域的领导地位。

以上五个故事从不同角度展示了Festo公司在电子行业中的发展历程和成就。作为一家以创新为驱动、以可持续发展为目标的公司,Festo将继续引领电子行业的发展方向,为全球客户提供更加优质的产品和服务。

Device Engineering Incorporated公司的发展小趣事

随着公司业务的不断发展,DEI公司开始考虑国际化拓展。他们积极寻求与国际知名企业的合作,通过技术交流和共同研发,不断提升自身实力。同时,DEI公司也在全球范围内建立了销售网络,将产品推向了更广阔的市场。这一举措不仅提高了公司的知名度,也为公司带来了可观的收益。

HB公司的发展小趣事

理念:作为一家负责任的企业,Hartmann Codier GmbH始终将环保理念贯穿于产品研发、生产和销售的全过程中。公司严格遵守RoHS/WEEE等国际环保标准,杜绝使用或包含六种有毒重金属物质。

实践:在产品设计阶段,公司就充分考虑环保因素,采用环保材料和工艺;在生产过程中,公司加强了对废弃物的处理和回收利用;在产品销售后,公司还提供了完善的回收服务。这些措施不仅降低了产品对环境的影响,还提升了企业的社会形象。

Corsair Electrical Connectors Inc公司的发展小趣事

随着市场的不断发展,Corsair意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进先进技术和设备,不断提升产品的性能和质量。在一次次的尝试和失败后,Corsair的研发团队终于突破了行业技术瓶颈,成功开发出了一款具有高性能、高稳定性的连接器产品。这一创新成果不仅赢得了客户的青睐,也为公司在行业中树立了良好的口碑。

问答坊 | AI 解惑

[资料]凌阳单片机SPCE061A芯片资料

最近正在实习,得到一些凌阳单片机的资料,传上来看大家谁需要^_^ 资料说明 1.《61指令周期表V1.1》 介绍了SPCE061A的unSP 1.1版本CPU内核的指令周期数、指令形式等 2.《SPCE061A英文数据手册v0.8》 最新的英文数据手册,当其他资料和它冲突时 ...…

查看全部问答>

读写HT24 系列的EEPROM 应用范例

發點读写HT24 系列的EEPROM 应用范例…

查看全部问答>

求助关于CORDIC算法求反正切

我看了一些关于CORDIC算法的资料,我现在想用CORDIC算法来实现求反正切,我想问一下求反正切时主要考虑一些什么问题?那些要考虑,那些不需要考虑?例如,校正因子K需不需要考虑,旋转方向采用什么方法判断比较有利。希望熟悉的大侠给点意见,非常 ...…

查看全部问答>

稳压电源实用手册

稳压电源实用手册 [ 本帖最后由 文浩 于 2009-7-9 17:06 编辑 ]…

查看全部问答>

无线馈电

本帖最后由 paulhyde 于 2014-9-15 03:30 编辑 传说无线传输电力可能性很大,07年就和这个相关,我正在准备这个模块!关键是效率问题 附件为经过试验可以成功的电路,参数可能因为环境而有所不同 [ 本帖最后由 xxt 于 2009-8-29 21:37 编辑 ] ...…

查看全部问答>

avr单片机读书笔记

好东西,不想独自放到电脑里面,与大家共享. 单片机学习及提升的绝佳资料,可以让你直接成为单片机高手,为arm学习打下坚实的基础. …

查看全部问答>

嵌入式硬盘录像机录像的磁盘,linux下无法挂载

Linux系统下新增一块500G磁盘,这个磁盘是用于嵌入式硬盘录像机录像的磁盘,我需要把里面的内容COPY出来,但是无法挂载这块磁盘。用fdisk -l出现如下提示: Disk /dev/sda: 500.1G,500107862016 bytes 255 heads,63 sectors/track,60801 cylind ...…

查看全部问答>

100分请您提供WinCEPB50-061231-Product-Update-Rollup-Armv4I.msi,GOOGLE至凌晨没找着

如题,多谢。 我已经打了了: WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi WinCEPB50-090131-2009M01-Armv4I.msi WinCEPB50-090228-2009M02-Armv4I.msi 结果编译时,发现WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\SDCARD\\SDBUSDRIVER ...…

查看全部问答>

关于WINCE50下中断号

请问各位:    1、WINCE50下是不是分物理中断号和逻辑中断号??物理中断号就是定义的跟硬件开关中断相关的中断号,逻辑中断号是物理中断号对应的由系统调用的中断号???这个理解对不对???    2、BSP中SD驱动的注册表信 ...…

查看全部问答>

/dev 下没有U盘的设备文件

有HOTPLUG udev /DEV 下没有U盘设备文件 fdisk -l 也没有!…

查看全部问答>