这是机器未来的第46篇文章
原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126752099
文章目录
1. 概述
本文描述了IMX8QXP通过yocto编译烧写镜像和生成SDK的过程。本文参考《i.MX_Yocto_Project_User’s_Guide.pdf》文档,博主在实操过程中遇到了很多问题,例如repo国内无法下载的问题、repo同步慢的问题,生成SDK时包冲突的问题,等等。
环境准备:
- 至少300G硬盘空间,yocto工程编译结果很大。
- 网速越快越好
- 编译时间至少一个晚上。
2. repo安装及源码下载加速
yocto项目通过repo来管理源码。
2.1. repo清华源加速
repo工具存放在google的服务器上,因为国内无法访问谷歌,因此需要配置国内镜像服务。
$ mkdir mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-honister -m imx-5.15.5-1.0.0.xml --repo-url=https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
2.2 配置gitee加速
yocto相关的库下载速度太慢,将相关的库先download到本地(gitee),然后再同步到gitee上供使用。
在repo init操作完毕后,会在imx-yocto-bsp目录下创建一个.repo文件夹,在.repo/manifests/imx-5.15.5-1.0.0.xml文件中存储着repo sync需要同步的所有git仓库,网速长期在10KB/s以下,完整加载完需要花费大约一整晚,将其配置到gitee仓库加速后,大概几分钟就加载完成了。
得益于gitee直接拉取不好用,博主只能手动先下载到本地后再推送到博主的gitee仓库,目前仓库均开源。
仓库地址:https://gitee.com/RobotFutures/
完整的配置文件可以直接下载博主已经配置好的:【深入浅出imx8企业级开发实践 | 02】yocto项目repo源码gitee加速配置方法
不使用博主配置文件的可以自行修改fetch地址,将其仓库地址修改为博主的仓库地址即可,感兴趣的跳到末尾附录查看。
2.3 多线程加速同步库
# 多线程加速
$ repo sync -j`nproc`
3.编译过程
3.1 配置编译选项
# 编译配置:
# - DISTRO
# - MACHINE板卡型号
# - imx-setup-release.sh编译脚本
# -b imx8qxpc0mek_wayland 输出编译后的结果
$ DISTRO=fsl-imx-wayland MACHINE=imx8qxpc0mek source imx-setup-release.sh -b imx8qxpc0mek_wayland
3.2 安装编译依赖工具包
# 编译依赖包安装
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint3 xterm rsync curl zstd pzstd lz4c lz4
如果提示提示没有安装zstd,则先更新源再同步
$ sudo apt update
$ sudo apt install zstd
3.3 编译
# 开始编译:镜像选择的不带QT支持GUI的镜像, 编译结果大约300G
$ bitbake imx-image-multimedia
编译完毕之后,生成的固件包在imx-yocto-bsp/imx8qxpc0mek_wayland/tmp/deploy/images/imx8qxpc0mek目录下,imx-image-multimedia-imx8qxpc0mek-20220814092234.rootfs.wic.bz2为sd卡烧写文件。
因为没有配置uboot启动方式,默认启动方式为sd卡
4. 烧写SD卡镜像
bzcat imx-image-multimedia-imx8qxpc0mek-20220814092234.rootfs.wic.bz2 | sudo dd of=/dev/sd<partition> bs=1M conv=fsync
具体是哪个设备,可以通过df -h命令查询新增设备
zhoushimin@zsm:linux-imx$ df -h
df: /run/user/1000/doc: Operation not permitted
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 2.7M 1.6G 1% /run
/dev/nvme0n1p10 39G 31G 6.8G 83% /
/dev/nvme0n1p3 72G 63G 8.6G 89% /media/c
/dev/nvme0n1p7 269G 212G 57G 79% /media/d
/dev/sda2 321G 107G 197G 36% /media/zhoushimin/removable_disk
/dev/sda1 606G 502G 104G 83% /media/zhoushimin/iDisk
5. 生成SDK
编译sdk,建议不要生成多媒体等镜像的SDK,博主编译出来的脚本文件报错了,可能与脚本文件过大有关。
$ bitbake core-image-minimal -c populate_sdk
执行完毕之后,生成的sdk包在imx-yocto-bsp/imx8qxpc0mek_wayland/tmp/deploy/core-image-minimal/sdk目录下
6. 其它开发操作
6.1 重启电脑或退出终端后bitbake提示找不到
如果退出终端或重启电脑,则需要重新配置bitbake运行环境。
source setup-environment imx8qxpc0mek_wayland/
6.2 配置uboot启动方式
uboot启动方式在imx-yocto-bsp/imx8qxpc0mek_wayland/conf/local.conf中修改,字段为UBOOT_CONFIG
$ echo "UBOOT_CONFIG = \"emmc\"" >> conf/local.conf
注意!!!!每次执行编译都会将local.conf文件就会被清空成默认的,记得重新更改启动介质设置
DISTRO=fsl-imx-wayland MACHINE=imx8qxpc0mek source imx-setup-release.sh -b imx8qxpc0mek_wayland
重新编译u-boot
$ MACHINE=imx8qxpc0mek bitbake -c deploy u-boot-imx
6.3 如果编译失败需要清除重新编译
local.conf配置文件修改后,需求重新编译才能生效。
bitbake -c clean -v imx-image-multimedia
bitbake -c cleansstate -v imx-image-multimedia
如果不行,直接将目标文件夹完整删掉。
rm -rf imx8qxpc0mek_wayland
6.4 单独编译/清除某个bb模块
- 单独编译某一个bb模块
bitbake -b pulseaudio_10.0 -c clean
bitbake -b pulseaudio_10.0 -c build
参考链接:https://blog.csdn.net/fcf1990501/article/details/102757987
- 单独清除某个bb模块
如果在编译过程中出错,可以清除单个recipe,而无需清除整个工程
bitbake nativesdk-wget -c cleansstate
例如输出如下:
ERROR: Task (virtual:nativesdk:/media/zhoushimin/removable_disk/imx-yocto-bsp/sources/poky/meta/recipes-devtools/perl/perl_5.34.0.bb:do_install) failed with exit code '1'
ERROR: nativesdk-wget-1.21.1-r0 do_configure: autoreconf execution failed.
ERROR: nativesdk-wget-1.21.1-r0 do_configure: ExecutionError('/media/zhoushimin/removable_disk/imx-yocto-bsp/imx8qxpc0mek_wayland/tmp/work/x86_64-nativesdk-pokysdk-linux/nativesdk-wget/1.21.1-r0/temp/run.do_configure.2284384', 1, None, None)
ERROR: Logfile of failure stored in: /media/zhoushimin/removable_disk/imx-yocto-bsp/imx8qxpc0mek_wayland/tmp/work/x86_64-nativesdk-pokysdk-linux/nativesdk-wget/1.21.1-r0/temp/log.do_configure.2284384
bitbake nativesdk-wget -c cleansstate
6.5 删除镜像中的软件包
博主在生成SDK的时候遇到一个wifi网卡固件冲突的问题,因为博主没有用到wifi模块,因此用PACKAGE_EXCLUDE将wifi模块排除。
在imx-yocto-bsp/build/conf/local.conf中添加
PACKAGE_EXCLUDE = "package_name package_name package_name ..."
PACKAGE_EXCLUDE = "firmware-nxp-wifi"
来删除指定软件。
配置文件要生效需要删除整个编译目录,重新编译生成。
rm -rf imx8qxpc0mek_wayland/
6.6 多个软件包冲突的另外一个解决方式
多个recipe包含同一个软件包,则可以指定PREFERRED_PROVIDER来指定安装包
输入指令查看冲突recipe
bitbake -g imx-image-multimedia
输出:
zhoushimin@zsm:imx8qxpc0mek_wayland$ bitbake -g imx-image-multimedia
/home/zhoushimin/tools/anaconda3/lib/python3.7/site-packages/html5lib/_trie/_base.py:3: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Mapping
/home/zhoushimin/tools/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__
return f(*args, **kwds)
Loading cache: 100% |#####################################################################################################################################| Time: 0:00:02
Loaded 5091 entries from dependency cache.
Parsing recipes: 100% |###################################################################################################################################| Time: 0:00:01
Parsing of 3386 .bb files complete (3385 cached, 1 parsed). 5092 targets, 538 skipped, 6 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Multiple providers are available for runtime linux-firmware-bcm4359-pcie (firmware-nxp-wifi, linux-firmware)
Consider defining a PREFERRED_RPROVIDER entry to match linux-firmware-bcm4359-pcie
NOTE: PN build list saved to 'pn-buildlist'
NOTE: Task dependencies saved to 'task-depends.dot'
在imx-yocto-bsp/build/conf/local.conf中添加
PREFERRED_PROVIDER_linux-firmware-bcm4359-pcie = "linux-firmware"
或
PREFERRED_PROVIDERS = "xxx:yyy aaa:bbb ..."
This form is a convenient replacement for the following:
PREFERRED_PROVIDER_xxx = "yyy"
PREFERRED_PROVIDER_aaa = "bbb"
6.7 查询内核源码目录
bitbake -e linux-imx | grep ^S=
任何源码包都可以通过这个命令找到,在独立编译时查找源码很方便。
7. 总结
按照博主的流程操作基本上就可以完整的生成多媒体镜像固件,可以在评估板上测试板载的各种功能,以及生成开发环境SDK。
正式开发时将采用独立编译的方式,yocto还是太重了,下一篇博主将描述独立安装的方式。
写在末尾:
- 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
- 专栏简介:imx8qxp小白从拿到板子到完成项目的过程记录
- 面向人群:嵌入式工程师
- 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
- Python零基础快速入门系列
- Python数据科学系列
- 人工智能开发环境搭建系列
- 机器学习系列
- 物体检测快速入门系列
- 自动驾驶物体检测系列
- …