撰写日期 | 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
html
cd u-boot-2012.04.01/ patch -p1 <../u-boot-2012.04.01_100ask.patch
我修改了内核分区大小,将默认的2m改成了4m(打完补丁在进行以如下操做)linux
vim include/configs/smdk2440.h
这是我改后的文件
保存退出后执行如下命令编译u-bootgit
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:github
cd linux-3.4.2/ patch -p1 <../linux-3.4.2_100ask.patch cp config_ok .config
接下来把内核所在分区修改成4mubuntu
vim arch/arm/mach-s3c24xx/common-smdk.c
下图是我修事后的文件
而后在执行如下命令编译内核uImagevim
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
内核完成,但不支持网络和触摸屏windows
至此上面的内核挂载启动文件系统后,是不支持网卡的,也就是没法使用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/
***
在arch/arm/mach-s3c24xx/
文件夹中,修改里面的mach-smdk2440.c
文件内容,修改内容就不粘贴了,我把这个改后的文件链接粘贴出来直接下载使用便可,文件见上述百度云盘资料
编译内核从新烧录后以下图:
4.3LCD支持搞定,启动此内核时,JZ2440V3的4.3寸LCD会显示一个闪烁光标
首先引用宋宝华《linux设备驱动开发详解》中P66的一段话
在linux内核中增长程序须要完成如下3项工做。
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的配置文件撰写
下面进入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!驱动上以后果真,解决了。
这个触屏驱动的正常驱动,是后续使用触屏的前提!--这好像是句废话
在windows下经过openJTAG下载吧,或者进Nor-Flash中用老版本的u-boot下载,这个就须要借助DNW工具了
启动新加载的u-boot
经过mtdparts
命令能够看出通过u-boot划分后的flash分区,其中kernel已经为修改后的4M大小
1) //经过tftp协议将tftp共享文件夹里面的uImage文件下载到板内地址为0x30000000的SDRAM内存中
tftp 0x30000000 uImage
2) //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
3) //其下命令表示将SDRAM中存放在地址为0x30000000地方的文件下载到flash偏移地址为0x60000的大小为$filesize中去
//偏移量0x60000也是经过mtdparts命令获取得知的,见上图
nand write.jffs2 0x30000000 0x60000 $filesize
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分区内核
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
sudo apt-get install autoconf automake libtool
检测编译器里面的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解决,自学能力也是很重要的一种能力哦。
1) 首先须要yaffs2制做工具mkyaffs2image
此文件在韦东山提供的JZ2440配套光盘A盘里面的tools文件夹下有
2) 或者来到B盘这里
在此文件夹路径下终端make
一下,也能出来这个工具
Tips: 执行make clean
生成的文件就消失了
把这个mkyaffs2image工具复制到/usr/local/bin/
目录下,这样就能够直接在终端中使用此工具了
sudo cp mkyaffs2image /usr/local/bin/
找到制做好的busybox文件夹,这个文件夹是本文第5步下的busybox安装位置
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]
便可,效果图以下:
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
文章下面有纠正。
步骤以下
Step 1
Tips:
C++ 对应 arm-none-linux-gnueabi-g++
C 对应 arm-none-linux-gnueabi-gcc
** Step 2
单击Add
选择编译后的Qt中的qmake
文件
Step 3 **
Step 1
在正常流程创建工程时,在选择编译器时,选择本身配置的,其他正常流程。
Step 2
建好工程后
run qmake
build
就是那个锤子logo
字体问题已经于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上的显示问题 |
参考资料: