应用调试-----输入模拟器之编写测试模拟功能
====================================================================
触摸屏驱动源码:
#include "linux/errno.h"
#include "linux/kernel.h"
#include "linux/module.h"
#include "linux/slab.h"
#include "linux/input.h"
#include "linux/init.h"
#include "linux/serio.h"
#include "linux/delay.h"
#include "linux/platform_device.h"
#include "linux/clk.h"
#include "asm/io.h"
#include "asm/irq.h"
#include "asm/uaccess.h"
#include "asm/plat-s3c24xx/ts.h"
#include "asm/arch/regs-
adc.h"
#include "asm/arch/regs-gpio.h"
struct s3c_ts_regs {
};
static struct input_dev *s3c_ts_dev;
static volatile struct s3c_ts_regs *s3c_ts_regs;
static struct timer_list ts_timer;
#define MYLOG_BUF_LEN (1024*1024)
#define INPUT_REPLAY
0
#define INPUT_TAG
1
static char *replay_buf;
static int replay_r = 0;
static int replay_w = 0;
static int major = 0;
static struct class *cls;
static struct timer_list replay_timer;
extern int myprintk(const char *fmt, ...);
static ssize_t replay_write(struct file * file, const char __user *buf, size_t size, loff_t *offset)
{
}
// app: ioctl(fd, CMD, ..); //
static int replay_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
}
// 返回值: 0 - 无数据 //
static int replay_get_line(char *line)
{
}
static void input_replay_timer_func(unsigned long data)
{
}
static struct file_operations replay_fops = {
};
static void enter_wait_pen_down_mode(void)
{
}
static void enter_wait_pen_up_mode(void)
{
}
static void enter_measure_xy_mode(void)
{
}
static void start_adc(void)
{
}
void write_input_event_to_file(unsigned int time, unsigned int type, unsigned int code, int val)
{
}
static int s3c_filter_ts(int x[], int y[])
{
#define ERR_LIMIT 10
}
static void s3c_ts_timer_function(unsigned long data)
{
}
static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
}
static irqreturn_t adc_irq(int irq, void *dev_id)
{
}
static int s3c_ts_init(void)
{
}
static void s3c_ts_exit(void)
{
}
module_init(s3c_ts_init);
module_exit(s3c_ts_exit);
MODULE_LICENSE("GPL");
==================================================================
测试程序:
#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"
#define INPUT_REPLAY
0
#define INPUT_TAG
1
// Usage:
//./input_replay write "file"
// ./input_replay replay
// ./input_repaly tag "string"
//
void print_usage(char *file)
{
}
int main(int argc, char **argv)
{
}
================================================================
解析:
在触摸屏按下后上报事件是把按下时间、类型等打印到制定文件中,如/proc/mymsg中,然后再从/proc/mymsg中的数据还原回来重新上报显示。
在:触摸屏驱动程序(输入子系统)实验的基础上进行以下命令测试:
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
insmod mymsg.ko
//加载自己写的myprintk驱动程序
insmod touch_emulate.ko
//触摸屏驱动程序
./emulate_test tag 100ask
//给保存在mymsg文件中的触摸数据加标记
cat /proc/mymsg
//查看mymsg文件内容
ts_test
//测试触摸屏指令,指令此命令需要加载了触摸屏驱动程序以后才有效
随意的画线
cp /proc/mymsg /ts2.txt
//拷贝完成以后按ctrl+c键才能退出来
sudo chmod 777 ts.txt
//到服务器上执行该指令
./emulate_test write /ts.txt
ts_test &
//用ps命令查看运行的ts_test 进程,可以用:kill -9 +进程号,指令来杀死进程
./emulate_test replay
注意:当程序在执行replay_get_line(line);函数获取一行数据出错时,始终返回有数据存在,那么del_timer(&replay_timer);函数就得不到执行,当卸载驱动重新加载新的驱动时,老的定时器变量依然存在,执行到add_timer(&replay_timer);系统会报错如下,只有系统复位才能解决问题。
kernel BUG at include/linux/timer.h:153!
Unable to handle kernel NULL pointer dereference at vi
rtual address 0000000 pgd=c3f50000
评论