经常看到有人问移植Qt Embedded时如何键盘响应不灵怎么办,可能系统介绍这方面知识的文章比较少,这里笔者就尽我所能介绍一下,以填补以往的空白。
我们都知道Qt-x11借助XServer提供对硬件外设的接口,不需要直接和driver打交道,Qt Embedded则颠覆了这个传统并且摒弃了对XServer的依赖, 所以免不了要有和硬件driver交互的时候。为了保持Qt Embedded 对硬件最小化的依赖程度,Qt Embedded所有硬件相关的操作都采用插件的封装形式,并且大部分功能都可以从程序外部运用环境变量的方式来配置。 这样一来我们只要针对不同的硬件写好不同的插件,为不同硬件平台提供不同的启动脚本就可以了,换了硬件代码却不需要修改,这是多么惬意的事啊!简直是嵌入式开发的***目标!
Qt Embedded的键盘操作是这种插件封装形式的典范,我们就以此为例,对Qt Embedded的硬件操作一窥究竟。
告诉Qt Embedded你需要哪个驱动
QWS_KEYBOARD这个环境变量就是你需要了解的全部。
设置该变量的方法为在运行QtE server程序之前用下面的命令设置:
export QWS_KEYBOARD= <driver>[:<driver specific options>]
driver参数即驱动的键值, 如“usb”、“tty”等, 在下篇中我们再详细讨论这个。
options则指定硬件设备名, 如/dev/input/event0, 这个参数就要按你的硬件实际情况来提供了。
载入用户需要的驱动插件
这个环境变量是如何工作的呢? 今天我们讲述的重点放在QtE的几个文件上:
读取环境变量, 载入相应的键盘驱动插件:src/gui/embedded/qwindowsystem_qws.cpp
创建键盘处理函数类的实例:src/gui/embedded/qkbddriverfactory_qws.cpp
故事从QWSServerPrivate::initServer开始, 这个函数在QWSServer构造时被调用, 它会完成初始化的工作, 包括按顺序初始化各个硬件接口(鼠标、键盘等等外设), 这个函数接近***的几行代码调用了openKeyboard来初始化键盘。
第二步进到同一源码文件的QWSServer::openKeyboard(), 该函数负责解析环境变量 QWS_KEYBOARD的设定, 从中取得键盘设备的名称和driver handler的类型, 并最终调用QKbdDriverFactory::create函数载入对应的键盘处理插件。
第三步也是本场大戏的重头, 打开qkbddriverfactory_qws.cpp找到QKbdDriverFactory::create函数。 前面我们说到过这个函数包含了创建键盘处理函数的类的实例的代码, 简单看一下这个函数我们发现, 前面大段的code是一堆跟硬件类型相关的宏包裹住的代码, 这部分代表了Qt里内嵌的driver handler, 而非插件形式提供的。 QtE自身支持的每个键盘设备都有一个预定义的宏和预定义的driver handler类与之对应, 根据代码显示, 设备的类型必须在configure阶段就确定, 以X86模拟器环境下为例, 在这个环境下configure的时候需要加 -qvfb参数, 这个参数就会去掉 QT_NO_QWS_KBD_QVFB这个宏, 在此函数中就表示为调用到return new QVFbKeyboardHandler(device);这行。
那么,如果上面所有的QT_NO都被定义了呢? 当然代码就会跳过这一堆无用的code, 直接调用到
if (QWSKeyboardHandlerFactoryInterface *factory = qobject_cast<QWSKeyboardHandlerFactoryInterface*>(loader()->instance(driver)))
return factory->create(driver, device);
这段代码就比较有意思了,它代表的是以插件形式存在的各个键盘处理插件。在你不使用Qt预定义键盘处理的情况下就需要有与环境变量请求的driver handler键值一致的插件。键盘处理插件如何定义不是本文探讨的内容(请参看下篇),我们只要知道这个插件会提供一个标识自己的键值,这样loader比较创建插件的请求和插件的键值就知道该返回哪个插件提供的服务了。
还有几点有意思的地方:
1、 driver的类型信息不区分大小写。
2、 QtE内嵌的driver类型默认是都不支持的, 只有在configure的时候加上-qt-kbd-xxx才能支持某种driver类型。(详情 configure –help)
3、 同一时刻只能有一个driver处理函数生效。
4、 由于这部分代码都在QWSServer构造时调用, 也就是说QtE不支持动态的更改键盘处理。
小结:Qt Embedded 键盘驱动分析的内容就介绍到这里,希望本篇文章对你有所帮助!请继续参考 浅析 Qt Embedded 键盘驱动分析 。