使用tslib来读取触摸屏的数据,可以得到原始数据,也可以在原始数据的基础上进行一些处理。比如有些触摸屏比较不稳定,跳动比较大,我们可以将跳动比较大的数据给删除掉
plugins里面的每个文件都会被编译成一个动态库,这些动态库称为module,module里面都有两个函数,read和read_mt
要分析tslib的框架,先看看示例程序怎么使用,我们参考ts_test.c和ts_test_mt.c,前者用于一般触摸屏(电阻屏、单点电容屏),后者多用于多点触摸屏。
一开始,我们要用ts_setup去设置触摸屏设备,ts_setup分为两部分,ts_open(打开设备),ts_config(根据配置文件来加载各种模块,模块就是里面可以添加对数据的处理),设置完就可以调用ts_read,ts_read_mt,来获得数据,不同了就调用ts_close
指定读取的设备名,读取设备的方式是阻塞方式还是非阻塞方式
如果传入了设备名,就是传入的设备名,如果没有传入设备名,就是从环境变量里面来获取设备名
如果你既没有传入设备名,也没有设置环境变量,它回去使用这些默认的设备结点
如果这些默认的设备结点也没有,在linux里面,它会去扫描结点,在“/dev/input”DEV_INPUT_EVENT下面去扫描,如果这个目录下的设备结点表示它是触摸屏设备的话,那就返回那个设备结点。如何判断一个结点是不是设备结点。
可以使用ioctl来获得它的属性信息,如果INPUT_PROP_DIRECT为1,表示它是触摸屏
找到设备结点以后,就可以打开设备结点
打开结点之后,它就会给你构造一个结构体
里面包含文件句柄,各种链表。
打开文件之后,会配置我们刚刚得到的ts结构体,
首先要获得配置文件,你可以使用“TSLIB_CONFFILE”这个环境变量去指定使用哪个配置文件,如果没有设置的话,会使用这个事先设置的文件,TS_CONF,这个文件就是/etc/ts.conf
猜测,module_raw_input是去读取设备结点,得到原始设备数据,module pthres pmin=1处理前面得到的数据,module dejitter处理module pthres pmin=1得到的数据,module linear 得到处理从module dejitter得到的数据,然后module linear得到的数据返回给调用者
打开配置文件以后,逐行读取
,如果那一行是以module开头,ts_load_module, 以module_raw开头ts_load_module_raw
他们最终都会调用同一个函数,只是参数不同
load_module_shared 加载动态库,加载完动态库之后,用这个结构体表示
然后把这个结构体附加给dev_ts,就是把info放在ts里面的链表