最近博主我接到要求,要对研发的一个产品的触摸屏进行测试,大概内容就是要不断地随机点击触摸屏,来测试软件会不会意外退出(鲁棒性验证)。这里我把开发过程记录下来,方便参考。

我们的触摸屏使用的是ads7846这一款触摸屏控制器,找到内核下对应的驱动文件:/drivers/input/touchscreen/ads7846.c。

接下来就要开始修改这个驱动了。我的修改思路是这样的:在这个驱动的基础上增加一个外节点,比如叫做input_emu。然后应用层通过ioctl来操作这个设备节点,从而触发定时器。在这个定时器里面来上报坐标、键值、压力这些关键信息,从而模拟点击这个过程:

1.修改ads7846_probe函数,增加如下几句代码,从而建立input_emu这个节点:

 major = register_chrdev(0, "touch_emulate", &touch_emulate_fops);cls = class_create(THIS_MODULE, "touch_emulate");device_create(cls, NULL, MKDEV(major, 0), NULL, "input_emu"); /* /dev/input_emu */emulate_dev = ts;init_timer(&touch_emulate_timer);touch_emulate_timer.function = touch_timer_function;

2.构建touch_emulate_fops结构体,touch_emulate_ioctl函数以及touch_timer_function定时器服务函数:

long touch_emulate_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{switch(cmd){case EMULATE_START:{touch_emulate_timer.expires = jiffies + 1; //10ms后执行,1HZ定义是100add_timer(&touch_emulate_timer); //将定时器加入定时器等待队列中printk("touch_emulate_ioctl add_timer\n");break;}case EMULATE_STOP:{del_timer(&touch_emulate_timer);printk("touch_emulate_ioctl del_timer\n");break;}default:break;}return 0;
}struct file_operations touch_emulate_fops = {.owner           =  THIS_MODULE,.unlocked_ioctl     =  touch_emulate_ioctl,
};void touch_timer_function(unsigned long data)
{static unsigned int x = 0;static unsigned int y = 0;/* 随机生成坐标,范围: 2bytes, 0-65535 */get_random_bytes(&x, 2);get_random_bytes(&y, 2);x = (x % 4096); //ads7846的采样精度为12位,范围是0-4096,把随机生成的值限制在该范围。y = (y % 4096);/* 模拟触屏事件,上报坐标值 */input_report_abs(emulate_dev->input, ABS_X, x);input_report_abs(emulate_dev->input, ABS_Y, y);input_report_abs(emulate_dev->input, ABS_PRESSURE, 1);/* BTN_TOUCH为点击事件,单点触摸中需要上报点击事件*/input_report_key(emulate_dev->input, BTN_TOUCH, 1); //上报BTN_TOUCH按键值按下     input_sync(emulate_dev->input); //上报同步事件,通知系统有事件上报/* 松开*/input_report_abs(emulate_dev->input, ABS_PRESSURE, 0); //上报压力值为0input_report_key(emulate_dev->input, BTN_TOUCH, 0); //上报BTN_TOUCH按键值松开   input_sync(emulate_dev->input);mod_timer(&touch_emulate_timer, jiffies + 1 * HZ);
}

3.重新编译内核(或者重新编译模块,这个得看内核配置中该驱动的配置模式)。

4.编写控制程序来开启或者关闭这个模拟的功能:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <poll.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>#include <sys/ioctl.h>#define EMULATE_START      1
#define EMULATE_STOP        0/* Usage:* ./touch_emulate start * ./touch_emulate stop */void print_usage(char *file)
{printf("Usage:\n");printf("%s start\n", file);printf("%s stop\n", file);
}int main(int argc, char **argv)
{int fd;if(argc != 2){print_usage(argv[0]);return -1;          }fd = open("/dev/input_emu", O_RDWR);if(fd < 0){printf("Can't open /dev/input_emu!\n");return -1;}if (strcmp(argv[1], "start") == 0){ioctl(fd, EMULATE_START);}else if(strcmp(argv[1], "stop") == 0){ioctl(fd, EMULATE_STOP);}else{print_usage(argv[0]);return -1;}return 0;
}

5.测试:

重新加载这个驱动,然后运行编译好的控制程序:

./touch_emulate start

通过hexdump来观察输出:

cat /dev/input/touchscreen0 | hexdump

输出以下信息:

0000f00 2d42 5780 22b5 0000 0003 0000 00a8 0000
0000f10 2d42 5780 22b5 0000 0003 0001 07eb 0000
0000f20 2d42 5780 22b5 0000 0003 0018 0001 0000
0000f30 2d42 5780 22b5 0000 0001 014a 0001 0000
0000f40 2d42 5780 22b5 0000 0000 0000 0000 0000
0000f50 2d42 5780 22dc 0000 0003 0018 0000 0000
0000f60 2d42 5780 22dc 0000 0001 014a 0000 0000
0000f70 2d42 5780 22dc 0000 0000 0000 0000 0000

分析输出信息:


hexdump序列号              秒                  微秒            type         code            value绝对坐标事件   code=ABS_X       X坐标值0000f00             2d42 5780            22b5 0000          0003         0000          00a8 0000绝对坐标事件   code=ABS_Y       Y坐标值0000f10             2d42 5780            22b5 0000          0003         0001          07eb 0000code=ABS_PRESSURE     压力值0000f20             2d42 5780            22b5 0000          0003         0018          0001 0000键盘事件    code=触摸按键    value=1(按下)0000f30             2d42 5780            22b5 0000          0001         014a          0001 0000同步事件0000f40             2d42 5780            22b5 0000          0000         0000          0000 00000000f50             2d42 5780            22dc 0000          0003         0018          0000 00000000f60             2d42 5780            22dc 0000          0001         014a          0000 00000000f70             2d42 5780            22dc 0000          0000         0000          0000 0000

可以看到,输出的顺序和我们定时器里面的上报顺序是一样的。

嵌入式linux下的触屏模拟相关推荐

  1. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  2. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  3. Ubuntu linux下的录屏

    Ubuntu linux下的录屏 ################## SimpleScreenRecorder ################## 官方网站:http://www.maartenb ...

  4. 嵌入式Linux 软件界面,嵌入式Linux下的图形用户界面系统设计

    为了满足嵌入式系统的界面设计需求,给出了一种图形用户界面系统SKY-GUI的设计思路和其在嵌入式Linux环境下的实现方法.SKY-GUI有四大组成部分:输入抽象层.显示抽象层.事件系统和窗口系统.其 ...

  5. Linux 下的分屏利器-tmux安装、原理及使用

    完整的 tmux 命令可以参考 tmux 常用命令 Tmux 快捷键 & 速查表 Linux 下的分屏利器 - tmux 有时候相关操作,开多个终端切来切去的挺麻烦,这时可以在一个终端里分屏. ...

  6. 南京邮电大学嵌入式系统开发实验5:嵌入式Linux下LED报警灯驱动设计及编程

    实验5  嵌入式Linux下LED报警灯驱动设计及编程 一.实验目的 理解驱动本质,掌握嵌入式Linux系统下驱动开发相关知识,包括端口寄存器访问.接口函数编写.和文件系统挂接.注册及相关应用编程等知 ...

  7. 嵌入式linux音频播放器设计,基于嵌入式Linux下Madplay音频播放器设计论文.docx

    基于嵌入式Linux下Madplay音频播放器设计论文 滁州职业技术学院计算机应用技术专业毕业论文PAGE I 滁州职业技术学院信息工程系--2015届计算机应用专业毕业论文 姓 名: 周杰 班 级: ...

  8. Linux 下的截屏并编辑的工具-flamshot安装及使用

    方法1. linux 系统自带简单截图方式 支持功能:截取整个屏幕:屏幕中的某个区域:某个特定的窗口: 如果只需要获取一张屏幕截图,不对其进行编辑的话,那么键盘的默认快捷键就可以满足要求了.而且不仅仅 ...

  9. 嵌入式linux进行视频监控,嵌入式Linux下的视频监控解决方案

    原标题:嵌入式Linux下的视频监控解决方案 在嵌入式工控板上接一个摄像头进行视频监控,看起来比较容易实现,但往往是"理想很丰满.现实很骨感".历经千辛万苦效果却不是很理想,本文就 ...

  10. gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计

    摘要:移动通信中的短消息业务以其方便.可靠和价廉得到了广泛应用,本文在嵌入式Linux系统中,通过西门子MC35模块,实现了短信收发系统,该系统采用PDU短信模式,能支持中文短信.程序设计采用异步事件 ...

最新文章

  1. linux简单设计与实现代码,《linux内核设计与实现》第五章(示例代码)
  2. 配置PHP启动Apache服务报错
  3. JS图片放大查看效果!
  4. nginx 启动报错 “/var/run/nginx/nginx.pid“ failed” 解决方法
  5. 学python有前途吗-2019年转行学Python有还前途吗?如何学习Python?
  6. ubuntu不能更新包
  7. 迅雷上传速度怎么限制的方法
  8. 【网站】比较知名的大型公司官网清单可以收藏关注一下,欢迎您来补充
  9. java找不到指定路径_java创建文件时提示找不到指定路径的解决方法
  10. matlab 广义特征,特征值 特征向量 广义特征值 matlab
  11. java 中关于字节数的总结_javaweb实习报告
  12. 手机视频如何投屏到电脑 手机投屏电脑
  13. ubuntu下sed命令详解 - Dicky - 开源中国社区
  14. 你还停留在使用Dagger2吗? 带你一步一步走进Dagger2的世界
  15. 传统支付方式不能满足线下支付的需求
  16. 神经网络中的权值共享
  17. java基础语法入门到类型转换问题,运算符,数据输入,数组,方法概述,Debug模式,以及10个小案例的详细介绍。
  18. 微信小程序点击图片保存到相册
  19. 分布式数据库系统基本概念
  20. 用DW做网页怎么让网页的背景图片进行拉伸使其达到全屏

热门文章

  1. linux下shell检测sd卡分区表,shell中给sd卡或u盘分区
  2. 基于Unity3d的FPS与塔防相结合的游戏设计
  3. 计算机中堆栈指针的作用,堆栈指针是什么_有什么作用
  4. css3新单位vw、vh、vmin、vmax的使用详解
  5. 数据字典的作用和定义(软件工程)
  6. 好用的免费CMS网站模板源码下载推荐
  7. 淘客链接转成正常淘宝链接JAVA代码实现
  8. 全球与中国组合锁市场深度研究分析报告
  9. 华为 MATE7 调试 LOCAT 日志不输出问题
  10. 最大公因数、最小公倍数求法(C++)