基于S3C2410的触摸屏手写应用程序设计

2014-09-07 03:32刘作栋
湖北理工学院学报 2014年1期
关键词:内核显示屏触摸屏

高 芹,刘作栋

(湖北理工学院 计算机学院,湖北 黄石 435003)

基于S3C2410的触摸屏手写应用程序设计

高 芹,刘作栋

(湖北理工学院 计算机学院,湖北 黄石 435003)

触摸屏作为一种重要的电子输入设备,在各个领域都备受青睐。触摸屏以其简单、自然的人机交互方式,已广泛应用于工业过程控制、公共信息咨询、金融证券交易市场、家用电器等众多领域。基于S3C2410的电阻式触摸屏应用,介绍了触摸屏的原理及结构以及在嵌入式系统中的应用、嵌入式文件系统的配置、LCD和触摸屏的配置;采用了触摸屏3点校准方法,并利用Linux中的Framebuffer设备实现了在触摸屏上追随手指显示轨迹的具体算法。

嵌入式;LCD;触摸屏;帧缓冲;手写

由于触摸屏技术的不断改进与革新,越来越多的电子产品采用触摸屏作为输入设备,用户的交互性有了质的飞跃。目前国内外的触摸屏控制方式越来越趋向于智能化,触摸屏触摸实现技术多样,主要有矢量压力传感器技术触摸屏、电阻感应触摸屏、红外线触摸屏、电容感应触摸屏和表面声波触摸屏。对于产品的设计者来说,设计产品更加灵活,更容易推出富有个性的产品。

本设计采用嵌入式Linux操作系统,将基于S3C2410处理器触摸屏作为硬件设计平台。触摸屏选用4线电阻式触摸屏,当触摸点接触到屏幕时,它在X、Y方向产生模拟信号,通过S3C2410的A/D转换器转化成数字信号送至CPU处理,从而实现触摸屏功能[1-2]。

本设计软件平台主要由Bootloader、操作系统、文件系统、应用程序、驱动程序等组成。在触摸屏驱动设计上,设计基于Linux S3C2410平台的触摸屏驱动管理,针对触摸屏的点击获得脉冲电压值并通过A/D转化后读取该值,根据相关校准算法将该值转换成显示屏较为精确的坐标。利用Linux的Framebuffer原理在触摸屏获得其精确坐标后实现了追随手指轨迹的几何图形的描绘。

1 设计平台构建

1.1软件平台

1)Ramdisk文件系统的配置。

在实现触摸屏手指追随的Linux操作系统移植中,使用的Ramdisk 是一个最小的Linux 根文件系统。它是一种基于内存的虚拟磁盘技术,采用ext2文件格式,包含了所有Linux 系统在引导和管理时需要的工具。ramdisk.gz是ramdisk文件进行压缩后的格式。挂载该文件系统的具体操作方法如下[3-4]。

假设将ramdisk.gz存放在/home/cvtech/jx2410/root/下面,则操作如下:

$cd /home/cvtech/jx2410/root/

$mkdir rd

$gunzip ramdisk.gz

经过上述操作后,已将ramdisk.gz解压成ramdisk系统映像文件。

$mount -o loop ramdisk rd/

$cd rd/

其中命令mount的-o参数loop表示将文件当作硬盘的挂接方式。这样,rd下面的就是Linux的文件系统,此时就可以加入自己的应用程序,或者对其中的文件进行修改,修改完成后,使用如下命令重新生成文件系统映像文件:

$umount rd

$gzip ramdisk ramdisk.gz

这样再用tftp下载到JXARM9-2410实验箱上,然后运行Linux系统就可以看到程序了。

2)Linux 2.6.14内核的移植。

获取Linux源码后解压,解压完成后安装编译器;通过修改Makefile,添加对ARM的支持以及编译器的制定;用make menuconfig命令进入系统配置菜单,下载配置文件s3c2410_defconfig,保存退出后,进行编译。编译通过后,在目录arch/arm/boot/下,得到一个新的内核文件zImage,将内核下载到ARM9S3C2410实验箱中[5-6]。

1.2硬件平台

1) 触摸屏的配置。

S3C2410带有1个电阻式触摸屏面板、4个外部晶体管和1个外部电压源。将触摸屏接口控制和选择控制信号(nYPON、YMON、nXPON和XMON)以及模拟pad(AIN[7],AIN[5])都连接到触摸屏面板和X、Y坐标转换外部晶体管。触摸屏接口包括一个外部晶体控制逻辑和一个带有中断发生器的A/D转换逻辑[7-10]。

在Linux操作系统中,S3C2410微控制器对应的字符型驱动源文件为s3c2410_ts.c。将该驱动编译为模块后,生成驱动模块s3c2410.ko,将该驱动模块用insmod插入到内核后,自动在Linux的/dev/目录下创建节点touchscreen。

编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序就可以实现,利用open函数打开触摸屏设备,然后用读函数read()函数读取触摸屏的按压信息和对应的触摸屏坐标x,y即可。

此外,如果要正常使用ARM9 S3C2410实验箱上的LCD,还需完成如下操作:

$ cd/home/cvtech/jx2410/linux-2.6.14

$ make menuconfig

在Linux配置菜单中,添加Frame buff支持,添加后,保存退出。触摸屏Framebuffer内核加载如图1所示。

图1 触摸屏Framebuffer内核加载

在程序中,通过下面一段代码打开触摸屏:

if((fd = open("/dev/fb0", O_RDWR)) < 0)

{perror("fail to open");

return 0; }

2)LCD内核驱动配置。

如果要正常使用ARM9 S3C2410实验箱上的LCD,还需完成如下操作:

$cd/home/cvtech/jx2410/linux-2.6.14

$ make menuconfig

在Linux配置菜单中,添加LCD支持,Device Drivers->Graphics support->添加后,保存退出。添加LCD Framebuffer支持选项如图2所示。

图2 添加LCD Framebuffer支持选项

2 详细设计

2.1电阻式触摸屏取点的实现

对于4线电阻式触摸屏,当触摸点接触到屏幕时,它在X、Y方向产生模拟信号,通过S3C2410的A/D转化成数字信号。对触摸屏的操作除了打开、关闭设备外,一般只有读操作。读操作将在触摸屏上读取到的信息保存在一个结构体变量中。这个结构体定义在Linux源码的include/asm-arm/linuette_ioctl.h文件中,定义如下:

//触摸屏触点坐标值及动作信息

typedef struct

{

unsigned short pressure; //触摸笔动作unsigned short x; //触点x坐标值

unsigned short y; //触点y坐标值

unsigned short pad;

}TS_EVENT;

从而获得其对应的数字信号x和y,关键算法如下:

while(1)

{ flag=1;

for(i=0;flag!=0;i++)

{ read (ts, &ts_event, sizeof (TS_EVENT));

if (ts_event.pressure > 0)

{ x[i]= ts_event.x;

y[i]= ts_event.y;

printf("x[%d] =%d, y[%d] = %d ", i,x[i],i,y[i]);

}}

else flag=0; }

但通过以上算法获得的坐标点是触摸屏上的坐标点,并不是与LCD完全匹配的坐标点。触摸屏常和LCD叠加在一起配套使用,构成一个矩形的实际物理平面; 而由用户触摸的触摸点集合经过 A/D 转换器,得到具体显示坐标的集合,这个集合构成了一个逻辑平面,由于存在误差,这2个平面并不重合。触摸屏部分坐标点值如图3所示。

图3 触摸屏部分坐标点值

2.2 3点触摸屏校准算法

当触摸屏和LCD的角度存在较小的偏差时,可采用3点校准法对触摸屏进行校准。校准算法选取3个采样点来收集校准信息。

假设LCD显示器上的对应点可以通过触摸屏上的点转换得到,只需3个采样点就可得到校准数据。从图3中这3个采样点可获得足够的信息来建立并求解这一联立方程组。

2.3采用3点校准法校准屏幕坐标

由于电阻式触摸屏的电压成线性均匀分布,因此A/D 转换后的坐标也成线性,基于此原理,下面给出3点校准法的基本思想。

如果已知触摸屏上一点A,其触摸屏坐标为(X,Y),希望相应的显示坐标为(XD,YD),根据假定的线性关系,得到:

XD=AX+BY+C

YD=DX+EY+F

为了求得对应的6个常数A、B、C、D、E、F, 需要选取3个采样点来收集校准信息。取LCD坐标分别为(20,20),(620,20),(620,460)的3个点,可列出以下非冗余方程式:

XD0=AX0+BY0+C

XD1=AX1+BY1+C

XD2=AX2+BY2+C

YD0=DX0+EY0+F

YD1=DX1+EY1+F

YD2=DX2+EY2+F

通过以上方程式,即可求解出对应的6个常数。

校准步骤为:

1)在坐标(XD0,YD0)中画出第1个目标。

2)收集从触摸屏中返回的数据,并存储在坐标(X0,Y0)中。

3)在坐标(XD1,YD1)中画出第2个目标。

4)收集从触摸屏中返回的数据,并存储在坐标(X1,Y1)中。

5)在坐标(XD2,YD2)中画出第3个目标。

6)收集从触摸屏中返回的数据,并存储在坐标(X2,Y2)中。

上述联立方程组的未知量已求解出,此处不再推导。直接跳过中间步骤得出最后结论,将K作为各方程式的公分母,便可得出未知量:

k=(x0-x2)*(y1-y2)-(x1-x2)*(y0-y2);

A=((XD0-XD2)*(y1-y2)-(XD1-XD2)*(y0-y2))/k;

B=((x0-x2)*(XD1-XD2)- (XD1-XD2)*(y0-y2))/k;

C=(y0*(x2*XD1-x1*XD2)+y1*(x0*XD2-x2*XD0)+y2*(x1*XD0-x0*XD1))/k;

D=((YD0-YD2)*(y1-y2)-(YD1-YD2)*(y0-y2))/k;

E=((x0-x2)*(YD1-YD2)-(YD0-YD2)*(x1-x2))/k;

F=(y0*(x2*YD1-x1*YD2)+y1*(x0*YD2-x2*YD0)+y2*(x1*YD0-x0*YD0))/k;

根据概算法思路,可较准确地求出触摸屏任意点的LCD坐标值。

2.4鼠标追随算法实现

1)Framebuffer原理。

Framebuffer (帧缓冲)是Linux内核的一种图形设备驱动接口,提供了LCD控制器的抽象性描述。它将LCD控制器上的显存抽象成一种字符设备,应用程序通过定义好的接口可以访问LCD控制器的显存,直接对显示缓冲区进行read/write操作,而不需要知道底层的任何细节。

事实上,帧缓冲只是一块显示缓冲区,向这个显示缓冲区中写入特定格式的数据就意味着更新显示屏的输出。帧缓冲与显示屏上的点存在着映射关系,显示屏上的每个点都与缓冲区某个特定的位置相关联,向帧缓冲设备写入数据就相当于改变显示屏显示的相关信息[11-13]。

2)Framebuffer实现画线。

在计算映射缓冲区之前,需要知道固定显示屏信息和可变显示屏信息。其中,固定显示屏信息由硬件和驱动决定;可变显示屏信息由硬件的当前状态决定。通常在程序中使用ioctl()函数来查询帧缓冲设备信息。需要用到的数据结构主要分为以下2种:

struct fb_var_screeninfo vinfo; //存储可变显示屏信息。

struct fb_fix_screeninfo finfo; //存储固定显示屏信息。

其中,可变显示屏信息使用FBIOGET_VSCREENINFO通过ioctl()函数获得。得到显示屏相关信息后,使用内存映射(mmap)将帧缓冲设备中的显示缓存区映射到进程中的一段虚拟地址空间,然后通过读写这一块虚拟地址来访问显示缓冲区,实现在显示屏上绘图画线等操作。

帧缓冲基本使用步骤如下:

1) 计算需要映射的内存大小。

2) 映射内存。

3) 获取手指触摸坐标。

4) 根据触摸坐标利用Framebuffer显示轨迹。

3 调试运行

加载Linux系统完成后,可以执行Linux系统命令,驱动触摸屏设备用手指在触摸屏上划线并在LCD显示屏上显示。

文件系统加载完成后,挂载nfs文件系统,调试过程如下:

# mount 192.168.1.180:/tftpboot /mnt/nfs

# cd /mnt/nfs

# ./3

即可在实验箱上看到实验结果。

在触摸屏上划线时,应尽量用大一点的力量来画线,因为本次设计使用的实验箱配置的是电阻式触摸屏,必须用足够的力量点击触摸,才能使电阻式触摸屏2层导电层完全接触,从而减小实际画线位置和LCD显示画线位置的误差。程序执行效果图如图4所示。

图4 程序执行效果图

4 结束语

触摸屏手指追随的设计完成以后,还完成了触摸屏的校准,但仍然存在一些边缘误差,即取得的触摸屏坐标和LCD的坐标仍然存在较小的偏差。如果采用Ts_lib包自带的Ts_calibrate来校准触摸屏,则可进一步准确校准。

[1] 马忠梅,祝烈煌,李善平,等.ARM & Linux嵌入式系统教程[M].北京:北京航空航天大学出版社,2008:8-238.

[2] 潘巨龙,黄宁,姚伏天,等.ARM9嵌入式Linux系统构建与应用[M].北京:北京航空航天大学出版社,2006:8-156.

[3] 马忠梅,徐英慧.ARM嵌入式处理器结构应用基础[M].北京:清华大学出版社,2003:5-182.

[4] 王丁,闫瑶,张廷宇.触摸屏校准的一种通用算法[J].自动化技术与应用,2008,27(2):116-118.

[5] 徐杨,乔卫民,赵中.基于AT91RM9200 的触摸屏驱动及三点校正算法[J].微计算机信息,2007,2(2):73-74.

[6] 陆启帅.基于嵌入式LINUX车载多媒体控制终端设计[D].宜昌:三峡大学,2007.

[7] 谭翀.电阻式触摸屏校准算法的研究与设计[J].嵌入式系统应用,2010,6(2):35-37.

[8] 吴凌云.基于ARM9的Windows Embedded CE 6.0应用开发[D].云南:云南大学,2011.

[9] 王永利.基于Android平台的电阻式触摸屏校准算法的研究与实现[D].北京:北京交通大学,2012.

[10] 罗勇刚,夏定纯.电阻式触摸屏的校准与应用研究[J].武汉科技学院学报,2007,25(12):47-49.

[11] 许荣斌,谢莹,朱永红.触摸屏校准常用算法分析[J].工业控制计算机,2006,19(4):77-79.

[12] 杨伟钧,戴青云,张辉,等.基于STC单片机的触摸屏五点校准算法设计与实现[J].仪器仪表用户,2008,15(3):79-81.

[13] 李玉波,朱自强,郭军.Linux C编程[M].北京:清华大学出版社,2005:78-79.

(责任编辑桂堤)

Design of Application Programming of Touch-screen Handwriting Based on S3C2410

GaoQin,LiuZuodong

(School of Computer Science, Hubei Polytechnic University,Huangshi Hubei 435003)

As a new electronic input device,the touch screen technology has been gained popularity in various fields.Touch screen with its simple,natural human-computer interaction,has been widely used in industrial process control,public information consultation,finance and securities trading market,household appliances and many other fields.This paper describes the application of touchscreen based on S3C2410,introduces the principles and structure of touchscreen,its application in the embedded system and configuration in the embedded file system configuration,LCD and touch screen.Three-point calibration method is expounded and the algorithm is implemented by using framebuffer to realize touchscreen's finger follow based on S3C2410.

embedded;LCD;touchscreen;framebuffer;finger follow

2013-09-09

湖北理工学院校级科研项目(项目编号12xjz41Q);湖北省大学生创新创业训练计划项目(项目编号20130920019)。

高芹(1980— ),女,讲师,硕士。

10.3969/j.issn.2095-4565.2014.01.010

TP368.1

A

2095-4565(2014)01-0039-05

猜你喜欢
内核显示屏触摸屏
一块布就是一个显示屏?
强化『高新』内核 打造农业『硅谷』
PLC和触摸屏在卫生间控制系统的应用
苍蝇迷恋显示屏
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
浅析投射式多点触控电容触摸屏
皮肤“长”出触摸屏
微生物内核 生态型农资
未来五年LED显示屏出货将保持16%增长