QT5.5.1 嵌入式平台 鼠标键盘不能热插拔问题解决(一)

前言:

        由于项目需要,采用qt5.5.1开发界面,要求支持键鼠。经过uboot/kernel/fs的移植之后usb接口的热插拔已经OK,但是QT怎么也不支持热插拔,工作任务和强迫症双层压力下,决心对键鼠的热插拔一探究竟。


首先感谢http://blog.csdn.net/fu851523125/article/details/51190316博主的文章,给了我不少灵感,在下面的文章中我也会引用其文章中的语句。


这里是我综合了自己的理解,采用不同于上面博主的另外一个方法实现。


切入正题

========================================================

诚如QT官网(http://doc.qt.io/qt-5/embedded-linux.html)所述如下,

Mouse

The mouse cursor shows up whenever QT_QPA_EGLFS_HIDECURSOR (for eglfs) or QT_QPA_FB_HIDECURSOR (for linuxfb) is not set and Qt's libudev-based device discovery reports that at least one mouse is available. Whenlibudev support is not present, the mouse cursor always show up unless explicitly disabled via the environment variable.

Hot plugging is supported, but only if Qt was configured with libudev support (that is, if the libudev development headers are present in the sysroot at configure time). This allows connecting or disconnecting an input device while the application is running.


解释一下:在不设置QT_QPA_EGLFS_HIDECURSOR (for eglfs) or QT_QPA_FB_HIDECURSOR (for linuxfb)两个环境变量的情况下,鼠标是可以显示的,并且只有在支持libudev情况下QT才能支持热插拔。


官网说的很清楚,就是需要支持libudev,查看配置文件configure的帮助信息(执行./configure -h),在列出的信息中没有udev或者libudev的相关信息,但是之前一致过程中存在相关信息的,如下图,说明是没有配置成功的



于是搜索qt源码根目录下(以下表示为QT_ROOT/)的configure没有任何发现,再搜索QT_ROOT/qtbase/目录下的configure,键入【grep -rn "udev" configure】结果如下

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 1844:    libudev)  
  2. 5251:    if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists libudev 2>/dev/null; then  
  3. 5252:        QMAKE_INCDIR_LIBUDEV=`$PKG_CONFIG --cflags-only-I libudev 2>/dev/null | sed -e 's,^-I,,g' -e 's, -I, ,g'`  
  4. 5253:        QMAKE_LIBS_LIBUDEV=`$PKG_CONFIG --libs libudev 2>/dev/null`  
  5. 5254:        QMAKE_CFLAGS_LIBUDEV=`$PKG_CONFIG --cflags libudev 2>/dev/null`  
  6. 5258:    if compileTest unix/libudev "libudev" $QMAKE_CFLAGS_LIBUDEV $QMAKE_LIBS_LIBUDEV; then  
  7. 5260:        QT_CONFIG="$QT_CONFIG libudev"  
  8. 5262:        echo "The libudev functionality test failed!"  
说明存在相应的配置,在网上查找相应帮助,有位博主已经尝试过,他的结果是:

      需要libudev.h头文件。得移植udev。然后重新配置 使出现libudev enabled,libudev测试通过。

      但是拿到开发板上,还是不支持热插拔啊。

我也进行了移植尝试,首先下载udev源码https://www.kernel.org/pub/linux/utils/kernel/hotplug/,我用的qt版本比较高,于是下载比较新的udev-182,解压后配置udev相应的congfigure,然后make,由于中间遇到了各种各样的问题,时间紧迫,时间是个单程票耽误不得,再在网上找资料验证自己的方案可能性有多大。发现一片文章介绍udev/mdev的区别(网址如下:http://www.tuicool.com/articles/Eb6FB3),内容如下

==========================================================

关于udev和mdev之间的区别与联系我发现自己现在还没有把它完整的给区分开来和联系起来.
    设备文件系统有devfs,mdev,udev

    mdev是udev的简化版本,是busybox中所带的程序,最适合用在嵌入式系统,而udev一般用在PC上的linux中,相对mdev来说要复杂些,devfs是2.4内核引入的,而在2.6内核中却被udev所替代,他们有着共同的优点,只是devfs中存在一些未修复的BUG,作者也停止了对他的维护,最显著的一个区别,采用devfs时,当一个并不存在的设备结点时,他却还能自动的加载对应的设备驱动,而udev则不能,udev认为当加载了不存在的对应的设备驱动的时候不应加载对应的驱动模块,因为加载也没有,浪费了资源.
  从本质上来说,udev与mdev他们都是一个应用程序,配置了就可以使用,为了方便使用,我们可以使用busybox自带的mdev,当然也可以去下载udev的源码去编译和移植.

  这应该是对udev和mdev的一个理解,我们下次可以再深入一些.

dev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作。udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时时可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了,例如:

echo “/sbin/mdev” > /proc/sys/kernel/hotplug

 
补充一点:如果使用的是udevd,那么uevent_helper变量应为空,即

echo “ ” > /proc/sys/kernel/hotplug

这段内容总结的很好,我也看了linux内核有关uevent的代码,的确是这样,这样看来简单的将mdev看做udev的简化版也就不准确了。这样在做嵌入式的文件系统就要注意了,一般只会使用mdev,目前我还不确定能不能只用udev,理论上是可以的,当然两种一起用也是可以的,也就是mdev + udev,但是这时要注意了,写规则时一定要注意,避免让它们重复执行。也就是说udev执行过的,mdev不要再执行了。其实udev最大的特点就是使用了netlink,实质上是一个scoket,这个特别的scoket用来监测uevent,当然,我们也可以自己写一个函数用来监测任何uevent事件。

=====================================================
文章中被我标红的说明我采用的方法不是常规(或者说风险比较大)的方法,于是果断寻找另外的方案。


准备走一下QT的源代码,QT官网指示调试信息如下

Debugging Input Devices

It is possible to print some information to the debug output by enabling theqt.qpa.input logging rule, for example by setting the QT_LOGGING_RULES environment variable to qt.qpa.input=true. This is useful for detecting which device is being used, or to troubleshoot device discovery issues.


打开调试信息的输出,即在嵌入式系统执行命令【export QT_LOGGING_RULES=qt.qpa.input=true】 ,再次启动QT后插拔键鼠会出现相应的调试信息。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. qt.qpa.input: evdevkeyboard: Using device discovery  
  2. qt.qpa.input: udev device discovery for type QFlags(0x8)  
  3. qt.qpa.input: Found matching devices ()  
  4. qt.qpa.input: evdevmouse: Using device discovery  
  5. qt.qpa.input: udev device discovery for type QFlags(0x1|0x2)  
  6. qt.qpa.input: Found matching devices ()  
  7. qt.qpa.input: evdevtouch: Using device discovery  
  8. qt.qpa.input: udev device discovery for type QFlags(0x2|0x4)  
搜索上述相应的信息可定位代码位置。具体的代码分析可以见http://blog.csdn.net/fu851523125/article/details/51192065。



于是产生了我最终解决方案的思路,具体见下移篇文章。








http://blog.csdn.net/shengzhadon/article/details/51454703


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,要下载Qt5.5.1源码,您可以按照以下步骤操作: 1. 打开Qt官方网站:https://www.qt.io/downloads,点击 "下载"按钮。 2. 在下载页面中,选择“源代码”选项卡,并选择对应操作系统的Qt版本。 3. 在下载页面中会有一个 "开始下载"按钮,点击该按钮即可开始下载Qt5.5.1源码的压缩包。 4. 下载完成后,将压缩包解压到您希望存放Qt源码的目录中。 5. 打开解压后的文件夹,在该文件夹中找到 "configure" 文件,并双击运行。 6. 配置脚本将根据您的操作系统和编译器设置Qt编译环境。 7. 配置完成后,使用命令行或者IDE打开Qt源码文件夹。 8. 在Qt源码文件夹中,可以找到各个模块的源代码以及示例和文档资料。 这样,您就成功下载了Qt5.5.1的源码,并可以在自己的机器上进行阅读、学习或者二次开发。如果您需要根据自己的需求进行编译构建,可以参考Qt官方的编译指南进行操作。祝您学习愉快! ### 回答2: Qt 5.5.1是一个跨平台的应用程序开发框架,如果想要下载它的源码,可以按照以下步骤进行: 1. 打开Qt的官方网站(https://www.qt.io/),点击网站顶部的"Download"按钮。 2. 在下载页面上,选择"Archives"选项卡,找到"Qt 5.5.1"版本并点击它。 3. 在弹出的页面上,选择你的操作系统和编译器版本。如果你使用的是Windows操作系统,可以选择基于MSVC 2013或者MinGW编译器的版本,如果是Mac系统,可以选择基于Clang版本的Qt,如果是Linux系统,可以选择基于GCC版本的Qt。 4. 根据你的选择,点击相应的下载链接,开始下载相应的离线安装包。 5. 下载完成后,解压安装包,你将得到Qt 5.5.1的源码文件。 另外,Qt的源码也可以通过版本控制工具Git进行获取。你可以在Qt的官方Git仓库(https://code.qt.io/cgit/qt/qt5.git/)中找到Qt 5.5.1的源码,然后根据Git的用法进行克隆或者下载源码。 需要注意的是,Qt的源码下载可能会比较大,所以下载时间可能会比较长,而且需要一定的网络带宽和存储空间来存储源码。 ### 回答3: 您可以通过以下步骤下载qt5.5.1源码: 1. 打开Qt官方网站(https://www.qt.io/),并点击顶部菜单栏中的“下载”按钮。 2. 在下载页面中,您可以看到不同版本的Qt可用于下载。向下滚动页面,直到找到下方的“历史Qt版本”部分。 3. 在“历史Qt版本”部分中,找到并点击“5.5.1版本”的链接。 4. 进入5.5.1版本的下载页面后,您将看到不同的Qt安装程序。寻找一个标有“源代码”或“src”的选项,并点击下载链接。 5. 下载源代码包后,您可以解压缩它以获取Qt 5.5.1的源代码。 请注意,Qt 5.5.1是一个旧版本,可能已经过时并且不再接收官方支持。如果您正在寻找最新版本的Qt源代码,建议您查看Qt官方网站上可用的最新版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值