交叉编译工具: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.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. 将移植好的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
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上绘画了!)
从官网下载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程序,开发板上就能显示出中文了!