Linux Input子系统浅析(二)-- 模拟tp上报键值

原创 2016年08月31日 12:36:04
通过前一节的分析得到,linux Input子系统上传数据本质上是将input_dev的数据,上报给input_handler,
当用户读入event时,驱动层只需要利用copy_to_user将数据传递至用户空间。当然,以上只是内核中Linux input
的机制,作为驱动工程师我们该如何使用input子系统呢?考虑到部分读者没有嵌入式设备,作者从一个虚拟嵌入式
设备的编写,描述Input subsystem 的使用。
    实际的嵌入式设备中,用的input system的设备很多,如gsensor,psensor,touch panel等,本文着重模拟一个
virsual touch 设备,让其向上层空间报值,然后用户空间可以通过通用IO来捕获键值或者坐标。
一、 虚拟设备的编写流程
1.定义虚拟设备结构体
struct touch_dev{  
    struct platform_device *p_dev;  //定义平台设备,这个不为必须
    struct input_dev *input;    //定义input设备结构体
    int x;  //定义坐标X
    int y;  //定义坐标Y,当然如果需要也可以添加键值
    struct task_struct *run_thread;  //定义内核线程,为了让用户空间随时都抓到坐标,我们可以开启线程
	不断上报
};  
2. 注册平台设备和驱动
	platform_device_register_simple("v_touch",-1,NULL,0);
	platform_device_register_simple("v_touch",-1,NULL,0);  
3. probe 函数实现
   kthread_run(vtouch_thread,vtouch_dev,"vtouch_thread"); 
4. 内核线程实现
static int vtouch_thread(void *data)  
{  
    int x,y;  
    struct touch_dev *vtouch_dev = (struct touch_dev*)data;  
      
    printk(KERN_INFO "vtouch thread running\n");  
      
    do{  
		
		...
  
        printk("vtouch thread report\n");
		msleep(2000);
    }  while(!kthread_should_stop());//线程退出条件
  
    return 0;  
}  
二、 input 设备的添加流程
1.在 probe中添加
//为input device申请内存
vtouch_dev->input = input_allocate_device();  
//设置 vtouch 设备名称
vtouch_dev->input->name = "vtouch";  
//设置设备支持坐标事件,包括X坐标,Y坐标事件,Z坐标事件。
set_bit(EV_ABS,vtouch_dev->input->evbit);  
//对于X轴范围是-1024到+1024,数据误差是-2到+2,中心平滑位置是0 
input_set_abs_params(vtouch_dev->input, ABS_X, -1024, 1024, 2, 0);
//同上
input_set_abs_params(vtouch_dev->input, ABS_Y, -1024, 1024, 2, 0);  

	//注册输入设备
    ret = input_register_device(vtouch_dev->input);  
    if(ret < 0){  
        printk("%s register input device error\n",__func__);  
        goto input_register;  
    }  

2.在线程中添加

//上报绝对坐标
input_report_abs(vtouch_dev->input,ABS_X,x);  
input_report_abs(vtouch_dev->input,ABS_Y,y);  
//上报同步通知
input_sync(vtouch_dev->input);   //对于坐标必须添加
三、应用程序编写
int main(void)  
{  
    struct input_event ev;  
    int count,x,y;  
  
    int fd = open(EVENT_DEV, O_RDWR);  


    while(1){  
        count = read(fd, &ev,sizeof(struct input_event));  
        if(EV_ABS == ev.type){  
            if(ev.code == ABS_X){  
                x = ev.value;  
            }else if(ev.code == ABS_Y){  
                y = ev.value;  
            }  
            printf("position: x=%d, y=%d\n",x,y);  
        }else if(EV_SYN == ev.type){  
                puts("sync!");  
        }  
    }  
  
    return 0;     
}  
整体源码如下:

 驱动:  input_simulate.c

 应用: input_simulate_test.c


四、调试过程
1. 通过
 cat /proc/bus/input/devices

查看与dev、input目录下的event对应的设备 

2. ./a.out  //运行应用程序

实验效果:

五、总结

    就单纯使用而言,应用input subsystem 我们只需要做以下工作,

1. 定义input_device 并分配调用input_allocate_device(); 分配空间 

2. 设置input_dev 支持的事件类型如:set_bit,input_set_abs_params

3. 调用input_register_device 注册input_dev

4. 调用input_report_abs,input_sync上报事件

  




版权声明:本文为博主原创文章,未经博主允许不得转载。

[Linux]input 子系统学习笔记(简单范例和四个基本函数)

输入子系统是为了将输入设备的功能呈现给应用程序。 它支持 鼠标、键盘、蜂鸣器、触摸屏、传感器等需要不断上报数据的设备。 分析了四个函数: 1. input_allocate_device 在内存中...
  • dearsq
  • dearsq
  • 2016年05月19日 14:54
  • 5846

Linux内核Input输入子系统浅解

Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。子系统共分为三层,...
  • G_linuxer_
  • G_linuxer_
  • 2016年07月01日 16:03
  • 1678

linux input输入子系统分析《四》:input子系统整体流程全面分析

主要讲述本人在学习Linux内核input子系统的全部过程,如有分析不当,多谢指正。以下方式均可联系,文章欢迎转载,保留联系信息,以便交流。 邮箱:eabi010@gmail.com 主页:www...
  • ielife
  • ielife
  • 2012年07月31日 14:29
  • 9250

linux驱动之input子系统之按键驱动编写流程(三)

的撒旦撒
  • u013256018
  • u013256018
  • 2015年11月21日 14:46
  • 735

linux input 子系统分析

转自:http://blog.csdn.net/yaozhenguo2006/article/details/6769482 linux input子系统分析--概述与数据结构 ...
  • coder_jack
  • coder_jack
  • 2015年05月01日 18:28
  • 628

全网络对Linux input子系统最清晰、详尽的分析

本文应是全网对linux input子系统分析最有系统逻辑性和最清晰的分析文章了,主要结构input-core, input-handler和input-device三者的关系以及应用open和rea...
  • yueqian_scut
  • yueqian_scut
  • 2015年08月27日 14:27
  • 2450

Linux之解析鼠标input事件数据

Linux中USB鼠标驱动:http://blog.csdn.net/qq_21792169/article/details/48790745 或者直接Linux自带的USB鼠标驱动。 /...
  • qq_21792169
  • qq_21792169
  • 2016年03月05日 17:03
  • 6502

闲聊linux中的input设备(转)

转自:http://blog.csdn.net/lmm670/article/details/6080998   用过linux的哥们都知道,linux所有的设备都是以文件的形式实现的,要访问一...
  • beckdon
  • beckdon
  • 2016年01月28日 10:48
  • 675

linux input 子系统分析 三

linux input子系统分析--子系统核心.事件处理层.事件传递过程 一.  输入子系统核心分析。     1.输入子系统核心对应与/drivers/input/input.c文件,这个也...
  • YAOZHENGUO2006
  • YAOZHENGUO2006
  • 2011年09月14日 19:48
  • 7577

linux input输入子系统分析《一》:初识input输入子系统

主要讲述本人在学习Linux内核input子系统的全部过程,如有分析不当,多谢指正。以下交流方式,文章欢迎转载,保留联系信息,以便交流。 邮箱:eabi010@gmail.com 主页:www.i...
  • ielife
  • ielife
  • 2012年07月29日 14:33
  • 11272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Input子系统浅析(二)-- 模拟tp上报键值
举报原因:
原因补充:

(最多只允许输入30个字)