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

简介: 前面我们学习了鼠标是如何如何通过应用程序来读取事件和坐标值的,后面也写了一个简单的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;
}


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!\n");
	return -1 ;
    }
    printf("tp init success!\n");
    while(1)
    {    //获取屏幕上的绝对坐标点
	 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 

You're 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文件,然后我们触摸触摸屏,如下,坐标值打印出来了。


目录
相关文章
|
9月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
491 0
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
308 6
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
441 5
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
|
7月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
800 1
二、Linux文本处理与文件操作核心命令
|
7月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
463 137
|
7月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1258 58
|
10月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
860 143
linux命令—tree
|
6月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1147 2
|
7月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
657 0
Linux内存问题排查命令详解