Linux文本模式下触摸屏的驱动设计及校准

2018-04-15 21:13
单片机与嵌入式系统应用 2018年6期
关键词:触摸屏电阻驱动

(北京明航科技发展有限公司 湖南分公司,长沙 410205)

引 言

本文是在Linux文本模式下对电阻式触摸屏进行校准。Linux系统是一套开源的操作系统,可以根据实际需要进行裁剪、移植,而且可以非常方便地在Linux系统上开发扩展设备的驱动。

1 触摸屏工作原理

首先简单介绍一下触摸屏的工作原理,用手指或其他物体触摸安装在显示器前端的触摸屏,然后系统根据手指触摸的图标或菜单位置来定位选择信息输入。触摸屏由触摸检测部件和触摸屏控制器组成;触摸检测部件安装在显示器屏幕前面,用于检测用户触摸位置,接受后送触摸屏控制器;而触摸屏控制器的主要作用是从触摸点检测装置上接收触摸信息,并将它转换成触点坐标,再送给CPU,它同时能接收CPU发来的命令并加以执行。

电阻式触摸屏其实就是一种传感器,这种屏幕可以用四线、五线、七线或八线来产生屏幕偏置电压,同时读回触摸点的电压,电压值和位置信息成正比。这里以四线为例进行说明,当在触摸屏上按下触笔时,触摸屏的4个引脚会产生不同的电压值,这样触摸屏控制器就能检测到这种变化,从而产生INT_TC中断,表示触笔按下。然后在得到CPU指示的情况下,通过A/D转换,触摸屏控制器可以根据4个引脚上的位置得到不同电压值,这就是触摸屏的工作原理。

2 触摸屏驱动

触摸屏的类型有电阻式触摸屏、电容式触摸屏、表面声波触摸屏、红外触摸屏等。可以在网上下载Linux内核源码,在Linux源码中有各种触摸屏的驱动,根据触摸屏的类型选取适合的触摸屏驱动。在硬件连接正常的情况下,如果触摸屏在图形模式下点击没有反应,则需要根据实际情况对触摸屏的驱动进行修改。本文就USB接口的电阻式触摸屏进行介绍。

在Linux源码中driverinput ouchscreen,提供了各种类型的触摸屏驱动,选取合适的驱动进行修改。触摸屏的驱动和其他外设驱动的架构类似,包括设备初始化、设备打开、设备关闭、中断处理等。本文以usbtouchscreen.c为例,对需要改动的部分进行说明。

static struct usb_device_id usbtouch_devices[] = {

#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX

/* ignore the HID capable devices, handled by usbhid */

{USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE},

{USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE},

/* normal device IDs */

{USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},

{USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX},

{USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},

....

上文中的0x0123, 0x0001分别为厂商号和设备号,这两个一般作为设备的标识符。先确定自身的触摸屏的厂商号和设备号,然后将触摸屏信息添加进去。driver_info 包含驱动信息,其类型为usbtouch_device_info。以DEVTYPE_EGALAX为例:

static struct usbtouch_device_info usbtouch_dev_info[] = {

#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX

[DEVTYPE_EGALAX] = {

.min_xc= 0x0, //X轴最小坐标

.max_xc= 0x07ff, //X轴最大坐标

.min_yc= 0x0, //Y轴最小坐标

.max_yc= 0x07ff, //Y轴最大坐标

.rept_size= 16, /位数

.process_pkt = usbtouch_process_multi,

//用于中断回调函数,用于上传数据

.get_pkt_len = egalax_get_pkt_len,

.read_data = egalax_read_data,

//用于中断回调函数,用于读取数据

},

#endif

上文中X、Y轴的最大坐标为0x07ff,这与rept_size = 16相关,16表示触摸屏的转换位数,16位的最大转换值为0x07ff。

程序修改完成后,在命令行make menuconfig中通过Device Drivers→Input device support→Touchscreens→USB Touchscreen Driver选取需要的touchscreen类型。内核配置完成后,对内核进行重新编译,编译完成后重启加载触摸屏驱动。

3 触摸屏校准

触摸屏驱动加载完成后还需要对触摸屏进行校准,根据电阻式触摸屏的工作原理可知电压和坐标位置成正比,将电压值通过A/D转换器进行转换,从而计算出触摸屏的X轴和Y轴坐标的数值,而校准就是去计算(0, 0)坐标点的电压值转换值是多少。

在图形模式下进行触摸屏校准比较方便。触摸屏厂家一般都会提供图形模式下的校准程序,只需要执行命令文件即可。在Windows系统下进行校准后,将校准数据保存,当切换到Linux图形系统后,触摸屏一般不需要再次校准,对触摸屏进行操作时,将会调用Windows系统保存的校准数据,从而实现触摸屏的校准。

文本模式下调用触摸屏时,由于文本界面和图形界面的差异,图形界面下触摸屏的校准数据不能实现文本模式下的触摸屏校准。下面就文本模式下的触摸屏校准进行详细说明。

触摸屏的校准一般采用的是5点校准法,进入校准界面后,根据提示触摸出现的校准点,完成后,校准程序将得到的校准数据保存到存储设备中,校准以后,在使用触摸屏时,将此数据为基准进行校准。

本文通过tslib软件对触摸屏设备进行校准,tslib是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在Linux系统下触摸屏进行校准的步骤为:

首先将USB触摸设备接入系统中,在系统中查看该USB触摸屏的设备号,即通过cat /proc/bus/input/devices获取环境变量中触摸屏的event值。

根据获取的event值,修改/etc/profile,具体修改如下:

export TSLIB_ROOT=/usr/local/bin

export TSLIB_TSDEVICE=/dev/input/eventX

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 TSLIB_CONSOLEDEVICE=none

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

修改tslib/tests/ts_calibrate中的/dev/input/eventX,和环境变量中触摸屏的event值相匹配。修改tslib/etc/ts.conf,将# module_raw input前的“#”以及module_raw input前的空格去掉。

运行tslib中的./run.sh后,在config.h中添加#define USE_INPUT_API 1。

运行make;make install。

在/usr/local/bin/bin中运行./ts_calibrate即可看到校准界面;校准后将校准数据保存,通过以上步骤可以实现tslib在Linux文本模式下的触摸屏校准。

结 语

[1] 王建,宋永昌.触摸屏实用技术(三菱)[M].北京:机械工业出版社,2012.

[2] 科波特.LINUX设备驱动程序(第3版)[M]. 魏永明,耿岳,钟书毅,等译.北京:中国电力出版社,2009.

猜你喜欢
触摸屏电阻驱动
基于模糊PI控制的驱动防滑仿真系统分析
屈宏斌:未来五年,双轮驱动,砥砺前行
电阻大小谁做主
PLC和触摸屏在卫生间控制系统的应用
轨旁ATC系统门控柜接收/驱动板改造
巧测电阻
皮肤“长”出触摸屏
电阻焊
基于S3C6410的Wi-Fi驱动移植实现
基于multisim13.0负电阻在电源中作用的仿真