基于VxWorks操作系统的触摸屏驱动实现

2013-11-10 06:18
关键词:描述符控制板驱动程序

冯 宁 , 戈 亮

(中海船研科技股份有限公司研究开发部,上海200135)

0 引 言

随着电子技术的不断进步,人机交互方式也在不断地演变和进化,这种改变又潜移默化影响着我们的生活方式。最初人们操作电脑只能选择键盘和鼠标;近十年来,采用电阻式触摸屏的单点触控技术被广泛应用于日常生活中,比如手机、数码相机、银行柜员机和地铁售票机等自助终端;最近几年,采用电容式触摸屏的多点触控技术在智能手机和平板电脑领域大行其道,用手指来滑动屏幕、用两指放大显示区域等交互方式已深入人心。

以前在船舶自动化领域中很少使用触摸屏,主要是考虑到触摸屏在恶劣环境下的环境适应性和使用寿命问题,并担心无意地触碰到触摸屏将导致误操作。随着电子技术的发展,电阻式触摸屏的可靠性和使用寿命不断地提高,在船舶自动化领域中采用触摸屏技术的终端设备逐渐增多。根据用户提出的新需求,上海船舶运输科学研究所已有的一款操作显示单元需要增加触摸功能,该款操作显示单元的主板采用X86架构的Pentium M级处理器,支持Windows XP和VxWorks操作系统,限于主板已有的空闲接口资源,选择了一款USB(Universal Serial BUS)接口的PenMount 6300触摸控制板,并在液晶显示屏上增加了1层4线制电阻式触摸面板AMT9509(见图1)。

图1 操作显示单元触摸硬件示意图

PenMount 6300触摸控制板的核心是PenMount 6000控制芯片,可以连接4/8线制或5线制的电阻式触摸面板,并广泛支持各种版本的Windows、WinCE、Linux、QNX等操作系统,唯独没有提供VxWorks操作系统的驱动程序。

1 操作系统对触摸屏的支持

VxWorks操作系统由美国风河公司(Wind River System)推出,具有高性能、可剪裁、强实时等优点,以其良好的可靠性和卓越的实时性被广泛地应用在通讯、军事、航空、航天等高尖技术及实时性要求极高的领域中。WindML(Wind Media Library)是风河公司为VxWorks提供的多媒体库,它具有良好的软件独立性和可移植性,能够在保证VxWorks操作系统实时性的同时,为用户提供基本的图形、视频、音频驱动和应用程序接口,对于鼠标、键盘、触摸屏等人机接口设备还提供了面向事件的消息处理机制。

适用于VxWorks 5.5操作系统的多媒体库版本为WindML 3.0,能够支持PS-2、RS232、USB接口的鼠标和键盘输入设备,触摸屏和鼠标同为Pointer类输入设备,Pointer类输入设备又分为相对坐标指示器(例如鼠标)和绝对坐标指示器(例如触摸屏)。由于风河公司提供的WindML文档没有涉及触摸屏驱动程序开发的内容,因此只能采取读源代码的方式,通过分析和研究WindML自带的Pointer类设备驱动,得到了如图2所示的触摸屏驱动程序框架。

图2 触摸屏驱动程序框架

1.要从最底层实现1个字符设备驱动,类比于USB鼠标的底层驱动“usbMouseLib.c”、RS232微软鼠标的底层驱动“st16552Sio.c”,它们的作用是控制主机端的各种接口芯片实现与Pointer类外设的数据传输,这些字符设备驱动在I/O文件系统中注册,并向上层提供标准的读写函数接口。对于USB接口的触摸屏驱动,首先要实现1个USB HID类设备驱动,它能够管理PenMount 6300触摸控制板的热插拔,建立连接后可以在shell中用“devs”命令查看到PenMount 6300对应的设备名“/usbPm/0”。

2.在倒数第3层需要实现WindML接口驱动,类比于USB鼠标的接口驱动“uglusb.c”和RS232微软鼠标的接口驱动“uglms.c”,它们向下调用字符设备驱动获取触摸屏数据报文,向上将被WindML消息引擎调用抛出触摸屏消息。

3.为了能够使用“WindML Configuration”工具剪裁WindML接口驱动,还需要改写原有的输入设备组建配置文件,将新开发的触摸屏驱动添加到Pointer类设备配置选项中。

2 触摸控制板通信协议

参考台湾原厂提供的PenMount 6000控制芯片通信协议[3],并采用BusHound5.0抓包软件在Windows XP下截获的PenMount 6300触摸屏控制板通信报文,得到了完整的通信协议。

当PenMount 6300接入计算机的USB接口,Windows XP操作系统自动启动枚举流程:获取设备描述符(版本USB1.1,厂商号0x14e1,设备号0x6000)、获取配置描述符(总线供电最大500mA)、获取接口描述符(具有2个端点,类代码0x03,子类代码0x00,协议代码0x00)、获取端点描述符(1个中断传输输入端点,最大包长度5 Byte,查询间隔1ms;1个中断传输输出端点,最大包长度5 Byte,查询间隔1ms)、获取HID描述符和报告描述符(A/D分辨率10位),枚举过程结束后建立连接。

建立连接后用触摸笔点击触摸面板,PenMount 6300将通过输入端点上传数据报文(见图3),数据报文按照小端字节序发送。第1个Byte表示触摸笔的状态;后4个 Byte包含触摸笔点击位置的坐标值,触摸板左上角坐标值(0,0),右下角坐标值(1023,1023)。

图3 输入端点报文格式

此外,PenMount 6300的输出端点还能够接收来自USB主机端的5 Byte命令报文,USB主机发送命令报文可以停止控制器、启动控制器、获取A/D分辨率、获取固件版本号、读/写/清空非易失存储单元(共512 Byte),触摸控制板将回送应答报文并执行相应的操作。

3 USB驱动程序实现

PenMount 6300触摸控制板的USB驱动程序,准确地说是1个USB HID(Human Interface Device)类设备驱动,它包括2个源文件和1个头文件:“usbPenmountLib.c”实现最低层的协议栈注册、热插拔的动态管理和数据收发;“usrUsbPmtInit.c”则实现与I/O文件系统的接口,支持所有标准字符设备驱动的函数接口。

USB HID类设备驱动的开发,可以参考VxWorks 5.5自带的USB接口鼠标、键盘驱动程序,USB驱动程序开发设计很多内容。

1.USB驱动程序的运行,需要有VxWorks USB主机协议栈[1]的支撑,因此在剪裁VxWorks操作系统镜像的时候,必须包含“USB Host Stack”和“UHCI”相关组件。

2.由于USB接口的鼠标、键盘其子类代码为0x01,属于引导接口设备,遵循引导协议。X86架构处理器在BIOS引导过程中已经做了大量的工作,因此VxWorks 5.5自带的USB鼠标、键盘驱动只需实现最简化版的枚举过程。然而,对于非引导接口设备(如PenMount 6300的子类代码是0x00),仅请求1次配置描述符是不足以完成枚举过程的,必须严格遵照USB HID类设备规范进行枚举,在configureSioChan()函数中顺序实现如下流程:获取设备描述符并解析、获取配置描述符并解析、获取接口描述符并解析、获取端点描述符并解析、设置总线供电方式和最大电流、设置接口参数、获取HID描述符和报告描述符、创建1个中断传输输入管道和1个中断传输输出管道、初始化IRP并返回。

2.在I/O文件系统接口方面,对应于1个中断传输输入端点,需要实现1个标准的usbPmtRead()函数接口;对应于1个中断传输输出端点,为了分辨不同的操作命令字,将其设计在usbPmtIoctl()函数中实现,通过不同的控制字实现对PenMount 6300命令报文的下发。

4.需要特别注意的是USB驱动程序为了能够支持WindML消息引擎(在uglInput.c源文件中实现)的异步调用,必须实现usbPmtIoctl()函数中FIOSELECT控制字的功能代码,从而配合WindML消息引擎的异步查询操作方式。

PenMount 6300触摸控制板的USB驱动程序开发完成后,可以编写1个独立测试程序,包含驱动程序的2个源文件和1个头文件,编译镜像文件并下载运行,测试PenMount 6300热插拔检测功能是否正确,用“devs”命令是否能看到挂载设备的名称“/usbPm/0”,通过调用I/O文件系统标准的open()、close()、read()、write()函数测试USB驱动程序的功能。

4 WindML接口驱动程序实现

要实现PenMount 6300触摸控制板的WindML接口驱动,可以参考WindML自带的两个触摸屏驱动“assabet”和“wrsbcpxa250”,经过对比发现这两个触摸屏驱动结构完全相同,它们都包含3个函数:uglXxxT-sOpen(),uglXxxTsClose()和 uglXxxTsControl()。

1.在uglXxxTsOpen()函数中,首先为触摸屏设备数据结构分配内存空间;而后透过I/O文件系统打开最底层的字符设备驱动;最后用默认数据填写触摸屏设备数据结构。在该函数中调用标准open()函数打开的字符设备名称“pDevName”,对应于在WindML配置工具中选定Pointer类设备类型后填写在“Name:”文本框中的字符串。

2.在uglXxxTsClose()函数中做清理工作,首先透过I/O文件系统关闭最底层的字符设备驱动;而后释放为触摸屏设备数据结构分配的内存空间。

3.uglXxxTsControl()函数类似于VxWorks标准驱动中的 xxxIoctl()函数,采用分支结构处理各种WindML定义的控制字:响应ICR_READ控制字的代码,实现从最底层的字符设备驱动读取触摸屏外设数据报文,从中解析触摸屏状态(按下/抬起),并计算出绝对坐标数值,将其填写到Msg消息数据结构后,调用uglInputMsgPost()函数抛出触摸屏消息;能够响应ICR_GET_PTR_TYPE控制字,返回触摸屏驱动的绝对定位类型。

所实现的PenMount 6300触摸控制板WindML接口驱动,是在“assabet”触摸屏驱动的基础上进行移植的,修改了触摸屏设备数据结构和一些宏定义,并按照PenMount 6300的通讯协议修改了解析数据报文和计算绝对坐标的相关代码。

5 输入设备组件配置文件

在安装了VxWorks 5.5 for Pentium光盘后,虽然在“ argetsrcugldriverpointer”目录下会自动拷贝“assabet”驱动,但是在WindML配置对话框的Pointer类设备中却找不到任何触摸屏选项(“assabet”驱动专属于XScale架构)。因此需要修改“host esourcewindMLconfigdatabase”目录下的组件配置文件“windML_INPUT_DB.cfg”,在其中加入如下脚本:

再次打开WindML配置对话框,将看到如图4所示的“Penmount6300 Touch Screen”选项,设备名将自动填写为“/usbPm/0”,保存配置结果并重新编译,“uglabtts.c”将被编译到最后生成的“wndml.o”库文件中。

图4 触摸屏驱动的剪裁

6 结 语

为了给上海船舶运输科学研究所已有操作显示单元模块增加单点触控功能,选择了市场占有率较高的PenMount 6300触摸控制板解决方案,在缺乏相关文档和文献的情况下,通过分析和研究WindML自带的Pointer类设备驱动程序,总结出触摸屏驱动程序的开发方法,针对PenMount 6300开发了USB驱动程序、WindML接口驱动程序和输入设备组件配置文件,全面实现了对VxWorks操作系统下触控应用程序开发的支持。

[1] W ind River Syslems.USB developer's kit programmer's guide [ M].USA:Wind River Systems,2003.

[2] W ind River Syslems.WindML SDK programmer's guide[M].USA:Wind River Systems,2002.

[3] S alt International Corp.Device driver development manual penMount 6000 controller V1.0[M].中国台湾:Salt International Corp.,2009.

猜你喜欢
描述符控制板驱动程序
基于AKAZE的BOLD掩码描述符的匹配算法的研究
欧洲共同语言参考标准在中国高校学术英语写作教学适用性的研究:可理解性,可行性和有用性
阻止Windows Update更新驱动程序
轨道交通AFC导向标识控制板设计
基于深度学习的局部描述符
计算机硬件设备驱动程序分析
一种基于PCIE总线的改进分散集聚DMA的设计
一种集成脚本控制单元的设计与实现
一种全隔离的无刷直流电机的反馈制动控制板的研究
一种机载SAR中心控制板的设计