Copyright © 2010-2011 Linux Foundation
Permission is granted to copy, distribute and/or modify this document under the terms of the Creative Commons Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales as published by Creative Commons.
Revision History | |
---|---|
Revision 0.9 | 24 November 2010 |
The initial document draft released with the Yocto Project 0.9 Release. | |
Revision 1.0 | 6 April 2011 |
Released with the Yocto Project 1.0 Release. | |
Revision 1.0.1 | 23 May 2011 |
Released with the Yocto Project 1.0.1 Release. | |
Revision 1.1 | 6 October 2011 |
Released with the Yocto Project 1.1 Release. |
Table of Contents
A Board Support Package (BSP) is a collection of information that defines how to support a particular hardware device, set of devices, or hardware platform. The BSP includes information about the hardware features present on the device and kernel configuration information along with any additional hardware drivers required. The BSP also lists any additional software components required in addition to a generic Linux software stack for both essential and optional platform features.
This section (or document if you are reading the BSP Developer's Guide) defines a structure for these components so that BSPs follow a commonly understood layout. Providing a common form allows end-users to understand and become familiar with the layout. A common form also encourages standardization of software support of hardware.
The proposed format does have elements that are specific to the Yocto Project and OpenEmbedded build systems. It is intended that this information can be used by other systems besides Yocto Project and OpenEmbedded and that it will be simple to extract information and convert it to other formats if required. Yocto Project, through its standard layers mechanism, can directly accept the format described as a layer. The BSP captures all the hardware-specific details in one place in a standard format, which is useful for any person wishing to use the hardware platform regardless of the build system they are using.
The BSP specification does not include a build system or other tools - it is concerned with the hardware-specific components only. At the end distribution point you can ship the BSP combined with a build system and other tools. However, it is important to maintain the distinction that these are separate components that happen to be combined in certain end products.
The BSP consists of a file structure inside a base directory, which uses the following naming convention:
meta-<bsp_name>
"bsp_name" is a placeholder for the machine or platform name. Here are some example base directory names:
meta-emenlow meta-n450 meta-beagleboard
The base directory (meta-<bsp_name>
) is the root of the BSP layer.
This root is what you add to the BBLAYERS
variable in the build/conf/bblayers.conf
file found in the
Yocto Project file's build directory.
Adding the root allows the Yocto Project build system to recognize the BSP
definition and from it build an image.
Here is an example:
BBLAYERS = " \ /usr/local/src/yocto/meta \ /usr/local/src/yocto/meta-yocto \ /usr/local/src/yocto/meta-<bsp_name> \ "
For more detailed information on layers, see the "BitBake Layers" section of the Yocto Project Reference Manual. You can also see the detailed examples in the appendices of The Yocto Project Development Manual.
Below is the common form for the file structure inside a base directory. While you can use this basic form for the standard, realize that the actual structures for specific BSPs could differ.
meta-<bsp_name>/ meta-<bsp_name>/<bsp_license_file> meta-<bsp_name>/README meta-<bsp_name>/binary/<bootable_images> meta-<bsp_name>/conf/layer.conf meta-<bsp_name>/conf/machine/*.conf meta-<bsp_name>/recipes-bsp/* meta-<bsp_name>/recipes-graphics/* meta-<bsp_name>/recipes-kernel/linux/linux-yocto_<kernel_rev>.bbappend
Below is an example of the Crown Bay BSP:
meta-crownbay/COPYING.MIT meta-crownbay/README meta-crownbay/binary meta-crownbay/conf/ meta-crownbay/conf/layer.conf meta-crownbay/conf/machine/ meta-crownbay/conf/machine/crownbay.conf meta-crownbay/conf/machine/crownbay-noemgd.conf meta-crownbay/recipes-bsp/ meta-crownbay/recipes-bsp/formfactor/ meta-crownbay/recipes-bsp/formfactor/formfactor_0.0.bbappend meta-crownbay/recipes-bsp/formfactor/formfactor/ meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/ meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/ meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/machconfig meta-crownbay/recipes-core meta-crownbay/recipes-core/tasks meta-crownbay/recipes-core/tasks/task-core-tools.bbappend meta-crownbay/recipes-graphics/ meta-crownbay/recipes-graphics/xorg-xserver/ meta-crownbay/recipes-graphics/xorg-xserver/emgd-driver-bin_1.6.bb meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend meta-crownbay/recipes-graphics/xorg-xserver/emgd-driver-bin-1.6/ meta-crownbay/recipes-graphics/xorg-xserver/emgd-driver-bin-1.6/.gitignore meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/ meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/ meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xorg.conf meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/ meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/xorg.conf meta-crownbay/recipes-kernel/ meta-crownbay/recipes-kernel/linux/ meta-crownbay/recipes-kernel/linux/linux-yocto_2.6.34.bbappend meta-crownbay/recipes-kernel/linux/linux-yocto_2.6.37.bbappend meta-crownbay/recipes-kernel/linux/linux-yocto_3.0.bbappend
The following sections describe each part of the proposed BSP format.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/<bsp_license_file>
These optional files satisfy licensing requirements for the BSP.
The type or types of files here can vary depending on the licensing requirements.
For example, in the Crown Bay BSP all licensing requirements are handled with the
COPYING.MIT
file.
Licensing files can be MIT, BSD, GPLv*, and so forth. These files are recommended for the BSP but are optional and totally up to the BSP developer.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/README
This file provides information on how to boot the live images that are optionally
included in the /binary
directory.
The README
file also provides special information needed for
building the image.
Technically speaking a README
is optional but it is highly
recommended that every BSP has one.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/binary/<bootable_images>
This optional area contains useful pre-built kernels and user-space filesystem images appropriate to the target system. This directory typically contains graphical (e.g. sato) and minimal live images when the BSP tarball has been created and made available in the Yocto Project website. You can use these kernels and images to get a system running and quickly get started on development tasks.
The exact types of binaries present are highly hardware-dependent. However, a README file should be present in the BSP file structure that explains how to use the kernels and images with the target hardware. If pre-built binaries are present, source code to meet licensing requirements must also be provided in some form.
You can find this file in the Yocto Project file's directory structure at:
meta-<bsp_name>/conf/layer.conf
The conf/layer.conf
file identifies the file structure as a Yocto
Project layer, identifies the
contents of the layer, and contains information about how Yocto Project should use it.
Generally, a standard boilerplate file such as the following works.
In the following example you would replace "bsp" and "_bsp" with the actual name
of the BSP (i.e. <bsp_name> from the example template).
# We have a conf directory, add to BBPATH BBPATH := "${BBPATH}:${LAYERDIR}" # We have a recipes directory containing .bb and .bbappend files, add to BBFILES BBFILES := "${BBFILES} ${LAYERDIR}/recipes/*/*.bb \ ${LAYERDIR}/recipes/*/*.bbappend" BBFILE_COLLECTIONS += "bsp" BBFILE_PATTERN_bsp := "^${LAYERDIR}/" BBFILE_PRIORITY_bsp = "5"
This file simply makes BitBake aware of the recipes and configuration directories. This file must exist so that the Yocto Project build system can recognize the BSP.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/conf/machine/*.conf
The machine files bind together all the information contained elsewhere
in the BSP into a format that the Yocto Project build system can understand.
If the BSP supports multiple machines, multiple machine configuration files
can be present.
These filenames correspond to the values to which users have set the
MACHINE
variable.
These files define things such as the kernel package to use
(PREFERRED_PROVIDER
of virtual/kernel), the hardware drivers to
include in different types of images, any special software components
that are needed, any bootloader information, and also any special image
format requirements.
At least one machine file is required for a BSP layer.
However, you can supply more than one file.
For example, in the Crown Bay BSP shown earlier in this section, the
conf/machine
directory contains two configuration files:
crownbay.conf
and crownbay-noemgd.conf
.
The crownbay.conf
file is used for the Crown Bay BSP
that supports the Intel® Embedded
Media and Graphics Driver (Intel®
EMGD), while the crownbay-noemgd.conf
file is used for the
Crown Bay BSP that does not support the Intel®
EMGD.
This crownbay.conf
file could also include
a hardware "tuning" file that is commonly used to
define the the package architecture and specify
optimization flags, which are carefully chosen to give best
performance on a given processor.
Tuning files are found in the meta/conf/machine/include
directory.
To use them, you simply include them in the machine configuration file.
For example, the Crown Bay BSP crownbay.conf
has the
following statement:
include conf/machine/include/tune-atom.inc
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/recipes-bsp/*
This optional directory contains miscellaneous recipe files for the BSP.
Most notably would be the formfactor files.
For example, in the Crown Bay BSP there is the
formfactor_0.0.bbappend
file, which is an append file used
to augment the recipe that starts the build.
Furthermore, there are machine-specific settings used during the build that are
defined by the machconfig
files.
In the Crown Bay example, two machconfig
files exist:
one that supports the Intel EMGD and one that does not:
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay-noemgd/machconfig meta-crownbay/recipes-bsp/formfactor/formfactor_0.0.bbappend
If a BSP does not have a formfactor entry, defaults are established according to the configuration script.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/recipes-core/*
This directory contains recipe files for the core.
For example, in the Crown Bay BSP there is the
task-core-tools.bbappend
file, which is an append file used
to recommend that the SystemTap package be included as a package when the image
is built.
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/recipes-graphics/*
This optional directory contains recipes for the BSP if it has special requirements for graphics support. All files that are needed for the BSP to support a display are kept here. For example, the Crown Bay BSP contains the following files that support building a BSP that supports and does not support the Intel EMGD:
meta-crownbay/recipes-graphics/xorg-xserver/emgd-driver-bin_1.6.bb meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xorg.conf meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd/xorg.conf
You can find these files in the Yocto Project file's directory structure at:
meta-<bsp_name>/recipes-kernel/linux/linux-yocto_*.bbappend
These files append your specific changes to the kernel you are using.
For your BSP, you typically want to use an existing Yocto Project kernel found in the
Yocto Project repository at meta/recipes-kernel/linux
.
You can append your specific changes to the kernel recipe by using a
similarly named append file, which is located in the
meta-<bsp_name>/recipes-kernel/linux
directory.
Suppose you use a BSP that uses the linux-yocto_3.0.bb
kernel,
which is the preferred kernel to use for developing a new BSP using the Yocto Project.
In other words, you have selected the kernel in your
<bsp_name>.conf
file by adding the following statements:
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" PREFERRED_VERSION_linux-yocto = "3.0%"
You would use the linux-yocto_3.0.bbappend
file to append
specific BSP settings to the kernel, thus configuring the kernel for your particular BSP.
As an example, look at the existing Crown Bay BSP. The append file used is:
meta-crownbay/recipes-kernel/linux/linux-yocto_3.0.bbappend
The file contains the following:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" COMPATIBLE_MACHINE_crownbay = "crownbay" KMACHINE_crownbay = "yocto/standard/crownbay" KERNEL_FEATURES_append_crownbay += " cfg/smp.scc" COMPATIBLE_MACHINE_crownbay-noemgd = "crownbay-noemgd" KMACHINE_crownbay-noemgd = "yocto/standard/crownbay" KERNEL_FEATURES_append_crownbay-noemgd += " cfg/smp.scc" SRCREV_machine_pn-linux-yocto_crownbay ?= "6b4b9acde5fb0ff66ae58fa98274bfe631501499" SRCREV_meta_pn-linux-yocto_crownbay ?= "5b535279e61197cb194bb2dfceb8b7a04128387c" SRCREV_machine_pn-linux-yocto_crownbay-noemgd ?= "6b4b9acde5fb0ff66ae58fa98274bfe631501499" SRCREV_meta_pn-linux-yocto_crownbay-noemgd ?= "5b535279e61197cb194bb2dfceb8b7a04128387c"
This append file contains statements used to support the Crown Bay BSP for both
Intel EMGD and non-EMGD.
The build process, in this case, recognizes and uses only the statements that
apply to the defined machine name - crownbay
in this case.
So, the applicable statements in the linux-yocto_3.0.bbappend
file are follows:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" COMPATIBLE_MACHINE_crownbay = "crownbay" KMACHINE_crownbay = "yocto/standard/crownbay" KERNEL_FEATURES_append_crownbay += " cfg/smp.scc" SRCREV_machine_pn-linux-yocto_crownbay ?= "6b4b9acde5fb0ff66ae58fa98274bfe631501499" SRCREV_meta_pn-linux-yocto_crownbay ?= "5b535279e61197cb194bb2dfceb8b7a04128387c"
The append file defines crownbay
as the compatible machine,
defines the KMACHINE
, points to some configuration fragments
to use by setting the KERNEL_FEATURES
variable, and then points
to the specific commits in the Yocto Project files Git repository and the
meta
Git repository branches to identify the exact kernel needed
to build the Crown Bay BSP.
One thing missing in this particular BSP, which you will typically need when
developing a BSP, is the kernel configuration file (.config
) for your BSP.
When developing a BSP, you probably have a kernel configuration file or a set of kernel
configuration files that, when taken together, define the kernel configuration for your BSP.
You can accomplish this definition by putting the configurations in a file or a set of files
inside a directory located at the same level as your append file and having the same name
as the kernel.
With all these conditions met simply reference those files in a
SRC_URI
statement in the append file.
For example, suppose you had a set of configuration options in a file called
defconfig
.
If you put that file inside a directory named
/linux-yocto
and then added
a SRC_URI
statement such as the following to the append file,
those configuration
options will be picked up and applied when the kernel is built.
SRC_URI += "file://defconfig"
As mentioned earlier, you can group related configurations into multiple files and
name them all in the SRC_URI
statement as well.
For example, you could group separate configurations specifically for Ethernet and graphics
into their own files and add those by using a SRC_URI
statement like the
following in your append file:
SRC_URI += "file://defconfig \ file://eth.cfg \ file://gfx.cfg"
The FILESEXTRAPATHS
variable is in boilerplate form here
in order to make it easy to do that.
It basically allows those configuration files to be found by the build process.
Other methods exist to accomplish grouping and defining configuration options.
For example, you could directly add configuration options to the Yocto kernel
meta
branch for your BSP.
The configuration options will likely end up in that location anyway if the BSP gets
added to the Yocto Project.
For information on how to add these configurations directly, see
The Yocto Project Kernel Architecture and Use Manual.
In general, however, the Yocto Project maintainers take care of moving the
SRC_URI
-specified
configuration options to the meta
branch.
Not only is it easier for BSP developers to not have to worry about putting those
configurations in the branch, but having the maintainers do it allows them to apply
'global' knowledge about the kinds of common configuration options multiple BSPs in
the tree are typically using.
This allows for promotion of common configurations into common features.
In some cases, a BSP contains separately licensed IP (Intellectual Property) for a component that imposes upon the user a requirement to accept the terms of a 'click-through' license. Once the license is accepted the Yocto Project build system can then build and include the corresponding component in the final BSP image. Some affected components might be essential to the normal functioning of the system and have no 'free' replacement (i.e. the resulting system would be non-functional without them). On the other hand, other components might be simply 'good-to-have' or purely elective, or if essential nonetheless have a 'free' (possibly less-capable) version that could be used as a in the BSP recipe.
For cases where you can substitute something and still maintain functionality, the Yocto Project website's BSP Download Page makes available 'de-featured' BSPs that are completely free of any IP encumbrances. For these cases you can use the substitution directly and without any further licensing requirements. If present, these fully 'de-featured' BSPs are named appropriately different as compared to the names of the respective encumbered BSPs. If available, these substitutions are the simplest and most preferred options. This, of course, assumes the resulting functionality meets requirements.
If however, a non-encumbered version is unavailable or the 'free' version would provide unsuitable functionality or quality, you can use an encumbered version.
Several methods exist within the Yocto Project build system to satisfy the licensing requirements for an encumbered BSP. The following list describes them in preferential order:
Get a license key (or keys) for the encumbered BSP by visiting a website and providing the name of the BSP and your email address through a web form.
After agreeing to any applicable license terms, the BSP key(s) will be immediately sent to the address you gave and you can use them by specifying BSPKEY_<keydomain> environment variables when building the image:
$ BSPKEY_<keydomain>=<key> bitbake core-image-sato
These steps allow the encumbered image to be built with no change at all to the normal build process.
Equivalently and probably more conveniently, a line
for each key can instead be put into the user's
local.conf
file found in the Yocto Project file's
build directory.
The <keydomain> component of the
BSPKEY_<keydomain> is required because there
might be multiple licenses in effect for a given BSP.
In such cases, a given <keydomain> corresponds to
a particular license. In order for an encumbered
BSP that encompasses multiple key domains to be built
successfully, a <keydomain> entry for each
applicable license must be present in local.conf
or
supplied on the command-line.
Do nothing - build as you normally would.
When a license is needed the build will stop and prompt you with instructions.
Follow the license prompts that originate from the
encumbered BSP.
These prompts usually take the form of instructions
needed to manually fetch the encumbered package(s)
and md5 sums into the required directory
(e.g. the yocto/build/downloads
).
Once the manual package fetch has been
completed, restart the build to continue where
it left off.
During the build the prompt will not appear again since you have satisfied the
requirement.
Get a full-featured BSP recipe rather than a key. You can do this by visiting the Yocto Project website's Download page and clicking on "BSP Downloads". BSP tarballs that have proprietary information can be downloaded after agreeing to licensing requirements as part of the download process. Obtaining the code this way allows you to build an encumbered image with no changes at all as compared to the normal build.
Note that the third method is also the only option available when downloading pre-compiled images generated from non-free BSPs. Those images are likewise available at from the Yocto Project website.