文章转自: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 显示中文
为了方便,这里将移植之前所有驱动(基于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内核。
按照移植之前所有驱动(基于linux-2.6.22.6)到linux-4.12内核的1. 移植网卡驱动的内容给内核添加网卡驱动。
1. 将移植好的lcd.c驱动文件重命名为jz2440fb.c,拷贝到linux-4.12/drivers/video/fbdev目录下。 2. 修改该目录下的Makefile,添加如下部分:
obj-$(CONFIG_FB_JZ2440) += jz2440fb.o3. 修改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 JZ24404. 重新配置内核,在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. 将移植好的s3c_ts.c驱动文件重命名为jz2440_ts.c,拷贝到linux-4.12/drivers/input/touchscreen目录下。 2. 修改该目录下的Makefile,添加如下部分:
obj-$(CONFIG_TOUCHSCREEN_JZ2440) += jz2440_ts.o3. 修改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 JZ24404. 重新配置内核,在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
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 0x0100012. 安装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上绘画了!)
从官网下载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/
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
执行如下命令将上面安装好的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这两个文件夹内容即可。
修改/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,根据实际情况修改。
下载Qt测试程序到文件系统,下载地址:https://pan.baidu.com/s/1X4PCRtPnnqVDjJb5ujtteA 如下:
在服务器上进入程序所在目录,执行如下命令: /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
下载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此时重新在开发板上执行应用程序串口就没有任何错误提示了,但是还是不能显示中文。
下载字库DroidSansFallback.ttf,下载地址:https://pan.baidu.com/s/1e8lyxnPVF0Uw1_4woHMVTw 将该文件拷贝到/work/tools/fs_mini/Qt5.6.1-1/lib/fonts 重新运行Qt程序,开发板上就能显示出中文了!