layui获取input信息_Linux 下Input系统应用编程实战

作者:杨源鑫(也是我们的校园代理)
经授权转载于公众号嵌入式开发圈,有些许修改。

什么是input子系统?不管是什么操作系统,都有一个程序用于管理各种输入设备,哪些是输入设备?比如,电脑键盘、鼠标,智能手机上的触摸屏,按键。都是输入设备。那么操作系统怎么管理这些输入设备?这里以最常用的Linux操作系统进行讲解。

在Linux内核中,有非常多用于管理诸多设备的子系统,比如显示系统,输入子系统,音频子系统,电源管理子系统,时钟管理子系统等等,本节我们重点关注输入子系统。

输入子系统是在内核里实现,因为设备经常要通过特定的硬件接口被访问 (例如串口, ps/2, usb等等 ),这些硬件接口由内核保护和管理。内核给用户导出一套固定的与硬件无关的 input API,供用户空间程序使用。

在Linux input子系统中,分三块进行管理,分别是: input core(输入系统核心层), drivers(输入系统驱动层)和 event handlers(输入系统事件层),可能你感觉太抽象,看下图4-5-9就清楚了。

660e9361cc6a92b2e7959d44869582bb.png

先从应用程序角度认识input子系统,我们可以从以下这个文件看到对应的设备。

打开Linux终端,输入命令cat /proc/bus/input/devices可以看到类似下面的内容。

I

这些devices主要是用来描述注册在input子系统的设备文件,可能有鼠标,键盘,触摸屏,重力传感器,温度传感器等等,写驱动的时候,通过内核提供的input设备注册设备相关的接口后,这些信息都会保存到对应的文件里。

那么,input子系统如何描述输入设备呢?

Linux系统为我们提供了这个输入系统操作相关的头文件:

#include <linux/input.h>

在这个文件中,可以找到这个结构体:

//用于描述一个输入事件

在这里我们看到input_event结构体中还嵌套了另一个结构体struct timeval time;

先解读struct timeval time,它在time.h中定义如下

struct 

其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。

type域是被报告事件的类型,例如,一个 key press或者 button press, relative motion(比如移动鼠标 )或者 absolute motion(比如移动游戏杆 );

code域告诉你是哪一个key或者坐标轴在被操作;

value域告诉你设备现在的状态或者运动情况是什么。

最主要的事件有以下三种: 相对事件(例如鼠标),绝对事件(例如触摸屏),键盘事件。

例如鼠标,我们在移动鼠标的时候鼠标就是一个相对事件,所以type的类型也就是底层上报给用户的事件为相对事件类型,code表示的就是相对于鼠标当前的位置的X或者Y的坐标,value也就是相对于当前的位置偏移了多少。

事件类型(type)在input.h分类如下:

/*

我们可以使用cat命令来测试当前的鼠标事件到底属于哪一个事件节点,如图4-5-10所示:

0eb8e7e541b258e5950c578c0de04d7c.png

只需切换到/dev/input,找到对应的事件节点,再使用cat eventx(事件节点),然后移动鼠标就可以看到数据打印啦,但是这些数据我们显然是看不懂的,不过可以使用测试程序将鼠标的值读出来。

接下来,我们写个程序mouse.c来看看如何读取鼠标事件,

#include 

运行结果,如图4-5-11所示。

a33baac48e31cf4666f1e85586355dff.png


当我们不断移动鼠标的时候,这些值将会被打印出来。

请思考一个问题,既然我们移动鼠标能够打印数值,那能不能够写一个程序控制鼠标自动移动呢?肯定可以,下面我们写个程序让鼠标自己画一个正方形,上代码:

#include 

执行效果请读者自行验证。

接下来我们再写一个案例:在Tiny4412平台上获取电容屏的坐标值。

触摸屏上报坐标值的事件属于绝对事件,也就是,触摸的坐标点X和Y会在屏幕的分辨率范围内上报一个绝对的坐标(X,Y)。

那么上报对于的类型(type)如下:EV_ABS

对于的code如下:

绝对于X:

ABS_MT_POSITION_X

绝对于Y:

ABS_MT_POSITION_Y

我用了一个程序获取了屏幕的分辨率,得知分辨率宽为480,高为800。

首先,写这个程序时,我通过adb进到Android根目录,然后用getevent -p查到触摸屏的事件节点为event0, 同时也知道触摸屏是一个绝对事件,如下:

3e61e5bec2aafa54c575c24249bc8beb.png

接下来,我在Android5.0的源代码external目录下创建了如下目录:Getft5x0x_Test

该目录下有如下两个文件文件:

Android.mk和Get_ft5x0x_tp.c

(1) 先看Android.mk

LOCAL_PATH 

(2)Get_ft5x0x_tp.c

#include 

编写完Android.mk和C程序后,切换到Android的根目录,用以下命令编译Get_ft5x0x_tp.c

(使用mmm命令之前一定要先执行source和lunch这两个步骤)

root

接下来,编译程序 :

mmm 

然后我们看到以下显示:

8fbc8dbd5b4ed32f907501f46098e164.png

这个二进制生成的绝对路径是out目录, 我们需要ft5x0x_tp文件,这个名字就是上面Android.mk里面对应的:

LOCAL_MODULE 

Install: out/target/product/tiny4412/system/bin/ft5x0x_tp
将这个文件拷贝到当前目录:

cp 

然后,用USB线连接tiny4412开发板,再用adb命令将ft5x0x_tp push到system/bin/目录下,这个目录是Android的根文件系统下的一个命令,很多命令都在这个目录下。

(若没有安装adb,可以apt-get install adb 进行安装)

adb push完毕以后,再adb shell切换到根目录下

执行ft5x0x_tp.bin,然后触摸触摸屏,这样,坐标值就打印出来了。

51b2682ceee0ad59a92ca6a2e69ff7b1.png


ps:韦东山2期视频对输入子系统的驱动编写以及机制讲解的很清楚,有需要的可以看看

--END--

关注公众号百问科技(ID:baiwenkeji)第一时间阅读嵌入式干货。
技术交流加个人威信13266630429,验证:知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值