转自:https://www.cnblogs.com/0822vaj/p/4185634.html

-----------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://blog.csdn.net/android_huber
交流邮箱:dp.shao@gmail.com
-----------------------------------------------------------------------

linux drive中input子系统上报信息,调用函数

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value),

input子系统最终调用copy_to_user(buffer, event, sizeof(struct input_event))将信息上报给上层,event为struct input_event类型结构体, 中间会有一些处理将 type,code,value值打包成input_event类型的数据。底层上报该结构体给上层。

struct input_event {

struct timeval time;

__u16 type;

__u16 code;

__s32 value;

};

struct timeval {

__kernel_time_t tv_sec; /* seconds */

__kernel_suseconds_t tv_usec; /* microseconds */

};

typedef long        __kernel_time_t;

typedef int __kernel_suseconds_t;

对于按键

type为事件类型,按键为EV_KEY,在include/linux/input.h中,

#define EV_KEY    0x01

code为按键的值,value用于标记按键是按下还是弹起,1是按下,0是弹起。

按下和弹起事件只需上报一次。

对于touch

static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)  为input_event的封装,函数如下

input_event(dev, EV_ABS, code, value);

type为EV_ABS,  #define EV_ABS   0X03,

code的值,根据上报属性的不同,分别如下:

(多点触摸)

#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */

#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */

#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */

#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */

#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */

#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */

#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */

#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */

#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */

#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */

#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */

ABS_MT_TOUCH_MAJOR和ABS_MT_PRESSURE实现一个应该就可以了。

(单点触摸)input.h中列举了很多属性,但只需实现以下几种即可。

#define ABS_X 0x00

#define ABS_Y 0x01

#define ABS_Z 0x02  (一般不必实现)

#define ABS_PRESSURE 0x18

下面一个BTN_TOUCH为点击事件,单点触摸中需要上报点击事件

#define BTN_TOUCH 0x14a

touch点上报机制

多点触摸

value为对应属性的值,如code为ABS_MT_POSITION_X,则value的值为就为x轴坐标。

当把一个点的信息发送完毕以后,还需加上input_mt_sync(注意:即使只有一个点也需要加上),这个函数转换成input_event事件为

input_event(dev, EV_SYN, SYN_MT_REPORT, 0);

其中#define EV_SYN  0x00,   #define SYN_MT_REPORT    2,

则type为0x00,code为2,value为0。

接着再上报第二个点,第二个点上报结束,依旧要上报input_mt_sync,直至最后一次报点结束,加上input_sync,转换成input_event事件为

input_event(dev, EV_SYN, SYN_REPORT, 0);

其中#define EV_SYN  0x00,#define SYN_REPORT 0,

则type为0x00,code为0,value为0。至此报点结束。

点需要一直上报。

Linux 驱动中的例子

input_report_abs(ssd2531_data.input, ABS_MT_TRACKING_ID, 1);

input_report_abs(ssd2531_data.input, ABS_MT_TOUCH_MAJOR, PRESS_STATUS);

input_report_abs(ssd2531_data.input, ABS_MT_POSITION_X, X_COOR);

input_report_abs(ssd2531_data.input, ABS_MT_POSITION_Y, Y_COOR);

input_mt_sync(ssd2531_data.input);

单点触摸

单点上报同多点上报差不多,只是不需要input_mt_sync了,上报过程中需要

input_event(dev, EV_KEY, BTN_TOUCH,  0/1 );  value为1,代表按下,value为0代表抬起。code值为BTN_TOUCH,  #define BTN_TOUCH 0x14a;

同样最后结束需要input_sync。

linux驱动的例子‘

input_report_abs(ts.input, ABS_X, ts.xp);

input_report_abs(ts.input, ABS_Y, ts.yp);

input_report_key(ts.input, BTN_TOUCH, 1);

input_sync(ts.input);

input_event结构体中,有一个成员为struct timeval time;用来记录此刻的墙上时间。

input子系统 KeyPad-Touch上报数据格式与机制【转】的更多相关文章

  1. input子系统 KeyPad-Touch上报数据格式与机制

    -----------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://b ...

  2. Input子系统与多点触摸技术-3【转】

    转自:https://blog.csdn.net/u012839187/article/details/77335941 版权声明:本文为博主原创文章,欢迎转载,转载请注明转载地址 https://b ...

  3. 基于input子系统的sensor驱动调试(一)

    要想弄明白世界的本质,就要追根溯源:代码也是一样的道理: 最近调试几个sensor驱动,alps sensor驱动.compass sensor驱动.G-sensor驱动都是一样的架构: 一.基于in ...

  4. Linux Input子系统浅析(二)-- 模拟tp上报键值【转】

    转自:https://blog.csdn.net/xiaopangzi313/article/details/52383226 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  5. Linux--内核Uevent事件机制 与 Input子系统【转】

    转自:http://blog.csdn.net/lxl584685501/article/details/46379453 [-] 一Uevent机制 Uevent在kernel中的位置 Uevent ...

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

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

  7. input子系统事件处理层(evdev)的环形缓冲区【转】

    在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue), ...

  8. 【驱动】input子系统全面分析

    初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputC ...

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

    1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...

随机推荐

  1. c++ 套路多

    1. 浅拷贝带来的多次析构问题 参见:https://www.cnblogs.com/33debug/p/6657730.html 解决方案,深拷贝.强烈建议自定义拷贝构造函数为深拷贝,否则可能会给自 ...

  2. 查看dll或lib中包含的函数

    这个功能主要用于检测是否包含自己所需的函数,可能在解决 error LNK2019 时会用到. dumpbin /exports avcodec.lib /out:test.txt

  3. Jeecg-Boot前后端分离版

    Jeecg-Boot前后端分离版http://www.jeecg.org/forum.php?gid=229 Jeecg-Boot 快速开发平台http://boot.jeecg.org/user/l ...

  4. Linux(Ubuntu)使用日记------markdown文件与pdf,doc,docx文件的相互转化(pandoc使用)

    安装: sudo apt-get install pandoc 使用: man pandoc   查看帮助文档 直接转换,命令如下: pandoc -f markdown -t docx ./test ...

  5. django模板引擎自定义变量

    定义临时变量: {% with i=1 %} {{i}} {% endwith %} 定义对临时变量操作的tag 在templatetags中创建set_val.py 内容是 from django ...

  6. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

  7. Nginx-http_proxy_module模块

    Nginx 反向代理之 http_proxy_module 模块 proxy_pass指定属于 ngx_http_proxy_module 模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工 ...

  8. 牛客小白月赛13 小A买彩票 (记忆化搜索)

    链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  9. React 16 加载性能优化指南

    关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...

  10. SQL Server 中字段的精度问题

    在工作中遇到,一个多表联合查询的情况,查询出来的有些字段精度太高,小数点后达到8个0,现在客户要求报表只要精确到0.01 ,就是只要小数点后面只要保存两位,另外还需要四舍五入 在网上找了点资料,自己测 ...