Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469910
  • 博文数量: 83
  • 博客积分: 92
  • 博客等级: 民兵
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 13:33
文章分类

全部博文(83)

文章存档

2014年(3)

2013年(59)

2012年(16)

2011年(5)

我的朋友

分类: LINUX

2013-04-27 17:43:36

input子系统上报数据的的机制可以用到用户空间监听硬件某个中断的产生,然后通过input_report给用户空间。用户空间只要不断的去poll这个设备节点就OK。效率的话应该没有其他机制比系统自带的高。
1.在驱动申请一个input设备并注册
    
    input_dev = input_allocate_device();
    if (!input_dev) {
         pr_info("Failed to input_allocate_device\n");
          ret = -ENOMEM;
    }

    input_dev->name = "input_event";
    input_dev->id.bustype = BUS_HOST;

    set_bit(BTN_TOUCH, rf_input_dev->keybit);
    set_bit(EV_KEY, input_dev->evbit);//所支持的事件
    set_bit(EV_SYN, input_dev->evbit);
 
    ret = input_register_device(rf_input_dev);
    if (ret) {
           pr_info("Failed to register input device, err: %d\n", ret);
    }else{
            pr_info("succeed to register input device\n");
    }
    
    注册成功后会在产生/dev/input/eventx的节点。

    上报数据格式:
    input_report_key(input_dev, BTN_TOUCH, 1);//上报按键
    input_sync(input_dev);//上报同步消息
  
   report数据必须前不一样才能有效。系统会检测上报数据是否一样,一样将其丢弃。

2. 用户空间操作
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define LOG_TAG "input"
    #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)  
    #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)  
    #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##args)

    #ifndef INFTIM
    #define INFTIM -1
    #endif
  
   #define RF_EVENT "/dev/input/event3"


    int main(int argc, char **argv)
    {
          struct pollfd pfd[1];
          int nfd=1;
          int len;
          int event_fd;
          struct input_event data;

          event_fd=open(RF_EVENT, O_RDWR);
          if(event_fd < 0){
             LOGI("open %s error\n",RF_EVENT);                
             return 0;
          }

          pfd[0].fd=event_fd;
          pfd[0].events=POLLIN;
         
          while(1){
             if(poll(pfd,nfd,INFTIM)>0){
                  len=read(event_fd,&data,sizeof(data));
                  if(len<0){
                      LOGI("len < 0\n");
                  }else{
                      if(data.type == EV_KEY){
                         LOGI("==receive event\n");
                      }
                  }
              }
         }
 
    }
   

 

阅读(4982) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~