asp.net建立手机网站,工信部网站备案号查询,wordpress怎么查看域名绑定,dw网页设计成品素材本章学习输入设备的应用编程#xff0c;首先要知道什么是输入设备#xff1f;输入设备其实就是能够产生输入事件的设备就称为输入设备#xff0c;常见的输入设备包括鼠标、键盘、触摸屏、按钮等等#xff0c;它们都能够产生输入事件#xff0c;产生输入数据给计算机系统。… 本章学习输入设备的应用编程首先要知道什么是输入设备输入设备其实就是能够产生输入事件的设备就称为输入设备常见的输入设备包括鼠标、键盘、触摸屏、按钮等等它们都能够产生输入事件产生输入数据给计算机系统。 对于输入设备的应用编程其主要是获取输入设备上报的数据、输入设备当前状态等譬如获取触摸屏当前触摸点的 X、Y 轴位置信息以及触摸屏当前处于按下还是松开状态。 本章将会讨论如下主题内容。 ⚫ 什么是输入设备 ⚫ 如何读取输入设备的数据 ⚫ 如何解析从输入设备中获取到的数据 ⚫ 按键、触摸屏设备如何解析数据、应用编程。 输入类设备编程介绍  什么是输入设备  先来了解什么是输入设备也称为 input 设备常见的输入设备有鼠标、键盘、触摸屏、遥控器、电脑画图板等用户通过输入设备与系统进行交互。 input 子系统  由上面的介绍可知输入设备种类非常多每种设备上报的数据类型又不一样那么 Linux 系统如何管理呢Linux 系统为了统一管理这些输入设备实现了一套能够兼容所有输入设备的框架那么这个框架就是 input 子系统。驱动开发人员基于 input 子系统开发输入设备的驱动程序input 子系统可以屏蔽硬件的差异向应用层提供一套统一的接口。 基于 input 子系统注册成功的输入设备都会在/dev/input 目录下生成对应的设备节点设备文件设备节点名称通常为 eventXX 表示一个数字编号 0、1、2、3 等譬如/dev/input/event0、/dev/input/event1、 /dev/input/event2 等通过读取这些设备节点可以获取输入设备上报的数据。 读取数据的流程  如果我们要读取触摸屏的数据假设触摸屏设备对应的设备节点为/dev/input/event0那么数据读取流程如下 ①、应用程序打开/dev/input/event0 设备文件 ②、应用程序发起读操作譬如调用 read如果没有数据可读则会进入休眠阻塞 I/O 情况下 ③、当有数据可读时应用程序会被唤醒读操作获取到数据返回 ④、应用程序对读取到的数据进行解析。 当无数据可读时程序会进入休眠状态也就是阻塞譬如应用程序读触摸屏数据如果当前并没有去触碰触摸屏自然是无数据可读当我们用手指触摸触摸屏或者在屏上滑动时此时就会产生触摸数据、应用程序就有数据可读了应用程序会被唤醒成功读取到数据。那么对于其它输入设备亦是如此无数据可读时应用程序会进入休眠状态阻塞式 I/O 方式下当有数据可读时才会被唤醒。 应用程序如何解析数据  首先我们要知道应用程序打开输入设备对应的设备文件向其发起读操作那么这个读操作获取到的是什么样的数据呢其实每一次 read 操作获取的都是一个 struct input_event 结构体类型数据该结构体定义在linux/input.h头文件中它的定义如下 示例代码 17.1.1 struct input_event 结构体  结构体中的 time 成员变量是一个 struct timeval 类型的变量该结构体在前面给大家介绍过内核会记录每个上报的事件其发生的时间并通过变量 time 返回给应用程序。时间参数通常不是那么重要而其它3 个成员变量 type、code、value 更为重要。 ⚫ typetype 用于描述发生了哪一种类型的事件对事件的分类Linux 系统所支持的输入事件类型如下所示  以上这些宏定义也是在linux/input.h头文件中所以在应用程序中需要包含该头文件一种输入设备通常可以产生多种不同类型的事件譬如点击鼠标按键左键、右键或鼠标上的其它按键时会上报按键类事件移动鼠标时则会上报相对位移类事件。 ⚫ codecode 表示该类事件中的哪一个具体事件以上列举的每一种事件类型中都包含了一系列具体事件譬如一个键盘上通常有很多按键譬如字母 A、B、C、D 或者数字 1、2、3、4 等而 code变量则告知应用程序是哪一个按键发生了输入事件。每一种事件类型都包含多种不同的事件譬如按键类事件  相对位移事件  绝对位移事件  触摸屏设备是一种绝对位移设备它能够产生绝对位移事件譬如对于触摸屏来说一个触摸点所包含的信息可能有多种譬如触摸点的 X 轴坐标、Y 轴坐标、Z 轴坐标、按压力大小以及接触面积等所以 code变量告知应用程序当前上报的是触摸点的哪一种信息X 坐标还是 Y 坐标、亦或者其它绝对位移事件如下  除了以上列举出来的之外还有很多大家可以自己浏览linux/input.h头文件这些宏其实是定义在input-event-codes.h 头文件中该头文件被linux/input.h所包含了关于这些具体的事件后面再给大家进行介绍。 ⚫ value内核每次上报事件都会向应用层发送一个数据 value对 value 值的解释随着 code 的变化而变化。譬如对于按键事件type1来说如果 code2键盘上的数字键 1也就是 KEY_1那么如果 value 等于 1则表示 KEY_1 键按下value 等于 0 表示 KEY_1 键松开如果 value 等于 2则表示 KEY_1 键长按。再比如在绝对位移事件中type3如果 code0触摸点 X 坐标 ABS_X那么 value 值就等于触摸点的 X 轴坐标值同理如果 code1触摸点 Y 坐标 ABS_Y此时value 值便等于触摸点的 Y 轴坐标值所以对 value 值的解释需要根据不同的 code 值而定 数据同步  上面我们提到了同步事件类型 EV_SYN同步事件用于实现同步操作、告知接收者本轮上报的数据已经完整。应用程序读取输入设备上报的数据时一次 read 操作只能读取一个 struct input_event 类型数据譬如对于触摸屏来说一个触摸点的信息包含了 X 坐标、Y 坐标以及其它信息对于这样情况应用程序需要执行多次 read 操作才能把一个触摸点的信息全部读取出来这样才能得到触摸点的完整信息。 那么应用程序如何得知本轮已经读取到完整的数据了呢其实这就是通过同步事件来实现的内核将本轮需要上报、发送给接收者的数据全部上报完毕后接着会上报一个同步事件以告知应用程序本轮数据已经完整、可以进行同步了。 同步类事件中也包含了多种不同的事件如下所示  所以的输入设备都需要上报同步事件上报的同步事件通常是 SYN_REPORT而 value 值通常为 0。 读取 struct input_event 数据  根据前面的介绍可知对输入设备调用 read()会读取到一个 struct input_event 类型数据本小节编写一个简单地应用程序将读取到的 struct input_event 类型数据中的每一个元素打印出来、并对它们进行解析。 本例程源码对应的路径为开发板光盘-11、Linux C 应用编程例程源码-17_input-read_input.c。  执行程序时需要传入参数这个参数就是对应的输入设备的设备节点设备文件程序中会对传参进行校验。程序中首先调用 open()函数打开设备文件之后在 for 循环中调用 read()函数读取文件将读取到的数据存放在 struct input_event 结构体对象中之后将结构体对象中的各个成员变量打印出来。注意程序中使用了阻塞式 I/O 方式读取设备文件所以当无数据可读时 read 调用会被阻塞知道有数据可读时才会被唤醒 Tips设备文件不同于普通文件读写设备文件之前无需设置读写位置偏移量。 使用交叉编译工具编译上述代码得到可执行文件 testApp  在开发板上验证  ALPHA 和 Mini 开发板上都有一个用户按键 KEY0它就是一个典型的输入设备如下图所示  该按键是提供给用户使用的一个 GPIO 按键在出厂系统中该按键驱动基于 input 子系统而实现所以在/dev/input 目录下存在 KEY0 的设备节点具体是哪个设备节点可以使用 13.1.1 小节介绍的方法进行判断这里不再重述也可以通过查看/proc/bus/input/devices 文件得知查看该文件可以获取到系统中注册的所有输入设备相关的信息如下所示  接下来我们使用这个按键进行测试执行下面的命令  程序运行后执行按下 KEY0、松开 KEY0 等操作终端将会打印出相应的信息如上图所示。 第一行中 type 等于 1表示上报的是按键事件 EV_KEYcode114打开 input-event-codes.h 头文件进行查找可以发现 cpde114 对应的是键盘上的 KEY_VOLUMEDOWN 按键这个是 ALPHA/Mini 开发板出厂系统已经配置好的。而 value1 表示按键按下所以整个第一行的意思就是按键 KEY_VOLUMEDOWN被按下。 第二行表示上报了 EV_SYN 同步类事件type0中的 SYN_REPORT 事件code0表示本轮数据已经完整、报告同步。 第三行type 等于 1表示按键类事件code 等于 114、value 等于 0所以表示按键 KEY_VOLUMEDOWN被松开。 第四行又上报了同步事件。 所以整个上面 4 行的打印信息就是开发板上的 KEY0 按键被按下以及松开这个过程内核所上报的事件以及发送给应用层的数据 value。 我们试试长按按键 KEY0按住不放如下所示  可以看到上报按键事件时对应的 value 等于 2表示长按状态。 按键应用编程  本小节编写一个应用程序获取按键状态判断按键当前是按下、松开或长按状态。从上面打印的信息可知对于按键来说它的事件上报流程如下所示  如果是按下则上报 KEY_A 事件时value1如果是松开则 value0如果是长按则 value2。 接下来编写按键应用程序读取按键状态并将结果打印出来代码如下所示 本例程源码对应的路径为开发板光盘-11、Linux C 应用编程例程源码-17_input-read_key.c。  在 for 循环中调用 read()读取输入设备上报的数据当按键按下或松开以及长按动作发生时read()会读取到输入设备上报的数据首先判断此次上报的事件是否是按键类事件EV_KEY如果是按键类事件、接着根据 value 值来判断按键当前的状态是松开、按下还是长按。 将上述代码进行编译  将编译得到的可执行文件拷贝开发板 Linux 系统的/home/root 目录下。 首先我们来测试开发板的 KEY0 按键执行应用程序 ./testApp /dev/input/event2 //测试开发板上的 KEY0  运行程序之后按下 KEY0 或松开 KEY0 以及长按情况下终端会打印出相应的信息如上图所示。 code114KEY_VOLUMEDOWN 按键。 除了测试开发板上的 KEY0 按键之外我们还可以测试键盘上的按键首先找到一个 USB 键盘连接到开发板的 USB HOST 接口上当键盘插入之后终端将会打印出相应的驱动加载信息  驱动加载成功之后可以查看下该键盘设备对应的设备节点使用命令cat/proc/bus/input/devices在打印信息中找到键盘设备的信息  譬如笔者使用的是一个罗技的USB 键盘Logitech USB Keyboard对应的设备节点为/dev/input/event3 运行测试程序并按下、松开键盘上的按键  大家可以根据 code 值查询到对应的按键通过 input-event-codes.h 头文件譬如 code30 对应的是键盘上的字母 A 键code48 对应的是字母 B 键。 触摸屏应用编程  本小节编写触摸屏应用程序获取触摸屏的坐标信息并将其打印出来。  解析触摸屏设备上报的数据  触摸屏设备是一个绝对位移设备可以上报绝对位移事件绝对位移事件如下    单点触摸和多点触摸  触摸屏分为多点触摸设备和单点触摸设备。单点触摸设备只支持单点触摸一轮笔者把一个同步事件称为一轮完整的数据只包含一个触摸点信息单点触摸设备以 ABS_XXX 事件承载、上报触摸点的信息譬如 ABS_Xvalue 值对应的是 X 轴坐标值、ABS_Yvalue 值对应的是 Y 轴坐标值等绝对位移事件而有些设备可能还支持 Z 轴坐标通过 ABS_Z 事件上报、value 值对应的便是 Z 轴坐标值、按压力大小通过 ABS_PRESSURE 事件上报、value 值对应的便是按压力大小以及接触面积等属性。大部分的单点触摸设备都会上报 ABS_X 和 ABS_Y 事件而其它绝对位移事件则根据具体的设备以及驱动的实现而定  多点触摸设备可支持多点触摸譬如 ALPHA/Mini 开发板配套使用的 4.3 寸、7 寸等触摸屏均支持多点触摸对于多点触摸设备一轮完整的数据可能包含多个触摸点信息。多点触摸设备则是以 ABS_MT_XXXMT 是 Multi-touch意思为多点触摸事件承载、上报触摸点的信息如 ABS_MT_POSITION_XX 轴坐标、ABS_MT_POSITION_YY 轴坐标等绝对位移事件。  触摸屏设备除了上报绝对位移事件之外还可以上报按键类事件和同步类事件。同步事件很好理解因为几乎每一个输入设备都会上报同步事件、告知应用层本轮数据是否完整当手指点击触摸屏或手指从触摸屏离开时此时就会上报按键类事件用于描述按下触摸屏和松开触摸屏具体的按键事件为BTN_TOUCHcode0x14a也就是 330当然手指在触摸屏上滑动不会上报 BTN_TOUCH 事件。  TipsBTN_TOUCH 事件不支持长按状态故其 value 不会等于 2。对于多点触摸设备来说只有第一个点按下时上报 BTN_TOUCH 事件 value1、当最后一个点离开触摸屏时上报 BTN_TOUCH 事件 value0。  单点触摸设备--事件上报的顺序  通过上面的介绍可知单点触摸设备事件上报的流程大概如下所示   以上列举出只是一个大致流程实际上对于不同的触摸屏设备能够获取到的信息量大小是不相同的譬如某设备只能读取到触摸点的 X 和 Y 坐标、而另一设备却能读取 X、Y 坐标以及按压力大小、触点面积等信息总之这些数据都会在 SYN_REPORT 同步事件之前上报给应用层。  当手指点击触摸屏时首先上报 BTN_TOUCH 事件此时 value1表示按下接着上报ABS_X、ABS_Y事件将 X、Y 轴坐标数据发送给应用层数据上报完成接着上报一个同步事件 SYN_REPORT表示此次触摸点信息已经完整。  当手指在触摸屏上滑动时并不会上报 BTN_TOUCH 事件因为滑动过程并未发生按下、松开这种动作。  当松开时首先上报了 BTN_TOUCH 事件此时 value0表示手指已经松开了触摸屏接着上报一个同步事件 SYN_REPORT。  以上就是单点触摸设备事件上报的一个大致流程接下来看看多点触摸设备。  多点触摸设备--事件上报的顺序  多点触摸设备上报的一轮完整数据中可能包含多个触摸点的信息譬如 5 点触摸设备如果 5 个手指同时在触摸屏上滑动那么硬件就会更新 5 个触摸点的信息内核需要把这 5 个触摸点的信息上报给应用层。  在 Linux 内核中多点触摸设备使用多点触摸MT协议上报各个触摸点的数据MT 协议分为两种类型Type A 和 Type BType A 协议实际使用中用的比较少几乎处于淘汰的边缘这里就不再给大家介绍了我们重点来看看 Type B 协议。  MT 协议之 Type B 协议  Type B 协议适用于能够追踪并区分触摸点的设备开发板配套使用的触摸屏都属于这类设备。Type B协议的重点是通过 ABS_MT_SLOT 事件上报各个触摸点信息的更新能够追踪并区分触摸点的设备通常在硬件上能够区分不同的触摸点譬如对于一个 5 点触摸设备来说 硬件能够为每一个识别到的触摸点与一个 slot 进行关联这个 slot 就是一个编号触摸点 0、触摸点 1、触摸点 2 等。底层驱动向应用层上报 ABS_MT_SLOT 事件此事件会告诉接收者当前正在更新的是哪个触摸点的数据ABS_MT_SLOT 事件中对应的 value 数据存放的便是一个 slot、以告知应用层当前正在更新 slot关联的触摸点对应的信息。  每个识别出来的触摸点分配一个 slot与该 slot 关联起来利用这个 slot 来传递对应触点的变化。除了ABS_MT_SLOT 事 件 之 外  Type B 协 议 还 会 使 用 到 ABS_MT_TRACTKING_ID 事 件ABS_MT_TRACTKING_ID 事件则用于触摸点的创建、替换和销毁工作ABS_MT_TRACTKING_ID 事件携带的数据 value 表示一个 ID一个非负数的 IDID0表示一个有效的触摸点如果 ID 等于-1 表示该触摸点已经不存在、被移除了一个以前不存在的 ID 表示这是一个新的触摸点。  Type B 协议可以减少发送到用户空间的数据只有发生了变更的数据才会上报譬如某个触摸点发生了移动但仅仅只改变了 X 轴坐标、而未改变 Y 轴坐标那么内核只会将改变后的 X 坐标值通过ABS_MT_POSITION_X 事件发送给应用层。  以上关于 Type B 协议就给大家介绍这么多为了帮助大家理解笔者把 Type B 协议下多点触摸设备上报数据的流程列举如下   单看这个可能大家看不懂接下来我们打印触摸屏的数据一个一个进行分析。  Tips大家可能会对 slot 和 ID 这两个概念有点混乱这里笔者将自己的理解告知大家slot 是硬件上的一个概念、而 ID 则可认为是软件上的一个概念对于一个多点触摸设备来说它最大支持的触摸点数是确定的譬如 5 个触摸设备最多支持 5 个触摸点每一个触摸点在硬件上它有一个区分的编号譬如触摸点0、触摸点 1、触摸点 2 等这个编号就是一个 slot通常从 0 开始如何给识别到的触点分配一个 slot 呢触点与 slot 关联通常是按照时间先后顺序来的譬如第一根手指先触碰到触摸屏那第一根手指就对应触摸点 0slot0接着第二根手指触碰到触摸屏则对应触摸点 1slot1以此类推这个通常是硬件所支持的。而 ID 可认为是软件上的一个概念它也用于区分不同的触摸点但是它跟 slot 不同不是同一层级的概念举个例子譬如一根手指触碰到触摸屏之后拿开然后再次触碰触摸屏这个过程中假设只有这一根手指进行触碰操作那么两次触碰对应都是触摸点 0slot0这个无疑义但从触摸点的生命周期来看它们是同一个触摸点吗答案肯定不是为啥呢手指从触摸屏上离开后该触摸点就消失了、被删除了该触摸点的生命周期也就到此结束了所以它们自然是不同的触摸点所以它们的 ID 是不同的。   触摸屏上报数据分析  首先在测试触摸屏之前需要保证开发板上已经连接了 LCD 屏ALPHA/Mini I.MX6U 开发板出厂系统配套支持多种不同分辨率的 LCD 屏包括 4.3 寸 480*272、4.3 寸 800*480、7 寸 800*480、7 寸 1024*600以及 10.1 寸 1280*800在启动开发板之前需要将 LCD 屏通过软排线连接到开发板的 LCD 接口开发板连接好 LCD 屏之后上电启动开发板、运行出厂系统。  触摸屏与 LCD 液晶屏面板是粘合在一起的也就是说触摸屏是直接贴在了 LCD 液晶屏上面直接在LCD 屏上触摸、滑动操作即可。为了测试方便可以将出厂系统的 GUI 应用程序退出如何退出呢点击屏幕进入设置页面可以看到在该页面下有一个退出按钮选项直接点击即可  使用命令cat /proc/bus/input/devices确定触摸屏对应的设备节点如下所示   笔者使用的是开发板配套的 4.3 寸 800*480 LCD 屏如果各位读者使用的是其它屏那么查看到的名称可能不是goodix-ts。执行示例代码 17.2.1 对应的可执行文件一个手指点击触摸屏先不松开终端将会打印如下信息   首先第一行上报了绝对位移事件 EV_ABStype3中的 ABS_MT_TRACKING_IDcode57事件并且 value 值等于 78也就是 ID这个 ID 是一个非负数所以表示这是一个新的触摸点被创建也就意味着触摸屏上产生了一个新的触摸点手指按下。  第二行上报了绝对位移事件 EV_ABStype3中的 ABS_MT_POSITION_Xcode53事件其 value对应的便是触摸点的 X 坐标第三行上报了 ABS_MT_POSITION_Ycode54事件其 value 值对应的便是触摸点 Y 坐标所以由此可知该触摸点的坐标为(372, 381)。  第四行上报了按键类事件 EV_KEYtype1中的 BTN_TOUCHcode330value 值等于 1表示这是触摸屏上最先产生的触摸点slot0、也就是触摸点 0。  第五行和第六行分别上报了绝对位移事件 EV_ABStype3中的 ABS_Xcode0和 ABS_Ycode1其 value 分别对应的是触摸点的 X 坐标和 Y 坐标。多点触摸设备也会通过 ABS_X、ABS_Y 事件上报触摸点的 X、Y 坐标但通常只有触摸点 0 支持所以可以把多点触摸设备当成单点触摸设备来使用。  最后一行上报了同步类事件 EV_SYNtype0中的 SYN_REPORTcode0事件表示此次触摸点的信息全部上报完毕。  在第一个触摸点的基础上增加第二个触摸点打印信息如下所示   1~7 行不再解释第八行上报了绝对位移事件 EV_ABStype3中的 ABS_MT_SLOT 事件code47表示目前要更新 slot1 所关联的触摸点也就是触摸点 1对应的信息。  第九行上报了绝对位移事件 EV_ABStype3中的 ABS_MT_TRACKING_ID 事件code57ID79这是之前没有出现过的 ID表示这是一个新的触摸点。  第十、十一行分别上报了 ABS_MT_POSITION_X 和 ABS_MT_POSITION_Y 事件。  最后一行上报同步事件type0、code0告知应用层数据完整。  当手指松开时触摸点就会被销毁上报 ABS_MT_TRACKING_ID 事件并将 value 设置为-1ID如下所示   关于触摸屏数据的分析就给大家介绍这么多不管是键盘也好、或者是鼠标、触摸屏都可以像上面那样将输入设备的数据直接打印出来然后自己再去分析确定该输入设备上报事件的规则和流程把这些弄懂之后再去编写程序验证结果。下面我们将自己动手编写单点触摸以及多点触摸应用程序读取触摸点的坐标信息。  获取触摸屏的信息  本小节介绍如何获取触摸屏设备的信息譬如触摸屏支持的最大触摸点数、触摸屏 X、Y 坐标的范围等。通过 ioctl()函数可以获取到这些信息3.10.2 小节给大家介绍过该函数ioctl()是一个文件 I/O 操作的杂物箱可以处理的事情非常杂、不统一一般用于操作特殊文件或设备文件为了方便讲解再次把 ioctl()函数的原型列出  #include sys/ioctl.h  int ioctl(int fd, unsigned long request, ...);  第一个参数 fd 对应文件描述符第二个参数 request 与具体要操作的对象有关没有统一值表示向文件描述符请求相应的操作也就是请求指令此函数是一个可变参函数第三个参数需要根据 request 参数来决定配合 request 来使用。  先来看下输入设备的 ioctl()该怎么用在 input.h 头文件有这样一些宏定义如下所示        每一个宏定义后面都有相应的注释对于 input 输入设备对其执行 ioctl()操作需要使用这些宏不同的宏表示不同请求指令譬如使用 EVIOCGNAME 宏获取设备名称使用方式如下   EVIOCGNAME(len)就表示用于接收字符串数据的缓冲区大小而此时 ioctl()函数的第三个参数需要传入一个缓冲区的地址该缓冲区用于存放设备名称对应的字符串数据。  EVIOCGget开头的表示获取信息EVIOCSset开头表示设置这里暂且不管其它宏重点来看看 EVIOCGABS(abs)宏这个宏也是通常使用最多的如下所示  #define EVIOCGABS(abs)  _IOR(E, 0x40  (abs), struct input_absinfo)  通过这个宏可以获取到触摸屏 slotslot0表示触摸点 0、slot1表示触摸点 1、slot2表示触摸点 2以此类推的取值范围可以看到使用该宏需要传入一个 abs 参数该参数表示为一个 ABS_XXX 绝对位移事件譬如 EVIOCGABS(ABS_MT_SLOT)表示获取触摸屏的 slot 信息此时 ioctl()函数的第三个参数是一个 struct input_absinfo *的指针指向一个 struct input_absinfo 对象调用 ioctl()会将获取到的信息写入到struct input_absinfo 对象中。struct input_absinfo 结构体如下所示   获取触摸屏支持的最大触摸点数   其它宏定义不再介绍读者可以自行测试。  获取触摸屏支持的最大触摸点数  本例程源码对应的路径为开发板光盘-11、Linux C 应用编程例程源码-17_input-read_slot.c。    编译示例代码将其拷贝到开发板 Linux 系统的用户家目录下执行该应用程序   所以从打印结果可知我们这个屏是一个 5 点触摸屏。  单点触摸应用程序  通过上面的详细介绍详细大家应该知道如何去编写一个触摸屏的应用程序了本小节我们编写一个单点触摸应用程序获取一个触摸点的坐标信息并将其打印出来。  ALPHA/Mini 开发板配套使用的触摸屏均支持多点触摸这里我们把它当成单点触摸设备来使用编写一个程序读取一个触摸点示例代码如下所示  本例程源码对应的路径为开发板光盘-11、Linux C 应用编程例程源码-17_input-read_ts.c。     程序中首先校验传参通过传参的方式将触摸屏设备文件路径传入到程序中main()函数中定义了 4 个变量  ⑴、变量 x 表示触摸点的 X 坐标  ⑵、变量 y 表示触摸点的 Y 坐标  ⑶、变量 down 表示手指状态时候按下、松开还是滑动down1 表示手指按下、down0 表示手指松开、down-1 表示手指滑动  ⑷、变量 valid 表示数据是否有效valid1 表示有效、valid0 表示无效有效指的是我们检测的信息发生了更改譬如程序中只检测了手指的按下、松开动作以及坐标值的变化。  接着调用 open()打开触摸屏设备文件得到文件描述符 fd在 for 循环之前首先对 x、y、down、valid这 4 个变量进行初始化操作。在 for 循环读取触摸屏上报的数据将读取到的数据存放在 struct input_event数据结构中。在 switch…case 语句中对读取到的数据进行解析获取 BTN_TOUCH 事件的 value 数据判断触摸屏是按下还是松开状态获取 ABS_X 和 ABS_Y 事件的 value 变量得到触摸点的 X 轴坐标和 Y 轴坐标。  当上报同步事件时表示数据已经完整接着对我们得到的数据进行分析、打印坐标信息。  编译应用程序   将编译得到的可执行文件拷贝到开发板 Linux 系统的用户家目录下准备进行测试。  笔者使用的是 4.3 寸 800*480 LCD 屏执行单点触摸应用程序程序执行之后接着用一个手指按下触摸屏、松开以及滑动操作串口终端将会打印出相应的信息   当手指点击触摸屏时会打印按下(X, Y)松开时会打印松开手指在触摸屏上滑动时会打印移动(X, Y)等信息。大家可以自己动手测试对代码不理解的可以对照测试结果进行对比。  多点触摸应用程序  介绍完单点触摸应用程序之后再来看看多点触摸应用程序该如何编写前面已经详细给大家介绍了多点触摸设备的事件上报流程。  本例程源码对应的路径为开发板光盘-11、Linux C 应用编程例程源码-17_input-read_mt.c。        示例代码中申明了 struct ts_mt 数据结构用于描述多点触摸情况下每一个触摸点的信息。  首先来看下 main()函数定义了 max_slots 变量用于指定触摸屏设备的支持的最大触摸点数通过 ioctl(fd, EVIOCGABS(ABS_MT_SLOT), slot)  获取到触摸屏该信息。  接着根据 max_slots 变量的值为 mt 指针申请内存  mt  calloc(max_slots, sizeof(struct ts_mt));  for( ; ; )循环中调用 ts_read()函数该函数是自定义函数用于获取触摸屏上报的数据第一个参数表示文件描述符 fd、第二个参数表示触摸屏支持的最大触摸点数、第三个参数则是 struct ts_mt 数组ts_read()函数会将获取到的数据存放在数组中mt[0]表示 slot0数据、mt[1]表示 slot1的数据依次类推  在内部的 for 循环中则对获取到的数据进行分析判断数据是否有效并根据 id 判断手指的动作在单点触摸应用程序中我们是通过 BTN_TOUCH 事件来判断手指的动作而在多点触摸应用中我们需要通过 id 来判断多个手指的动作。  关于自定义函数 ts_read()就不再介绍了代码的注释已经描述很清楚了  接着编译应用程序将编译得到的可执行文件拷贝到开发板 Linux 系统的用户家目录下执行应用程序接着可以用多个手指触摸触摸屏、松开、滑动等操作   每一个不同的 slot 表示不同的触摸点譬如 slot0表示触摸点 0、slot1表示触摸点 1 以此类推                      鼠标应用编程  本小节是笔者留给各位读者的一个作业交给大家去完成通过本章内容的介绍相信大家可以独立完成ALPHA/Mini 开发板出厂系统支持 USB 鼠标直接将一个 USB 鼠标插入到开发板的 USB HOST 接口即可在终端会打印驱动加载信息。