100ASK-IMX6ULL开发板_QT移植全过程_make 100ask_imx6ull-qt_defconfig(1)

先在 u-boot 中设置开发板 IP 为 192.168.1.112,然后在 u-boot 中使用 ping 命令测试开发板与 Ubuntu

系统是否连通(出现“alive”就表示联通):命令如下:

=> setenv ipaddr 192.168.1.112
=> ping 192.168.1.224

3.3. 配置选项,网络启动内核

先在 Ubuntu 的 TFTP 目录中放入 zImage 和设备树文件,再在/home/book/nfs_rootfs 目录下拷贝配置好的根文件系统。

然后在 U-Boot 控制台执行以下命令启动单板,假设 Ubuntu IP 是 192.168.1.224:

=> setenv serverip 192.168.***.*** //设置服务器的 IP 地址,这里指的是 Ubuntu 主机 IP
=> setenv ipaddr 192.168.***.*** //设置开发板的 IP 地址。
=> setenv nfsroot /home/book/nfs_rootfs/*** //设置文件系统所在目录。
=> run netboot //设置完成后,运行网络启动系统命令

3.4. 启动流程

U-boot通过tftp从服务端tftp指定目录下下载到内核设备树加载入内存,从而启动内核,最终挂载根文件系统

在这里插入图片描述

启动完成后如下图:
在这里插入图片描述
可以执行基本的命令了,但是提示没有/etc/init.d/rcS文件,所以需要完善一下文件系统。

3. 完善根文件系统

3.1 创建/etc/init.d/rcS文件

linux启动后需要运行一些服务,而 /etc/init.d/rcS文件就是规定启动哪些服务,创建该文件并添加如下内容:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
#往PATH里面新增一个~/bin的路径,如果不加:$PATH的话,就表示直接把PATH赋值为~/bin,这样你其他的老路径就丢失了。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug #通过这两行,linux内核就可以在/dev目录下自动创建设备节点
mdev -s
mount -a
exec /etc/rc.local

将rcS添加可执行权限chmod 777 rcS

创建/etc/rc.local,创建该文件并添加如下内容:

\#!/bin/sh
. /etc/profile #注意.后边有个空格!

创建/etc/profile,暂且不添加内容.

3.2 创建/etc/fstab文件

fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区,创建该文件并添加如下内容:

#<file system> <mount point> <type> <options> <dump> <pass>
proc           /proc         proc    defaults   0      0
tmpfs          /tmp          tmpfs   defaults   0      0
tmpfs          /dev          tmpfs   defaults   0      0
sysfs          /sys          sysfs   defaults   0      0

3.3 创建/etc/inittab文件

init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成,创建该文件并添加如下内容:

::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/umount -a -r
::shutdown:/sbin/swapoff -a

3.4 创建/etc/resolv.conf文件

/etc/resolv.conf文件用于配置域名服务器,没有域名服务器就不能将网址转换成ip地址,创建该文件并添加如下内容:

nameserver 114.114.114.114
nameserver 192.168.101.1

创建完以上三个文件后,重启linux,发现没有错误提示了。ping一下百度也可以ping通,网络也可以使用了,此时可以通过交叉编译器来编译可以在100ASK开发板上运行的linux程序了。

3.5 构建 /dev 目录

mkdir -p ~/nfs_rootfs/blogrootfs/dev
cd ~/nfs_rootfs/blogrootfs/dev
sudo mknod console c 5 1
sudo mknod null   c 1 3

三.编译QT_arm源码与tslib

一. 安装tslib

tar xzf tslib-1.4.tar.gz
cd tslib
mkdir -p generated_tslib_ok/tslib
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=arm-linux-gnueabihf-gcc \
-prefix=$(pwd)/generated_tslib_ok/tslib

make&sudo make install

tslib安装在/generated_tslib_ok/tslib目录下:

在这里插入图片描述

二. 安装qt-everywhere-opensource-src-5.6.0

tar -xf qt-everywhere-opensource-src-5.6.0.tar.gz
cd qt-everywhere-opensource-src-5.6.0

vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

原配置文件:

修改配置文件:(注意以下选项:QMAKE_INCDIR QMAKE_LIBDIR对应tslib安装目录)

#
# 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_RELEASE    += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE  += -O2 -march=armv7-a
QMAKE_INCDIR +=/home/book/QT_imx6ull/tslib/generated_tslib_ok/tslib/include
QMAKE_LIBDIR +=/home/book/QT_imx6ull/tslib/generated_tslib_ok/tslib/lib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_NM                = arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = arm-linux-gnueabihf-strip
load(qt_config)

配置选项:

./configure -v -prefix /opt/qt-5.6.0 -release \
-opensource -no-accessibility \
-make libs -xplatform linux-arm-gnueabi-g++ -optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-zlib \
-tslib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-pkg-config \
-no-separate-debug-info \
-I /home/book/QT_imx6ull/tslib/generated_tslib_ok/tslib/include \
-L /home/book/QT_imx6ull/tslib/generated_tslib_ok/tslib/lib

执行安装:

make
sudo make install

最终生成文件:

在这里插入图片描述

四. QT与tslib移植

cp /opt/qt-5.6.0 /home/book/nfs_rootfs/blogrootfs/
cp /home/book/QT_imx6ull/tslib/generated_tslib_ok/tslib/ /home/book/nfs_rootfs/blogrootfs/

修改最小根文件系统配置文件,增加以下内容 /etc/profile

export T_ROOT=/tslib 
export LD_LIBRARY_PATH=/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1 #注意:该设备为板子触摸屏文件
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QTEDIR=/qt-5.6.0
export LD_LIBRARY_PATH=lib:$LD_LIBRARY_PATH
export QT_QPA_GENERIC_PLUGINS=tslib
export QT_QPA_FONTDIR=/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=plugins 
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x640:mmSize=1280x720:offset=0x0:tty=/dev/ttymxc0
export TSLIB_TSDEVICE=/dev/input/event1 #注意:该设备为板子触摸屏文件

移植后执行QT应用文件,可能会出现以下问题:

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

下载 http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz 解压后,执行以下命令:

./configure -prefix=$PWD/_install -host=arm-linux-gnueabihf  
wget -c http://www.itkb.ro/userfiles/file/libiconv-glibc-2.16.patch.gz
gzip -d libiconv-glibc-2.16.patch.gz 
cp libiconv-glibc-2.16.patch libiconv-1.14/srclib #将补丁考到 libiconv-1.14/srclib 目录
cd libiconv-1.14/srclib
patch -p1 <libiconv-glibc-2.16.patch
cd libiconv-1.14 #返回
make
make install 
#把_install/lib 下的preloadable_libiconv.so 拷到最小根文件系统的/lib 下, 
#/etc/profile添加
export LD_PRELOAD=/lib/preloadable_libiconv.so

不打补丁会出现以下问题:
make[2]: [progname.o] Error 1
make[2]: Waiting for unfinished jobs…
make[2]: Leaving directory /opt/sources/libiconv-1.14/srclib
make[1]: [all] Error 2
make[1]: Leaving directory /opt/sources/libiconv-1.14/srclib

make: *** [all] Error 2

参考链接: https://blog.csdn.net/wangyuanfei555/article/details/47399771

https://blog.csdn.net/ownfire/article/details/47276219?utm_source=blogxgwz6

此刻,兼容QT5.6.0的最小根文件制作完成

四.使用genimage制作可烧录运行镜像

在制作完最小根文件系统后,需配置系统内核模块以及固件:
重新挂载rootfs.ext4,在根文件系统下创建/boot目录,
拷贝编译好的内核镜像和设备树文件到 arm 架构 ubuntu 根文件系统的 boot 目录下。

安装内核模块到arm架构的ubuntu文件系统内,如下命令所示,

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs/roofs_ext4_touch/rootfs_mount modules_install

INSTALL_MOD_PATH后面的目录地址为 arm 架构 ubuntu 文件系统所在绝对路径(模块安装前需要先编译模块make moudle)。

安装完内上述文件后,即可进行镜像生成操作如下命令所示,需要先生成一个大小为 2GB 的 rootfs.ext4 镜像文件,让后格式化镜像为 ext4 格式,之后通过挂载镜像方式把制作好的镜像文件拷贝到文件系统内。

book@100ask:~$ dd if=/dev/zero of=rootfs.ext4 bs=1M count=512
book@100ask:~$ sudo mkfs.ext4 -F rootfs.ext4

在这里插入图片描述

如下命令所示,创建一个 rootfs-mount 目录,并挂载 rootfs.ext4 镜像到该目录下,之后拷贝制作好的文件系统内所有文件到此挂载目录,紧接着使用 sync 命令同步数据缓存保证拷贝完成,完成后可以使用 sudo umount rootfs-mount/卸载当前挂载的镜像。

book@100ask:~$ mkdir rootfs-mount
book@100ask:~$ sudo mount rootfs.ext4 rootfs_mount/
book@100ask:~$ sudo cp -rvfp min_blogrootfs/* rootfs_mount/
book@100ask:~$ sync
book@100ask:~$ sudo umount rootfs_mount/

在这里插入图片描述

只制作好 ext4 格式的文件系统并不能直接烧录到开发板启动,此时我们需要使用一个 buildroot 下的一个镜像生成工具 genimage 来制作。首先把编译好生成的 genimage 可执行程序拷贝到家目录下,同时把编译好的 uboot 镜像文件 u-boot-dtb.imx 文件也拷贝到当前目录下。

此时需要在家目录下新建一个名为 root-genimage.cfg 的分区配置文件,里面写入如下信息。

image 100ask_imx6ull.img {
        hdimage {
}
partition u-boot {
        in-partition-table = "no"
        image = "u-boot-dtb.imx"
        offset = 1024
}
partition arduino {
        partition-type = 0xC
        size = 50M
        offset = 10M
}
partition rootfs {
        partition-type = 0x83
        image = "rootfs.ext4"
        size = 512M
}

此时目录下有如下 4 个文件,分别是 rootfs-genimage.cfg rootfs.ext4 u-boot-dtb.imx genimage

在这里插入图片描述

此时我们可以执行如下命令来生成 ubuntu-16.04-armhf_100ask_imx6ull.img 系统镜像文件。

book@100ask:~$ mkdir root
book@100ask:~$ sudo ./genimage --inputpath ./ --outputpath ./ --config ./rootfs-genimage.cfg

执行命令完成在当前路径下生成空白文件目录与镜像文件100ask_imx6ull.img。

在这里插入图片描述

使用FileZilla软件将镜像文件拷贝到PC机修改正确的文件目录名称,使用100ask_imx6ull_flashing_tool即可烧录运行测试

五. 功能演示

  1. 测试tslib,并校准屏幕:

在这里插入图片描述
在这里插入图片描述

  1. 自己编写的QT测试程序,编译执行:

在这里插入图片描述
在这里插入图片描述

​ PS:根文件系统没有一次制作完成得多次挂载移植文件有点繁琐,不过当作练习命令敲写:!,过程还有很多地方得学习改进…

参考链接:

busybox最小根文件系统创建:

https://blog.csdn.net/u014783685/article/details/105034074/

QT移植方法:

https://blog.csdn.net/fengyuwuzu0519/article/details/80110912

https://www.freesion.com/article/3380457898/

安装过程问题解决:

https://blog.csdn.net/wangyuanfei555/article/details/47399771

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

[外链图片转存中…(img-d1kOGMMO-1715535213099)]

[外链图片转存中…(img-x9vWiZjB-1715535213100)]

[外链图片转存中…(img-bnJK9VnV-1715535213100)]

[外链图片转存中…(img-1TVrZx1f-1715535213100)]

[外链图片转存中…(img-ITXoSNbg-1715535213101)]

[外链图片转存中…(img-cOZQ1JQa-1715535213101)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值