所有操作使用普通用户,不能是管理员权限。yocto的用户权限是普通用户。
1、使用Poky源代码的scarthgap分支,路径:yocto/poky
2、meta-raspberrypi层包含与树莓派硬件相关的元数据、菜谱、类文件和工具文件。
获取meta-raspberrypi的scarthgap分支:
cd yocto
git clone -b scarthgap https://git.yoctoproject.org/meta-raspberrypi/

.
├── classes
│ └── sdcard_image-rpi.bbclass
├── conf
│ ├── layer.conf
│ └── machine
├── COPYING.MIT
├── docs
│ ├── conf.py
│ ├── contributing.md
│ ├── extra-apps.md
│ ├── extra-build-config.md
│ ├── index.rst
│ ├── ipcompliance.md
│ ├── layer-contents.md
│ ├── Makefile
│ ├── readme.md -> ../README.md
│ └── requirements.txt
├── dynamic-layers
│ ├── meta-python
│ ├── multimedia-layer
│ ├── networking-layer
│ ├── openembedded-layer
│ └── qt5-layer
├── files
│ └── custom-licenses
├── img
│ ├── balena.png
│ └── LF_17_02_Yocto-Badge-Update_Compatible_Final_Blank.png
├── kas-poky-rpi.yml
├── lib
│ └── oeqa
├── README.md
├── recipes-bsp
│ ├── armstubs
│ ├── bootfiles
│ ├── common
│ ├── formfactor
│ ├── gpio-shutdown
│ ├── rpi-eeprom
│ ├── rpi-u-boot-scr
│ └── u-boot
├── recipes-connectivity
│ ├── bluez5
│ └── pi-bluetooth
├── recipes-core
│ ├── images
│ ├── packagegroups
│ ├── psplash
│ └── udev
├── recipes-devtools
│ ├── bcm2835
│ ├── pi-blaster
│ ├── python
│ ├── raspi-gpio
│ └── raspi-utils
├── recipes-graphics
│ ├── cairo
│ ├── kmscube
│ ├── libsdl2
│ ├── libva
│ ├── mesa
│ ├── piglit
│ ├── raspidmx
│ ├── userland
│ ├── vc-graphics
│ ├── wayland
│ └── xorg-xserver
├── recipes-kernel
│ ├── bluez-firmware-rpidistro
│ ├── linux
│ └── linux-firmware-rpidistro
├── recipes-multimedia
│ ├── gstreamer
│ ├── omxplayer
│ ├── picamera-libs
│ ├── python3-picamera
│ ├── rpidistro-ffmpeg
│ └── x264
├── recipes-sato
│ └── libwpe_%.bbappend
└── wic
└── sdimage-raspberrypi.wks

3、设置构建环境
初始化构建环境,在yocto目录下新建了rasp_build并自动切换了进去
source poky/oe-init-build-env rasp_build
将meta-raspberrypi层添加到构建环境的conf/bblayers.conf
yocto/rasp_build# bitbake-layers add-layer ../meta-raspberrypi/
得到:
yocto/rasp_build# cat conf/bblayers.conf
POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/learn/yocto/poky/meta \
/learn/yocto/poky/meta-poky \
/learn/yocto/poky/meta-yocto-bsp \
/learn/yocto/meta-raspberrypi \"
4、BitBake构建目标镜像
通过bitbake -e | grep XX命令可以查看当前构建环境所有的配置。
查看meta-raspberrypi层中所有的机器配置文件。
yocto/rasp_build# ls ../meta-raspberrypi/conf/machine/ -all
total 72
drwxr-xr-x 3 root root 4096 12月 11 19:48 .
drwxr-xr-x 3 root root 4096 12月 11 19:48 ..
drwxr-xr-x 2 root root 4096 12月 11 19:48 include
-rw-r--r-- 1 root root 461 12月 11 19:48 raspberrypi0-2w-64.conf
-rw-r--r-- 1 root root 382 12月 11 19:48 raspberrypi0-2w.conf
-rw-r--r-- 1 root root 291 12月 11 19:48 raspberrypi0.conf
-rw-r--r-- 1 root root 585 12月 11 19:48 raspberrypi0-wifi.conf
-rw-r--r-- 1 root root 387 12月 11 19:48 raspberrypi2.conf
-rw-r--r-- 1 root root 1096 12月 11 19:48 raspberrypi3-64.conf
-rw-r--r-- 1 root root 644 12月 11 19:48 raspberrypi3.conf
-rw-r--r-- 1 root root 1127 12月 11 19:48 raspberrypi4-64.conf
-rw-r--r-- 1 root root 690 12月 11 19:48 raspberrypi4.conf
-rw-r--r-- 1 root root 1128 12月 11 19:48 raspberrypi5.conf
-rw-r--r-- 1 root root 1417 12月 11 19:48 raspberrypi-armv7.conf
-rw-r--r-- 1 root root 1574 12月 11 19:48 raspberrypi-armv8.conf
-rw-r--r-- 1 root root 413 12月 11 19:48 raspberrypi-cm3.conf
-rw-r--r-- 1 root root 235 12月 11 19:48 raspberrypi-cm.conf
-rw-r--r-- 1 root root 398 12月 11 19:48 raspberrypi.conf
树莓派4B使用的配置文件是 raspberrypi4-64.conf和raspberrypi4.conf,分别构建64位和32位的linux系统。这里选择64位,将rasp_build/conf/local.conf中MACHINE字段中"qemux86-64"改为"raspberrypi4-64"
使用bitbake构建rpi-test-image镜像:
bitbake rpi-test-image
#Yocto Project(BitBake 是其核心工具)明确禁止使用 root 权限运行 BitBake

报错:

Yocto 为了合规,默认拒绝编译带有特殊 /restricted 许可证的包,而树莓派的 BCM43456 无线固件恰好包含这类许可证,因此被拦截。解决方法:
yocto/rasp_build$ vim conf/local.conf
#在文件末尾增加
加入synaptics-killswitch许可证到白名单 LICENSE_FLAGS_ACCEPTED += "synaptics-killswitch"
重新执行yocto/rasp_build$ bitbake rpi-test-image

完成构建后,在yocto/rasp_build/tmp/deploy/images/raspberrypi4-64目录下可以找到生成的wic镜像文件。
ls *.rootfs.wic.bz2 -all
lrwxrwxrwx 2 tmp tmp 60 12月 11 22:50 rpi-test-image-raspberrypi4-64.rootfs.wic.bz2 -> rpi-test-image-raspberrypi4-64.rootfs-20251211122910.wic.bz2
5、将镜像部署到SD卡
使用树莓派官方推荐的Raspberry Pi Imager工具。
安装Raspberry Pi Imager在ubuntu系统。
sudo snap install rpi-imager
6、meta-raspberrypi层分析
yocto含有三种元数据层:发行版层、BSP层和软件层。其中meta-raspberrypi属于BSP层。
6.1 层配置
路径yocto/meta-raspberrypi/conf/layer.conf
主要完成指定元数据文件的路径和名称,定义层的标识符,设置该层在在构建过程中的优先级,指定对mate层的依赖关系,支持uboot配置,动态加载dynamic-layers目录下的扩展层和相关菜谱文件。
6.2 硬件配置
yocto/meta-raspberrypi/conf/machine/下是为树莓派平台定制的多个机器配置文件。机器配置文件负责配置相关硬件选项,在conf/local/conf配置文件中的MACHINE变量负责选择指定配置文件。
主要完成:
- 设置硬件配置匹配字段;
- 添加特性;
- 增加外部扩展功能;
- 性能优化(添加最新的头文件);
- 基础硬件配置;
- 内核配置;
- uboot配置及引导;
- 启动固件配置。
6.3 内核配置
内核配置不仅涉及大多数硬件支持,还决定系统整体性能和兼容性。
- yocto/meta-raspberrypi/recipes-kernel/linux目录下是mate-raspberrypi层的内核配置文件位置。其中files目录下是内核配置片段文件,允许用户根据需求修改内核配置。

- 内核菜谱选择在机器配置文件设置PREFERRED_PROVIDER和PREFERRED_VERSION变量指定。通过如下两个命令查看当前构建环境针对树莓派4B使用的内核菜谱信息:
执行:bitbake -e | grep "PREFERRED_PROVIDER_virtual\/kernel"
输出:PREFERRED_PROVIDER_virtual/kernel="linux-raspberrypi"
执行: bitbake -e | grep "PREFERRED_VERSION_linux-raspberrypi"
输出:PREFERRED_VERSION_linux-raspberrypi="6.6.%"
- 分析linux-raspberrypi_6.6.bb菜谱
路径yocto/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.6.bb

SRC_URI:指定内核的源代码git仓库、引入内核元数据仓库yocto-kernel-cache辅助修改和配置内核;
linux-raspberrypi.inc文件:路径在yocto/meta-raspberrypi/recipes-kernel/linux,包含通用内核配置包含文件;

- linux-raspberrypi.inc文件包含的recipes-kernel/linux/linux-yocto.inc使的树莓派内核菜谱能够利用yocto项目的内核工具,简化内核的配置和构建过程。
- KBUILD_DEFCONFIG变量指定树莓派4B的默认内核配置。默认KBUILD_DEFCONFIG:raspberrypi4-64 ?= "bcm2711_defconfig"
- RDEPENDS变量指定依赖关系,为树莓派4B的内核指定必要依赖项,确保所有必须的内核组件都被正确包含。
- DEPLOYDEP变量保证在执行内核部署时,armv7架构的内核首先被部署,从而为其他内核组件的部署提供必要的依赖。
6.4 图形系统配置
路径yocto/meta-raspberrypi/recipes-graphics,包含多个菜谱文件、追加菜谱文件及相关配置文件。

mesa:图形库;
wayland:显示协议;
xorg:窗口系统;
raspidmx:在树莓派上构建和安装dispmanX API示例应用,演示低级显示控制;
userland:提供树莓派用户空间多媒体,支持图形渲染与视频编解码及硬件封装;
vc-graphics:提供树莓派的videocore图形库。
6.5 硬件测试镜像菜谱
为了进行硬件配置测试。meta-raspberrypi层创建了rpi-test-image.bb镜像菜谱。该菜谱用于构建基础的树莓派测试镜像,确保硬件适配和系统功能正确性。
路径:yocto/meta-raspberrypi/recipes-core/images/rpi-test-image.bb

该镜像菜谱以core-image-base.bb为基础,提供了系统基本硬件支持和控制台功能;
COMPATIBLE_MACHINE变量确保该镜像菜谱仅适用于树莓派硬件;
7、Kickstart文件
在meta-raspberrypi/conf/machine/include/rpi-base.inc文件的WKS_FILE变量中定义了wic工具使用的Kickstart(后缀.wks)文件的名称。
默认变量值是sdimage-raspberrypi.wks(路径:meta-raspberrypi/wic/sdimage-raspberrypi.wks)
通过运行"wic list images"命令,可以查看当前构建环境中所有可用的Kickstart文件及其功能描述。


- wic工具可以调用插件功能,路径:poky/scripts/lib/wic/plugins。imager插件用于定义如何将分区内容写入最终镜像文件,负责处理镜像的整体布局和结构,将多个分区整合到一个可启动的镜像中。
- source插件提供一种在wic镜像生成过程中自定义分区内容的机制,在wks文件中使用--source参数指定。
- 使用BitBake构建出未分区的镜像或相关组件(文件系统和内核),wic提供两种操作模式:Raw模式和Cooked模式。