嵌入式Linux系统BSP(Board Support Package)的整个编译过程非常繁琐且漫长,而我们在BSP开发过程中却经常需要编译这些源码,如果每次都是逐条命令输入执行,这个过程非常麻烦且容易出错。为此,凌云实验室郭工为 IMX 系列开发板编写了一套编译脚本,这样方便各个开发板的一键编译。当前该编译系统支持的开发板有:
凌云实验室 IMX 系列开发板一键编译脚本托管在 凌云实验室的 git 服务器上, 我们可以从该站点上下载最新的编译系统。这里以 IGKBoard-IMX6ULL 开发板为例,使用 git 命令下载该项目源码并重命名为 igkboard-imx6ull(也可以命名为其它开发板的名字)。
guowenxue@9d57f9229b66:~$ git clone http://iotcraft.cn:8088/r/build-imxboard.git ~/igkboard-imx6ull
guowenxue@9d57f9229b66:~$ cd ~/igkboard-imx6ull/
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls
bootloader config.json debian drivers images kernel tools yocto
下面是编译系统各文件的简单介绍。
文件/文件夹 | 描述 |
---|---|
config.json | 编译系统的JSON格式配置文件 |
tools | 编译系统所依赖系统命令和交叉编译器安装脚本 |
bootloader | Bootloader的编译脚本及补丁文件 |
kernel | Linux内核的编译脚本及补丁文件 |
drivers | 驱动学习示例源码及测试程序 |
images | Linux系统烧录镜像一键制作脚本 |
debian | Debian根文件系统一键制作的脚本 |
yocto | Yocto系统源码编译脚本 |
下面是顶层编译系统的配置文件,默认为 IGKBoard-IMX6ULL 开发板的配置。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cat config.json
{
"bsp":
{
"board":"igkboard-imx6ull",
"version":"lf-6.1.36-2.1.0",
"giturl":"https://github.com/nxp-imx/",
"cortexAtool":"/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-",
"cortexMtool":"/opt/gcc-cortexM-10.3-2021.07/bin/arm-none-eabi-"
},
"system":
{
"distro":"yocto",
"version":"mickledore",
"imgsize":"3072",
"bootsize":"100"
}
}
下面是该配置文件中各选项的配置说明:
kernel/patches/
文件夹下有哪些开发板文件夹.guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/
alientek-imx6ull-v20 alientek-imx6ull-v24 gauguin-imx8mp gen_patch.sh igkboard-imx6ull igkboard-imx8mp
如上面支持的开发板 igkboard-imx6ull、 igkboard-imx8mp、alientek-imx6ull-v20 等
kernel/patches/
相应开发板下支持哪些补丁.guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/igkboard-imx6ull/
linux-imx-lf-6.1.36-2.1.0.patch
如上面支持的 BSP 版本为 lf-6.1.36-2.1.0
bsp.giturl 该选项指定Linux BSP源码的下载地址,默认从NXP 官方的 github 仓库下载;
bsp.cortexAtool 该选项用来指定 Cortex-A核 + Linux系统的交叉编译器;
一个完整的 Linux 系统镜像制作,需要经过以下几个步骤:
接下来,我们以 IGKBoard-IMX6ULL 为例,使用该编译系统从源码来编译制作一个可以烧录到 eMMC 或 TF 卡启动的系统镜像。
在开始编译之前,我们首先确定当前编译系统支持哪些BSP版本,这点可以通过查看相应开发板的补丁文件来获取。如下所示,当前 IGKBoard-IMX6ULL 只支持 lf-6.1.36-2.1.0 这个版本。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/igkboard-imx6ull/
linux-imx-lf-6.1.36-2.1.0.patch
接下来我们需要修改顶层的配置文件 config.json 如下:
{
"bsp":
{
"board":"igkboard-imx6ull",
"version":"lf-6.1.36-2.1.0",
"giturl":"https://github.com/nxp-imx/",
"cortexAtool":"/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-",
},
"system":
{
"distro":"yocto",
"version":"mickledore",
"imgsize":"3072",
"bootsize":"100"
}
}
在下面的所有源码编译过程中,需要从github的NXP官方站点上下载大量的源码,但由于众所周知的原因,国内经常不能正常访问 github 。如果您的Linux编译服务器不能正常访问 github,请先设置好代理服务然后再开始执行后续的 build.sh 脚本开始编译,否则编译时会下载源码失败。***如果是凌云实验室的学员,可以将 giturl 设置为实验室的文件服务器地址,这样避免从 github 下载源码。***
"bsp":
{
- "giturl":"https://github.com/nxp-imx/",
+ "giturl":"http://studio.xxx.club:2211",
},
WARNNING: 上面的
"http://studio.xxx.club:2211"
请改成实验室文件服务器的正确域名。
下面是我配置的代理命令 proxy 用来代理访问 github,设置好后可以使用 curl 命令访问 google.com 来测试代理是否生效。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ proxy
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
另外,也可以使用 unproxy 命令来取消命令行代理。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ unproxy
如果是基于 i.MX8 处理器的开发板,则可以参考修改交叉编译器如下。
{
"bsp":
{
"board":"igkboard-imx8mp",
"version":"lf-6.1.36-2.1.0",
"giturl":"https://github.com/nxp-imx/",
"cortexAtool":"/opt/gcc-aarch64-10.3-2021.07/bin/aarch64-none-linux-gnu-",
"cortexMtool":"/opt/gcc-cortexM-10.3-2021.07/bin/arm-none-eabi-"
},
"system":
{
"distro":"yocto",
"version":"mickledore",
"imgsize":"3072",
"bootsize":"100"
}
}
在嵌入式BSP系统开发过程中,依赖很多的Linux系统命令及交叉编译器。在该编译系统的 tools 文件夹下,有一个 setup_tools.sh 脚本可以用来一键安装它们。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls tools/
imgmnt setup_tools.sh
接下来以 root 权限执行 tools/setup_tools.sh 脚本,来安装BSP源码编译所依赖的系统工具和交叉编译器,如果之前已经安装过则会自动跳过。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd tools/
guowenxue@9d57f9229b66:~/igkboard-imx6ull/tools$ sudo ./setup_tools.sh
All system tools already installed, skip it
All development tools already installed, skip it
start download cross compiler from ARM Developer for Cortex-A core
... ...
start decompress cross compiler for Cortex-A core
... ...
cross compiler for Cortex-A installed to "/opt/gcc-aarch32-10.3-2021.07" successfully
至此,整个编译系统的配置和开发环境搭建已经完成。
在做好前面的配置后,编译 bootloader 的工作就非常简单了,我们只需要切换到 bootloader 文件夹下,执行 build.sh
脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd bootloader/
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls
build.sh patches
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./build.sh
start build bootloader for igkboard-imx6ull
start fetch uboot-imx source code
... ...
do patch for uboot-imx now...
... ...
start build uboot-imx
... ...
MKIMAGE u-boot-dtb.imx
OFCHK .config
+ cp u-boot-igkboard-imx6ull.imx /home/guowenxue/igkboard-imx6ull/bootloader/install
+ set +x
bootloader installed to '/home/guowenxue/igkboard-imx6ull/bootloader/install'
u-boot-igkboard-imx6ull.imx
编译完成后,生成的 bootloader 文件将会存放到自动创建的 install 文件夹下。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls install/
u-boot-igkboard-imx6ull.imx
如果对 bootloader 源码有新的修改,我们可以使用 ./patches/gen_patch.sh
脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 patches 文件夹下的相应文件。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./patches/gen_patch.sh uboot-imx/
generate patch file
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls
build.sh install patches tarballs uboot-imx uboot-imx-lf-6.1.36-2.1.0.patch
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ mv uboot-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
另外使用 build.sh -c
命令可以一键清除所有编译产生的文件和源码。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./build.sh -c
start clean bootloader
guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls
build.sh patches
同样地,编译 Linux内核源码的工作也非常简单,我们只需要切换到 kernel 文件夹下,执行 build.sh
脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd kernel/
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
build.sh patches
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./build.sh
start build linux kernel for igkboard-imx6ull
start fetch linux kernel source code
... ...
do patch for linux-imx now...
... ...
start build linux-imx
... ...
linux kernel installed to '/home/guowenxue/igkboard-imx6ull/kernel/install'
igkboard-imx6ull.dtb lib overlays zImage
同样地,编译完成后生成的 linux内核文件将会存放到自动创建的 install 文件夹下。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls install/
igkboard-imx6ull.dtb lib overlays zImage
如果对 Linux内核源码有新的修改,我们可以使用 ./patches/gen_patch.sh
脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 patches 文件夹下的相应文件。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./patches/gen_patch.sh linux-imx/
generate patch file
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
build.sh install linux-imx linux-imx-lf-6.1.36-2.1.0.patch patches tarballs
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ mv linux-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
另外使用 build.sh -c
命令可以一键清除所有编译产生的文件和源码。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./build.sh -c
start clean linux kernel
guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
build.sh patches
系统镜像的制作依赖 Bootloader、Linux内核 和 根文件系统系统,前面的过程我们已经从源码编译了 Bootloader 和 Linux内核镜像文件,而根文件系统则需要从凌云实验室的文件服务器上下载。实验室的学员只需要在前面的配置中,将 githurl 配置成实验室的文件服务器即可。
因为 Linux 系统镜像需要使用 sudo 和 loop 设备,所以这个需要在自己的虚拟机或实验室的编译服务器具有相应权限的账号下工作。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd images/
guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ ls
build.sh
guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ sudo ./build.sh
Build system image yocto-mickledore-lf-6.1.36-2.1.0.img
INFO: download rootfs-yocto-mickledore.tar.zst form http://studio.xxx.com:2211
... ...
start generate empty system image
... ...
start partition system image
losetup system image on loop4
... ...
start format system image
... ...
start install u-boot image
... ...
start install linux kernel images
update drivers in root filesystem
start install root filesystem
Build system image yocto-mickledore-lf-6.1.36-2.1.0.img done
Start bzip2 compress yocto-mickledore-lf-6.1.36-2.1.0.img
... ...
Shell script exit now, do some clean work
kpartx -dv /dev/loop4
del devmap : loop4p1
del devmap : loop4p2
losetup -d /dev/loop4
编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 install 文件夹下。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ ls install/
u-boot-igkboard-imx6ull.imx yocto-mickledore-lf-6.1.36-2.1.0.img.bz2
接下来将上面两个文件下载到自己的 Windows 系统下,参考前面的文档就可以烧录启动了。
Yocto 系统的编译比较复杂,对软件的要求比较高。其至少要求:
如果您的编译服务器满足上述软硬件要求,则可以尝试 Yocto 的源码编译。在该编译系统中,这个过程也非常简单,只需要执行 yocto 文件夹下的 build.sh
脚本即可。一次完整的编译在凌云实验室编译服务器上大概需要7~8个小时,该服务器的配置为:
下面是 Yocto 源码编译的过程。
guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd yocto/
guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ls
build.sh meta-igkboard
guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ./build.sh
start build Yocto mickledore for igkboard-imx6ull
start download fetch Yocto mickledore source code
... ...
Build directory is igkboard-imx6ull
/home/guowenxue/igkboard-imx6ull/yocto/mickledore-lf-6.1.36-2.1.0
Welcome LingYun IoT Gateway Kit Board Yocto BSP
The Yocto Project has extensive documentation about OE including a
reference manual which can be found at:
http://yoctoproject.org/documentation
You can now run 'bitbake <target>'
Common targets are:
yocto-image-full
core-image-minimal
imx-image-full
... ...
Yocto(mickledore) installed to '/home/guowenxue/igkboard-imx6ull/yocto/install'
Start bzip2 compress yocto-mickledore-lf-6.1.36-2.1.0.wic
rootfs-yocto-mickledore.tar.zst u-boot-igkboard-imx6ull.imx yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 install 文件夹下。
guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ls install/
rootfs-yocto-mickledore.tar.zst u-boot-igkboard-imx6ull.imx yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
接下来将上面两个文件下载到自己的 Windows 系统下,参考前面的文档就可以烧录启动了。