Linux Input子系统浅析(二)-- 模拟tp上报键值【转】
转自: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上报键值【转】的更多相关文章
- Linux Input子系统
先贴代码: //input.c int input_register_handler(struct input_handler *handler) { //此处省略很多代码 list_for_each ...
- Linux input子系统分析
输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...
- Linux input子系统编程、分析与模板
输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...
- Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值
Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...
- Linux input子系统 io控制字段【转】
转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...
- PHP 按二维数组的键值排序
/** * 按二维数组的键值排序 * @param unknown $array 二维数组 * @param unknown $key 二维数组的键值 * @param string $order 升 ...
- PHP二维数组按照键值排序
在开发过程中,我们常常需要对二维数组按照数组的某个键来排序,这里提供两个封装好的方法,可以放到公共函数模块里以后需要的时候直接调用即可. /** * 二维数组按照键值降序排序 * @param arr ...
- Android驱动之 Linux Input子系统之TP——A/B(Slot)协议
将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子系统的开发人员也不甚理解:另一方面是由于这部分知识一旦扩展到TP(触摸屏Touch Panel)的多点触 ...
- Android驱动之 Linux Input子系统之TP——A/B(Slot)协议【转】
转自:http://www.thinksaas.cn/topics/0/646/646797.html 将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子 ...
随机推荐
- ios 添加三方字体
字体文件一般后缀名为.ttf 或.odf (备注: 有的字体是收费的,不能用于商业应用.所以还请设计师选择免费的字体好一点,不然会收到律师函哦) 1 加入字体文件 2. info.plist 文件引入 ...
- java返回数据工具类
import com.qbskj.project.util.SpringUtils; /** * 消息 * */ public class Message { /** * 类型 */ public e ...
- mongodb解决只能本地连接不能远程连接问题
本机windows7 ,装了vagrant盒子,并在盒子上装了mongodb服务,本机连接虚拟机时连不上. 解决方法: 修改虚拟机上 mongodb.conf 文件,将bind_ip = 127.0. ...
- 如何在Linux中轻松删除源安装的软件包?
第1步:安装Stow 在这个例子中,我们使用的是CentOS,因此我们需要扩展的EPEL库.您可以使用以下命令安装它们:yum install epel-release然后,下面这段命令:yum in ...
- [模板] 2-SAT 问题
简介 2-SAT (2-satisfiability) 问题形如: 给定一些变量 \(x_i \in \{true, false\}\); 给定一些一元/二元约束条件, 如 \(x_i \land \ ...
- git版本回退
场景1: 当你改乱了工作区某个文件的内容,修改后未执行git add和git commit,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2: 当你不但改乱了工作区某 ...
- Error:Failed to resolve: com.android.support.constraint:constraint-layout:1.0.2
可以换个maven库: allprojects { repositories { jcenter() //maven { url "https://jitpack.io" } ma ...
- Ubuntu 16.04 RabbitMq 安装与运行(安装篇)
Ubuntu 16.04 RabbitMq 安装与运行(安装篇) 2018年08月15日 15:05:24 我跟吴彦祖四六开 阅读数:1966 前言 目前公司用阿里云 + redis 的方式实现的 ...
- Android Connection refused
遇到 Connection refused的错误. AndroidManifest.xml 文件中添加: //网络权限 <uses-permission android:name=" ...
- subprocess
在没有subprocess这个模块的时候,我们怎么去跟我们的操作系统做交互的呐?下面我们先说说这三个模块:os.system().os.popen().commands. 1. os.system( ...