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

本文详细介绍了如何在Linux系统中读取电容屏的事件坐标,通过实例展示了如何编写和使用程序获取FT5x0x触摸屏的X、Y坐标值。教程以友善之臂4412开发板为例,讲解了从获取屏幕分辨率到读取触摸事件的整个过程。
摘要由CSDN通过智能技术生成

前面我们学习了鼠标是如何如何通过应用程序来读取事件和坐标值的,后面也写了一个简单的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,同时也知道触摸屏是一个绝对事件,如下:

37417c63130f4e0c34a70aa5d2b8c068.png

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

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

Android.mk     Get_ft5x0x_tp.c

(1)先看Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SHARED_LIBRARIES += libcutils libutils#LOCAL_STATIC_LIBRARIES += libz libstdc++ libpng libvtpngLOCAL_STATIC_LIBRARIES += libz libstdc++ libpngLOCAL_SRC_FILES := Get_ft5x0x_tp.cLOCAL_MODULE := ft5x0x_tpinclude $(BUILD_EXECUTABLE)(2)Get_ft5x0x_tp.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //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

");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!

"); } //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;}int main(int argc, char **argv){ int tp_ret ; int ft5x0x_x = 0; int ft5x0x_y = 0; tp_ret = ft5x0x_ts__init(); if(-1 == tp_ret){printf("tp init fair!

");return -1 ; } printf("tp init success!

"); while(1) { //获取屏幕上的绝对坐标点 Get_ft5x0x_ts_postion(&ft5x0x_x,&ft5x0x_y); printf("ft5x0x_x:%d ft5x0x_y:%d

",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.shincluding device/moto/shamu/vendorsetup.shincluding device/friendly-arm/tiny4412/vendorsetup.shincluding device/generic/mini-emulator-x86_64/vendorsetup.shincluding device/generic/mini-emulator-armv7-a-neon/vendorsetup.shincluding device/generic/mini-emulator-mips/vendorsetup.shincluding device/generic/mini-emulator-arm64/vendorsetup.shincluding device/generic/mini-emulator-x86/vendorsetup.shincluding device/asus/deb/vendorsetup.shincluding device/asus/fugu/vendorsetup.shincluding device/asus/grouper/vendorsetup.shincluding device/asus/tilapia/vendorsetup.shincluding device/asus/flo/vendorsetup.shincluding device/lge/hammerhead/vendorsetup.shincluding device/lge/mako/vendorsetup.shincluding sdk/bash_completion/adb.bashroot@morixinguan:/work/android-5.0.2# lunch You're building on LinuxLunch 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-userdebugWhich would you like? [aosp_arm-eng] 20============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=5.0.2TARGET_PRODUCT=aosp_tilapiaTARGET_BUILD_VARIANT=userdebugTARGET_BUILD_TYPE=releaseTARGET_BUILD_APPS=TARGET_ARCH=armTARGET_ARCH_VARIANT=armv7-a-neonTARGET_CPU_VARIANT=cortex-a9TARGET_2ND_ARCH=TARGET_2ND_ARCH_VARIANT=TARGET_2ND_CPU_VARIANT=HOST_ARCH=x86_64HOST_OS=linuxHOST_OS_EXTRA=Linux-4.8.2021年02月16日-generic-x86_64-with-Ubuntu-16.04-xenialHOST_BUILD_TYPE=releaseBUILD_ID=LRX22GOUT_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

b44357a23827fbeb4caf21c02dedde7e.png

push完毕以后:

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

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

805f5989242f6d7987a8cb8cf6e29516.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值