QT 触摸屏 驱动

:本文主要介绍了在嵌入式 Linux 系统下基于 Qt/Embeded 的触摸屏驱动的设计,通过对 Linux 设备 驱动和Qt/Embedded设备驱动接口的工作原理和机制介绍,并结合大量源代码进行分析,提出了基于Qt/Embeded 的触摸屏驱动的开发方案。Linux 下的设备驱动基础
   Linux 系统主要将设备分成 3 种类型:字符设备、 块设备和网络接口。每个模块通常实现其中一种类型,相应的模块可分为字符模块、块模块和网络模块 3 种。然而这种分类方式并不是非常严格,程序员可以构造一个大的模块,在其中实现不同类型的设备驱动程序。为了实现良好的伸缩性和扩展性,通常还要为每个功能创建一个不同的模块。
   字符设备是能够像字节流一样被访问的设备,由字符设备驱动程序来实现这种特性。它通常至少 需要实现 open、close、read 和 write 系统调用。字 符设备可以通过文件系统节点来访问,比如字符终 端(/dev/console)和串口(/dev/ttyS0)就是字符 设备的例子。块设备也是通过/dev 目录下的文件系统节点被访 问的。块设备能够容纳文件系统。Linux 允许应用程序像字符设备那样读写块设备,可以一次传递任意多字节的数据。因此,块设备与字符设备的区别仅仅在于内核内部管理数据的方式。也就是内核和驱动程序的接口不同。另外,块设备的接口必须支持挂装文件系统。
   网络接口是一个能够和其他主机交换数据的设备。 它由内核中的网络子系统驱动,负责发送和接收数据包,它无须了解每项事务是如何映射到实际传输的数据包的。
   Linux 中还存在其他类型的驱动程序模块,这些模块利用内核提供的公共服务来处理特定类型的设备。 因此我们能够和通用串行总线(USB)模块、串口模块等通信。
   在本系统中,控制器将触摸屏采集的原始电压信号通过专用 A/D 转换为坐标数据,经过 RS-232 总线传送给嵌入式系统(见图 2)。Linux 系统利用内核提供的串口模块来处理触摸屏设备,将该设备以文件/dev/ttyS0 的形式存放在/dev 目录下,提供了 open、read、write、close 等系统调用。我们只需像操作普通 数据文件一样对串口设备进行操作,将触摸屏的坐标 数据送往上层的 Qt/Embedded 应用层。

3 、Qt 下触摸屏的驱动
   Qt/Embedded 中与用户输入事件相关的信号,是 建立在对底层输入设备的接口调用之上的,一般通过 对设备文件的 I/O 读写来实现。大部分这样的驱动程序已经被封装进 Qt 库当中,形成了相应的设备驱动接口,如显示卡驱动、鼠标、键盘、串口和并口等。其中鼠标设备的抽象基类为 QWSMouse Handler,从 该类又重新派生出一些具体的鼠标类设备的实现类。在 3.3.4 版本系列的 Qt/Embedded 中,鼠标类设备的派生结构如图 3 所示。

图 3 鼠标类设备的派生结构图(灰色线框表示可省略类结构)

   鼠标类设备的加载方式与 KeyBoard 设备加载方 式是类似的,在系统构造 QWSServer 对象时,调用成 员函数 QWSServer:: openMouse,程序在QWSServer:: openMouse 函数中再调用QmouseDriverFactory::create () 或QmouseDriverPlugin:: create ()。该函数根据 Linux 系统的环境变量QWS_MOUSE_PROTO获得鼠标类设备的设备类型和设备节点。打开并返回相应设备的基类指针 QWSMouseHandler 给系统,系统通过操作该基类派生出的具体子类设备指针QWSCustomMouseHandler,获得对具体鼠标类设备的调用操作(见图 4)。
  
图 4 软件流程图

   触摸屏和鼠标类设备在功能上基本是一致的,因 此,在 Qt 库中一般把触摸屏模拟成鼠标设备来实现 对触摸屏设备的操作。但由于触摸屏和鼠标底层接口并不一样,会造成对上层接口的不一致。例如,从鼠 标驱动接口中几乎不会得到绝对位置信息,一般只会 读到相对移动量。另外,鼠标的移动加速度也需要考虑在内,而触摸屏接口则几乎是清一色的绝对位置信 息和压力信息。针对此类差别,Qt/Embedded 将同一类设备的接口部分也给予区别和抽象,具体实现在 QmouseDriverInterface 类中。
   在本系统中,Linux 系统从 COM1 口读入触摸屏
的坐标数据,但由于与触摸屏的底层接口并不一致,需通过添加 QWSCustomMouseHandler 程序接口类来实现对触摸屏的控制。查看Qt/Embedded源代码qwsmouselinuxtp_qws.cpp 和 qwsmousevr41xx_qws.cpp,可知 Qt 提供了 linuxtp 和 vr41xx 触摸屏的驱动接口类。如果使用的就是这两种触摸屏接口,可直接在执行 Qt 的 configure 配置时加入配置选项-qt-mouse-<driver>。由于我们的触摸屏并非以上两种,因此需添加驱动接口。
   由前面鼠标设备驱动类的派生结构可知,添加驱 动接口先要通过调用QmouseDriverFactory或QmouseDriverPlugin 类根据相应的设备名生成相对应的 QWSCustomMouseHandler 对象,这些具体的设备驱动 接口类都是由 QWSMouseHandler 类派生出来的,都 继承了 QWSMouseHandler 类。然后再由系统调用QWSCustomMouseHandler:: readMouseData (),获取到的触摸屏定位和状态信息都直接送到鼠标设备驱动类的抽象层 QWSMouseHandler 类,Qt/Embedded 通过 QWSMouseHandler 类来实现对鼠标设备的操作。
   可以通过两种方式添加设备驱动接口类,一种是 通过调用 QmouseDriverFactory 生成相应的 QWSCustomMouseHandler,一种是由 QmouseDriverPlugin 添 加生成相应的 QWSCustomMouseHandler。我们采用第 一种方案,在原有的接口 qwsmouselinuxtp_qws.cpp 上 进行修改,以适合新的触摸屏设备驱动接口。
   首先,我们在 qwsmouselinuxtp_qws.cpp 修改,先 把 TS_EVENT 的结构改为相应设备的数据结构,再把 QWSLinuxTPMouseHandlerPrivate 函数中打开的设备 文件节点由/dev/ts 改为自己的设备文件/dev/ttyS1。然 后修改 readMouseData()函数,按自己的数据结构 读取设备文件,传递给 QPoint 类对鼠标进行定位或转 换为鼠标按键状态。这个函数的操作可以参照windows 下的鼠标驱动源代码。
   其实这样修改以后,已经能正常使用触摸屏设备 了,但是为了在该系统平台上同时使用鼠标和触摸屏 操作还必须完成两个步骤:一个是要正确的设置QWS_ MOUSE_PROTO 环境变量,阅读 qwindowsystem_ qws.cpp 中 QWSServer:: openMouse () 函数可知,该环 境变量可同时设置多个设备<Driver> [: <Device>],多个设备之间以空格隔开,由此可设置 QWS_MOUSE_PROTO="Auto LinuxTP", Qt/Embedded 通过该环境变量生成相应的鼠标和触摸屏驱动接口,对设备进行操作。然后再对Qt/Embedded的鼠标驱动接口类的源代码进行修改。由于触摸屏是采用了系统的串口,而Qt/Embedded 自动搜索鼠标接口时发现串口正在工作中,就会把它当作一个鼠标设备进行操作,这就发生了设备冲突。因此,我们要在 qmousepc_qws.cpp 文件中将串口鼠标的子驱动去掉,找到函数 QWSPcMouseHandlerPrivate:: openDevices () 中的代码如下,把它注释掉就行了。
else if (driver=="Microsoft") {
   QString dev=device.isEmpty()? QString("/dev/ttyS0") : device;
   fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
if ( fd >= 0 )
   sub[nsub++] = newQWSPcMouseSubHandler_ms(fd);
} else if (driver=="MouseSystems"){
   QStringdev=device.isEmpty()?QString("/dev/ttyS0"). : device;
   fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
   if ( fd >= 0 ) sub[nsub++] = new QWSPcMouseSubHandler_mous esystems (fd);
}

关于触摸屏的校准,阅读 qwsmouselinuxtp_qws.h 文件(代码如下),可知在QWSMouseLinuxTPHandler 中已经实现了坐标的校准,一般直接读取坐标的位置 和状态即可。
class QWSLinuxTPMouseHandler:
      public QWSCalibratedMouseHandler
{
};
   最后只需要在配置 Qt/Embedded 的安装configure 加入选项-qt-mouse-<linuxtp>,重新编译,该 Qt/Embedded平台上的应用程序即能够按照定制的要求提供对触摸屏的支持

时间: 2025-01-25 04:52:07

QT 触摸屏 驱动的相关文章

linux-s5pv210电热屏触摸屏驱动移植问题

问题描述 s5pv210电热屏触摸屏驱动移植问题 找了一个别人都能用的s5pv210驱动,然后我把驱动编译进内核,放在/drivers/input/touchscreen下,然后增加i2c设备出现错误.移植好tslib后,开发板dev下没有event0之类的../ts_test,no such file....../ts_c....., ts_open:no such file.......怎么办啊? 解决方案 电容屏,内核是linux3.0.8 解决方案二: 好有前途的embeded,就是喜欢

qt 连接硬件 驱动连接操作

问题描述 qt 连接硬件 驱动连接操作 跪求 QT 驱动连接实例,例如用QT写的窗口软件点击某一按钮可以启动摄像头!新手一枚,跪求大神围观! 解决方案 http://blog.csdn.net/liang19890820/article/details/12782531http://www.oschina.net/code/snippet_124925_3789

AM335x(TQ335x)学习笔记——触摸屏驱动编写

前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱动源码,单纯的配置DTS是无法完成TQ335x的触摸驱动移植工作的,因此,本文参考内核中原有的pixcir_i2c_ts驱动编写TQ335x的触摸屏(TN92)驱动. 在之前移植TQ210时,我已经编写过TQ210的触摸屏驱动,我的TQ335x还是使用的TQ210的屏,因此,难度不是很大.这里需要说

Linux触摸屏驱动测试程序范例【转】

转自:http://blog.sina.com.cn/s/blog_4b4b54da0102viyl.html 转载2015-05-09 16:28:27 标签:androiditlinux 触摸屏驱动测试 由于mini2440的触摸屏驱动是基于input子系统的,而input子系统给用户层提供的是input_event结构体,我们主要是在应用层接收这个结构体,然后对其类型进行分类,取出我们需要的数值. struct input_event { struct timeval time;     

四线电阻式触摸屏驱动的优化

      触摸屏在电子产品中用得越来越多,其技术也在不断发展.目前常见的有电阻式.电容式.红外式和表面声波式等几大类,其中电阻式最为普遍.最近在WinCE下调试了一款四线电阻式的触摸屏驱动,利用检测触摸压力的方法实现了动态调整触摸屏的灵敏度.       一般的嵌入式处理器中会有几个通道的AD,通常有四个通道用于连接触摸屏的XP.XM.YP和YM.如果MCU 没有Touch Screen Interface,可以选择如TSC2003一类的触摸屏控制器芯片.MCU可通过IIC总线与其通讯,以得到

调试四线电阻式触摸屏驱动的注意点

      在<四线电阻式触摸屏驱动的优化>基础之上,针对手写输入的灵敏度参数过低又做了一些调整,比原来有所改善,如下图所示,现在能达到72/s.一般以正常速度手写时为60/s左右,所以应该能满足绝大多数的需求了.               CPU占用率比原来略有升高,如下图所示.             总的来说,调试触摸屏驱动时需要考虑如下三个问题:       连笔快速书写时是否流畅.笔迹是否圆滑       轻按时是否有抖动或者跳笔       点击触屏和滑动时CPU的使用率    

关于编译Qt以及驱动的一点总结吧

通过这几次的折腾,对编译Qt算是有一点的心得吧: 首先我们编译QT的时候需要面对的是下载源代码,一般情况下我们建议下载qt-everywhere-opensource-src-4.8.2.zip这种形式的源代码.这样编译起来的问题也就很少了.当然如果人品不行的话,还是会出现很多的问题的. 其次是选择动态编译还是静态编译,默认是动态的,我之前一直打算采用静态编译的,这样分发程序的时候很简单,但是在静态编译的时候出现许多的问题,导致我来来回回编译了几次. 关于静态编译请参看:这篇文章 文章中是使用v

QT图形驱动加速器

在QT嵌入式Linux版本中,painting是一个纯软件实现,分两步:首先,每个窗口使用QPaintEngine在QWSWindowSurface画图,然后,服务器程序将内存中内容写入显示器中.嵌入式Linux版本QT使用QRasterPaintEngine来实现painting操作,利用QScreen来实现window composition 为了实现加速,嵌入式版本进行如下操作:1.建立定制显示屏2.实现定制Raster Paint Engine3.让Paint Device检测到Pain

Linux内核触摸屏驱动--多点触摸 【转】

  转自:http://blog.chinaunix.net/uid-24227137-id-3127126.html 简介 为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据.这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息. 使用说明 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH.ABS_X.ABS_Y.SYNC.而多点触摸信息则是以 ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X.ABS