Just Do It

tslib移植

主机系统: Ubuntu 18.04 64-bit;
交叉编译环境: arm-none-linux-gnueabi;
开发板: EasyARM-i.MX287A;
安装文件目录结构: /home/user/work/nfs/tslib

安装 autoconf、 automake 和 libtool

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

下载解压tslib源码
使用版本tslib-1.4.tar.gz

cd tslib

./autogen.sh

./configure --prefix=/home/user/work/nfs/tslib --host=arm-none-linux-gnueabi ac_cv_func_malloc_0_nonnull=yes
make
make install

–prefix为安装路径

(make 出错 )

/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.4.4/../../../../arm-fsl-linux-gnueabi/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments

cd tests
vi ts_calibrate.c
227,229行:改为

open (calfile, O_CREAT | O_RDWR,0)
cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR,0))

修改安装完成目录下 ./etc/ts.conf文件
将module_raw input前面的注释删除(空格也要删除,使该行顶格)

拷贝安装文件夹到开发板上,我这里拷贝到/usr/local/tslib

更改开发板配置文件/etc/profile
增加如下配置

export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export QWS_MOUSE_PROTO=/dev/input/event0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

进入tslib/bin下
运行ts_test提示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;
}

该错误是由于version == EV_VERSION错误
tslib中version是在交叉编译的时候指定的,而EV_VERSION是在内核中定义.
在linux/kernel源码的include/linux/input.h中,值是0x010001,
查看编译器,在 /opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/usr/include/linux/input.h中,值是0x010000
这两值不等导致错误
修改其中一个的值就可以解决该问题

 

移植完成后运行ts_calibrate ts_test都可正确运行,运行qt程序不能触摸

运行ts_calibrate ts_test后查看/etc/pointercal这个校正文件是都存在,由于我这里使用的nfs文件系统没有写文件的权限,直接在pc端将该文件加上

还不能触摸,将配置文件/etc/profile的

export QWS_MOUSE_PROTO=/dev/input/event0

改为

export QWS_MOUSE_PROTO=TSLIB:/dev/input/event0
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注