嵌入式Linux中基于Qt/Embeded触摸屏驱动的设计
得到绝对位置信息,一般只会读到相对移动量。另外,鼠标的移动加速度也需要考虑在内,而触摸屏接口则几乎是清一色的绝对位置信息和压力信息。针对此类差别,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平台上的应用程序即能够按照定制的要求提供对触摸屏的支持。
4、 结束语
本方案与 Qt 下普通鼠标驱动使用一致的框架,设计简洁,条理清楚。已经成功的运用于电能质量监测仪平台,并且运行稳定,定位准确,反应灵敏。友好的 GUI 界面和便捷的人机接口,使电能质量检测仪更具亮点。同时,开放源代码的优势在此方案中得到充分的体现,通过大量地阅读源代码,可以充分的理解软件工作机制并按用户的要求进
驱动 设计 触摸屏 Qt Embeded Linux 基于 嵌入式 相关文章:
- 声卡安装向导中文版(11-12)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- Linux内核解读入门(11-09)
- Linux操作系统网络驱动程序编写(04-11)
- Linux系统下USB摄像头驱动程序开发(04-25)
- Linux系统中如何正确安装摄像头驱动(04-25)