移植Qt5.6

    xiaoxiao2022-07-06  205

    文章转自:https://blog.csdn.net/qq_36576792/article/details/87600010#1. 将网卡驱动、lcd显示设备驱动与触摸屏设备驱动编译进linux-4.12内核

    交叉编译工具:arm-linux-gcc-4.4.3内核:linux-4.12.0(使用移植linux-4.12到JZ2440里的linux-4.12,按照2.4 制作补丁内容获取内核,补丁下载地址:https://pan.baidu.com/s/1_uyLxOIgwVGCJPip5RcFNQ)制作好的网络文件系统目录:/work/tools/fs_mini/(使用制作文件系统里制作的文件系统)开发板:JZ2440本人写的基于qt的电子书效果:https://pan.baidu.com/s/1TlCOq57UjrYt2uGEaFcF8g

    目录

          1. 将网卡驱动、lcd显示设备驱动与触摸屏设备驱动编译进linux-4.12内核          1.1 将网卡驱动编译进linux-4.12内核          1.2 将lcd显示设备驱动编译进linux-4.12内核          1.3 将触摸屏设备驱动编译进linux-4.12内核      2. 安装tslib     3. 下载、配置与安装Qt5.6.1-1         3.1 下载Qt5.6.1-1         3.2 配置与安装Qt5.6.1-1     4. 将安装好的Qt拷贝到文件系统     5. 设置Qt环境变量     6. 测试Qt程序         6.1 获取qt测试程序         6.2 编译         6.3 解决报错         6.4 显示中文


    1. 将网卡驱动、lcd显示设备驱动与触摸屏设备驱动编译进linux-4.12内核

        为了方便,这里将移植之前所有驱动(基于linux-2.6.22.6)到linux-4.12内核里修改好的lcd显示设备驱动lcd.c(下载地址:https://pan.baidu.com/s/15CpK4BXGt5vDb5Q0THUwbQ)与触摸屏设备驱动s3c_ts.c(下载地址:https://pan.baidu.com/s/1d4OQAwaAkY-zP2jNMQW5JA)编译进linux-4.12内核。

    1.1 将网卡驱动编译进linux-4.12内核

        按照移植之前所有驱动(基于linux-2.6.22.6)到linux-4.12内核的1. 移植网卡驱动的内容给内核添加网卡驱动。

    1.2 将lcd显示设备驱动编译进linux-4.12内核

        1. 将移植好的lcd.c驱动文件重命名为jz2440fb.c,拷贝到linux-4.12/drivers/video/fbdev目录下。     2. 修改该目录下的Makefile,添加如下部分:

    obj-$(CONFIG_FB_JZ2440) += jz2440fb.o

        3. 修改linux-4.12/drivers/video/fbdev/Kconfig,添加如下部分:

    config FB_JZ2440 tristate "JZ2440 LCD framebuffer support" depends on FB && ARCH_S3C24XX select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT ---help--- Currently the suport is only for the JZ2440

        4. 重新配置内核,在linux-4.12内核目录下执行:       make menuconfig     配置步骤如下:      Device Drivers  --->           Graphics support  --->               Frame buffer Devices  --->                   <*> JZ2440 LCD framebuffer support                  [*] Bootup logo  --->    选中新添加的JZ2440 lcd设备(Bootup logo是启动logo,选上就有企鹅图标显示出来,当然也可以不选),这样重新编译内核时就会将jz2440fb.c驱动编译进内核(并且Kconfig里添加了select选项,内核会自动将cfbcopyarea.ko、cfbfillrect.ko、cfbimgblt.ko这三个驱动编译进内核)。

    1.3 将触摸屏设备驱动编译进linux-4.12内核

        1. 将移植好的s3c_ts.c驱动文件重命名为jz2440_ts.c,拷贝到linux-4.12/drivers/input/touchscreen目录下。     2. 修改该目录下的Makefile,添加如下部分:

    obj-$(CONFIG_TOUCHSCREEN_JZ2440) += jz2440_ts.o

        3. 修改linux-4.12/drivers/input/touchscreen/Kconfig,添加如下部分:

    config TOUCHSCREEN_JZ2440 tristate "Samsung JZ2440 touchscreen input driver" depends on ARCH_S3C24XX || SAMSUNG_DEV_TS depends on S3C_ADC help Currently the suport is only for the JZ2440

        4. 重新配置内核,在linux-4.12内核目录下执行:       make menuconfig     配置步骤如下:      Device Drivers  --->           Input device support  --->               [*]   Touchscreens  --->                   <*>   Samsung JZ2440 touchscreen input driver    选中新添加的JZ2440触摸屏设备,这样重新编译内核时就会将jz2440_ts.c驱动编译进内核。修改完成的内核uImage文件下载地址:https://pan.baidu.com/s/134-nCCpauuQoUiOK4iXHzA

    2. 安装tslib

        1. 修改编译器的EV_VERSION变量       vi /work/tools/usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include/linux/input.h +32       修改为:

    #define EV_VERSION 0x010001

        2. 安装tslib     将tslib-1.4.tar.gz放到服务器上,在ubuntu执行以下命令:      tar xzf tslib-1.4.tar.gz  (解压文件)      cd tslib       ./autogen.sh       mkdir tmp       echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache       ./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp       make  (编译)      make install  (安装到tmp)      cp tmp /work/tools/fs_mini/ts_dir -rfd  (将tmp目录复制到网络文件系统目录)

        3. 网络文件系统启动开发板,进入刚才的ts_dir目录,执行:      cd /ts_dir       cp * / -rfd  (再将该目录里所有内容拷贝到网络文件系统目录)

        4. 修改 /etc/ts.conf文件,开发板上执行命令如下:       vi /etc/ts.conf           改为(去掉第二行的#号和第一个空格):      

        5. 设置触摸屏的环境变量     执行vi /work/tools/fs_mini/etc/profile (重启开发板生效,或者开发板挂载fs_mini网络文件系统时执行. /etc/profile手动执行该文件里的环境变量设置)修改profile文件添加如下内容:

    export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0

        /dev/input/event0是我板子的触摸屏设备,/dev/fb0是lcd设备。不同板子选择对应的设备。

        6. 校验。开发板上执行如下:       ts_calibrate  (开发板上此时会出现校验触摸点)           7. 测试 。开发板上执行如下:      ts_test  (此时可以在lcd上绘画了!)    

    3. 下载、配置与安装Qt5.6.1-1

    3.1 下载Qt5.6.1-1

        从官网下载Qt5.6.1-1源码qt-everywhere-opensource-src-5.6.1-1.tar.gz,下载地址:http://download.qt.io/archive/qt/5.6/5.6.1-1/single/

    3.2 配置与安装Qt5.6.1-1

        1. 将源码包放到服务器上,本人放到/work/tools目录,进入该目录解压源码:      tar zxvf qt-everywhere-opensource-src-5.6.1-1.tar.gz

        2. 修改编译配置文件qmake.conf       vi /work/tools/qt-everywhere-opensource-src-5.6.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf     修改qmake.conf文件如下:

    MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS += -msoft- float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t QMAKE_CXXFLAGS += -msoft- float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = arm-none-linux-gnueabi-gcc -lts QMAKE_CXX = arm-none-linux-gnueabi-g++ -lts QMAKE_LINK = arm-none-linux-gnueabi-g++ -lts QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ -lts # modifications to linux.conf QMAKE_AR = arm-none-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy QMAKE_NM = arm-none-linux-gnueabi-nm -P QMAKE_STRIP = arm-none-linux-gnueabi-strip load(qt_config)

        注意其中的“arm-none-linux-gnueabi-”是根据自己所使用的编译器来决定的。

        3. 创建编译脚本文件auto_config.sh       sudo mkdir -p /work/tools/Qt5.6.1-1    (创建qt安装目录)       vi /work/tools/qt-everywhere-opensource-src-5.6.1/auto_config.sh    (创建auto_config.sh脚本文件内容如下)

    ./configure -prefix /work/tools/Qt5 .6 .1 -1 \ -opensource \ -release \ -confirm-license \ -xplatform linux-arm-gnueabi-g++ \ -shared \ -qt-zlib \ -no-gif \ -qt-libjpeg \ -no-nis \ -no-opengl \ -no-cups \ -no-glib \ -no-dbus \ -no-rpath \ -no-sse2 -no-sse3 -no-ssse3 -no-sse4 .1 -no-sse4 .2 \ -no-avx \ -no-openssl \ -nomake tools \ -qreal float \ -qt-libpng \ -tslib \ -nomake examples \ -I /work/tools/fs_mini/ts_dir/include \ -L /work/tools/fs_mini/ts_dir/lib

        /work/tools/Qt5.6.1-1是安装目录,/work/tools/fs_mini/ts_dir是之前移植好的tslib相关文件存放目录。

        4. 编译安装     执行如下命令:    cd /work/tools/qt-everywhere-opensource-src-5.6.1     ./auto_config.sh (服务器可能需要安装部分库,参考qt-everywhere-opensource-src-5.6.1/qtbase/src/plugins/platforms/xcb/README文件:apt-get install libncurses5-dev libreadline-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-glx0-dev libxcb-xinerama0-dev)    make -j4     sudo make install

    4. 将安装好的Qt拷贝到文件系统

        执行如下命令将上面安装好的qt部分库文件拷贝到开发板使用的文件系统上:      mkdir -p /work/tools/fs_mini/Qt5.6.1-1/plugins       cp /work/tools/Qt5.6.1-1/plugins/. /work/tools/fs_mini/Qt5.6.1-1/plugins -rfd       mkdir -p /work/tools/fs_mini/Qt5.6.1-1/lib       cp /work/tools/Qt5.6.1-1/lib/. /work/tools/fs_mini/Qt5.6.1-1/lib -rfd     在开发板上运行Qt程序只需要plugins与lib这两个文件夹内容即可。

    5. 设置Qt环境变量

        修改/work/tools/fs_mini/etc/profile(文件系统目录下的/etc/profile),添加如下内容(重启开发板生效,或者开发板挂载fs_mini网络文件系统时执行. /etc/profile手动执行该文件里的环境变量设置):

    export QTEDIR=/Qt5 .6 .1 -1 export LD_LIBRARY_PATH=/Qt5 .6 .1 -1/lib:$LD_LIBRARY_PATH export QT_QPA_GENERIC_PLUGINS=tslib export QT_QPA_FONTDIR=$QTEDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size= 480x272:mmSize= 480x272:offset= 0x0:tty=/dev/tty1 export QT_QPA_FB_TSLIB= 1

        其中export QTEDIR=/Qt5.6.1-1表示指定qt所在目录;480*272表示LCD显示屏尺寸,输出设备为/dev/tty1,根据实际情况修改。

    6. 测试Qt程序

    6.1 获取qt测试程序

        下载Qt测试程序到文件系统,下载地址:https://pan.baidu.com/s/1X4PCRtPnnqVDjJb5ujtteA     如下:    

    6.2 编译

        在服务器上进入程序所在目录,执行如下命令:       /work/tools/Qt5.6.1-1/bin/qmake    (生成Makefile)      make            可以看到生成可执行文件helloworld了,接着在开发板上运行该程序,LCD上能看到效果,但不显示中文且提示错误:

    QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

    6.3 解决报错

        下载libiconv源码,下载地址:http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz     拷贝文件到服务器上执行如下命令:      tar xzf libiconv-1.14.tar.gz       cd /work/tools/libiconv-1.14       mkdir /work/tools/libiconv       ./configure --host=arm-none-linux-gnueabi --prefix=/work/tools/libiconv            make       make install            cp ./lib/preloadable_libiconv.so /work/tools/fs_mini/lib/     执行vi /work/tools/fs_mini/etc/profile (重启开发板生效,或者开发板挂载fs_mini网络文件系统时执行. /etc/profile手动执行该文件里的环境变量设置)修改profile文件添加如下内容:

    export LD_PRELOAD=/lib/preloadable_libiconv.so

        此时重新在开发板上执行应用程序串口就没有任何错误提示了,但是还是不能显示中文。

    6.4 显示中文

        下载字库DroidSansFallback.ttf,下载地址:https://pan.baidu.com/s/1e8lyxnPVF0Uw1_4woHMVTw     将该文件拷贝到/work/tools/fs_mini/Qt5.6.1-1/lib/fonts     重新运行Qt程序,开发板上就能显示出中文了!    

     

    最新回复(0)