zl程序教程

您现在的位置是:首页 >  系统

当前栏目

手把手教你写Linux设备驱动---input子系统(三)--电容屏事件坐标读取(基于友善之臂4412开发板)

Linux设备驱动事件 基于 -- --- 读取
2023-09-27 14:28:47 时间
前面我们学习了鼠标是如何如何通过应用程序来读取事件和坐标值的,后面也写了一个简单的input系统的按键驱动程序。 博文如下,讲的内容非常清楚,给小白来入手当然是非常容易的: http://blog.csdn.net/morixinguan/article/details/69808832 这节,我们来学习一下触摸屏事件获取,然后上一个基于4412开发板ft5x0x型号的x,y坐标值读取,后面我们将从零开始实现这款触摸屏的驱动程序: 首先,我们要明白一个概念,触摸屏在input系统中是一类什么事件呢? 前面我们知道,鼠标是相对事件,也就是相对一个位置的坐标点,那么不是固定的。

前面我们学习了鼠标是如何如何通过应用程序来读取事件和坐标值的,后面也写了一个简单的input系统的按键驱动程序。

博文如下,讲的内容非常清楚,给小白来入手当然是非常容易的:

http://blog.csdn.net/morixinguan/article/details/69808832

这节,我们来学习一下触摸屏事件获取,然后上一个基于4412开发板ft5x0x型号的x,y坐标值读取,后面我们将从零开始实现这款触摸屏的驱动程序:

首先,我们要明白一个概念,触摸屏在input系统中是一类什么事件呢?

前面我们知道,鼠标是相对事件,也就是相对一个位置的坐标点,那么不是固定的。坐标点会在相对位移上报。

按键是按键事件,有对于的键值,键值也会上报。

那么触摸屏是什么事件?

绝对事件,也就是,触摸的坐标点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,同时也知道触摸屏是一个绝对事件,如下:


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

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

Android.mk     Get_ft5x0x_tp.c

(1)先看Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng

LOCAL_SHARED_LIBRARIES += libcutils libutils

#LOCAL_STATIC_LIBRARIES += libz libstdc++ libpng libvtpng

LOCAL_STATIC_LIBRARIES += libz libstdc++ libpng

LOCAL_SRC_FILES := Get_ft5x0x_tp.c

LOCAL_MODULE := ft5x0x_tp

include $(BUILD_EXECUTABLE)

(2)Get_ft5x0x_tp.c
#include ctype.h 

#include errno.h 

#include fcntl.h 

#include getopt.h 

#include limits.h 

#include linux/input.h 

#include stdio.h 

#include stdlib.h 

#include string.h 

#include sys/stat.h 

#include sys/types.h 

#include time.h 

#include unistd.h 

#include dirent.h 

#include inttypes.h 

#include errno.h 

//ft5x0x_ts触摸屏事件初始化

int touch_fd = -1 ;

int ft5x0x_ts__init(void)

 touch_fd = open("/dev/input/event0", O_RDONLY);

 if (touch_fd 0)

 printf("open /dev/input/event0 failed\n");

 return -1;

 return 0;

//获取ft5x0x_ts触摸屏上的坐标点

int Get_ft5x0x_ts_postion(int *x, int *y)

 int touch_ret = -1 ; 

 //1、定义一个结构体变量用来描述ft5x0x触摸屏事件 

 struct input_event ft5x0x_ts ; 

 //2、读事件 

 touch_ret = read(touch_fd , ft5x0x_ts ,sizeof(ft5x0x_ts)); 

 if(touch_ret 0){

 printf("read touch fair!\n");

 //3、判断事件类型

 switch(ft5x0x_ts.type)

 case EV_SYN: 

 break ; 

 case EV_ABS: 

 if(ft5x0x_ts.code == ABS_MT_POSITION_X){ 

 *x = ft5x0x_ts.value ;

 if(ft5x0x_ts.code == ABS_MT_POSITION_Y){ 

 *y = ft5x0x_ts.value ;

 defalut: 

 break ; 

 return 0;


Get_ft5x0x_ts_postion( ft5x0x_x, ft5x0x_y); printf("ft5x0x_x:%d ft5x0x_y:%d\n",ft5x0x_x,ft5x0x_y); usleep(100); return 0;
编写万makefile还有.c程序后:

我们切换到Android的根目录下:

用以下命令编译这个程序:

使用m,mm,mmm命令之前一定要先:

执行:source和lunch这两个步骤,如下:

root@morixinguan:/work/android-5.0.2# source build/envsetup.sh 

including device/samsung/manta/vendorsetup.sh

including device/moto/shamu/vendorsetup.sh

including device/friendly-arm/tiny4412/vendorsetup.sh

including device/generic/mini-emulator-x86_64/vendorsetup.sh

including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh

including device/generic/mini-emulator-mips/vendorsetup.sh

including device/generic/mini-emulator-arm64/vendorsetup.sh

including device/generic/mini-emulator-x86/vendorsetup.sh

including device/asus/deb/vendorsetup.sh

including device/asus/fugu/vendorsetup.sh

including device/asus/grouper/vendorsetup.sh

including device/asus/tilapia/vendorsetup.sh

including device/asus/flo/vendorsetup.sh

including device/lge/hammerhead/vendorsetup.sh

including device/lge/mako/vendorsetup.sh

including sdk/bash_completion/adb.bash

root@morixinguan:/work/android-5.0.2# lunch 

Youre building on Linux

Lunch menu... pick a combo:

 1. aosp_arm-eng

 2. aosp_arm64-eng

 3. aosp_mips-eng

 4. aosp_mips64-eng

 5. aosp_x86-eng

 6. aosp_x86_64-eng

 7. aosp_manta-userdebug

 8. aosp_shamu-userdebug

 9. full_tiny4412-userdebug

 10. full_tiny4412-eng

 11. mini_emulator_x86_64-userdebug

 12. m_e_arm-userdebug

 13. mini_emulator_mips-userdebug

 14. mini_emulator_arm64-userdebug

 15. mini_emulator_x86-userdebug

 16. aosp_deb-userdebug

 17. full_fugu-userdebug

 18. aosp_fugu-userdebug

 19. aosp_grouper-userdebug

 20. aosp_tilapia-userdebug

 21. aosp_flo-userdebug

 22. aosp_hammerhead-userdebug

 23. aosp_mako-userdebug

Which would you like? [aosp_arm-eng] 20

============================================

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=5.0.2

TARGET_PRODUCT=aosp_tilapia

TARGET_BUILD_VARIANT=userdebug

TARGET_BUILD_TYPE=release

TARGET_BUILD_APPS=

TARGET_ARCH=arm

TARGET_ARCH_VARIANT=armv7-a-neon

TARGET_CPU_VARIANT=cortex-a9

TARGET_2ND_ARCH=

TARGET_2ND_ARCH_VARIANT=

TARGET_2ND_CPU_VARIANT=

HOST_ARCH=x86_64

HOST_OS=linux

HOST_OS_EXTRA=Linux-4.8.0-46-generic-x86_64-with-Ubuntu-16.04-xenial

HOST_BUILD_TYPE=release

BUILD_ID=LRX22G

OUT_DIR=out

============================================

root@morixinguan:/work/android-5.0.2# 


接下来,编译程序:

mmm external/Getft5x0x_Test/

然后我们看到以下图片显示:

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

LOCAL_MODULE := ft5x0x_tp

Install: out/target/product/tiny4412/system/bin/ft5x0x_tp

将这个文件拷贝到当前目录下:

cp out/target/product/tiny4412/system/bin/ft5x0x_tp .

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

如果没有安装adb,可以apt-get install adb 安装adb


push完毕以后:

我们在终端: adb shell切换到根目录下:

执行ft5x0x_tp这个bin文件,然后我们触摸触摸屏,如下,坐标值打印出来了。



手把手教你写Linux设备驱动---input子系统(四)--电容屏驱动ft5x06编写(一)(基于友善之臂4412开发板) 这一节,我们将从零开始写tiny4412的触摸屏驱动ft5x06,写这节博客之前,先了解下需要什么知识: 1、i2c驱动相关的知识 2、输入子系统 4、工作队列 关于i2c驱动相关的知识,在后期的博文里会专门写几篇博文来进行总结,这里就不再说i2c相关的知识,我们先知道怎么用就行了。
手把手教你写Linux设备驱动---input子系统(二)--按键驱动实现(一)(基于友善之臂4412开发板) 在上一节里,我们用一个应用程序实现了鼠标的控制,并控制鼠标用相对位移不断的画一个正方形,感觉非常有意思,这一节,我们将通过一个简单按键实例来真正的实现一个input设备驱动程序。 http://blog.
手把手教你写Linux设备驱动---input子系统(一)--input事件应用程序的读写实现(基于友善之臂4412开发板)      这节,我们来说下input子系统,什么是input子系统? input子系统就是输入子系统。      输入子系统是 Linux内核用于管理各种输入设备 (键盘,鼠标,遥控杆,书写板等等 )的部分,用户通过输入子系统进行内核,命令行,图形接口之间的交换。
Linux--内核Uevent事件机制 与 Input子系统【转】 转自:http://blog.csdn.net/lxl584685501/article/details/46379453 一Uevent机制 Uevent在kernel中的位置 Uevent的内部逻辑解析 二Input子系统  从应用层的角度出发看input子系统 输入设备上报事件的处理过程 通过设备节点读取输入事件 通过设备节点写入输入事件
(1)Sysfs文件系统          内核设备模型主要的模块和用户之间能看到的相关部分就是sysfs文件系统了。
I.MX6 Linux 自动获取AR1020 event input节点 /*********************************************************************** * I.MX6 Linux 自动获取AR1020 event input节点 * 说明: * 本文主要记录如何自动获取AR1020 SPI电阻Touch产生的设备节点。
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。