板级支持包 (BSP) 是定义如何支持特定硬件设备、设备集或硬件平台的信息集合. BSP 包括有关设备上存在的硬件功能的信息和内核配置信息以及所需的任何其他硬件驱动程序。除了通用 Linux 软件堆栈之外,BSP 还列出了必要的和可选平台功能所需的任何其他软件组件。
BSP由基本目录中的文件结构组成。总的来说,您可以将基本目录、其文件结构和内容视为BSP层。尽管没有严格的要求,Yocto项目中的BSP层使用了以下成熟的命名约定:
meta-bsp_root_name
字符串“meta-”附加在machine或platform name之前,即上述形式的“bsp_root_name”。
Note
因为BSP层命名约定是完善的,所以在创建层时遵循它是明智的。从技术上讲,BSP层名不需要以meta-开头。然而,Yocto项目开发环境中的各种脚本和工具都采用这种约定。
为了帮助理解BSP层的概念,请考虑Yocto项目支持并在每个版本中提供的BSP。你可以在https://git.yoctoproject.org/cgit/cgit.cgi/上的一个网页界面上看到Yocto项目源库中的层。如果你进入那个界面,你会在“Yocto Metadata Layers”下找到一个存储库列表。
Note
Yocto项目中不再积极支持的层出现在“Yocto Metadata Layer Archive.”的标题下
每个存储库都是Yocto项目支持的BSP层(例如meta-raspberrypi和meta-intel)。每个层都是自己的存储库,单击层名会显示两个url,您可以从中将层的存储库克隆到本地系统。以下是克隆树莓派BSP层的例子:
$ git clone git://git.yoctoproject.org/meta-raspberrypi
除了BSP层之外,meta-yocto-BSP层也是poky存储库的一部分。meta-yocto-bsp layer 维护几个“refence”bsp,包括基于arm的Beaglebone、基于mips的EdgeRouter以及32位和64位IA机器的通用版本。
有关典型BSP开发工作流程的信息,请参阅开发板支持包(BSP)部分。关于如何从Git存储库中建立源文件的本地副本的更多信息,请参见Yocto项目开发任务手册中的 Locating Yocto Project Source Files一节。
BSP层的基本目录(meta-bsp_root_name)是该层的根目录。这个目录是你在你的构建目录中找到的conf/bblayer.conf文件中添加的BBLAYERS变量,它是在你运行openenembedded构建环境设置脚本(即oe-init-build-env)后建立的。添加根目录允许OpenEmbedded构建系统识别BSP层并从它构建映像。下面是一个例子:
BBLAYERS ?= " \
/usr/local/src/yocto/meta \
/usr/local/src/yocto/meta-poky \
/usr/local/src/yocto/meta-yocto-bsp \
/usr/local/src/yocto/meta-mylayer \
"
Note
BBLAYERS 中列出的层的顺序和 BBFILE_PRIORITY 很重要。例如,如果多个层定义了一个机器配置,OpenEmbedded 构建系统使用给定相似层优先级的最后一层搜索。构建系统自上而下通过 BBLAYERS 中列出的层工作。
一些BSP需要或依赖于BSP根层之外的其他层才能发挥功能。在这种情况下,您需要在BSP的根层的README“Dependencies”部分中指定这些层。此外,如果存在任何针对BSP的构建说明,您必须将它们添加到“Dependencies”部分。
一些层用作保存其他 BSP 层的层。这些层被称为“容器层(container layers)”。这种类型的层的一个例子是 OpenEmbedded 的 meta-openembedded 层。meta-openembedded 层包含许多 meta-* 层.在这种情况下,您需要包含要使用的实际图层的名称,例如:
BBLAYERS ?= " \
/usr/local/src/yocto/meta \
/usr/local/src/yocto/meta-poky \
/usr/local/src/yocto/meta-yocto-bsp \
/usr/local/src/yocto/meta-mylayer \
.../meta-openembedded/meta-oe \
.../meta-openembedded/meta-perl \
.../meta-openembedded/meta-networking \
"
有关层的更多信息,请参阅 Yocto 项目开发任务手册的“Understanding and Creating Layers”部分。
本节介绍如何让您的构建主机准备好使用 BSP 层。设置好主机后,您可以按照“Creating a new BSP Layer Using the bitbake-layers Script”部分中的说明创建层。
Note
有关 BSP 的结构信息, 查看Example Filesystem Layout章节
$ cd /home/you/pok
$ git clone git://git.yoctoproject.org/meta-intel.git
Cloning into 'meta-intel'...
remote: Counting objects: 15585, done.
remote: Compressing objects: 100% (5056/5056), done.
remote: Total 15585 (delta 9123), reused 15329 (delta 8867)
Receiving objects: 100% (15585/15585), 4.51 MiB | 3.19 MiB/s, done.
Resolving deltas: 100% (9123/9123), done.
Checking connectivity... done.
检查正确的分支:您为 meta-intel 检查的分支必须与您用于 Yocto 项目版本的同一分支匹配(例如 kirkstone)
$ cd meta-intel
$ git checkout -b kirkstone remotes/origin/kirkstone
Branch kirkstone set up to track remote branch
kirkstone from origin.
Switched to a new branch 'kirkstone'
Note
要查看克隆存储库中可用的分支名称,请使用 git branch -al 命令。有关更多信息,请参阅 Yocto 项目开发任务手册中的“Checking Out by Branch in Poky”部分。
$ git clone git://git.yoctoproject.org/meta-raspberrypi
Cloning into 'meta-raspberrypi'...
remote: Counting objects: 4743, done.
remote: Compressing objects: 100% (2185/2185), done.
remote: Total 4743 (delta 2447), reused 4496 (delta 2258)
Receiving objects: 100% (4743/4743), 1.18 MiB | 0 bytes/s, done.
Resolving deltas: 100% (2447/2447), done.
Checking connectivity... done.
$ source oe-init-build-env
除其他外,该脚本创建构建目录,在这种情况下构建并位于源目录中。脚本运行后,您的当前工作目录将设置为构建目录。
定义一个通用的 BSP 目录结构可以让最终用户理解并熟悉该标准。通用格式还鼓励对硬件的软件支持进行标准化。
本节中描述的建议表单具有特定于OpenEmbedded构建系统的元素。除了 OpenEmbedded 构建系统之外,开发人员还可以将此结构与其他构建系统一起使用。如果需要,还可以很容易地提取信息并将其转换为其他格式。OpenEmbedded 构建系统通过其标准的分层机制,可以直接接受描述为层的格式。BSP 层使用标准格式在一个位置捕获所有特定于硬件的细节,这对于希望使用硬件平台的任何人都非常有用,无论他们使用的是什么构建系统.
BSP 规范不包括构建系统或其他工具 - 该规范仅涉及特定于硬件的组件。在最终分发点,您可以将 BSP 层与构建系统和其他工具相结合,重要的是要保持 BSP 层、构建系统和工具是可以组合在某些最终产品中的独立组件的区别。
在查看 BSP 层内的目录结构的推荐形式之前,您应该知道有一些要求才能使 BSP 层被认为与 Yocto 项目兼容。对于该要求列表 , 查看Released BSP Requirements章节。
下面是 BSP 层的典型目录结构。虽然这种基本形式代表了标准,但要意识到各个 BSP 的实际布局可能会有所不同。
meta-bsp_root_name/
meta-bsp_root_name/bsp_license_file
meta-bsp_root_name/README
meta-bsp_root_name/README.sources
meta-bsp_root_name/binary/bootable_images
meta-bsp_root_name/conf/layer.conf
meta-bsp_root_name/conf/machine/*.conf
meta-bsp_root_name/recipes-bsp/*
meta-bsp_root_name/recipes-core/*
meta-bsp_root_name/recipes-graphics/*
meta-bsp_root_name/recipes-kernel/linux/linux-yocto_kernel_rev.bbappend
以下是可从 Source Repositories 获得的 Raspberry Pi BSP 层的示例:
meta-raspberrypi/COPYING.MIT
meta-raspberrypi/README.md
meta-raspberrypi/classes
meta-raspberrypi/classes/sdcard_image-rpi.bbclass
meta-raspberrypi/conf/
meta-raspberrypi/conf/layer.conf
meta-raspberrypi/conf/machine/
meta-raspberrypi/conf/machine/raspberrypi-cm.conf
meta-raspberrypi/conf/machine/raspberrypi-cm3.conf
meta-raspberrypi/conf/machine/raspberrypi.conf
meta-raspberrypi/conf/machine/raspberrypi0-wifi.conf
meta-raspberrypi/conf/machine/raspberrypi0.conf
meta-raspberrypi/conf/machine/raspberrypi2.conf
meta-raspberrypi/conf/machine/raspberrypi3-64.conf
meta-raspberrypi/conf/machine/raspberrypi3.conf
meta-raspberrypi/conf/machine/include
meta-raspberrypi/conf/machine/include/rpi-base.inc
meta-raspberrypi/conf/machine/include/rpi-default-providers.inc
meta-raspberrypi/conf/machine/include/rpi-default-settings.inc
meta-raspberrypi/conf/machine/include/rpi-default-versions.inc
meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc
meta-raspberrypi/docs
meta-raspberrypi/docs/Makefile
meta-raspberrypi/docs/conf.py
meta-raspberrypi/docs/contributing.md
meta-raspberrypi/docs/extra-apps.md
meta-raspberrypi/docs/extra-build-config.md
meta-raspberrypi/docs/index.rst
meta-raspberrypi/docs/layer-contents.md
meta-raspberrypi/docs/readme.md
meta-raspberrypi/files
meta-raspberrypi/files/custom-licenses
meta-raspberrypi/files/custom-licenses/Broadcom
meta-raspberrypi/recipes-bsp
meta-raspberrypi/recipes-bsp/bootfiles
meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb
meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb
meta-raspberrypi/recipes-bsp/common
meta-raspberrypi/recipes-bsp/common/firmware.inc
meta-raspberrypi/recipes-bsp/formfactor
meta-raspberrypi/recipes-bsp/formfactor/formfactor
meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi
meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi/machconfig
meta-raspberrypi/recipes-bsp/formfactor/formfactor_0.0.bbappend
meta-raspberrypi/recipes-bsp/rpi-u-boot-src
meta-raspberrypi/recipes-bsp/rpi-u-boot-src/files
meta-raspberrypi/recipes-bsp/rpi-u-boot-src/files/boot.cmd.in
meta-raspberrypi/recipes-bsp/rpi-u-boot-src/rpi-u-boot-scr.bb
meta-raspberrypi/recipes-bsp/u-boot
meta-raspberrypi/recipes-bsp/u-boot/u-boot
meta-raspberrypi/recipes-bsp/u-boot/u-boot/*.patch
meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend
meta-raspberrypi/recipes-connectivity
meta-raspberrypi/recipes-connectivity/bluez5
meta-raspberrypi/recipes-connectivity/bluez5/bluez5
meta-raspberrypi/recipes-connectivity/bluez5/bluez5/*.patch
meta-raspberrypi/recipes-connectivity/bluez5/bluez5/BCM43430A1.hcd
meta-raspberrypi/recipes-connectivity/bluez5/bluez5brcm43438.service
meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend
meta-raspberrypi/recipes-core
meta-raspberrypi/recipes-core/images
meta-raspberrypi/recipes-core/images/rpi-basic-image.bb
meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb
meta-raspberrypi/recipes-core/images/rpi-test-image.bb
meta-raspberrypi/recipes-core/packagegroups
meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb
meta-raspberrypi/recipes-core/psplash
meta-raspberrypi/recipes-core/psplash/files
meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h
meta-raspberrypi/recipes-core/psplash/psplash_git.bbappend
meta-raspberrypi/recipes-core/udev
meta-raspberrypi/recipes-core/udev/udev-rules-rpi
meta-raspberrypi/recipes-core/udev/udev-rules-rpi/99-com.rules
meta-raspberrypi/recipes-core/udev/udev-rules-rpi.bb
meta-raspberrypi/recipes-devtools
meta-raspberrypi/recipes-devtools/bcm2835
meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.52.bb
meta-raspberrypi/recipes-devtools/pi-blaster
meta-raspberrypi/recipes-devtools/pi-blaster/files
meta-raspberrypi/recipes-devtools/pi-blaster/files/*.patch
meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb
meta-raspberrypi/recipes-devtools/python
meta-raspberrypi/recipes-devtools/python/python-rtimu
meta-raspberrypi/recipes-devtools/python/python-rtimu/*.patch
meta-raspberrypi/recipes-devtools/python/python-rtimu_git.bb
meta-raspberrypi/recipes-devtools/python/python-sense-hat_2.2.0.bb
meta-raspberrypi/recipes-devtools/python/rpi-gpio
meta-raspberrypi/recipes-devtools/python/rpi-gpio/*.patch
meta-raspberrypi/recipes-devtools/python/rpi-gpio_0.6.3.bb
meta-raspberrypi/recipes-devtools/python/rpio
meta-raspberrypi/recipes-devtools/python/rpio/*.patch
meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb
meta-raspberrypi/recipes-devtools/wiringPi
meta-raspberrypi/recipes-devtools/wiringPi/files
meta-raspberrypi/recipes-devtools/wiringPi/files/*.patch
meta-raspberrypi/recipes-devtools/wiringPi/wiringpi_git.bb
meta-raspberrypi/recipes-graphics
meta-raspberrypi/recipes-graphics/eglinfo
meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-fb_%.bbappend
meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-x11_%.bbappend
meta-raspberrypi/recipes-graphics/mesa
meta-raspberrypi/recipes-graphics/mesa/mesa-gl_%.bbappend
meta-raspberrypi/recipes-graphics/mesa/mesa_%.bbappend
meta-raspberrypi/recipes-graphics/userland
meta-raspberrypi/recipes-graphics/userland/userland
meta-raspberrypi/recipes-graphics/userland/userland/*.patch
meta-raspberrypi/recipes-graphics/userland/userland_git.bb
meta-raspberrypi/recipes-graphics/vc-graphics
meta-raspberrypi/recipes-graphics/vc-graphics/files
meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc
meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh
meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb
meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb
meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc
meta-raspberrypi/recipes-graphics/wayland
meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend
meta-raspberrypi/recipes-graphics/xorg-xserver
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/10-evdev.conf
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xorg_%.bbappend
meta-raspberrypi/recipes-kernel
meta-raspberrypi/recipes-kernel/linux-firmware
meta-raspberrypi/recipes-kernel/linux-firmware/files
meta-raspberrypi/recipes-kernel/linux-firmware/files/brcmfmac43430-sdio.bin
meta-raspberrypi/recipes-kernel/linux-firmware/files/brcfmac43430-sdio.txt
meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware_%.bbappend
meta-raspberrypi/recipes-kernel/linux
meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-dev.bb
meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc
meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.14.bb
meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.9.bb
meta-raspberrypi/recipes-multimedia
meta-raspberrypi/recipes-multimedia/gstreamer
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/*.patch
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_%.bbappend
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.12
meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.12/*.patch
meta-raspberrypi/recipes-multimedia/omxplayer
meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer
meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/*.patch
meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb
meta-raspberrypi/recipes-multimedia/x264
meta-raspberrypi/recipes-multimedia/x264/x264_git.bbappend
meta-raspberrypi/wic meta-raspberrypi/wic/sdimage-raspberrypi.wks
以下部分描述了提议的 BSP 格式的每个部分。
您可以在 BSP 层中找到这些文件:
meta-bsp_root_name/bsp_license_file
这些可选文件满足 BSP 的许可要求。此处的文件类型可能因许可要求而异。例如,在 Raspberry Pi BSP 中,所有许可要求都由 COPYING.MIT 文件处理。
许可文件可以是 MIT、BSD、GPLv* 等。这些文件推荐用于 BSP,但它们是可选的,完全取决于 BSP 开发人员。有关如何维护许可证合规性的信息,请参阅 Yocto 项目开发任务手册中的“在产品生命周期内维护开源许可证合规性”部分。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/README
此文件提供有关如何引导可选包含在 binary/ 目录中的实时映像的信息。README文件还提供了构建映像所需的信息。
README 文件至少必须包含依赖关系列表,例如 BSP 所依赖的任何其他层的名称以及 BSP 维护者的名称及其联系信息。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/README.sources
此文件提供有关在何处查找用于构建位于 meta-bsp_root_name/binary 中的映像(如果有)的 BSP 源文件的信息。binary文件中的images将是与 BSP 一起发布的images。 README.sources 文件中的信息还可以帮助您找到用于生成随 BSP 提供的images的metadata.
Note
如果 BSP 的二进制目录丢失或该目录没有images,则现有的README.sources文件没有意义,通常不存在。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/binary/bootable_images
此可选区域包含有用的预构建内核和随 BSP 发布的适用于目标系统的用户空间文件系统映像。当 BSP 压缩包已创建并在 Yocto 项目网站上可用时,此目录通常包含图形(例如 Sato)和最小的实时图像。您可以使用这些内核和映像来运行系统并快速开始开发任务。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/conf/layer.conf
conf/layer.conf 文件将文件结构标识为层,标识层的内容,并包含有关构建系统应如何使用它的信息。通常,标准样板文件如下所示.在以下示例中,您将用 BSP 的实际名称替换“bsp”(即示例模板中的“bsp_root_name”)。
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a recipes directory containing .bb and .bbappend files, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "bsp"
BBFILE_PATTERN_bsp = "^${LAYERDIR}/"
BBFILE_PRIORITY_bsp = "6"
LAYERDEPENDS_bsp = "intel"
为了说明字符串替换,以下是 Raspberry Pi conf/layer.conf 文件中的相应语句:
# We have a conf and classes directory, append to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a recipes directory containing .bb and .bbappend files, add to BBFILES
BBFILES += "${LAYERDIR}/recipes*/*/*.bb \
${LAYERDIR}/recipes*/*/*.bbappend"
BBFILE_COLLECTIONS += "raspberrypi"
BBFILE_PATTERN_raspberrypi := "^${LAYERDIR}/"
BBFILE_PRIORITY_raspberrypi = "9"
# Additional license directories.
LICENSE_PATH += "${LAYERDIR}/files/custom-licenses"
.
.
.
这个文件只是让 BitBake 知道配方和配置目录。该文件必须存在,以便 OpenEmbedded 构建系统可以识别 BSP。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/conf/machine/*.conf
machine文件将 BSP 中其他地方包含的所有信息绑定到构建系统可以理解的格式中。每个 BSP 层至少需要一个机器文件。如果BSP支持多台机器,可以存在多台机器配置文件。这些文件名对应于用户设置MACHINE变量的值。
这些文件定义了诸如要使用的内核包之类的东西(PREFERRED_PROVIDER of virtual/kernel),包含在不同类型镜像中的硬件驱动程序,所需的任何特殊软件组件、任何引导加载程序信息以及任何特殊镜像格式要求。
此配置文件还可以包括一个硬件“tuning(调整)”文件,该文件通常用于定义封装架构和指定优化标志,这些优化标志经过精心挑选,可在给定处理器上提供最佳性能。
tuning文件位于源目录的 meta/conf/machine/include 目录中。例如,许多 tune-* 文件(例如 tune-arm1136jf-s.inc、tune-1586-nlp.inc 等)位于 poky/meta/conf/machine/include 目录中。
要使用包含文件,您只需将它们包含在机器配置文件中。例如,Raspberry Pi BSP raspberrypi3.conf 包含以下语句:
include conf/machine/include/rpi-base.inc
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/recipes-bsp/*
此可选目录包含BSP的各种配方文件。最值得注意的是formfactor文件。例如,在 Raspberry Pi BSP 中,有 formfactor_0.0.bbappend 文件,这是一个附加文件,用于扩充启动构建的配方。
HAVE_TOUCHSCREEN=0
HAVE_KEYBOARD=1
DISPLAY_CAN_ROTATE=0
DISPLAY_ORIENTATION=0
DISPLAY_DPI=133
Note
如果BSP没有formfactor条目,则根据主要formfactor配方 meta/recipes-bsp/formfactor/formfactor_0.0.bb 安装的formfactor配置文件建立默认值,该文件位于源目录中。
您可以在 BSP 层中找到此文件:
meta-bsp_root_name/recipes-kernel/linux/linux*.bbappend
meta-bsp_root_name/recipes-kernel/linux/*.bb
附加文件 (.bbappend) 修改用于构建映像的main kernel配方。.bb文件将是developer-supplied kernel(开发人员)提供的内核配方。BSP 层次结构的这个区域可以包含这两种类型的文件,尽管在实践中,您可能会拥有其中一种。
对于您的 BSP,您通常希望使用在源目录 meta/recipes-kernel/linux 中找到的现有 Yocto Project 内核配方。
假设您正在使用 linux-yocto_4.4.bb 配方来构建内核。换句话说,您通过添加 PREFERRED_PROVIDER 和PREFERRED_VERSION语句在“bsp_root_name”.conf 文件中选择了内核,如下所示:
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "4.4%"
Note
默认情况下假定首选提供程序时,PREFERRED_PROVIDER 语句不会出现在“bsp_root_name”.conf 文件中。
您将使用 linux-yocto_4.4.bbappend 文件将特定的 BSP 设置附加到内核,从而为您的特定 BSP 配置内核。
您可以在 Yocto Project Linux 内核开发手册的“创建附加文件”部分中找到有关附加文件应包含内容的更多信息。
另一种情况是您为 BSP 创建自己的内核配方。一个很好的例子是 Raspberry Pi BSP。如果您检查 recipes-kernel/linux 目录,您会看到以下内容:
linux-raspberrypi-dev.bb
linux-raspberrypi.inc
linux-raspberrypi_4.14.bb
linux-raspberrypi_4.9.bb
该目录包含三个内核配方和一个公共包含文件。
本节描述了创建 BSP 可以遵循的高级过程。虽然不是创建 BSP 所必需的,但包含 Yocto 项目支持的许多BSP的meta-intel存储库是示例的一部分。
创建新的layer的方法的例子,参考:Creating a new BSP Layer Using the bitbake-layers Script章节。
下面的插图和列表总结了 BSP 创建的一般工作流程。

本节描述了被认为符合 Yocto 项目的已发布 BSP 的要求和建议。
在查看 BSP 要求之前,您应该考虑以下几点:
以下是符合 Yocto 项目的已发布 BSP 的要求:
Layer名字: BSP 必须具有遵循 Yocto 项目标准的层名称。有关 BSP 层名称的信息,请参阅“BSP layer”部分。
文件系统布局:如果可能,请在 BSP 层中使用与 poky 中的 recipes.txt 文件中列出的相同的目录名称。您应该将配方(.bb 文件)和配方修改(.bbappend 文件)按功能区域放置到 recipes-* 子目录中,如 recipes.txt 中所述。 如果您在 recipes.txt 中找不到适合特定食谱的类别,您可以创建自己的 recipes-* 子目录。在任何特定的 recipes-* 类别中,布局应与 OpenEmbedded-Core Git 存储库 (openembedded-core) 或源目录 (poky) 中的内容匹配。 换句话说,确保将相关文件放置在特定于配方功能的适当相关的 recipes-* 子目录中,或者放在包含一组密切相关的配方的子目录中。 配方本身应遵循“OpenEmbedded 样式指南”中的 Yocto 项目中使用的配方的一般准则。
License File: 您必须在 meta-bsp_root_name 目录中包含许可证文件。该许可证涵盖整个 BSP 元数据。您必须指定要使用的许可证,因为不存在默认许可证。请参阅元树莓派 BSP 层中树莓派 BSP 的 COPYING.MIT 文件作为示例。
README File: 您必须在 meta-bsp_root_name 目录中包含一个 README 文件。请参阅 meta-raspberrypi BSP 层中 Raspberry Pi BSP 的 README.md 文件作为示例。
README.sources文件: 如果您的 BSP 在二进制目录中包含二进制映像,则必须在 meta-bsp_root_name 目录中包含一个 README.sources 文件。该文件准确地指定了您可以在哪里找到用于生成二进制映像的源。
layer 配置文件: 您必须在 meta-bsp_root_name 目录中包含一个 conf/layer.conf 文件。该文件将 meta-bsp_root_name BSP 层标识为构建系统的层。
Machine配置文件: 您必须在 meta-bsp_root_name 目录中包含一个或多个 conf/machine/bsp_root_name.conf 文件。 这些配置文件定义了可以使用 BSP 层构建的机器目标。 多个机器配置文件定义了 BSP 支持的机器配置的变体。 如果 BSP 支持多种机器变体,则需要在 BSP README 文件中充分描述每个变体。 不要使用多个机器配置文件来描述不同的硬件。 如果您确实有非常不同的目标,您应该为每个目标创建单独的 BSP 层。
Note
开发人员完全有可能将工作存储库构建为不相关的 BSP 文件的集合体,并可能使用脚本或其他机制(例如 meta-yocto-bsp 层)生成针对从该目录发布的 BSP。 此类考虑超出了本文档的范围。
以下是针对符合 Yocto 项目的已发布 BSP 的建议:
Note
如果您确实将可引导映像作为 BSP 的一部分,并且该映像是由 GPL 或其他开源许可涵盖的软件构建的,您有责任了解并满足所有许可要求,其中可能包括源文件的分发。
如果您计划为特定 BSP 定制配方,您需要执行以下操作:
以下是一个具体示例,可帮助您更好地理解该过程。此示例通过将名为 interfaces 的 BSP 特定配置文件添加到机器“xyz”的 init-ifupdown_1.0.bb 配方来自定义配方,其中 BSP 层还支持其他几台机器:
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
他的附加文件需要位于 meta-xyz/recipes-core/init-ifupdown 目录中。
2. 在此处创建新的接口配置文件并将其放置在 BSP layer中:
meta-xyz/recipes-core/init-ifupdown/files/xyz-machine-one/interfaces
Note
如果 meta-xyz 层不支持多台机器,您可以将接口配置文件放在此处的层中
meta-xyz/recipes-core/init-ifupdown/files/interfaces
附加文件中的 FILESEXTRAPATHS 变量扩展了构建系统在构建期间用于查找文件的搜索路径。因此,对于此示例,您需要将 files 目录与附加文件放在同一位置。
在某些情况下,BSP 包含一个或多个组件的单独许可的知识产权 (IP)。对于这些情况,您需要接受需要某种明确的最终用户许可协议 (EULA) 的商业或其他类型许可的条款。一旦您接受许可,OpenEmbedded 构建系统就可以构建相应的组件并将其包含在最终的 BSP 映像中。如果 BSP 可作为预构建镜像使用,您可以在同意许可或 EULA 后下载该镜像。
您会发现某些对系统正常运行至关重要的单独许可组件可能没有不受限制(或免费)的替代品。如果没有这些基本组件,系统将无法正常工作。再说一次,您可能会发现其他简单“值得拥有”或纯粹可选的许可组件确实有一个您可以使用的不受限制的免费替换组件,而不是同意单独许可的组件。即使对于系统必不可少的组件,您也可能会发现一个不受阻碍的组件,它并不相同,但将作为 BSP 配方中许可版本的功能较弱的版本。
对于您可以替换免费组件并仍保持系统功能的情况,Yocto 项目网站上“软件”选项卡中的“下载”选项可提供完全没有任何 IP 限制的去功能 BSP。 对于这些情况,您可以直接使用替代,而无需任何进一步的许可要求。 如果存在,这些完全去特征化的 BSP 的命名与其各自的受阻 BSP 的名称相比会适当地不同。 如果可用,这些替换是您最简单和最喜欢的选择。 显然,使用这些替换假定生成的功能满足系统要求。
Note
但是,如果non-encumbered版本不可用或它提供不合适的功能或质量,您可以使用encumbered版本。
OpenEmbedded 构建系统中有两种不同的方法可以满足受担保BSP的许可要求。以下列表按优先顺序描述了它们:
使用 LICENSE_FLAGS 变量定义具有商业或其他类型的特殊许可包的配方: 对于每个配方,您可以在名为 LICENSE_FLAGS_ACCEPTED 的 local.conf 变量中指定匹配的许可证字符串。指定匹配的许可证字符串表示您同意该许可证。因此,构建系统可以构建相应的配方并将组件包含在映像中。如果您像往常一样构建,而不在 LICENSE_FLAGS_ACCEPTED 变量中指定任何配方,则构建将停止并为您提供您尝试包含在需要 LICENSE_FLAGS_ACCEPTED 变量中条目的映像中的配方列表。 在其中输入适当的许可证标志后,重新启动构建以从中断处继续。 在构建过程中,由于您已满足要求,因此不会再次出现提示。一旦适当的许可标志出现在 LICENSE_FLAGS_ACCEPTED 变量中的白名单上,您就可以在不改变正常构建过程的情况下构建受阻镜像。
获取 BSP 的预构建版本
您可以通过在 Yocto Project 网站上的“软件”选项卡中选择“下载”项来获得这种类型的 BSP。 作为下载过程的一部分,您可以在同意每个单独担保包的许可要求后下载包含专有组件的 BSP tarball。 通过这种方式获取 BSP,您可以在同意网站提供的点击许可协议后立即访问encumbered image。 如果您想使用 BSP tarball 中包含的配方自己构建映像,您仍然需要创建适当的 LICENSE_FLAGS_ACCEPTED 以匹配 BSP 中的受阻配方。
bitbake-layers create-layer脚本自动创建BSP层。使layer成为“BSP layer”的原因是至少存在一个机器配置文件。此外,BSP层通常有一个内核配方或一个利用现有内核配方的附加文件。
使用以下步骤创建BSP层:
本节的其余部分提供了对 Beaglebone 的 Yocto 项目参考 BSP 的描述,它位于 meta-yocto-bsp 层中。
layer的 conf 目录包含 layer.conf 配置文件。在本例中,conf/layer.conf 如下:
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a recipes directory containing .bb and .bbappend files, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "yoctobsp"
BBFILE_PATTERN_yoctobsp = "^${LAYERDIR}/"
BBFILE_PRIORITY_yoctobsp = "5"
LAYERVERSION_yoctobsp = "4"
LAYERSERIES_COMPAT_yoctobsp = "kirkstone"
正如本节前面提到的,与通用layer 或内核 layer相比,machine配置文件的存在使layer成为BSP layer。
该层的 bsp_layer/conf/machine/ 目录下有一个或多个machine配置文件:
bsp_layer/conf/machine/machine1\.conf
bsp_layer/conf/machine/machine2\.conf
bsp_layer/conf/machine/machine3\.conf
... more ...
例如,BeagleBone 和 BeagleBone Black开发板的机器配置文件位于 poky/meta-yocto-bsp/conf/machine 层,名为 beaglebone-yocto.conf:
#@TYPE: Machine
#@NAME: Beaglebone-yocto machine
#@DESCRIPTION: Reference machine configuration for http://beagleboard.org/bone and http://beagleboard.org/black boards
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
XSERVER ?= "xserver-xorg \
xf86-video-modesetting \
"
MACHINE_EXTRA_RRECOMMENDS = "kernel-modules kernel-devicetree"
EXTRA_IMAGEDEPENDS += "u-boot"
DEFAULTTUNE ?= "cortexa8hf-neon"
include conf/machine/include/arm/armv7a/tune-cortexa8.inc
IMAGE_FSTYPES += "tar.bz2 jffs2 wic wic.bmap"
EXTRA_IMAGECMD:jffs2 = "-lnp "
WKS_FILE ?= "beaglebone-yocto.wks"
IMAGE_INSTALL:append = " kernel-devicetree kernel-image-zimage"
do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot"
SERIAL_CONSOLES ?= "115200;ttyS0 115200;ttyO0"
SERIAL_CONSOLES_CHECK = "${SERIAL_CONSOLES}"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "5.0%"
KERNEL_IMAGETYPE = "zImage"
KERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
KERNEL_EXTRA_ARGS += "LOADADDR=${UBOOT_ENTRYPOINT}"
SPL_BINARY = "MLO"
UBOOT_SUFFIX = "img"
UBOOT_MACHINE = "am335x_evm_defconfig"
UBOOT_ENTRYPOINT = "0x80008000"
UBOOT_LOADADDRESS = "0x80008000"
MACHINE_FEATURES = "usbgadget usbhost vfat alsa"
IMAGE_BOOT_FILES ?= "u-boot.${UBOOT_SUFFIX} MLO zImage am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
用于配置机器的变量定义了机器特定的属性;例如,与机器相关的软件包、机器调优、要构建的内核类型和 U-Boot 配置。
以下列表对 BeagleBone 开发板的示例参考机器配置文件中的语句提供了一些解释。 意识到可以将更多内容定义为机器配置文件的一部分。 一般来说,您可以通过在 Yocto 项目参考手册中的“Variables Glossary”中定位变量来了解本示例中没有的相关变量。
TIP: 有许多 MACHINE* 变量可帮助您配置特定的硬件。Note
引入 conf/machine/include/arm/tune-cortexa8.inc 文件的 include 语句提供了许多调整可能性。
Note
有关如何使用 SPL 变量的更多信息,请参见u-boot.inc包含文件。
用于为 BeagleBone 设备构建内核映像的内核配方已在机器配置中建立:
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "5.0%"
该层中的 meta-yocto-bsp/recipes-kernel/linux 目录包含用于构建内核的元数据。在这种情况下,内核附加文件(即 linux-yocto_5.0.bbappend)用于覆盖位于 https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-kernel/linuxd的内核配方文件。
以下是附加文件的内容:
KBRANCH:genericx86 = "v5.0/standard/base"
KBRANCH:genericx86-64 = "v5.0/standard/base"
KBRANCH:edgerouter = "v5.0/standard/edgerouter"
KBRANCH:beaglebone-yocto = "v5.0/standard/beaglebone"
KMACHINE:genericx86 ?= "common-pc"
KMACHINE:genericx86-64 ?= "common-pc-64"
KMACHINE:beaglebone-yocto ?= "beaglebone"
SRCREV_machine:genericx86 ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
SRCREV_machine:genericx86-64 ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
SRCREV_machine:edgerouter ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
SRCREV_machine:beaglebone-yocto ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
COMPATIBLE_MACHINE:genericx86 = "genericx86"
COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
COMPATIBLE_MACHINE:edgerouter = "edgerouter"
COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto"
LINUX_VERSION:genericx86 = "5.0.3"
LINUX_VERSION:genericx86-64 = "5.0.3"
LINUX_VERSION:edgerouter = "5.0.3"
LINUX_VERSION:beaglebone-yocto = "5.0.3"
这个特殊的附加文件适用于所有属于 meta-yocto-bsp 层的机器。相关语句附加了“beaglebone-yocto”字符串。OpenEmbedded 构建系统使用这些语句来覆盖内核配方中的类似语句: