微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 关于Linux设备驱动中input子系统的介绍

关于Linux设备驱动中input子系统的介绍

时间:02-09 来源:OFweek 电子工程网 点击:

fo_tab));

  if(err)

  {

  return -1;

  }

  return 0;

  }

  // 关闭设备

  static void hq_key_release(struct input_dev *dev)

  {

  int i;

  for(i=0;i<KEY_NUM;i++){

  disable_irq_nosync(key_info_tab.irq_no);

  free_irq(key_info_tab.irq_no,(void *)(&key_info_tab));

  }

  }

  //模块初始化

  static int __init hq_key_init(void)

  {

  int err;

  key_dev=input_allocate_device();

  if(!key_dev){

  return -ENOMEM;

  }

        set_bit(EV_KEY,key_dev->evbit);

  set_bit(KEY_1,key_dev->keybit);

  set_bit(KEY_2,key_dev->keybit);

  set_bit(KEY_3,key_dev->keybit);

  set_bit(KEY_4,key_dev->keybit);

  key_dev->name="input_key_demo";

  key_dev->dev.init_name="input_key";

  key_dev->open=hq_key_open;

  key_dev->close=hq_key_release;

  err=input_register_device(key_dev);

  if(err){

  return err;

  }

  return 0;

  }

  // 模块卸载

  static void __exit hq_key_exit(void)

  {

  input_unregister_device(key_dev);

  }

  MODULE_AUTHOR;

  MODULE_LICENSE("Dual BSD/GPL");

  module_init(hq_key_init);

  module_exit(hq_key_exit);

  测试程序:

  #include<stdio.h>

  #include<fcntl.h>

  #include<errno.h>

  #include<stdlib.h>

  #include<linux/input.h>

  int main(void )

  {

  int fd;

  int key_value,i=0,count;

  struct input_event ev_key;

  fd=open("/dev/input/event0",0666);

  if(fd<0){

  perror("open device");

  exit(1);

  }

  while(1){

  count=read(fd,&ev_key,sizeof(struct input_event));

  for(i=0;i<(int)count/sizeof(struct input_event);i++)

  {

  if(EV_KEY==ev_key.type)

  {

  int num=ev_key.code%10-1;

  printf("type:%d,code:%d ,value:%d\n key%d pressed!\n",ev_key.type,ev_key.code,ev_key.value,num);

  }

  if(EV_SYN==ev_key.type)

  printf("syn event\n");

  }

  }

  close(fd);

  return 0;

  }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top