使用ts_calibrate校准触摸屏即时生效

本文探讨了tslib校准工具ts_calibrate的工作原理及如何解决校准后应用端需重启X的问题,并介绍了一种无需重启X即能让新校准坐标生效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用ts_lib包自带的ts_calibrate校准触摸屏非常简单实用,但在基于Xsever的GUI应用环境下,有两个问题存在:

1.校准后必须重新启动X,应用端才能生效。这样处理用户肯定不能接受,因为启动一次机器毕竟耗时。
2.在使用ts_calibrate校准触摸屏时,要触摸5个点,这时如果GUI应用端在运行其他响应触摸事件(鼠标事件)的程序就会出现错乱。所以安全的做法应该是在校准触摸屏时进行锁屏操作。

解决这两个问题之前来看看tslib校准方面的原理,如果将原理搞清楚,剩下就是方法实现的问题了。
Tslib 是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转 换为相应的屏幕坐标。通过tslib/src/tslib.h文件可以看出,在tslib中为应用层提供了2个主要的接口 ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接 口,ts_read_raw()为校准情况下使用的接口。从tslib默认的ts.conf文件中可以看出包括如下基本插件:
   pthres 为Tslib 提供的触摸屏灵敏度门槛插件;
   variance 为Tslib提供的触摸屏滤波算法插件;
   dejitter 为Tslib 提供的触摸屏去噪算法插件;
   linear为Tslib 提供的触摸屏坐标变换插件。

tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:

   raw device --> variance --> dejitter --> linear --> application
    module         module       module      module

再来看看ts_calibrate主要做了哪些事情,校准情况下,tslib对驱动采样到的数据进行处理的一般过程如下:
   1。读取屏上5个点的坐标(Top Left,Top Right,Bottom Left,Bottom Right,Center),在进行一系列的变换,取样的5个点,实际上是包含3个不同的X值,3个不同的Y值。和scaling 值一共7个值,一起保存到/etc/pointercal中.
   2.这个/etc/pointercal文件主要是供linear插件使用。而我们每次的触摸的操作都进行多次触摸坐标变换。

至此已经找到解决问题的大体的方法了。在校准触摸屏后只需及时的让linear插件再次读取新的/etc/pointeracal文件,这样新校准的坐标信息就及时的更新到上层应用。下面就要考虑具体实现的问题了。
1。从linear.c文件可以看出在该模块初始化时读取了/etc/pointercal文件。只要在linear_read()中读取新的/etc/pointercal文件即可。

2。 校准后保存了一个新的pointercal文件,但ts_lib怎么知道当前的pointercal文件是应该读取的新文件。刚开始的时候我们在 linear.c的linear_read()函数中采取计数轮询的方式查看/etc/poinercal文件的最后更新时间,如果当前的更新时间大于上 次更新时间,就去读取下pointercal文件。我们暂且不说在一台刚下流水线的机器,它的rtc时间是不确定,再进行时间比较时会出现错误。另外始终 的轮询的方式和ts_lib的采样间隔时间值很小。这样用户在进行触摸屏常按操作时,会非常明显的消耗系统资源。

3。此时想到的办法就是 进程通信,ts_lib是个动态库运行于系统中,他存在系统中不是以进程方式,但可以采取折衷方法,将调用ts_lib的进程号(实际上就是X的进程号) 保存到一个配置文件中。这样在使用ts_calibrate校准触摸屏后,利用信号的方式给ts_lib发送用户自定义信号,ts_lib的 lineral.c中加一个简单的信号处理函数。在接受到信号后就去读取下新的pointercal文件。正常情况下不做任何的轮询和读取操作。

从 上说的3个步骤中完全解决了校准后应用端触摸及时生效的问题。还有个次要问题就是如何锁屏?这需要从内核入手了,查看linux2.6内核 /drivers/input/evdev.c从该驱动提供的ioctl中看到对基于evdev的输入设备都提供EVIOCGRAB实现。顾名思 义,grab就是将当前的输入操作抓取到当前的操作中,让当前操作之外的所有应用端读不到触摸屏的触摸操作。由驱动源码就很容易知道该如何实现锁屏解锁操 作了。源码如下:

truct tsdev *ts;
char *tsdevice = "/dev/input/event0";
ts = ts_open(tsdevice, 0);
int ts_tmpfd = ts_fd(ts);
if (ts_tmpfd== -1)
{
    perror("ts_open");
    exit(1);
}
unsigned long val =1;
int ioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);
printf("now lock the ts ioctl ret is:%d/n",ioctl_ret);

if (ioctl_ret!=0)
{
    printf("Error: %s/n", strerror(errno));
    exit(1);
}
printf("lock the ts success /n");

### RK3588 设备触摸屏校准方法 对于RK3588设备上的电阻触摸屏,在ARM Linux环境下进行校准时,主要涉及配置Xorg中的特定属性来调整触控坐标映射。这类操作通常依赖于底层驱动的支持以及上层图形库(如Qt)的设置。 针对具体型号为RK3588的情况,可以参照如下流程: #### 配置内核模块参数 如果采用的是Goodix品牌的触摸控制器,则可以从指定Git仓库获取最新的通用型驱动程序[^3]。下载并编译适用于RK3588平台的新版gt1x系列驱动之后,将其集成至当前Linux发行版本之中。这一步骤确保了硬件层面能够正确识别与初始化触摸装置。 ```bash # 获取源码 git clone https://github.com/goodix/gt1x_driver_generic.git cd gt1x_driver_generic/ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- sudo make modules_install ``` #### 修改启动命令行传递给内核必要的选项 为了使新加载的驱动生效,可能需要更新GRUB或其他引导管理器内的kernel cmdline部分,添加类似`touchscreen_invert_x`, `touchscreen_invert_y`这样的开关用于初步的方向修正。 #### 使用tslib工具集完成精细调节 当基础支持已经就绪后,借助开源项目tslib所提供的实用程序来进行进一步微调成为一种可行的选择。特别是对于那些希望绕过复杂的应用框架定制工作的开发者而言更为适用。安装完成后执行`ts_calibrate`可进入交互式的四点定位模式;而通过编辑`.ts.conf`文件则允许保存长期有效的转换矩阵[^2]。 ```bash apt-get install libts-bin # Debian系系统为例 ts_calibrate ``` #### Qt应用内部处理方式 考虑到某些场景下直接改动操作系统全局行为并不合适,因此也可以考虑仅在基于Qt构建的人机界面上实现局部性的变换逻辑。例如利用环境变量`QT_QPA_EVDEV_TOUCHSCREEN_INTEGRATION`指向自定义插件路径从而接管原始事件流,并在此基础上施加额外的角度偏移补偿措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值