最近在做一个控制终端项目,项目中用到五线电阻触摸屏,接口为RS232,采用台湾 EETI 触摸屏控制器。使用过程中遇到了一些麻烦,在这里记录一下。
首先简单说一下触摸屏原理,触摸屏附着在显示屏的表面,与显示屏配合使用,通过触摸产生模拟电信号,经过转换为数字信号后,由微处理器计算得出触摸点的坐标,从而得到操作者的意图并执行。在Linux系统中会通过输入子系统来管理,最终封装成事件上报到应用程序中。更多关于触摸屏的硬件原理,可以参考这里:http://blog.csdn.net/lu_embedded/article/details/53063970。
那么现在我们知道,触摸控制器在整个触摸响应过程中起着承上启下的作用。其主要功能是在微控制器的控制下向触摸屏(五线电阻屏)的两个方向分时施加电压,并将相应的电压信号传送给自身的AD转换器,然后通过RS232将数字信号发送到微控制器。所以实际上电阻触摸屏的分辨率取决于AD转换器的精度,例如12位精度等级,最大值为2047。
下面内容大部分来自《EETI eGTouch Linux Programming Guide v2.5h》,可以在这里下载:http://download.csdn.net/detail/luckydarcy/9680285。
EETI 提供各种各样的触摸解决方案。EETI eGTouchD 是用于驱动 EETI 触摸控制器的触摸驱动程序(守护进程)。仅支持 kernel 2.6.24 以上版本的 Linux 操作系统。
支持的接口类型有:
1. USB
2. RS232
3. PS/2
有以下一些特征:
1. 精确(Precise points)
2. 校准精度高(对于电阻控制器)
3. 支持10+触点报告
4. 遵循 Linux 标准多触控协议触点报告
5. 支持右击、蜂鸣、连续触摸过滤
6. 支持多个设备
7. 可检测旋转
8. 允许手动修改驱动行为
这篇文章的目的是帮助你将 eGTouchD 安装到你的 Linux 机器上。
安装驱动前,需要检查下面这些模块的配置情况,如下:
需要添加的:
1. EVDEV
2. UINPUT
3. HIDRAW
( USB Interface )
4. HID_MULTITOUCH
( USB Interface & Kernel 3.0 upwards )
需要去掉的:
CONFIG_TOUCHSCREEN_USB_COMPOSITE
( For USB Interface & PID 0001 controller )
你可以通过“make menuconfig”或直接修改 Kconfig 文件来完成上面这些工作。下面以“make menuconfig”的方式来示范。
需要添加的:
2-2-1
注意!如果你的系统满足以下条件,请先参考 Sec 6-1-1 部分,为内核打上 blacklist 补丁, 否则驱动将无法正常工作。
1) 如果你完成了以上的修改,就可以重新编译你的内核,以使得这些修改生效。
2) 完成上一步操作后,可以通过下面这些步骤来检查这些内核功能是否生效。
运行安装脚本之前,请先确保硬件连接正常。接着就可以运行 setup.sh 脚本自动安装驱动了。相关命令如下:
sh setup.sh # To install the eGTouch driver.
sh setup.sh uninstall # To remove the eGTouch driver.
当然,你也可以手动地完成这些安装步骤,如下:
如果你的系统中有 X-window,还可以用到下面这些工具。注意运行这些工具需要 “root” 权限!
eGTouchD 守护进程通过内核 UINPUT 发送 input 事件,以使得客户程序能过从 /dev/input/eventX 中获得这些事件。
基于不同的 Linux 内核版本,eGTouchD 守护进程能够上报不同的事件。
1、2.6.36 以上内核版本:
Multi-touch Protocol Type B
ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 0
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 1
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
你可以在 Linux 内核源码 /Documentation/input/multi-touch-protocol.txt 中查看这些规则的详细描述。
2、2.6.35 以下内核版本:
EETI protocol: Standard mouse event and custom extra event
EETI 提供了一个示例程序 GetEvent.c ,来说明事件序列的行为。编译该示例程序,然后输入对应的事件节点( /dev/input/eventX)作为参数执行该程序。当你触摸屏幕时,可以看到一些事件序列的信息,同样,你可以利用这些事件序列来设计你的应用程序。
eGTouchL.ini 文件包含参数列表,驱动加载时将会读取这些参数信息。所以我们可以通过修改这些参数来影响驱动的行为,但是请注意千万不能更改 eGTouchL.ini 文件中的参数名,只能修改参数值。
下面这个表格详细地描述了所有参数的用法。这些参数在 eGTouchL.ini 文件中也有简单的描述。
[eGTouchL.ini]
DebugEnableBits 1
ShowDebugPosition 0
DeviceNums 1
BaudRate 0
ScanInterface 0
UseDriverCalib 0
SkipFirstByte 0
ShiftByteBothEnd 1
[String]
SerialPath0 default
SerialPath1 default
DevPID0 null
DevPID1 null
[Device_No.0]
Physical_Address
SupportPoints 10
SendRawPoints 0
Direction 0
Orientation 0
EdgeCompensate 0
EdgeLeft 100
EdgeRight 100
EdgeTop 100
EdgeBottom 100
HoldFilterEnable 1
HoldRange 10
SplitRectMode 0
CustomRectLeft 0
CustomRectRight 2047
CustomRectTop 0
CustomRectBottom 2047
DetectRotation 0
ReportMode 1
EventType 0
BtnType 0
RightClickEnable 1
RightClickDuration 1500
RightClickRange 10
BeepState 0
BeepDevice 0
BeepFreq 1000
BeepLen 200
VKEYEnable 1
VKEYReportMod 1
VKEY_0 0
[EndOfDevice]
[EndOfFile]
[NOTE]:
1. Remember to put this file at /etc/eGTouchL.ini
2. This is a parameter list that we can enable or disable functions easily by modifying the above list.
3. Please make sure just modify the value of the list. "DONT" change any front title of the list.
4. Below are the parameter explanations.
[Explanation of all Parameter]:
DebugEnableBits [0] Close all Debug , [FFFFF] Open all Debug
ShowDebugPosition [0] Print in file under /tmp , [1] Print in Terminal , [2] Print in both
SerialPath [default]: It represent serial port use default /dev/ttySX
/dev/serial/ttyS0: It represent assign the specific serial port. Pls be accordance to the form.
Physical_Address USB physical address ( use for multi-device )
SupportPoints [0] No point , [X] Point amount want to report
SendRawPoints [0] default point format , [1] raw point format
Direction [1] Invert X , [2] Invert Y , [4] Swap X with Y
Orientation [0] 0 degree, [1] 90 degree, [2] 180 degree, [3] 270 degree
EdgeCompensate [0] Disbale , [1] Enable
EdgeLeft [100] Default with no change , [50-150] Compensate Value.
EdgeRight [100] Default with no change , [50-150] Compensate Value.
EdgeTop [100] Default with no change , [50-150] Compensate Value.
EdgeBottom [100] Default with no change , [50-150] Compensate Value.
HoldFilterEnable [0] Disable , [1] Enable
HoldRange [X] Hold Filter Range area
SplitRectMode [0] Default , [1-8] In-built Mode , [9] Custom Mode
CustomRectLeft [0-2047] As Custom Mode, left edge value
CustomRectRight [0-2047] As Custom Mode, right edge value
CustomRectTop [0-2047] As Custom Mode, top edge value
CustomRectBottom [0-2047] As Custom Mode, bottom edge value
ReportMode [1] Normal Mode [2] Single Click on Touch [3] Single Click on Release
DetectRotation [0] Disable [1] Enable to detect X rotation and map coordinate.
EventType [0] AUTO_DETECT
BtnType [0] BTN_LEFT [1] ABS_PRESSURE [2] BTN_TOUCH
RightClick [0] Disable RightClick, [1] Enable RightClick
RightClickDuration [X] After constant touch for X millisec, trigger RightClick
RightClickRange [X] The touch range(area) which would cause constant touch
BeepState [0] Disable beep [1] Beep on Touch [2] Beep on Release
BeepDevice [0] Disable [1] System Beep [2] Sound Card Beep
BeepFreq [X] Beep sound frequency
BeepLen [X] Beep sound length
请将下面红色部分内容添加到你的源代码中。
如果你的 Linux 内核版本在 3.8.x 到 3.12.x 之间,并且使用电阻或电容技术的触摸屏控制器,请在你的源代码中将下面红色部分内容注释掉。
如果启动了 DetectRotation 功能,eGTouch 驱动需要在 X-server 准备就绪后执行(我们使用 Xlib 来做检测)。因此,你需要将 eGTouch 的执行从 rc.local 中移除,然后把相应的执行语句放在系统的 X server 准备就绪后的地方,这样才能使 DetectRotation 功能起作用。
我们提供的解决方案是一个通用的 gdm 自启动。
1. 修改 /etc/gdm/Init 下的“Default”文件。
2. 在文件末尾(exit 0 之前)添加 eGTouch 的执行语句 /usr/bin/eGTouchD。
3. 重启系统。
由于在不同机器和系统中,启动 Xlib 的准备就绪时间都不尽相同,所以很抱歉我们提供解决方案不能满足所有的应用场景。如果有任何问题,请联系我们的技术支持。
如果你使用的是嵌入式系统(如:ARM CPU),并且需要支持旋转检测。那么需要 Xrandr 库的支持,因为 eGTouch 是通过 Xrandr 库来监测旋转事件的。
同样,如果你使用的是嵌入式系统(如:ARM CPU),并且需要支持声卡蜂鸣。那么需要 ALSA 库的支持,因为 eGTouch 是通过 ALSA 库来发送蜂鸣声响的。
如果你需要这些支持,那么需要与 EETI 联系,专门定制一个驱动程序,因为 EETI 并不提供 eGTouchD 的源代码。
如果你的系统中有多个 EETI 设备,记住要修改 eGTouchL.ini 文件中的“DeviceNums”参数。举个栗子,你的系统中有两个 EETI 设备,应该修改参数如下:
DeviceNums 2
修改完 DeviceNums 参数后,不要忘了重启系统,否则不会生效。
如果在使用 eGTouchD 驱动过程中遇到任何问题,我们可以联系 EETI 的技术支持工程师,邮箱是 [email protected],为了更快解决问题,你应该收集一些调试信息和问题描述。例如:
为了让 EETI 的技术支持工程师了解你的平台环境,请尽你所能填写下表,不清楚的可以留空白。
1、执行命令 cat /proc/bus/input/devices
。
2、将打印的信息告诉 FAE。
1、修改 eGTouchL.ini 文件。将参数 DebugEnableBits 的值由 1 改为 FFFFF,将 ShowDebugPosition 的值由 1 改为 0。如下:
[eGTouchL.ini]
DebugEnableBits FFFFF
ShowDebugPosition 0
2、重启系统。重启之后,点击触摸屏的四个角。
3、调试日志文件将保存为 /tmp/eGTouch_[year]_[date]_[time]
4、你可能会看到很多名字如 eGTouch_[year]_[date]_[time]
的文件,只要把最新的一个发给 FAE 即可。