Yocto 项目的编译是一个完整的镜像生成过程,而真正的设计过程中常常是对部分进行更改设定,此时若仍对整个项目进行编译,操作时间过长,因此掌握 Standalone 编译方法是很重要的。
本文意在利用 Yocto 项目生成的工具链对 u-boot 、 kernel 进行 Standalone 编译,并利用生成的镜像制作 SD 启动卡。
主机环境:Ubuntu16.04
硬件环境:i.MX6ULEVK
ps:本文操作在创建的文件夹 ~/imx-standalone 下进行,并且需要借助 Yocto 项目获取一些必要的文件。
一、获取交叉编译工具链
- 利用 Yocto 项目获取得到工具链,参考执行命令如下,Yocto 项目的建立具体可以参考大大通博文“【i.MX6】 Yocto 项目编译”。
$ DISTRO=fsl-image-x11 MACHINE=imx6ulevk source fsl-setup-release.sh –b build-x11 $ bitbake core-image-minimal -c populate_sdk |
- 在路径 ~/imx-yocto-bsp/build-x11/tmp/deploy/sdk/ 下会生成工具链安装脚本 fsl-imx-x11-glibc-x86_64-core-image-minimal-cortexa7hf-neon-toolchain-4.14-sumo.sh,用命令“./”运行该脚本即可将工具链安装在默认路径 /opt 下,也可以自己设定安装位置。此处我们选择安装在路径 ~/imx-standalone/toolchain 。
二、获取 u-boot
- 获取 u-boot 代码并编译:
$ git clone https://source.codeaurora.org/external/imx/uboot-imx $ git checkout rel_imx_4.14.98_2.0.0_ga $ source ../toolchain/environment-setup-cortexa7hf-neon-poky-linux-gnueabi $ echo $CC $ make mx6ul_14x14_evk_optee_defconfig $ make |
- 在目录 /home/imx-standalone/uboot-imx 下可以找到文件 u-boot-dtb.imx
三、获取 kernel
- 获取 kernel 代码并编译:
$ git clone https://source.codeaurora.org/external/imx/linux-imx $ git checkout rel_imx_4.14.98_2.0.0_ga $ source ../toolchain/ environment-setup-cortexa7hf-neon-poky-linux-gnueabi $ make imx_v6_v7_defconfig $ LDFLAGS=”” CC=”$CC” make |
- 分别可以找到以下文件 kernel:~/imx-standalone/linux-imx/arch/arm/boot/zImage
设备树:~/imx-standalone/linux-imx/arch/arm/boot/dts/imx6ul-14x14-evk.dtb
- 可以使用命令“make dtbs”,单独编译得到设备树文件。
四、获取 uTee-6ulevk 文件
- 在已经编译好的 Yocto BSP 中,可以在如下目录找到该文件: ~/imx-yocto-bsp/build-x11/tmp/deploy/images/imx6ulevk/uTee-6ulevk
五、制作 SD 启动卡
- SD 启动卡的制作主要分为两部分:SDcard 分区和拷贝镜像。
① 给 SDcard 分区使用的“fdisk”命令必须要以 root 身份进行操作。
② 第一个分区设置为 vfat 格式,第二个分区设置为 ext3 格式。
$ sudo su $ fdisk /dev/sdb p → d → n → p → 1 → 20480 → 102400 → n → p→ 2 → 102401 → Default → p → w $ mkfs.vfat /dev/sdc1 $ mkfs.ext3 /dev/sdc2 |
- 拷贝镜像至 SDcard 。
① 使用命令 "mount" 对 SDcard 分区进行挂载,然后再进行镜像拷贝;进行挂载的文件夹最好是空文件夹,避免拷贝时出现冲突。
② 此处对于 "u-boot" 的烧录使用 "dd" 命令。
③ "sync" 也是一个重要的命令,给系统操作一个缓冲,保证能完整拷贝镜像。
④ 根文件系统一般是根据自身项目需求以及存储设备容量大小进行制作,此处我们借用 Yocto 项目中生成的根文件系统进行操作。
$ sudo dd if=u-boot-dtb.imx of=/dev/sdc bs=1k seek=1 && sync
$ mkdir mountpoint $ sudo mount /dev/sdc1 ./mountpoint $ sudo cp ./uboot-imx/u-boot-dtb.imx ./mountpoint $ sudo cp ./ linux-imx/arch/arm/boot/zImage ./mountpoint $ sudo cp ./linux-imx/arch/arm/boot/dts/imx6ul-14x14-evk.dtb ./moutpoint $ sudo cp ../imx-yocto-bsp/build-x11/tmp/deploy/images/imx6ulevk/uTee-6ulevk ./mountpoint $ sudo umount ./mountpoint $ sync $ sudo mount /dev/sdc2 ./mountpoint $ sudo tar –xvf ../imx-yocto-bsp/build-x11/tmp/deploy/images/imx6ulevk/fsl-image-validation-imx-imx6ulevk-DATE.rootfs.tar.bz2 ./moutpoint $ sudo umount ./mountpoint $ sync |
- 插入 SDcard 并启动开发板,使用 minicom 观察串口打印信息。
① minicom 是一个串口通信工具,是 Linux 开发常用的软件工具,就像 Windows 下的超级终端,可用来串口通信。
启动 log 显示如下:
【参考资料】
- NXP 官网:《i.MX 6UltraLite EVK - Quick Start Guide》
评论