diff options
author | Jason M. Bills <jason.m.bills@linux.intel.com> | 2020-12-08 00:38:17 +0300 |
---|---|---|
committer | Jason M. Bills <jason.m.bills@linux.intel.com> | 2020-12-08 00:38:17 +0300 |
commit | 8d6ae7f2a817751fad151168fa10ce28ee0869d8 (patch) | |
tree | 281032f7ec07c41589aa094bd165cc2a98f2d3a7 /poky/documentation/bsp-guide/bsp.rst | |
parent | c16fb8893b19075db4bcf3b5bf33c1db8c3ca2bd (diff) | |
parent | 5da3c2284560a7e08ffafd03c5b5ba44a3242228 (diff) | |
download | openbmc-8d6ae7f2a817751fad151168fa10ce28ee0869d8.tar.xz |
Merge tag '0.26' of ssh://git-amr-1.devtools.intel.com:29418/openbmc-openbmc into update
Diffstat (limited to 'poky/documentation/bsp-guide/bsp.rst')
-rw-r--r-- | poky/documentation/bsp-guide/bsp.rst | 1527 |
1 files changed, 1527 insertions, 0 deletions
diff --git a/poky/documentation/bsp-guide/bsp.rst b/poky/documentation/bsp-guide/bsp.rst new file mode 100644 index 000000000..024a240c2 --- /dev/null +++ b/poky/documentation/bsp-guide/bsp.rst @@ -0,0 +1,1527 @@ +.. SPDX-License-Identifier: CC-BY-2.0-UK + +************************************************ +Board Support Packages (BSP) - Developer's Guide +************************************************ + +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 guide presents information about BSP layers, defines a structure +for components so that BSPs follow a commonly understood layout, +discusses how to customize a recipe for a BSP, addresses BSP licensing, +and provides information that shows you how to create a BSP +Layer using the :ref:`bitbake-layers <bsp-guide/bsp:Creating a new BSP Layer Using the \`\`bitbake-layers\`\` Script>` +tool. + +BSP Layers +========== + +A BSP consists of a file structure inside a base directory. +Collectively, you can think of the base directory, its file structure, +and the contents as a BSP layer. Although not a strict requirement, BSP +layers in the Yocto Project use the following well-established naming +convention: :: + + meta-bsp_root_name + +The string "meta-" is prepended to the +machine or platform name, which is bsp_root_name in the above form. + +.. note:: + + Because the BSP layer naming convention is well-established, it is + advisable to follow it when creating layers. Technically speaking, a + BSP layer name does not need to start with + meta-. However, various scripts and tools in the Yocto Project development + environment assume this convention. + +To help understand the BSP layer concept, consider the BSPs that the +Yocto Project supports and provides with each release. You can see the +layers in the +:ref:`overview-manual/overview-manual-development-environment:yocto project source repositories` +through +a web interface at :yocto_git:`/`. If you go to that interface, +you will find a list of repositories under "Yocto Metadata Layers". + +.. note:: + + Layers that are no longer actively supported as part of the Yocto + Project appear under the heading "Yocto Metadata Layer Archive." + +Each repository is a BSP layer supported by the Yocto Project (e.g. +``meta-raspberrypi`` and ``meta-intel``). Each of these layers is a +repository unto itself and clicking on the layer name displays two URLs +from which you can clone the layer's repository to your local system. +Here is an example that clones the Raspberry Pi BSP layer: :: + + $ git clone git://git.yoctoproject.org/meta-raspberrypi + +In addition to BSP layers, the ``meta-yocto-bsp`` layer is part of the +shipped ``poky`` repository. The ``meta-yocto-bsp`` layer maintains +several "reference" BSPs including the ARM-based Beaglebone, MIPS-based +EdgeRouter, and generic versions of both 32-bit and 64-bit IA machines. + +For information on typical BSP development workflow, see the +:ref:`bsp-guide/bsp:developing a board support package (bsp)` +section. For more +information on how to set up a local copy of source files from a Git +repository, see the +:ref:`dev-manual/dev-manual-start:locating yocto project source files` +section in the Yocto Project Development Tasks Manual. + +The BSP layer's base directory (``meta-bsp_root_name``) is the root +directory of that Layer. This directory is what you add to the +:term:`BBLAYERS` variable in the +``conf/bblayers.conf`` file found in your +:term:`Build Directory`, which is +established after you run the OpenEmbedded build environment setup +script (i.e. :ref:`ref-manual/ref-structure:\`\`oe-init-build-env\`\`` ). +Adding the root directory allows the :term:`OpenEmbedded Build System` +to recognize the BSP +layer and from it build an image. Here is an example: :: + + 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:: + + Ordering and ``BBFILE_PRIORITY`` for the layers listed in BBLAYERS matter. For + example, if multiple layers define a machine configuration, the OpenEmbedded + build system uses the last layer searched given similar layer priorities. The + build system works from the top-down through the layers listed in ``BBLAYERS``. + +Some BSPs require or depend on additional layers beyond the BSP's root +layer in order to be functional. In this case, you need to specify these +layers in the ``README`` "Dependencies" section of the BSP's root layer. +Additionally, if any build instructions exist for the BSP, you must add +them to the "Dependencies" section. + +Some layers function as a layer to hold other BSP layers. These layers +are knows as ":term:`container layers <Container Layer>`". An example of +this type of layer is OpenEmbedded's +`meta-openembedded <https://github.com/openembedded/meta-openembedded>`__ +layer. The ``meta-openembedded`` layer contains many ``meta-*`` layers. +In cases like this, you need to include the names of the actual layers +you want to work with, such as: :: + + 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 \ + " + +and so on. + +For more information on layers, see the +":ref:`dev-manual/dev-manual-common-tasks:understanding and creating layers`" +section of the Yocto Project Development Tasks Manual. + +Preparing Your Build Host to Work With BSP Layers +================================================= + +This section describes how to get your build host ready to work with BSP +layers. Once you have the host set up, you can create the layer as +described in the +":ref:`bsp-guide/bsp:creating a new bsp layer using the \`\`bitbake-layers\`\` script`" +section. + +.. note:: + + For structural information on BSPs, see the Example Filesystem Layout + section. + +#. *Set Up the Build Environment:* Be sure you are set up to use BitBake + in a shell. See the ":ref:`dev-manual/dev-manual-start:preparing the build host`" + section in the Yocto Project Development Tasks Manual for information on how + to get a build host ready that is either a native Linux machine or a machine + that uses CROPS. + +#. *Clone the ``poky`` Repository:* You need to have a local copy of the + Yocto Project :term:`Source Directory` (i.e. a local + ``poky`` repository). See the + "ref:`dev-manual/dev-manual-start:cloning the ``poky`` repository`" and + possibly the + ":ref:`dev-manual/dev-manual-start:checking out by branch in poky`" or + ":ref:`dev-manual/dev-manual-start:checking out by tag in poky`" + sections + all in the Yocto Project Development Tasks Manual for information on + how to clone the ``poky`` repository and check out the appropriate + branch for your work. + +#. *Determine the BSP Layer You Want:* The Yocto Project supports many + BSPs, which are maintained in their own layers or in layers designed + to contain several BSPs. To get an idea of machine support through + BSP layers, you can look at the `index of + machines <&YOCTO_RELEASE_DL_URL;/machines>`__ for the release. + +#. *Optionally Clone the ``meta-intel`` BSP Layer:* If your hardware is + based on current Intel CPUs and devices, you can leverage this BSP + layer. For details on the ``meta-intel`` BSP layer, see the layer's + `README <http://git.yoctoproject.org/cgit/cgit.cgi/meta-intel/tree/README>`__ + file. + + #. *Navigate to Your Source Directory:* Typically, you set up the + ``meta-intel`` Git repository inside the :term:`Source Directory` (e.g. + ``poky``). :: + + $ cd /home/you/poky + + #. *Clone the Layer:* :: + + $ 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. + + #. *Check Out the Proper Branch:* The branch you check out for + ``meta-intel`` must match the same branch you are using for the + Yocto Project release (e.g. &DISTRO_NAME_NO_CAP;): :: + + $ cd meta-intel + $ git checkout -b &DISTRO_NAME_NO_CAP; remotes/origin/&DISTRO_NAME_NO_CAP; + Branch &DISTRO_NAME_NO_CAP; set up to track remote branch + &DISTRO_NAME_NO_CAP; from origin. + Switched to a new branch '&DISTRO_NAME_NO_CAP;' + + .. note:: + + To see the available branch names in a cloned repository, use the ``git + branch -al`` command. See the + ":ref:`dev-manual/dev-manual-start:checking out by branch in poky`" + section in the Yocto Project Development Tasks Manual for more + information. + +#. *Optionally Set Up an Alternative BSP Layer:* If your hardware can be + more closely leveraged to an existing BSP not within the + ``meta-intel`` BSP layer, you can clone that BSP layer. + + The process is identical to the process used for the ``meta-intel`` + layer except for the layer's name. For example, if you determine that + your hardware most closely matches the ``meta-raspberrypi``, clone + that layer: :: + + $ 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. + +#. *Initialize the Build Environment:* While in the root directory of + the Source Directory (i.e. ``poky``), run the + :ref:`ref-manual/ref-structure:\`\`oe-init-build-env\`\`` environment + setup script to define the OpenEmbedded build environment on your + build host. :: + + $ source &OE_INIT_FILE; + + Among other things, the script creates the :term:`Build Directory`, which is + ``build`` in this case and is located in the :term:`Source Directory`. After + the script runs, your current working directory is set to the ``build`` + directory. + +.. _bsp-filelayout: + +Example Filesystem Layout +========================= + +Defining a common BSP directory structure allows end-users to understand +and become familiar with that standard. A common format also encourages +standardization of software support for hardware. + +The proposed form described in this section does have elements that are +specific to the OpenEmbedded build system. It is intended that +developers can use this structure with other build systems besides the +OpenEmbedded build system. It is also intended that it will be be simple +to extract information and convert it to other formats if required. The +OpenEmbedded build system, through its standard :ref:`layers mechanism +<overview-manual/overview-manual-yp-intro:the yocto project layer model>`, can +directly accept the format described as a layer. The BSP layer captures +all the hardware-specific details in one place using 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 - +the specification is concerned with the hardware-specific components +only. At the end-distribution point, you can ship the BSP layer combined +with a build system and other tools. Realize that it is important to +maintain the distinction that the BSP layer, a build system, and tools +are separate components that could be combined in certain end products. + +Before looking at the recommended form for the directory structure +inside a BSP layer, you should be aware that some requirements do exist +in order for a BSP layer to be considered compliant with the Yocto +Project. For that list of requirements, see the +":ref:`bsp-guide/bsp:released bsp requirements`" section. + +Below is the typical directory structure for a BSP layer. While this +basic form represents the standard, realize that the actual layout for +individual BSPs could differ. :: + + 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 + +Below is an example of the Raspberry Pi BSP layer that is available from +the :yocto_git:`Source Respositories <>`: :: + + 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 + +The following sections describe each part of the proposed BSP format. + +.. _bsp-filelayout-license: + +License Files +------------- + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_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 Raspberry Pi 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. For information on how to maintain license compliance, see +the ":ref:`dev-manual/dev-manual-common-tasks:maintaining open source license compliance during your product's lifecycle`" +section in the Yocto Project Development Tasks Manual. + +.. _bsp-filelayout-readme: + +README File +----------- + +You can find this file in the BSP Layer at: :: + + meta-bsp_root_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 information needed for building the image. + +At a minimum, the ``README`` file must contain a list of dependencies, +such as the names of any other layers on which the BSP depends and the +name of the BSP maintainer with his or her contact information. + +.. _bsp-filelayout-readme-sources: + +README.sources File +------------------- + +You can find this file in the BSP Layer at: :: + + meta-bsp_root_name/README.sources + +This file provides information on where to locate the BSP source files +used to build the images (if any) that reside in +``meta-bsp_root_name/binary``. Images in the ``binary`` would be images +released with the BSP. The information in the ``README.sources`` file +also helps you find the :term:`Metadata` +used to generate the images that ship with the BSP. + +.. note:: + + If the BSP's ``binary`` directory is missing or the directory has no images, an + existing ``README.sources`` file is meaningless and usually does not exist. + +.. _bsp-filelayout-binary: + +Pre-built User Binaries +----------------------- + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_name/binary/bootable_images + +This optional area contains useful pre-built kernels and user-space +filesystem images released with the BSP that are 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_home:`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. The +:ref:`README <bsp-guide/bsp:readme file>` file should be present in the +BSP Layer and it explains how to use the images with the target +hardware. Additionally, the +:ref:`README.sources <bsp-guide/bsp:readme.sources file>` file should be +present to locate the sources used to build the images and provide +information on the Metadata. + +.. _bsp-filelayout-layer: + +Layer Configuration File +------------------------ + +You can find this file in the BSP Layer at: :: + + meta-bsp_root_name/conf/layer.conf + +The ``conf/layer.conf`` file identifies the file structure as a layer, +identifies the contents of the layer, and contains information about how +the build system should use it. Generally, a standard boilerplate file +such as the following works. In the following example, you would replace +bsp with the actual name of the BSP (i.e. bsp_root_name from the example +template). :: + + # We have a conf and classes directory, add to BBPATH + BBPATH .= ":${LAYERDIR}" + + # We have a recipes directory, add to BBFILES + BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ + ${LAYERDIR}/recipes-*/*/*.bbappend" + + BBFILE_COLLECTIONS += "bsp" + BBFILE_PATTERN_bsp = "^${LAYERDIR}/" + BBFILE_PRIORITY_bsp = "6" + LAYERDEPENDS_bsp = "intel" + +To illustrate the string substitutions, here are the corresponding +statements from the Raspberry Pi ``conf/layer.conf`` file: :: + + # 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" + . + . + . + +This file simply makes :term:`BitBake` aware of the recipes and configuration +directories. The file must exist so that the OpenEmbedded build system can +recognize the BSP. + +.. _bsp-filelayout-machine: + +Hardware Configuration Options +------------------------------ + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_name/conf/machine/*.conf + +The machine files bind together all the information contained elsewhere +in the BSP into a format that the build system can understand. Each BSP +Layer requires at least one machine file. If the BSP supports multiple +machines, multiple machine configuration files can exist. These +filenames correspond to the values to which users have set the +:term:`MACHINE` variable. + +These files define things such as the kernel package to use +(:term:`PREFERRED_PROVIDER` of +:ref:`virtual/kernel <dev-manual/dev-manual-common-tasks:using virtual providers>`), +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. + +This configuration file could also include a hardware "tuning" file that +is commonly used to define 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 +within the :term:`Source Directory`. +For example, many ``tune-*`` files (e.g. ``tune-arm1136jf-s.inc``, +``tune-1586-nlp.inc``, and so forth) reside in the +``poky/meta/conf/machine/include`` directory. + +To use an include file, you simply include them in the machine +configuration file. For example, the Raspberry Pi BSP +``raspberrypi3.conf`` contains the following statement: :: + + include conf/machine/include/rpi-base.inc + +.. _bsp-filelayout-misc-recipes: + +Miscellaneous BSP-Specific Recipe Files +--------------------------------------- + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_name/recipes-bsp/* + +This optional directory contains miscellaneous recipe files for the BSP. +Most notably would be the formfactor files. For example, in the +Raspberry Pi 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`` file further down in the +directory. Here is the ``machconfig`` file for the Raspberry Pi BSP: :: + + HAVE_TOUCHSCREEN=0 + HAVE_KEYBOARD=1 + + DISPLAY_CAN_ROTATE=0 + DISPLAY_ORIENTATION=0 + DISPLAY_DPI=133 + +.. note:: + + If a BSP does not have a formfactor entry, defaults are established + according to the formfactor configuration file that is installed by + the main formfactor recipe + ``meta/recipes-bsp/formfactor/formfactor_0.0.bb``, which is found in + the :term:`Source Directory`. + +.. _bsp-filelayout-recipes-graphics: + +Display Support Files +--------------------- + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_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. + +.. _bsp-filelayout-kernel: + +Linux Kernel Configuration +-------------------------- + +You can find these files in the BSP Layer at: :: + + meta-bsp_root_name/recipes-kernel/linux/linux*.bbappend + meta-bsp_root_name/recipes-kernel/linux/*.bb + +Append files (``*.bbappend``) modify the main kernel recipe being used +to build the image. The ``*.bb`` files would be a developer-supplied +kernel recipe. This area of the BSP hierarchy can contain both these +types of files although, in practice, it is likely that you would have +one or the other. + +For your BSP, you typically want to use an existing Yocto Project kernel +recipe found in the :term:`Source Directory` +at +``meta/recipes-kernel/linux``. You can append machine-specific changes +to the kernel recipe by using a similarly named append file, which is +located in the BSP Layer for your target device (e.g. the +``meta-bsp_root_name/recipes-kernel/linux`` directory). + +Suppose you are using the ``linux-yocto_4.4.bb`` recipe to build the +kernel. In other words, you have selected the kernel in your +bsp_root_name\ ``.conf`` file by adding +:term:`PREFERRED_PROVIDER` and :term:`PREFERRED_VERSION` +statements as follows: :: + + PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" + PREFERRED_VERSION_linux-yocto ?= "4.4%" + +.. note:: + + When the preferred provider is assumed by default, the ``PREFERRED_PROVIDER`` + statement does not appear in the ``bsp_root_name`` .conf file. + +You would use the ``linux-yocto_4.4.bbappend`` file to append specific +BSP settings to the kernel, thus configuring the kernel for your +particular BSP. + +You can find more information on what your append file should contain in +the ":ref:`kernel-dev/kernel-dev-common:creating the append file`" section +in the Yocto Project Linux Kernel Development Manual. + +An alternate scenario is when you create your own kernel recipe for the +BSP. A good example of this is the Raspberry Pi BSP. If you examine the +``recipes-kernel/linux`` directory you see the following: :: + + linux-raspberrypi-dev.bb + linux-raspberrypi.inc + linux-raspberrypi_4.14.bb + linux-raspberrypi_4.9.bb + +The directory contains three kernel recipes and a common include file. + +Developing a Board Support Package (BSP) +======================================== + +This section describes the high-level procedure you can follow to create +a BSP. Although not required for BSP creation, the ``meta-intel`` +repository, which contains many BSPs supported by the Yocto Project, is +part of the example. + +For an example that shows how to create a new layer using the tools, see +the ":ref:`bsp-guide/bsp:creating a new bsp layer using the \`\`bitbake-layers\`\` script`" +section. + +The following illustration and list summarize the BSP creation general +workflow. + +.. image:: figures/bsp-dev-flow.png + :align: center + +#. *Set up Your Host Development System to Support Development Using the + Yocto Project*: See the ":ref:`dev-manual/dev-manual-start:preparing the build host`" + section in the Yocto Project Development Tasks Manual for options on how to + get a system ready to use the Yocto Project. + +#. *Establish the meta-intel Repository on Your System:* Having + local copies of these supported BSP layers on your system gives you + access to layers you might be able to leverage when creating your + BSP. For information on how to get these files, see the + ":ref:`bsp-guide/bsp:preparing your build host to work with bsp layers`" + section. + +#. *Create Your Own BSP Layer Using the bitbake-layers Script:* + Layers are ideal for isolating and storing work for a given piece of + hardware. A layer is really just a location or area in which you + place the recipes and configurations for your BSP. In fact, a BSP is, + in itself, a special type of layer. The simplest way to create a new + BSP layer that is compliant with the Yocto Project is to use the + ``bitbake-layers`` script. For information about that script, see the + ":ref:`bsp-guide/bsp:creating a new bsp layer using the \`\`bitbake-layers\`\` script`" + section. + + Another example that illustrates a layer is an application. Suppose + you are creating an application that has library or other + dependencies in order for it to compile and run. The layer, in this + case, would be where all the recipes that define those dependencies + are kept. The key point for a layer is that it is an isolated area + that contains all the relevant information for the project that the + OpenEmbedded build system knows about. For more information on + layers, see the ":ref:`overview-manual/overview-manual-yp-intro:the yocto project layer model`" + section in the Yocto Project Overview and Concepts Manual. You can also + reference the ":ref:`dev-manual/dev-manual-common-tasks:understanding and creating layers`" + section in the Yocto Project Development Tasks Manual. For more + information on BSP layers, see the ":ref:`bsp-guide/bsp:bsp layers`" + section. + + .. note:: + + - Five hardware reference BSPs exist that are part of the Yocto + Project release and are located in the ``poky/meta-yocto-bsp`` + BSP layer: + + - Texas Instruments Beaglebone (``beaglebone-yocto``) + + - Ubiquiti Networks EdgeRouter Lite (``edgerouter``) + + - Two general IA platforms (``genericx86`` and ``genericx86-64``) + + - Three core Intel BSPs exist as part of the Yocto Project + release in the ``meta-intel`` layer: + + - ``intel-core2-32``, which is a BSP optimized for the Core2 + family of CPUs as well as all CPUs prior to the Silvermont + core. + + - ``intel-corei7-64``, which is a BSP optimized for Nehalem + and later Core and Xeon CPUs as well as Silvermont and later + Atom CPUs, such as the Baytrail SoCs. + + - ``intel-quark``, which is a BSP optimized for the Intel + Galileo gen1 & gen2 development boards. + + When you set up a layer for a new BSP, you should follow a standard + layout. This layout is described in the ":ref:`bsp-guide/bsp:example filesystem layout`" + section. In the standard layout, notice + the suggested structure for recipes and configuration information. + You can see the standard layout for a BSP by examining any supported + BSP found in the ``meta-intel`` layer inside the Source Directory. + +#. *Make Configuration Changes to Your New BSP Layer:* The standard BSP + layer structure organizes the files you need to edit in ``conf`` and + several ``recipes-*`` directories within the BSP layer. Configuration + changes identify where your new layer is on the local system and + identifies the kernel you are going to use. When you run the + ``bitbake-layers`` script, you are able to interactively configure + many things for the BSP (e.g. keyboard, touchscreen, and so forth). + +#. *Make Recipe Changes to Your New BSP Layer:* Recipe changes include + altering recipes (``*.bb`` files), removing recipes you do not use, + and adding new recipes or append files (``.bbappend``) that support + your hardware. + +#. *Prepare for the Build:* Once you have made all the changes to your + BSP layer, there remains a few things you need to do for the + OpenEmbedded build system in order for it to create your image. You + need to get the build environment ready by sourcing an environment + setup script (i.e. ``oe-init-build-env``) and you need to be sure two + key configuration files are configured appropriately: the + ``conf/local.conf`` and the ``conf/bblayers.conf`` file. You must + make the OpenEmbedded build system aware of your new layer. See the + ":ref:`dev-manual/dev-manual-common-tasks:enabling your layer`" + section in the Yocto Project Development Tasks Manual for information + on how to let the build system know about your new layer. + +#. *Build the Image:* The OpenEmbedded build system uses the BitBake + tool to build images based on the type of image you want to create. + You can find more information about BitBake in the + :doc:`BitBake User Manual <bitbake:index>`. + + The build process supports several types of images to satisfy + different needs. See the + ":ref:`ref-manual/ref-images:Images`" chapter in the Yocto + Project Reference Manual for information on supported images. + +Requirements and Recommendations for Released BSPs +================================================== + +Certain requirements exist for a released BSP to be considered compliant +with the Yocto Project. Additionally, recommendations also exist. This +section describes the requirements and recommendations for released +BSPs. + +Released BSP Requirements +------------------------- + +Before looking at BSP requirements, you should consider the following: + +- The requirements here assume the BSP layer is a well-formed, "legal" + layer that can be added to the Yocto Project. For guidelines on + creating a layer that meets these base requirements, see the + ":ref:`bsp-guide/bsp:bsp layers`" section in this manual and the + ":ref:`dev-manual/dev-manual-common-tasks:understanding and creating layers`" + section in the Yocto Project Development Tasks Manual. + +- The requirements in this section apply regardless of how you package + a BSP. You should consult the packaging and distribution guidelines + for your specific release process. For an example of packaging and + distribution requirements, see the "`Third Party BSP Release + Process <https://wiki.yoctoproject.org/wiki/Third_Party_BSP_Release_Process>`__" + wiki page. + +- The requirements for the BSP as it is made available to a developer + are completely independent of the released form of the BSP. For + example, the BSP Metadata can be contained within a Git repository + and could have a directory structure completely different from what + appears in the officially released BSP layer. + +- It is not required that specific packages or package modifications + exist in the BSP layer, beyond the requirements for general + compliance with the Yocto Project. For example, no requirement exists + dictating that a specific kernel or kernel version be used in a given + BSP. + +Following are the requirements for a released BSP that conform to the +Yocto Project: + +- *Layer Name:* The BSP must have a layer name that follows the Yocto + Project standards. For information on BSP layer names, see the + ":ref:`bsp-guide/bsp:bsp layers`" section. + +- *File System Layout:* When possible, use the same directory names in + your BSP layer as listed in the ``recipes.txt`` file, which is found + in ``poky/meta`` directory of the :term:`Source Directory` + or in the OpenEmbedded-Core Layer (``openembedded-core``) at + http://git.openembedded.org/openembedded-core/tree/meta. + + You should place recipes (``*.bb`` files) and recipe modifications + (``*.bbappend`` files) into ``recipes-*`` subdirectories by + functional area as outlined in ``recipes.txt``. If you cannot find a + category in ``recipes.txt`` to fit a particular recipe, you can make + up your own ``recipes-*`` subdirectory. + + Within any particular ``recipes-*`` category, the layout should match + what is found in the OpenEmbedded-Core Git repository + (``openembedded-core``) or the Source Directory (``poky``). In other + words, make sure you place related files in appropriately-related + ``recipes-*`` subdirectories specific to the recipe's function, or + within a subdirectory containing a set of closely-related recipes. + The recipes themselves should follow the general guidelines for + recipes used in the Yocto Project found in the "`OpenEmbedded Style + Guide <http://openembedded.org/wiki/Styleguide>`__". + +- *License File:* You must include a license file in the + ``meta-bsp_root_name`` directory. This license covers the BSP + Metadata as a whole. You must specify which license to use since no + default license exists when one is not specified. See the + :yocto_git:`COPYING.MIT </cgit.cgi/meta-raspberrypi/tree/COPYING.MIT>` + file for the Raspberry Pi BSP in the ``meta-raspberrypi`` BSP layer + as an example. + +- *README File:* You must include a ``README`` file in the + ``meta-bsp_root_name`` directory. See the + :yocto_git:`README.md </cgit.cgi/meta-raspberrypi/tree/README.md>` + file for the Raspberry Pi BSP in the ``meta-raspberrypi`` BSP layer + as an example. + + At a minimum, the ``README`` file should contain the following: + + - A brief description of the target hardware. + + - A list of all the dependencies of the BSP. These dependencies are + typically a list of required layers needed to build the BSP. + However, the dependencies should also contain information + regarding any other dependencies the BSP might have. + + - Any required special licensing information. For example, this + information includes information on special variables needed to + satisfy a EULA, or instructions on information needed to build or + distribute binaries built from the BSP Metadata. + + - The name and contact information for the BSP layer maintainer. + This is the person to whom patches and questions should be sent. + For information on how to find the right person, see the + ":ref:`dev-manual/dev-manual-common-tasks:submitting a change to the yocto project`" + section in the Yocto Project Development Tasks Manual. + + - Instructions on how to build the BSP using the BSP layer. + + - Instructions on how to boot the BSP build from the BSP layer. + + - Instructions on how to boot the binary images contained in the + ``binary`` directory, if present. + + - Information on any known bugs or issues that users should know + about when either building or booting the BSP binaries. + +- *README.sources File:* If your BSP contains binary images in the + ``binary`` directory, you must include a ``README.sources`` file in + the ``meta-bsp_root_name`` directory. This file specifies exactly + where you can find the sources used to generate the binary images. + +- *Layer Configuration File:* You must include a ``conf/layer.conf`` + file in the ``meta-bsp_root_name`` directory. This file identifies + the ``meta-bsp_root_name`` BSP layer as a layer to the build + system. + +- *Machine Configuration File:* You must include one or more + ``conf/machine/bsp_root_name.conf`` files in the + ``meta-bsp_root_name`` directory. These configuration files define + machine targets that can be built using the BSP layer. Multiple + machine configuration files define variations of machine + configurations that the BSP supports. If a BSP supports multiple + machine variations, you need to adequately describe each variation in + the BSP ``README`` file. Do not use multiple machine configuration + files to describe disparate hardware. If you do have very different + targets, you should create separate BSP layers for each target. + + .. note:: + + It is completely possible for a developer to structure the working + repository as a conglomeration of unrelated BSP files, and to possibly + generate BSPs targeted for release from that directory using scripts or + some other mechanism (e.g. ``meta-yocto-bsp`` layer). Such considerations + are outside the scope of this document. + +Released BSP Recommendations +---------------------------- + +Following are recommendations for released BSPs that conform to the +Yocto Project: + +- *Bootable Images:* Released BSPs can contain one or more bootable + images. Including bootable images allows users to easily try out the + BSP using their own hardware. + + In some cases, it might not be convenient to include a bootable + image. If so, you might want to make two versions of the BSP + available: one that contains binary images, and one that does not. + The version that does not contain bootable images avoids unnecessary + download times for users not interested in the images. + + If you need to distribute a BSP and include bootable images or build + kernel and filesystems meant to allow users to boot the BSP for + evaluation purposes, you should put the images and artifacts within a + ``binary/`` subdirectory located in the ``meta-bsp_root_name`` + directory. + + .. note:: + + If you do include a bootable image as part of the BSP and the + image was built by software covered by the GPL or other open + source licenses, it is your responsibility to understand and meet + all licensing requirements, which could include distribution of + source files. + +- *Use a Yocto Linux Kernel:* Kernel recipes in the BSP should be based + on a Yocto Linux kernel. Basing your recipes on these kernels reduces + the costs for maintaining the BSP and increases its scalability. See + the ``Yocto Linux Kernel`` category in the + :yocto_git:`Source Repositories <>` for these kernels. + +Customizing a Recipe for a BSP +============================== + +If you plan on customizing a recipe for a particular BSP, you need to do +the following: + +- Create a ``*.bbappend`` file for the modified recipe. For information on using + append files, see the ":ref:`dev-manual/dev-manual-common-tasks:using + .bbappend files in your layer`" section in the Yocto Project Development + Tasks Manual. + +- Ensure your directory structure in the BSP layer that supports your + machine is such that the OpenEmbedded build system can find it. See + the example later in this section for more information. + +- Put the append file in a directory whose name matches the machine's + name and is located in an appropriate sub-directory inside the BSP + layer (i.e. ``recipes-bsp``, ``recipes-graphics``, ``recipes-core``, + and so forth). + +- Place the BSP-specific files in the proper directory inside the BSP + layer. How expansive the layer is affects where you must place these + files. For example, if your layer supports several different machine + types, you need to be sure your layer's directory structure includes + hierarchy that separates the files according to machine. If your + layer does not support multiple machines, the layer would not have + that additional hierarchy and the files would obviously not be able + to reside in a machine-specific directory. + +Following is a specific example to help you better understand the +process. This example customizes customizes a recipe by adding a +BSP-specific configuration file named ``interfaces`` to the +``init-ifupdown_1.0.bb`` recipe for machine "xyz" where the BSP layer +also supports several other machines: + +#. Edit the ``init-ifupdown_1.0.bbappend`` file so that it contains the + following: :: + + FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + + The append file needs to be in the ``meta-xyz/recipes-core/init-ifupdown`` + directory. + +#. Create and place the new ``interfaces`` configuration file in the + BSP's layer here: :: + + meta-xyz/recipes-core/init-ifupdown/files/xyz-machine-one/interfaces + + .. note:: + + If the meta-xyz layer did not support multiple machines, you would place + the interfaces configuration file in the layer here: :: + + meta-xyz/recipes-core/init-ifupdown/files/interfaces + + The :term:`FILESEXTRAPATHS` variable in the append files extends the search + path the build system uses to find files during the build. Consequently, for + this example you need to have the ``files`` directory in the same location as + your append file. + +BSP Licensing Considerations +============================ + +In some cases, a BSP contains separately-licensed Intellectual Property +(IP) for a component or components. For these cases, you are required to +accept the terms of a commercial or other type of license that requires +some kind of explicit End User License Agreement (EULA). Once you accept +the license, the OpenEmbedded build system can then build and include +the corresponding component in the final BSP image. If the BSP is +available as a pre-built image, you can download the image after +agreeing to the license or EULA. + +You could find that some separately-licensed components that are +essential for normal operation of the system might not have an +unencumbered (or free) substitute. Without these essential components, +the system would be non-functional. Then again, you might find that +other licensed components that are simply 'good-to-have' or purely +elective do have an unencumbered, free replacement component that you +can use rather than agreeing to the separately-licensed component. Even +for components essential to the system, you might find an unencumbered +component that is not identical but will work as a less-capable version +of the licensed version in the BSP recipe. + +For cases where you can substitute a free component and still maintain +the system's functionality, the "DOWNLOADS" selection from the +"SOFTWARE" tab on the :yocto_home:`Yocto Project Website <>` 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 their respective encumbered BSPs. If available, these +substitutions are your simplest and most preferred options. Obviously, +use of these substitutions assumes the resulting functionality meets +system requirements. + +.. note:: + + If however, a non-encumbered version is unavailable or it provides + unsuitable functionality or quality, you can use an encumbered + version. + +A couple different methods exist within the OpenEmbedded build system to +satisfy the licensing requirements for an encumbered BSP. The following +list describes them in order of preference: + +#. *Use the LICENSE_FLAGS Variable to Define the Recipes that Have Commercial or + Other Types of Specially-Licensed Packages:* For each of those recipes, you can + specify a matching license string in a ``local.conf`` variable named + :term:`LICENSE_FLAGS_WHITELIST`. + Specifying the matching license string signifies that you agree to + the license. Thus, the build system can build the corresponding + recipe and include the component in the image. See the + ":ref:`dev-manual/dev-manual-common-tasks:enabling commercially licensed recipes`" + section in the Yocto Project Development Tasks Manual for details on + how to use these variables. + + If you build as you normally would, without specifying any recipes in + the ``LICENSE_FLAGS_WHITELIST``, the build stops and provides you + with the list of recipes that you have tried to include in the image + that need entries in the ``LICENSE_FLAGS_WHITELIST``. Once you enter + the appropriate license flags into the whitelist, restart the build + to continue where it left off. During the build, the prompt will not + appear again since you have satisfied the requirement. + + Once the appropriate license flags are on the white list in the + ``LICENSE_FLAGS_WHITELIST`` variable, you can build the encumbered + image with no change at all to the normal build process. + +#. *Get a Pre-Built Version of the BSP:* You can get this type of BSP by + selecting the "DOWNLOADS" item from the "SOFTWARE" tab on the + :yocto_home:`Yocto Project website <>`. You can download BSP tarballs + that contain proprietary components after agreeing to the licensing + requirements of each of the individually encumbered packages as part + of the download process. Obtaining the BSP this way allows you to + access an encumbered image immediately after agreeing to the + click-through license agreements presented by the website. If you + want to build the image yourself using the recipes contained within + the BSP tarball, you will still need to create an appropriate + ``LICENSE_FLAGS_WHITELIST`` to match the encumbered recipes in the + BSP. + +.. note:: + + Pre-compiled images are bundled with a time-limited kernel that runs + for a predetermined amount of time (10 days) before it forces the + system to reboot. This limitation is meant to discourage direct + redistribution of the image. You must eventually rebuild the image if + you want to remove this restriction. + +Creating a new BSP Layer Using the ``bitbake-layers`` Script +============================================================ + +The ``bitbake-layers create-layer`` script automates creating a BSP +layer. What makes a layer a "BSP layer" is the presence of at least one +machine configuration file. Additionally, a BSP layer usually has a +kernel recipe or an append file that leverages off an existing kernel +recipe. The primary requirement, however, is the machine configuration. + +Use these steps to create a BSP layer: + +- *Create a General Layer:* Use the ``bitbake-layers`` script with the + ``create-layer`` subcommand to create a new general layer. For + instructions on how to create a general layer using the + ``bitbake-layers`` script, see the + ":ref:`dev-manual/dev-manual-common-tasks:creating a general layer using the \`\`bitbake-layers\`\` script`" + section in the Yocto Project Development Tasks Manual. + +- *Create a Layer Configuration File:* Every layer needs a layer + configuration file. This configuration file establishes locations for + the layer's recipes, priorities for the layer, and so forth. You can + find examples of ``layer.conf`` files in the Yocto Project + :yocto_git:`Source Repositories <>`. To get examples of what you need + in your configuration file, locate a layer (e.g. "meta-ti") and + examine the + :yocto_git:`local.conf </cgit/cgit.cgi/meta-ti/tree/conf/layer.conf>` + file. + +- *Create a Machine Configuration File:* Create a + ``conf/machine/bsp_root_name.conf`` file. See + :yocto_git:`meta-yocto-bsp/conf/machine </cgit/cgit.cgi/poky/tree/meta-yocto-bsp/conf/machine>` + for sample ``bsp_root_name.conf`` files. Other samples such as + :yocto_git:`meta-ti </cgit/cgit.cgi/meta-ti/tree/conf/machine>` + and + :yocto_git:`meta-freescale </cgit/cgit.cgi/meta-freescale/tree/conf/machine>` + exist from other vendors that have more specific machine and tuning + examples. + +- *Create a Kernel Recipe:* Create a kernel recipe in + ``recipes-kernel/linux`` by either using a kernel append file or a + new custom kernel recipe file (e.g. ``yocto-linux_4.12.bb``). The BSP + layers mentioned in the previous step also contain different kernel + examples. See the ":ref:`kernel-dev/kernel-dev-common:modifying an existing recipe`" + section in the Yocto Project Linux Kernel Development Manual for + information on how to create a custom kernel. + +The remainder of this section provides a description of the Yocto +Project reference BSP for Beaglebone, which resides in the +:yocto_git:`meta-yocto-bsp </cgit/cgit.cgi/poky/tree/meta-yocto-bsp>` +layer. + +BSP Layer Configuration Example +------------------------------- + +The layer's ``conf`` directory contains the ``layer.conf`` configuration +file. In this example, the ``conf/layer.conf`` is the following: :: + + # We have a conf and classes directory, add to BBPATH + BBPATH .= ":${LAYERDIR}" + + # We have recipes-\* directories, 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 = "&DISTRO_NAME_NO_CAP;" + +The variables used in this file configure the layer. A good way to learn about layer +configuration files is to examine various files for BSP from the +:yocto_git:`Source Repositories <>`. + +For a detailed description of this particular layer configuration file, +see ":ref:`step 3 <dev-manual/dev-manual-common-tasks:creating your own layer>`" +in the discussion that describes how to create layers in the Yocto +Project Development Tasks Manual. + +BSP Machine Configuration Example +--------------------------------- + +As mentioned earlier in this section, the existence of a machine +configuration file is what makes a layer a BSP layer as compared to a +general or kernel layer. + +One or more machine configuration files exist in the +``bsp_layer/conf/machine/`` directory of the layer: :: + + bsp_layer/conf/machine/machine1\.conf`` + bsp_layer/conf/machine/machine2\.conf`` + bsp_layer/conf/machine/machine3\.conf`` + ... more ... + +For example, the machine configuration file for the `BeagleBone and +BeagleBone Black development boards <http://beagleboard.org/bone>`__ is +located in the layer ``poky/meta-yocto-bsp/conf/machine`` and is named +``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/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" + +The variables used to configure the machine define machine-specific properties; for +example, machine-dependent packages, machine tunings, the type of kernel +to build, and U-Boot configurations. + +The following list provides some explanation for the statements found in +the example reference machine configuration file for the BeagleBone +development boards. Realize that much more can be defined as part of a +machine's configuration file. In general, you can learn about related +variables that this example does not have by locating the variables in +the ":ref:`ref-manual/ref-variables:variables glossary`" in the Yocto +Project Reference Manual. + +- :term:`PREFERRED_PROVIDER_virtual/xserver <PREFERRED_PROVIDER>`: + The recipe that provides "virtual/xserver" when more than one + provider is found. In this case, the recipe that provides + "virtual/xserver" is "xserver-xorg", which exists in + ``poky/meta/recipes-graphics/xorg-xserver``. + +- :term:`XSERVER`: The packages that + should be installed to provide an X server and drivers for the + machine. In this example, the "xserver-xorg" and + "xf86-video-modesetting" are installed. + +- :term:`MACHINE_EXTRA_RRECOMMENDS`: + A list of machine-dependent packages not essential for booting the + image. Thus, the build does not fail if the packages do not exist. + However, the packages are required for a fully-featured image. + + .. tip:: + + Many ``MACHINE\*`` variables exist that help you configure a particular piece + of hardware. + +- :term:`EXTRA_IMAGEDEPENDS`: + Recipes to build that do not provide packages for installing into the + root filesystem but building the image depends on the recipes. + Sometimes a recipe is required to build the final image but is not + needed in the root filesystem. In this case, the U-Boot recipe must + be built for the image. + +- :term:`DEFAULTTUNE`: Machines + use tunings to optimize machine, CPU, and application performance. + These features, which are collectively known as "tuning features", + exist in the :term:`OpenEmbedded-Core (OE-Core)` layer (e.g. + ``poky/meta/conf/machine/include``). In this example, the default + tunning file is "cortexa8hf-neon". + + .. note:: + + The include statement that pulls in the + conf/machine/include/tune-cortexa8.inc file provides many tuning + possibilities. + +- :term:`IMAGE_FSTYPES`: The + formats the OpenEmbedded build system uses during the build when + creating the root filesystem. In this example, four types of images + are supported. + +- :term:`EXTRA_IMAGECMD`: + Specifies additional options for image creation commands. In this + example, the "-lnp " option is used when creating the + `JFFS2 <https://en.wikipedia.org/wiki/JFFS2>`__ image. + +- :term:`WKS_FILE`: The location of + the :ref:`Wic kickstart <ref-manual/ref-kickstart:openembedded kickstart (\`\`.wks\`\`) reference>` file used + by the OpenEmbedded build system to create a partitioned image + (image.wic). + +- :term:`IMAGE_INSTALL`: + Specifies packages to install into an image through the + :ref:`image <ref-classes-image>` class. Recipes + use the ``IMAGE_INSTALL`` variable. + +- ``do_image_wic[depends]``: A task that is constructed during the + build. In this example, the task depends on specific tools in order + to create the sysroot when buiding a Wic image. + +- :term:`SERIAL_CONSOLES`: + Defines a serial console (TTY) to enable using getty. In this case, + the baud rate is "115200" and the device name is "ttyO0". + +- :term:`PREFERRED_PROVIDER_virtual/kernel <PREFERRED_PROVIDER>`: + Specifies the recipe that provides "virtual/kernel" when more than + one provider is found. In this case, the recipe that provides + "virtual/kernel" is "linux-yocto", which exists in the layer's + ``recipes-kernel/linux`` directory. + +- :term:`PREFERRED_VERSION_linux-yocto <PREFERRED_VERSION>`: + Defines the version of the recipe used to build the kernel, which is + "5.0" in this case. + +- :term:`KERNEL_IMAGETYPE`: + The type of kernel to build for the device. In this case, the + OpenEmbedded build system creates a "zImage" image type. + +- :term:`KERNEL_DEVICETREE`: + The names of the generated Linux kernel device trees (i.e. the + ``*.dtb``) files. All the device trees for the various BeagleBone + devices are included. + +- :term:`KERNEL_EXTRA_ARGS`: + Additional ``make`` command-line arguments the OpenEmbedded build + system passes on when compiling the kernel. In this example, + ``LOADADDR=${UBOOT_ENTRYPOINT}`` is passed as a command-line argument. + +- :term:`SPL_BINARY`: Defines the + Secondary Program Loader (SPL) binary type. In this case, the SPL + binary is set to "MLO", which stands for Multimedia card LOader. + + The BeagleBone development board requires an SPL to boot and that SPL + file type must be MLO. Consequently, the machine configuration needs + to define ``SPL_BINARY`` as ``MLO``. + + .. note:: + + For more information on how the SPL variables are used, see the u-boot.inc + include file. + +- :term:`UBOOT_* <UBOOT_ENTRYPOINT>`: Defines + various U-Boot configurations needed to build a U-Boot image. In this + example, a U-Boot image is required to boot the BeagleBone device. + See the following variables for more information: + + - :term:`UBOOT_SUFFIX`: + Points to the generated U-Boot extension. + + - :term:`UBOOT_MACHINE`: + Specifies the value passed on the make command line when building + a U-Boot image. + + - :term:`UBOOT_ENTRYPOINT`: + Specifies the entry point for the U-Boot image. + + - :term:`UBOOT_LOADADDRESS`: + Specifies the load address for the U-Boot image. + +- :term:`MACHINE_FEATURES`: + Specifies the list of hardware features the BeagleBone device is + capable of supporting. In this case, the device supports "usbgadget + usbhost vfat alsa". + +- :term:`IMAGE_BOOT_FILES`: + Files installed into the device's boot partition when preparing the + image using the Wic tool with the ``bootimg-partition`` or + ``bootimg-efi`` source plugin. + +BSP Kernel Recipe Example +------------------------- + +The kernel recipe used to build the kernel image for the BeagleBone +device was established in the machine configuration: :: + + PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" + PREFERRED_VERSION_linux-yocto ?= "5.0%" + +The ``meta-yocto-bsp/recipes-kernel/linux`` directory in the layer contains +metadata used to build the kernel. In this case, a kernel append file +(i.e. ``linux-yocto_5.0.bbappend``) is used to override an established +kernel recipe (i.e. ``linux-yocto_5.0.bb``), which is located in +https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-kernel/linux. + +Following is the contents of the append file: :: + + 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" + +This particular append file works for all the machines that are +part of the ``meta-yocto-bsp`` layer. The relevant statements are +appended with the "beaglebone-yocto" string. The OpenEmbedded build +system uses these statements to override similar statements in the +kernel recipe: + +- :term:`KBRANCH`: Identifies the + kernel branch that is validated, patched, and configured during the + build. + +- :term:`KMACHINE`: Identifies the + machine name as known by the kernel, which is sometimes a different + name than what is known by the OpenEmbedded build system. + +- :term:`SRCREV`: Identifies the + revision of the source code used to build the image. + +- :term:`COMPATIBLE_MACHINE`: + A regular expression that resolves to one or more target machines + with which the recipe is compatible. + +- :term:`LINUX_VERSION`: The + Linux version from kernel.org used by the OpenEmbedded build system + to build the kernel image. |