开发板QT移植之tslib_1.4安装和移植
开发环境:
- VMware® Workstation 10.0.2
- ubuntu-16.04 LTS
- arm-linux-gcc-4.9.1
- busybox-1.17.2-20101120
- uboot_tiny4412-sdk1506.tar
- kernel –>linux 3.5
过程记录:
把tslib_1.4.tar.bz移到Ubuntu上,进行解压,然后进入解压后的目录
tar -vxf tslib_1.4.tar.bz cd tslib-1.4
执行./autogen.sh
发现缺少程序支持.
apt-get install autoconf automake libtool pkg-config m4
安装相关的一些软件,出现了E: Could not get lock /var/lib/dpkg/lock-frontend - open的问题,这是由于当前环境进行过异常的程序安装,导致的资源占用。
删除上图不能打开的文件。
rm /var/lib/dpkg/lock-frontend
继续删除/var/lib/dpkg/lock,然后重新执行./autogen.sh,会有警告,不过没关系。
进行配置,执行一下操作.
./configure CC=arm-linux-gcc CXX=arm-linux-g++ --host=arm-linux --prefix=/opt/tslib1.4 ac_vc_func_malloc_0_nonnull=yes
make make install
make时发生如下错误:
参考https://blog.csdn.net/u011171361/article/details/82944018解决办法如下:
编辑tslib文件夹下的config.h.in 将文件中的以下两行注释掉
//#undef HAVE_MALLOC 文件中的47行
//#undef malloc 文件中的189行
修改完成后,重新编译,然后安装.
安装成功后,在指定的安装目录下,有如下内容.
修改安装目录下的配置文件/opt/tslib1.4/etc/ts_conf,把input项前边的#和空格删除。
把安装目录整个复制到nfs根文件系统当中,并添加开发板系统环境变量(写入到开发板系统/etc/profile当中):
# 指定tslib主目录位置 export TSLIB_ROOT=/opt/tslib1.4
# 指定触摸屏设备 export TSLIB_TSDEVICE=/dev/event0
# 指定触摸屏校准文件pointercal存放位置
export TSLIB_CALIBFILE=/etc/pointercal
# 指定TSLIB配置文件的位置
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
# 指定触摸屏插件所在路径
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
# 指定帧缓冲设备
export TSLIB_FBDEVICE=/dev/fb0
# 设定控制台设备为none
# 否则默认为/dev/tty,
# 这样会出现”open consol device:No such file or directory KD…..”的错误
export TSLIB_CONSOLEDEVICE=none
# 指定TSLIB的库文件路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:TSLIB_ROOT/lib
# 指定触摸屏设备
export QWS_MOUSE_PROTO=tslib:/dev/event0
其中触屏设备根据自己实际情况填写,有的在/dev/下,有的在/dev/input/下,鼠标,键盘,触屏等都是使用input子系统通用的事件处理流程,生成eventX设备,X值是数值,根据具体情况填写。
可以使用如下两种方法查看具体设备:
1、cat /dev/eventX,如果触摸屏幕终端有乱码输出,则该设备就是触摸屏的设备驱动
2、cat /proc/bus/input/devices文件查看input通用设备的具体描述信息。我的硬件设备是ft5x06.
在开发板中进入:tslib1.4_install_dir/bin,执行./ts_calibrate进行五点校准。
执行时出现错误:
selected device is not a touchscreen I understand
看错误显示结果是环境变量中选择的/dev/eventX不是一个触屏设备,查看tslib1.4源码实现位置如下:
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; }
可以看到执行测试例程时会校验设备,检查交叉编译工具链和内核版本号是否一致和设备是否支持input子系统中的相对事件,以及相对事件中的子事件,如x轴,y轴,压力。这三项内容存在不符合的条件。
首先查看版本,分别在交叉工具和内核源码目录下查看版本号:grep –r EV_VERSION ./ (在当前路径下查看EV_VERSION 字符串,-r指定包含子目录),可以发现两者版本是一致的,都是0x010001.
其次查看驱动支持的事件类型,查看驱动源代码,在驱动层的probe函数中,发现如下事件类型支持操作:
能够看到单点触屏是支持ABS_X,ABS_Y,ABS_PRESSURE的,而多点触屏不支持。多点触屏和单点使用的子事件类型是不一致的,input子系统当中定义一套带MT字眼的子事件类型专门用于多点触屏。
要想解决该问题需要屏蔽多点触屏功能,我的触屏是支持多点的,需要屏蔽。进入内核菜单,搜索驱动,把多点支持屏蔽。
重新编译内核,烧录,重新执行tslib安装包下的bin目录中的校验例程ts_calibrate,此时能够进行五点校准了,执行ts_test能拖动标点和划线。