iMX93-Yocto工程构建过程
1、虚拟机安装完成后需要安装必备软件,按照i.MX Yocto Project User's Guide.pdf文档安装packages:
$ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential \ chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \ iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ python3-subunit mesa-common-dev zstd liblz4-tool file locales -y $ sudo apt install python is python3 //将默认的python设置为python3防止程序找不到python程序路径 $ sudo locale-gen en_US.UTF-8
2、安装Report程序
Repo 是一个构建在 Git 上的工具,可以更轻松地管理包含多个存储库的项目,这些存储库不需要位于同一台服务器上。
切换到工程文件夹,如~/imx-yocto-bsp,在文件夹下执行如下命令:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
向~/.bashrc文件添加下面的代码,确保~/imx-yocto-bsp文件夹在PATH变量中
export PATH=~/imx-yocto-bsp:$PATH
3、设置Git用户名和密码
git config --global user.name xxxxxx git config --global user.email xxxxxx git config --list
4、下载并安装i.Mx93的Yocto工程
$ mkdir imx-yocto-bsp $ cd imx-yocto-bsp $ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-nanbield -m imx-6.6.3-1.0.0.xml $ repo sync
24年4月16日编译时最新版本是6.6.3-1.0.0,后续编译时需要确认nxp是否更新了库。
由于网络原因,执行上面的repo init指令时可能会报错,可以在本地环境变量中指定repo服务器的国内镜像地址,在~/.bashrc文件中
添加如下指令并重启Ubuntu:
export REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/"
执行命令后将进行Yocto源代码的下载。
运行repo sync后会提示如下,表明sync成功
Fetching: 100% (15/15), done in 6.646s Checking out: 100% (15/15), done in 1.429s repo sync has finished successfully.
5、构建映像
a) 下载完成后会在imx-yocto-bsp目录下有一个imx-setuup-release.sh脚本文件,该脚本用于初始化Yocto构建目录,语法如下:
$ DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir>
脚本运行时输入3个主要参数:
DISTRO=fsl-imx-xwayland/fsl-imx-wayland/fsl-imx-fb MACHINE=imx93-11x11-lpddr4x-evk -b build
b) 配置完成运行该脚本即可执行工程的下载和构建:
$ DISTRO=fsl-imx-xwayland MACHINE=imx93-11x11-lpddr4x-evk source imx-setup-release.sh -b fsl-imx-xwayland
执行后会出现EULA协议确认,阅读后输入y确认即可,完成后,会在imx-yocto-bsp/fsl-imx-xwayland/目录下生成项目配置文件。
命令行路径会自动切换到fsl-imx-xwaylang$
c) 输入如下命令开始从网络拉取构建项目所需的库源码文件:
bitbake imx-image-full
然后是漫长的等待,期间下载某些库时会失败,可以使用bitbake -k imx-image-full命令跳过错误继续构建,也可以使用bitbake -c fetch imx-image-full先将源码下载下来然后再编译。
如果退出或者结束终端会话,可以使用以下命令重新载入环境:
$ source setup-environment <build-dir>
说一下电脑的配置要求,我使用的电脑是i7-13700 + 32GB + 2T,在VMware中使用的ubuntu22.04虚拟机分配的配置为8核心 + 16GB + 10GB swap。实际使用中发现在拉取配置的过程中内存占用会超过8GB ,而10GB 的swap空间占用在30%以下。之前我用16核+8GB RAM + 2GB swap的虚拟机配置拉取时总是会出现问题,提示某一个库的do_compile错误,出现ERROR红色提示,看了一下过程中的内存占用,8GB RAM 几乎用满且swap空间也没有剩余。后面更新为现在的配置后还未遇到过ERROR提示。
6、部署映像
构建完成后,所有的映像文件都部署到了 <build directory> /tmp/deploy/images/<MACHINE>/目录下。有linux image、设备树、uboot、rootfs等等很多文件。

因为生成的文件是根据imx93 evk官方开发板配置的,所以在烧写映像之前需要根据我们自己的开发板硬件配置做一些调整。
比如我们用的板子上DDR为LPDDR4(1.1v供电),跟官方开发板LPDDR4x(0.6v供电)型号不一样,这就需要修改UBOOT源码中的timing文件和设备树中PMIC的默认输出电压。

bitbake使用举例
1. 显示全局或每个配方环境有关变量所在位置的信息: # 查看源码目录: bitbake –e linux-renesas | grep ^S= # ^S 首字母为S # S="/home/zsj/rzg2/build/tmp/work-shared/smarc-rzg2l/kernel-source" bitbake –e u-boot | grep ^S= # 查看源码 git 下载链接: bitbake -e linux-renesas | grep ^SRC_URI= bitbake -e u-boot | grep ^SRC_URI= # 查看源码编译工作目录: bitbake -e linux-renesas | grep ^WORKDIR= bitbake -e u-boot | grep ^WORKDIR= 2. 配置内核 menuconfig bitbake linux-renesas -c menuconfig 3. 编译修改后的内核目录 (-C 为大写) bitbake linux-renesas -C compile –f 4. 编译内核所需要的执行的任务: bitbake linux-renesas -c listtasks 5. 显示图层 bitbake-layers show-layers 6. 强制执行操作,即使不需要 bitbake -f <target> 7. 显示更多调试信息 bitbake -DDD <target> 8. 清除单个目标 bitbake -c clean <recipe_name/target_name> # 执行 do_clean 任务 bitbake -c cleanall <recipe_name/target_name> # 轻易不要用这个,这个会将 downloads 的源文件删除
根据上面的命令行确认各部分源码在yocto工程中的位置:
Kernel源码位置:
bitbake -e linux-imx | grep ^S=
S="/home/xxx/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/linux-imx/6.6.3+git/git"
u-boot源码位置:
$ bitbake -e u-boot | grep ^S= S="/home/xxx/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/u-boot-imx/2023.04/git"
rootfs位置:
/home/xxx/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/imx-image-full/1.0
Yocto下单独编译u-boot
在fsl-imx-xwayland目录下,使用如下命令强制编译uboot
$ bitbake -c compile -f -v u-boot-imx //f-force compile v-show detail info
$ bitbake -c deploy -f -v u-boot-imx
终端会提示最终的编译结果

u-boot使用的默认deconfig文件为: ~/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/u-boot-imx/2023.04/git/configs/imx93_11x11_evk_defconfig
u-boot使用的默认设备树文件为:~/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/u-boot-imx/2023.04/git/arch/arm/dts/imx93-11x11-evk.dts
首先根据 《I.MX93 DDR 配置和CONFIG TOOL使用.pdf》测试板载的LPDDR4芯片的读写参数和稳定性,我们设备上使用的是LPDDR4-8Gb-512Mbx16,最高支持的数据速率为4267MHz,但imx9352芯片最高支持的DDR数据速率为3733MHz。根据使用的DDR参数配置工具的内容,然测试成功后将生成的lpddr4_timing.c文件中的配置参数拷贝到u-boot中的./board/freescale/imx93_evk/lpddr4x_timing.c替换原文件中的内容。
然后修改./include/configs/imx93_evk.h文件中的PHYS_SDRAM_SIZE 宏定义为 0x40000000-1GB大小。

使用如下命令打开u-boot的menuconfig:
$ bitbake u-boot-imx -c menuconfig
查找u-boot源码中的spl.c文件193行有如下判断语句,使能CONFIG_IMX93_EVK_LPDDR4选项后,进行PMIC初始化时会将VDDQ连接到的pmic buck2电压设置为1.1V。

而CONFIG_IMX93_EVK_LPDDR4选项是在同目录下的Kconfig文件中配置的,根据路径 board/freescale/imx93_evk/Kconfig 找到配置项在menuconfig菜单中的 “ARM architecture”中。

根据上面的定位,进入menuconfig中的如下选项,将DDR选择为LPDDR4的时序和PMIC电压。

更改完保存,并使用uboot的命令行重新进行编译,重新编译,遇到1条错误提示 “undifined reference to'dram_timing" ”。

这是因为menuconfig中配置为LPDDR4以后 Makefile中没有增加选项导致timing.o无法编译进去导致,添加如下两行后重新进行编译即可通过。

使用bitbake imx-image-full命令生成完整的程序包后使用如下命令将生成的包烧录到设备中
$ sudo uuu -b emmc_all imx-boot-imx93-11x11-lpddr4x-evk-sd.bin-flash_singleboot imx-image-full-imx93-11x11-lpddr4x-evk.rootfs-20240425080250.wic.zst
烧录完成后,重启可以正常运行spl和uboot和进入内核了,但进入内核初始化部分内容后进入了kernel panic异常模式

Yocto下编译Kernel
在fsl-imx-xwayland目录下,使用如下命令强制编译kernel
$ bitbake -c menuconfig -f -v linux-imx $ bitbake -c compile -f -v linux-imx $ bitbake -c compile_kernelmodules -f -v linux-imx $ bitbake -c deploy -f -v linux-imx
设备树位置
/home/liv/imx-yocto-bsp/fsl-imx-xwayland/tmp/work/imx93_11x11_lpddr4x_evk-poky-linux/linux-imx/6.6.3+git/git/arch/arm64/boot/dts/freescale/imx93-11x11-evk.dts

flash.bin文件构建过程:
/home/liv/imx-yocto-bsp/fsl-imx-xwayland/tmp/deploy/images/imx93-11x11-lpddr4x-evk/imx-boot-tools/soc.mak

a) 烧写映像
NXP官方下载工具UUU的下载链接:https://github.com/NXPmicro/mfgtools/releases
运行以下命令,烧写完整的i.MX93镜像
/* 烧写 SD 卡 */
.\uuu.exe -b sd_all imx-image-full-imx93evk.wic.zst/* 烧写 eMMC */.\uuu.exe -b emmc_all imx-image-full-imx93evk.wic.zst
如果uuu烧写失败,使用命令 .\uuu.exe -lsusb 确认USB设备是否正确连接
单独替换 flash.bin 文件
/* 烧写到SD卡的对应偏移中*/.\uuu.exe -b sd *.bin-flash_singleboot/* 烧写到eMMC的对应偏移中*/.\uuu.exe -b emmc*.bin-flash_singleboot
使用以下命令,将Image烧写到eMMC或SD卡的FAT分区中。
/* 将 Image 烧写到 SD卡 的 FAT 分区中*/.\uuu.exe -b fat_write Image mmc 1.\uuu.exe -b fat_write imx93-11x11-evk.dtb mmc 1
mc后跟的参数同样代表设备编号。这里的Image代表希望通过UUU烧写到对应设备中的FAT分区。以 i.MX93 EVK为例,设别编号0为eMMC,编号1为SD卡。所以,上面的命令可以理解为将Image和imx93-11x11-evk.dtb保存到SD卡的FAT分区。


浙公网安备 33010602011771号