转自:https://blog.csdn.net/xiaopangzi313/article/details/52383226

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaopangzi313/article/details/52383226
通过前一节的分析得到,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上报事件
---------------------
作者:xiaopangzi313
来源:CSDN
原文:https://blog.csdn.net/xiaopangzi313/article/details/52383226
版权声明:本文为博主原创文章,转载请附上博文链接!

Linux Input子系统浅析(二)-- 模拟tp上报键值【转】的更多相关文章

  1. Linux Input子系统

    先贴代码: //input.c int input_register_handler(struct input_handler *handler) { //此处省略很多代码 list_for_each ...

  2. Linux input子系统分析

    输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...

  3. Linux input子系统编程、分析与模板

    输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...

  4. Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

    Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...

  5. Linux input子系统 io控制字段【转】

    转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...

  6. PHP 按二维数组的键值排序

    /** * 按二维数组的键值排序 * @param unknown $array 二维数组 * @param unknown $key 二维数组的键值 * @param string $order 升 ...

  7. PHP二维数组按照键值排序

    在开发过程中,我们常常需要对二维数组按照数组的某个键来排序,这里提供两个封装好的方法,可以放到公共函数模块里以后需要的时候直接调用即可. /** * 二维数组按照键值降序排序 * @param arr ...

  8. Android驱动之 Linux Input子系统之TP——A/B(Slot)协议

    将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子系统的开发人员也不甚理解:另一方面是由于这部分知识一旦扩展到TP(触摸屏Touch Panel)的多点触 ...

  9. Android驱动之 Linux Input子系统之TP——A/B(Slot)协议【转】

    转自:http://www.thinksaas.cn/topics/0/646/646797.html 将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子 ...

随机推荐

  1. 时间插件datepicker(jQuery-UI,bootstrap)和jquery-steps的冲突解决。。。

    日期插件初始化:  $('.prelease_time').flatpickr(); let contentSteps = $("#content_form").steps({ h ...

  2. DAY19、日常模块

    一.hashlib模块:加密1.基本使用:import hashlibcipher = hashlib.md5('需要加密的数据(二进制形式)'.encode('utf-8'))print(ciphe ...

  3. table 里输入rules 验证

    HTML <el-form ref='from' :model="fromData"> <el-table ref="tableman" bo ...

  4. 仿 ELEMENTUI 实现一个简单的 Form 表单

    原文:仿 ElmentUI 实现一个 Form 表单 一.目标 ElementUI 中 Form 组件主要有以下 功能 / 模块: Form FormItem Input 表单验证 在这套组件中,有 ...

  5. Spring Boot 2.x 编写 RESTful API (六) 事务

    用Spring Boot编写RESTful API 学习笔记 Transactional 判定顺序 propagation isolation 脏读 不可重复读 幻读 不可重复读是指记录不同 (upd ...

  6. nginx配置反向代理CAS单点登录应用

    新增如下配置即可: location /cas { proxy_pass http://172.16.20.155:8080/cas; proxy_redirect default; proxy_re ...

  7. django xadmin(1)

    filter_horizontal 从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,必须是一个 ManyToManyField类型,且不能用于 ForeignKey字段,默认地,管理工具使用 ...

  8. jquery笔记整理

    01-jquery简介 1)功能:     ·html元素选取     ·Html元素操作     ·Css操作     ·Html事件函数     ·JavaScript特效和动画     ·DOM ...

  9. 【XSY3309】Dreamweaver 高斯消元 拉格朗日插值

    题目大意 这是一道通信题. 给你 \(8\) 个 \(32\) 位整数.加密端要把这些数加密成至少 \(1000\) 个 \(32\) 位整数,交互库会把这些整数随机打乱后发给解密端,解密端最多能获得 ...

  10. 第一模块:Python基础(二)

    目录 1.变量 常量 2.用户交互和注释 程序交互 注释 字符串 布尔型(bool) 格式化输出 运算符 while 循环 @(开发基础) 1.变量 变量用于存储要在计算机程序中引用和操作的信息.它们 ...