新闻中心

EEPW首页 > 设计应用 > 汉王手写芯片的触摸屏控制器应用设计

汉王手写芯片的触摸屏控制器应用设计

作者:北京大学 杨自锋 赵建业时间:2007-11-07来源:中电网

引言

在PDA和中高端手机等手持设备中,已经成为一种比较常用的输入设备,用户可以通过在上的点击和写划完成与手持设备的交互。此外,由于基于的中文手写输入法更符合我国各个文化层次的人使用,因此越来越多地出现在时下流行的各种手持设备中。大多数中文手写输入法完全由软件来实现,将输入法界面程序和后台识别算法集成到一起。其好处是不改变系统的硬件结构,而且便于升级;然而,使用商用的手写识别算法,较为高昂的费用和繁重的移植工作,会大大增加开发成本和延长开发周期。若使用开源的手写识别源代码(如kanjipad)进行移植开发,则一方面涉及移植的工作量问题,另一方面识别率比较低。针对以上这些由软件实现中文手写输入法所带来的一系列问题,本文提出一种在“PXA255微处理器+Linux+Qtopia图形界面”上由HW006同时实现中文手写输入及触摸屏控制的设计方案。该方案有以下几个优点:

◇ 软件方面将触摸屏驱动和手写识别的工作合二为一。
◇ 完全在用户空间实现触摸屏的驱动,减少了硬件平台的依赖性,降低了驱动设计的难度,分层的驱动设计思想也不会破坏原有程序的完整性。
◇ 硬件方面,省去了专用的触摸屏,降低了成本。
因此,该方案在工作量、成本、难度方面均有着明显的优势,从而大大缩短了开发周期,增强了实用性。

1  HW006简介

HW006是一款汉王手写,它内置了触摸屏控制电路和对外的UART接口,同时提供了灵活的控制命令接口,可以满足触摸屏分离型、触摸屏一体型等不同情况下的各种应用需求。

1.1  HW006主要功能

◇ 支持6 763个简体中文(GB2312)、52个英文大小写字母、10个数字、12个常用符号的手写识别输入,并可自由组合,设置识别范围;
◇ 支持点击模式、手写模式和混合模式;
◇ 内嵌触摸屏控制硬件和软件,可直接与触摸屏相连接;
◇ 支持异步串行通信接口(UART),通信波特率可设置,便于与各种CPU进行通信;
◇ 在手写状态下,识别参数可设置。
可见,HW006完全可以实现预想的功能。根据实际需要,选用混合模式。

1.2  HW006的通信协议

HW006为从设备,主设备对该芯片发送控制命令,HW006可以执行相应的功能。

(1) 主设备向手写芯片发送命令

格式如下:

本文引用地址:http://www.eepw.com.cn/article/71389.htm

(2)  手写芯片向主设备发送数据

这里主要介绍混合模式下的数据格式,如下:

在混合模式下,手写芯片先发送轨迹坐标,属性表示该点的状态:0x00,落笔;0x05,移笔;0x0f,抬笔。EOF表示发送轨迹结束标志,其值为0xff。之后发送识别字的编码,低字节在前,高字节在后。

1.3  命令码的简单介绍

对HW006进行操作控制的主要命令码如表1所列。

表1  HW006的主要命令码

2  硬件框图以及通信格式简介

硬件框图如图1所示。

图1  硬件框图

UART通信格式: 上电默认波特率,9 600 bps;数据位,8位;校验位,无;停止位,1位;先低位后高位。触摸屏采用了4线电阻屏,在触摸屏与HW006连线处,需要加上滤波电容。

上电初始化时,默认工作模式为点击模式。用户可根据应用需要,设置相应工作模式。使用混合模式时必须通过UART给系统发送4个数据X1、Y1、X2、Y2,以确定矩形手写区域的范围。

3  手写输入法及触摸屏驱动的实现

选用的图形界面系统Qtopia是由Trolltech公司所开发的专门用于嵌入式Linux操作系统电子设备的应用平台,这里使用开放源代码的Qtopia PDA版。它具有可定制的用户界面和集成的组件,其组件包括窗口操作界面、游戏和多媒体、PIM应用程序、输入法、本地化支持和无线支持等。对于输入法,它提供了一系列的通用API,便于开发用户自己的输入法。

Qtopia软件平台可分为4个层次,如图2所示。

图2  Qtopia软件平台层次结构

其中在Qt/Embedded层提供了触摸屏的API,在Qtopia层提供了输入法的API。需要完成的工作: ①  在Linux层编写触摸屏库,提供给Qt/Embedded层调用;②  改写Qt/Embedded层的触摸屏API;③  在Qtopia层利用输入法API完成手写输入法的手写和识别字的界面。下面详细介绍以上步骤。  

3.1  在Linux层编写触摸屏库

主要是提供设置HW006工作模式、读/写HW006数据以及对读到的数据进行发送的接口函数,最终编译成动态链接库,可供上层的应用程序调用。主要的接口函数及程序的主要代码如下:

(1)  打开串口
int *ts_open(const char * device) {

*fd=open(device,O_RDWR| O_NONBLOCK);  
if ( (*fd) < 0 ){
printf(open error!\n);
return NULL;
}
return fd;
}

(2)  设置HW006的混合工作模式
void ts_config(int* fd) {

write(*fd,&SET_96,2); //设置HW006波特率为9600bps
write(*fd,&SET_X1,2);
write(*fd,&SET_Y1,2);
write(*fd,&SET_X2,2);
write(*fd,&SET_Y2,2);//设置手写区域4个角的坐标
write(*fd,&WAIT_T,2);//设置汉字识别等待时间
write(*fd,&REG_SCOPE,2);//设置识别范围
write(*fd,&REG_CAN,2);//设置识别字候选个数

}

(3)  读串口
int ts_read(int *fd,unsigned char *buf) {
int res;
res=read(*fd,buf,3);
return res;
}

(4) 发送到有名管道
void sendFifo(unsigned char* buf,int i) {

fd=open(/dev/myfifo,O_WRONLY | O_NONBLOCK);
write(fd,buf,i);
close(fd);
}

3.2  改写Qt/Embedded层的触摸屏API

对读到的原始数据进行处理,包括变换、校正、分发等。Qt/Embedded中提供触摸屏API的文件是qwsmouse_qws.cpp,其中的类QCalibratedMouseHandler实现了对触摸屏数据的读取及其处理。本文所用的HW006是8位的,而分辨率是640



评论

技术专区

关闭