Qt在blackfin平台的移植(备忘)
前提:已经存在一个可以运行ulinux系统(内核需要支持unix socket选项)且支持frambuffer的Blackfin平台环境,并且有了blackfin平台编译工具链。
1.下载QtEmbedde(Qt/E)版本源码,下载地址为:ftp://ftp.trolltech.no/qt/source/qt-embedded-linux-opensource-src-4.5.1.tar.gz;
2.下载Qt/E支持blackfin的补丁,从http://blackfin.uclinux.org/gf/ 下载blackfin-linux-dist-2010R1-RC5.tar.bz2的uClinux版本,因为该版本支持QT,解压后在解压目录下lib/qt-embedded/patches下有相关的补丁(如果有的话也可从其它地方下);
3.解压qt-embedded-linux-opensource-src-4.5.1.tar.gz,在解压后的目录下利用patch命令打上所有的补丁:
patch -p1 -E < (补丁文件)
注意:由于补丁版本的BUG打完补丁后还需要修改触压目录下src/gui/embedded/qscreenlinuxfb_qws.cpp文件,找到412行把MAP_SHARED改为MAP_PRIVATE,否则将无法正常显示,修改如下:
改前:
data =(unsigned char *)-1;
if (d_ptr->fd != -1)
data = (unsigned char *)mmap(0,mapsize, PROT_READ | PROT_WRITE,
MAP_SHARED, d_ptr->fd, 0);
改后:
data =(unsigned char *)-1;
if (d_ptr->fd != -1)
data = (unsigned char *)mmap(0,mapsize, PROT_READ | PROT_WRITE,
MAP_PRIVATE, d_ptr->fd, 0);
如果要支持自己的触摸屏需自更改相关鼠标驱动文件代码,文件所在目录为:src/gui/embedded,最后采用修改qmouselinuxtp_qws.cpp和qmouselinuxtp_qws.h文件,添加自己的触摸屏信息解码相关代码(详细的修改可以参考网上),最后需在配置选项增加-qt-mouse-linuxtp对linuxtp驱动的支持.
4.打完补丁和修改代码后,可以进行Qt的配置,可以通过./configure –help查看相关的配置帮助,配置选项的意思可以在配置帮助查看,最后采用如下配置:
./configure-prefix /usr/local/qtembedded -embedded bfin -xplatformqws/linux-bfin-fdpic-g++ -shared -confirm-license -opensource -verbose-little-endian -no-qt3support -depths 8,16,24,32 -no-webkit -nomaketranslations -no-cups -no-nis -no-dbus -qt-gfx-linuxfb -no-iconv -no-glib-no-rpath -no-feature-QWS_CURSOR -qt-mouse-linuxtp
注:-no-feature-QWS_CURSOR表示不出现鼠标指针.
5.配置成功后就可以进行make;
6.make成功后生成相关动态库和实例,即基本完成移植;
7.把实例放到平台上运行,先要配置环境变量:
export QWS_MOUSE_PROTO=LinuxTP:(触摸屏设备节点)
再把相关的动态库复制到blackfin平台的/usr/lib目录下,同时也要把font下的*qpf文件复制到指定的目录,复制到什么目录可以运行下实例,出错时会提示出目录;
再运行:
./实例 –qws &
加&表示后台运行,如果没出错表示运行成功;
运行出错分析提示:
(1)直接./实例 运行出现如下错误:
QWSSocket::connectToLocalFilecould not connect:: Bad file descriptor
QWSSocket::connectToLocalFilecould not connect:: Bad file descriptor
QWSSocket::connectToLocalFilecould not connect:: Bad file descriptor
No Qt forEmbedded Linux server appears to be running.
If youwant to run this program as a server,
add the"-qws" command-line option.
需加-qws运行即./实例 –qws 如果还出现socket类的错误可能是内核没有增加Unix socket的支持;
(2)出现如下错误:
QLinuxFbScreen::connect:No such device
Error:failed to map framebuffer device to memory.
表示没把src/gui/embedded/qscreenlinuxfb_qws.cpp文件进行修改,
(3)出现如下错误码:
QFontDatabase: Cannot find font directory /usr/local/qte-arm/lib/fonts - is Qt ?
Aborted
(注:/usr/local/qte-arm/lib/fonts这个具体路径视你安装qte的路径而定)
需要把编译后在lib下的fonts复制到对应提示的目录。
(4)出现如下错误:
lockingqpf: Permission denied
在复制font下的文件时只复制*.qpf文件即可,可能会支持不了中文显示。
8.最后可以在$PATH中增加qt编译后的bin目录,主要是用到qmake,这样就有了QT/blackfin平台的交叉编译环境,可以编译自己的QT代码!
9.完成。