JZ2440(V3)移植QT5.6--图文教程
本文严禁转载
本文地址:https://www.cnblogs.com/multimicro/p/9872722.html
文章信息
| 撰写日期 | 2018.10.06
---|:--😐---
| 完稿日期 | 2018.10.28
| 最近维护 | 2018.11.18
| 本文作者 | multimicro
| 联系方式 | multimicro@qq.com
| 资料链接 | 百度网盘(提取码: yimj)
| GitHub| https://github.com/wifialan/
|小编备注 | 本文首发在CSDN上面
开发环境
环境说明 | 详细信息 | 备注信息 |
---|---|---|
操作系统 | Ubuntu 18.04.1 LTS | 官网地址 | 清华镜像 |
操作系统内核版本 | 4.15.0-36-generic | |
编译器 | arm-linux-gcc-4.4.3 | 下载地址 |
编译器路径 | /usr/local/arm/gcc-4.4.3/bin | |
u-boot版本 | u-boot-2014.04.01 | 官网地址 | 百度网盘(提取码: yimj) |
kernel版本 | linux-3.4.2 | 官网地址 |
busybox版本 | busybox-1.22.1 | 官网地址 |
tslib版本 | tslib-1.4 | 官网地址 |
libiconv版本 | libiconv-1.14 | 官网地址 |
Qt版本 | qt-everywhere-opensource-src-5.6.0 | 官网地址 |
友情提示
1. 本文所用的编译器全部为指定路径下的绝对路径,并没有把编译器配入环境变量中去
2. 编译Qt5.6所用的编译器是4.4.3版本的,这里就用4.4.3版本的编译器重新把u-boot
uImage
重新编译了一下
3. 打完补丁的linux-3.4.2代码GitHub地址:linux-3.4.2-JZ2440V3 clone下来后执行两条命令即可制作出支持4.3LCD,触屏和网卡的uImage:第一条命令:cp config_ok .config
第二条命令:make uImage CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
确保修改为你的编译器路径
4. 独立的linux-3.4.2补丁文件在百度网盘里面,名字为linux-3.4.2_ok.patch
1.编译u-boot
cd u-boot-2012.04.01/
patch -p1 <../u-boot-2012.04.01_100ask.patch
我修改了内核分区大小,将默认的2m改为了4m(打完补丁在进行以以下操作)
vim include/configs/smdk2440.h
这是我改后的文件
保存退出后执行以下命令编译u-boot
make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- smdk2440_config
make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- -j8
编译完成后通过ls
命令就可以看到u-boot.bin
文件了
若提示arm-linux-gcc command not found:
- 指定的编译器绝对路径错误
- 你的Linux系统为64位的,编译器为32位的,参考这里:https://blog.csdn.net/multimicro/article/details/82665972
- 未完待定
2.编译内核
2.1 按照韦东山的补丁文件进行编译第一个版本的uImage
cd linux-3.4.2/
patch -p1 <../linux-3.4.2_100ask.patch
cp config_ok .config
接下来把内核所在分区修改为4m
vim arch/arm/mach-s3c24xx/common-smdk.c
下图是我修过后的文件
然后在执行以下命令编译内核uImage
make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
make uImage CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
内核完成,但不支持网络和触摸屏
2.2 内核增加网卡(网络)功能
至此上面的内核挂载启动文件系统后,是不支持网卡的,也就是无法使用ifconfig
等网络相关命令,需要修改内核里面的文件:
进入内核文件夹里面:arch/arm/mach-s3c24xx/
对比文件mach-mini2440.c和mach-smdk2440.c
下面修改mach-smdk2440.c文件使其支持网卡功能:
(1)增加mini2440里面的dm9000网卡头文件
#include <linux/dm9000.h>
(2)增加下面这两个结构体(从mach-mini2440.c里面复制然后把"mini2440"改为"smdk2440")
static struct resource smkd2440_dm9k_resource[]={...};
static struct dm9000_plat_data smdk2440_dm9k_pdata={...};
(3)增加宏定义(从mach-mini2440.c里面复制然后把"MINI2440"改为"SMDK2440")
#define SMDK_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)
(4)在mach-smdk2440.c的下面结构体中增加一行代码:
static struct platform_device *smdk2440_devices[] __initdata={...};
加入代码:
&smdk2440_device_eth,
(5)重新编译内核后再次烧录即可
修改后的arch/arm/mach-s3c24xx/mach-smdk2440.c如下,头文件#include <linux/dm9000.h>
下图没截出来,但别忘添加了哦
如下是烧录支持DM9000网卡后的内核后挂载文件系统后的网络配置及其挂载信息,此步骤可在成功挂载文件系统后在看
图片中的挂载命令是作测试用的,真正用来挂载并正常传输文件的是下面这个命令
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.120:/home/china/work/nfsroot /mnt/nfs/
2.3 增加支持4.3寸LCD
在arch/arm/mach-s3c24xx/
文件夹中,修改里面的mach-smdk2440.c
文件内容,修改内容就不粘贴了,我把这个改后的文件连接粘贴出来直接下载使用即可,文件见上述百度云盘资料
编译内核重新烧录后如下图:
4.3LCD支持搞定,启动此内核时,JZ2440V3的4.3寸LCD会显示一个闪烁光标
2.4 增加触摸屏功能
首先引用宋宝华《linux设备驱动开发详解》中P66的一段话
在linux内核中增加程序需要完成以下3项工作。
- 将编写的源代码复制到linux内核源代码的相应目录中。
- 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项。
- 在目录的Makefile文件中增加对新源代码的编译条目。
2.4.1 完善触摸屏相关信息
Step 1
增加的支持触屏文件s3c2440_ts.c
文件见上述百度云盘资料
把s3c2440_ts.c拷贝至如下内核文件夹下
Step 2
修改linux-3.4.2/drivers/input/touchscreen/
下的Kconfig
文件
如图,可以仿照2410的配置文件撰写
Step 3
修改linux-3.4.2/drivers/input/touchscreen/
下的Makefile
文件
如图,可以仿照2410的配置文件撰写
2.4.2 进入menuconfig中开启s3c2440的触屏支持
下面进入menuconfig
里面进行配置
熟悉menuconfig
的朋友估计发现了,我在Kconfig中配置2440的信息时,加了一行代码:default y
,目的就是编译内核时默认编译内核中。当然,我么也可以进入menuconfig
里面进行配置或查看:
通过以下命令进入menuconfig
make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
进入后依次进入:
Device Drivers --->
Input device support
Touchscreens
JZ2440 /generic touchscreen input driver
选择*
直接编译入内核中,然后重新编译内核即可。编译命名此处不再粘贴!
编译完后,烧录进去的内核会打印出如下信息:
对应的这个触屏驱动程序会在文件系统的/dev/input/文件夹下创建对应的事件:
之前我没移植成功JZ2440配套的触屏驱动程序,就不会出现上图的input: ...
内核打印信息,文件系统中(移植见下面)也不会自动出现如下图的event0
和mouse0
两个事件,自己创建的话如果不好使,根本原因在于触屏驱动没有驱动上! 驱动上了,自己用mknod
命令创建节点也是可以的。否则就会出现:error: No such file or directory
这样的信息,记住了哦!
之前不知道是由于触屏驱动没驱动上,一直在那里傻乎乎的google,直到看到这篇文章后才意识到应该是触屏驱动没驱,WTF!驱动上之后果然,解决了。
这个触屏驱动的正常驱动,是后续使用触屏的前提!--这好像是句废话
3. 烧写u-boot
在windows下通过openJTAG下载吧,或者进Nor-Flash中用老版本的u-boot下载,这个就需要借助DNW工具了
启动新加载的u-boot
通过mtdparts
命令可以看出经过u-boot划分后的flash分区,其中kernel已经为修改后的4M大小
4. 烧写kernel
4.1 tftp和nand flash命令简介
- //通过tftp协议将tftp共享文件夹里面的uImage文件下载到板内地址为0x30000000的SDRAM内存中
tftp 0x30000000 uImage - //nand erase [clean] [off size] 其下命令表示擦除nand flash内存中偏移0x60000(off)地址后的大小为0x00400000(size)的flash位置空间 。[clean] 中[ ] 表示其中的命令是可选的
nand erase 0x60000 0x00400000
//下面这种方法不用考虑偏移量offset和擦除大小size,当然,kernel这个名字是要在u-boot中通过mtdparts命令获取的,见上图
nand erase.part kernel - //其下命令表示将SDRAM中存放在地址为0x30000000地方的文件下载到flash偏移地址为0x60000的大小为$filesize中去
//偏移量0x60000也是通过mtdparts命令获取得知的,见上图
nand write.jffs2 0x30000000 0x60000 $filesize
4.2 用tftp命令烧写kernel
tftp准备工作参考这篇文章:https://blog.csdn.net/multimicro/article/details/82288535 ,烧写工作看这个就行了
没准备好的,一定要看上面的文章,特别是在u-boot中配置网络环境(ip),不要忘了
tftp 0x30000000 uImage
nand erase.part kernel
nand write.jffs2 0x30000000 0x60000 $filesize
下面第一个蓝色框框里面的数据和上图红色框框里的数据是一样的哦
然后输入boot
启动内核
若内核启动乱码,则重启开发板,在u-boot命令行中输入
set bootargs console=ttySAC0,115200
save
然后输入
boot
启动即可
启动内核后的打印信息:
没有修改前的2M分区内核
修改后的4M分区内核
5.制作busybox
cd busybox-1.22.1/
make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8 install COFIG_PREFIX=/home/china/work/nfsroot/busybox
其余暂时参考:https://blog.csdn.net/lizuobin2/article/details/52673494
6.制作tslib(touch screen lib)
6.1 首先安装
sudo apt-get install autoconf automake libtool
6.2 然后检测 EV_VERSION
检测编译器里面的EV_VERSION
数值是否和内核include/linux/input.h
文件的EV_VERSION
所使用的一致,如果不一致,把编译器的EV_VERSON修改为和内核EV_VERSION一致。
内核 EV_VERSION(标准)
编译器 EV_VERSION (和内核中数值保持一致)
上图是我已经修改过的,若不一致,请自行修改!这是防止出现使用触屏时出现以下错误
-selected device is not a touchscreen I understan
(下面的 CC= 和 CXX= 我指定的是编译器的指定路径,所以make的时候就不需要指定了)
cd tslib/
./autogen.sh
./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc CXX=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -prefix=/home/china/work/jz2440/qt/tslib_root
make
make install -j8
其余配置步骤暂时参考:https://blog.csdn.net/lizuobin2/article/details/52673494
成功后,用./ts_test
测试。前提是4.3寸的LCD和触屏驱动移植成功。
对应的JZ2440 4.3寸的LCD显示为:
现在触碰LCD,则会在终端中输出相关信息,如下图:
若有其他错误,可根据错误信息百度或者google解决,自学能力也是很重要的一种能力哦。
7. 制作并烧写yaffs2文件系统
7.1 制作yaffs2文件系统
7.1.2 准备mkyaffs2image工具
- 首先需要yaffs2制作工具
mkyaffs2image
此文件在韦东山提供的JZ2440配套光盘A盘里面的tools文件夹下有
- 或者来到B盘这里
在此文件夹路径下终端make
一下,也能出来这个工具
Tips: 执行make clean
生成的文件就消失了
把这个mkyaffs2image工具复制到/usr/local/bin/
目录下,这样就可以直接在终端中使用此工具了
sudo cp mkyaffs2image /usr/local/bin/
7.1.2 用mkyaffs2image 制作后缀为.yaffs2的文件系统
找到制作好的busybox文件夹,这个文件夹是本文第5步下的busybox安装位置
7.2 烧写文件系统yaffs2
tftp 0x30000000 busybox.yaffs2
nand erase.part rootfs
nand write.yaffs 0x30000000 0x460000 $filesize
通过u-boot中的mtdparts
命令打印出的信息,设置offset信息哦
烧写yaffs2文件系统
此时直接输入boot
启动会出现以下信息“root=”下没有挂载文件系统,看下图可知文件系统分区在mtdblock3
地方
重启开发板,在u-boot中执行以下命令挂载文件系统所在分区:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 init=/linuxrc
save
boot
可以看出挂载后的系统了
至此,文件系统烧写并挂载成功!
注意到上图一行信息:can't run '/etc/init.d/rcS':Permission denied
这是由于没有执行权限的原因,给下图这这两个路径下的两个文件加执行权限chmod +x [yourfile]
即可,效果图如下:
8. 编译Embeded Qt5.6
Step 1 准备好Qt5.6源码包
qt-everywhere-opensource-src-5.6.0.tar.gz
Step 2 解压Qt5.6源码包,并建立自动配置脚本文件
tar -zxf qt-everywhere-opensource-src-5.6.0.tar.gz
cd qt-everywhere-opensource-src-5.6.0/
touch qt-build.sh
vim qt-build.sh
把下面这些粘贴进去
-prefix
后面是编译好的Qt安装路径,提前建立好
-I
后面是编译安装好的tslib中include
路径
-L
后面是编译安装好的tslib中lib
路径
#!/bin/sh
./configure -prefix /home/china/work/jz2440/qt/Qt5.6 \
-v \
-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 /home/china/work/jz2440/qt/tslib_root/include \
-L /home/china/work/jz2440/qt/tslib_root/lib
自动配置脚本文件搞定。
Step 3 配置Qt的平台信息
执行:
vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
把下面的替换进去
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
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)
include(../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-objcopy
QMAKE_NM = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-nm -P
QMAKE_STRIP = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-strip
Step 4 开始编译安装Qt
./qt-build.sh
make -j8
make install
Tips:
在执行./qt-build.sh
时,终端会输出很多error
,但仔细看会发现,一个error
下面会对应一个*** disable
信息,这个推测是根据配置文件禁用了相关功能,只要能产生Makefile
即可,不影响最后的编译结果!要是其他error情况,可自行google哦
Step 5 配置安装好的Qt如下
Step 6 把编译安装好的Qt核心文件复制到板子中
通过nfs
服务,首次使用的可参考此篇文章:https://blog.csdn.net/multimicro/article/details/82288449
仅把上图中的libs
plugins
两个文件夹复制至JZ2400开发板即可。
Step 7 在开发板中配置Qt的环境变量
在文件系统 /etc/profile 里添加
export QTEDIR=/usr/local/Qt5.6
export LD_LIBRARY_PATH=/usr/local/Qt5.6/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
搞定!
注:上图中的mmSize
写错了,应该是mmsize
文章下面有纠正。
9 编译Embeded Qt5.6 应用程序
9.1 配置桌面版Qt Creator
步骤如下
Step 1
Tips:
C++ 对应 arm-none-linux-gnueabi-g++
C 对应 arm-none-linux-gnueabi-gcc
** Step 2 **
单击Add
选择编译后的Qt中的qmake
文件
** Step 3 **
9.2 建立Qt界面程序
Step 1
在正常流程建立工程时,在选择编译器时,选择自己配置的,其余正常流程。
Step 2
建好工程后
run qmake
build
就是那个锤子logo
解决办法:仅能保证没有error,编译后的应用程序可以正常执行
下面是我设计的UI ,用于测试,字体过大,但显示起来正常,原因暂时不做考虑,现在就是测试!
字体问题已经于2018.11.18解决
以上错误的一个原因就在于把mmsize
错写为mmSize
了,当然也有后面的参数问题
如下:将mmsize的值修改以下即可
size
指的是屏幕分辨率(480x270)
mmsize
指的是屏幕物理尺寸(95x53),但经测试mmsize
的值为图中所示时,字体才显示比较正常,这个原因暂时未知,留个坑...
修复这个问题所参考的资料为:
http://blog.chinaunix.net/uid-26993600-id-4568302.html
http://doc.qt.io/qt-5/embedded-linux.html
效果图如下:
Step 3 生成可在JZ2440上面执行的程序
执行过qmake
和build
(锤子)后就能生成了:
Step 4 测试验证
先把上述可执行文件hellojz24401
复制到nfs
服务文件夹下面(图片没有截全):
在开发板上挂载nfs服务文件:
开发板中的/mnt/
文件夹下的nfs
文件夹提前建立好
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.120:/home/china/work/nfsroot /mnt/nfs/
直接在挂载的nfs
文件夹下执行即可
LCD显示信息为,虽然丑,但是能显示啊,哈哈
搞定!
在测试过程时会出现以下错误,虽然在我板子在不影响程序跑通,但为了避免以后的错误,现在解决一下:
根据参考资料1文章可知缺少libiconv
下载解压后:
--host
编译为目标格式文件
--prefix
编译安装目标目录
CC
编译器中arm-none-linux-gnueabi-gcc
路径
LDFLAGS
编译器中/sys-root/lib
路径
cd libiconv-1.14/
./configure --host=arm-none-linux-gnueabi --prefix=/home/china/work/jz2440/qt/libiconv CC=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc LDFLAGS="-L/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi/sys-root/lib" --enable-static
make
make install
然后把安装目录下的preloadable_libiconv.so
文件复制到文件系统的/usr/lib/
文件下,在/etc/profile
中添加
export LD_PRELOAD=/usr/lib/preloadable_libiconv.so:$TSLIB_ROOT/lib/libts.so
重启开发板再次运行就没事了。
维护日志
| 维护日期 | 维护内容
---|:--😐---
| 2018.11.18 | 修复Qt程序字体在JZ2440上的显示问题
参考资料: