tslib库的移植以及"selected device is not a touchscreen I understand"问题解决

tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。前面已经编写了LCD和触摸屏的驱动程序,现在开始移植tslib库对我们编写的LCD驱动和触摸屏驱动进行测试

实验环境:内核版本:linux-3.2.4      tslib:tslib-1.4


一、tslib库的配置、编译

下载好的tslib文件是压缩格式文件(tslib-1.4.tar.gz),先进行解压缩

tar -xvf tslib-1.4.tar.gz

解压完成后当前目录中会出现一个tslib目录,使用cd /tslib进入该目录,执行./autogen.sh生成.configure文件

如果执行./autogen.sh时出现 autoreconf:command not found 这个问题,需要在虚拟机上安装autoconf、automake、libtool工具。autoconf、automake可以通过configure.ac和Makefile.am文件生成configure脚本文件和最终的makefile文件,ubuntu环境执行以下命令就能完成安装(需要网络)

sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

创建一个tmp目录用于存放编译完成后执行make install安装的内容

mkdir tmp

新建一个arm-linux.cache文件,并将"ac_cv_func_malloc_0_nonnull=yes"写入其中,文件用于缓存配置结果

echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

进行配置操作,设置编译工具链、缓存文件以及编译好目标文件的存放目录

./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp

--host:指定编译器

--prefix:设置执行make install时生成目标文件的安装目录,$(pwd)/tmp代表当前目录下的tmp目录

配置完成后,执行make命令,编译完成后执行make install命令

make
make install

编译、安装成功后tmp目录中会存在以下内容

bin目录:存放生成的用于测试的应用程序,包括触摸屏的校准,测试等

etc目录:生成的配置文件

include目录:存放头文件

lib目录:生成的动态链接库和静态库

接着,分别将生成的内容拷贝到我们的文件系统中去,我使用的开发板挂接的是网络文件系统,网络文件系统存放的目录:/work/fs_digital_photo_self,执行以下拷贝命令

cp ./bin/* /work/fs_digital_photo_self
cp ./tec/* /work/fs_digital_photo_self/etc ------------->①
cp ./lib* -rfd /work/fs_digital_photo_self/lib---------->②

① 拷贝生成配置文件到根目录下的etc目录

② 拷贝生成的库到根目录下的lib目录,-rfd代表递归拷贝,并保持原有链接方式

二、tslib生成测试程序应用

先加载LCD和触摸屏的驱动程序(如果你的LCD驱动和触摸屏驱动已经编译到内核中,那么就不需要执行这部分操作)

insmod cfbcopyarea.ko
insmod cfbfillrect.ko
insmod cfbimgblt.ko
insmod lcd_drv.ko
insmod ts_drv.ko

修改 /etc/ts.conf第1行(去掉#号和第一个空格):
# module_raw input
改为:
module_raw input,代表tslib使用linux的输入子系统接口获取原始数据

添加环境变量,tslib中将使用这些环境变量,如果为设置环境变量或者环境变量设置错误,执行测试程序时会报错

export TSLIB_TSDEVICE=/dev/event1----------------->①
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-------------------->⑥

① 触摸屏的设备节点

② 存放触摸屏校准参数的文件

③ tslib配置的文件

④ tslib插件库目录

⑤ tslib运行需要的控制台,这里是LCD屏幕,设定的控制台设备为none,默认为/dev/tty

⑥ framebuffer显示设备,即LCD设备节点文件

先执行./ts_calibrate获取触摸屏校准参数,再执行./ts_test测试手写操作

ts_calibrate在执行完成后,会在/etc目录生成pointercal文件,文件中存放触摸屏电压值转换成物理坐标使用的参数

 

校准完成后,ts_test测试程序执行效果

 

三、"selected device is not a touchscreen I understand"问题解决

执行ts_calibrate时,出现"selected device is not a touchscreen I understand"问题

这句话在串口中输出,肯定是在代码中打印出来的,搜索tslib库的源码,最终定位plugins/input-raw.c文件中

static int check_fd(struct tslib_input *i)
{
        struct tsdev *ts = i->module.dev;
        int version;
        u_int32_t bit;
        u_int64_t absbit;

        if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
                (version == EV_VERSION) &&
                (ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
                (bit & (1 << EV_ABS)) &&
                (ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
                (absbit & (1 << ABS_X)) && 
                (absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
                fprintf(stderr, "selected device is not a touchscreen I understand\n");
                return -1;
        }

        if (bit & (1 << EV_SYN))
                i->using_syn = 1;

        return 0;
}

if语句的条件有一个不成立,就会打印错误提示并退出应用程序。通过分析定位到错误的来源为第一个判断条件(哈哈,比较走运气)

ioctl(ts->fd, EVIOCGVERSION, &version)通过系统调用进入内核,获取到内核中的EV_VERSION宏的值

 

 

内核中EV_VERSION的值为0x010001

接着查看tslib库中使用的EV_VERSION宏的值,该宏值存放在编译器的目录中的input.h文件中 

这里我们只需要将内核中的EV_VERSION值和编译器的头文件中的EV_VERSION修改一致即可

至此,tslib库移植完成!

posted on 2020-10-24 01:19  quinoa  阅读(1482)  评论(0)    收藏  举报