# Qualcomm Linux features Qualcomm Linux features include: - Metadata layers - Recipes and configurations in the metadata layers - Software features to enhance Qualcomm Linux - Tools introduced by Qualcomm - Instructions on how to build Qualcomm Linux images and metadata layers Note Qualcomm Linux is based on the Yocto Kirkstone release. For a comprehensive document on the Yocto Project Kirkstone release, see [Yocto Project documentation](https://docs.yoctoproject.org/4.0.20/singleindex.html). Note When you read this document, the Yocto Project may have released additional Kirkstone LTS point releases. This document refers to the version that was current at the time of this release. If you are new to the Yocto Project, see the build instruction in the [Yocto Project documentation](https://docs.yoctoproject.org/4.0.20/singleindex.html#document-brief-yoctoprojectqs/index). The Qualcomm Linux environment consists of several community-maintained metadata layers that deliver recipes, package groups, images, and configurations. The Qualcomm Linux metadata layers are stacked on the community layers to provide additional software components required for Qualcomm reference devices. ## Qualcomm Linux metadata layers overview The metadata layers introduce the layers that are included in the [Qualcomm manifest](https://github.com/quic-yocto/qcom-manifest). This manifest includes all the layers that are required to reproduce the reference build. The layers maintained by the Yocto Project are introduced in the subsequent sections. Qualcomm maintains the layers specific to Qualcomm reference devices, which depend on the community layers to realize full functionality. The following figure shows the layers included in the Qualcomm Linux release: ![../../_images/qualcomm_linux_metadata_layers.png](data:image/png;base64,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) **Qualcomm Linux metadata layers** Qualcomm Linux metadata layers and descriptions | Metadata layer | Description | | --- | --- | | `meta-qcom-hwe` | Contains recipes that build software components for Qualcomm device support and provides value-added software features applicable to Qualcomm SoCs. | | `meta-qcom-distro` | Provides a reference distribution configuration for Qualcomm products. Image recipes and package groups are defined in this layer. | | `meta-qcom-extras` | Optional metadata layer for registered users. This layer enables source compilation of select components, which are
otherwise present as binary in `meta-qcom-hwe`. | | `meta-qcom-qim-product-sdk` | Provides Qualcomm^®^ Intelligent Multimedia SDK (IM SDK) and AI SDKs based on the GStreamer framework. This includes
a set of GStreamer plug-ins, sample applications for multimedia, and AI use cases. | | `meta-qcom-realtime` | Provides patches and configurations for Linux Kernel to be enabled for real-time operations. | | `meta-qcom` | Contains Qualcomm device support and upstream OSS software components. | | `meta-virtualization`


For more information, see [meta-virtualization](https://git.yoctoproject.org/meta-virtualization). | Contains packages for constructing OpenEmbedded virtualized solutions and virtualization stacks, such as dockerd and Kubernetes. | | `meta-selinux`


For more information, see [meta-selinux](https://git.yoctoproject.org/meta-selinux). | Enables SELinux support. The layer includes reference SEPolicies and
provides necessary tooling. To enable SELinux for Qualcomm Linux, set the
variable `DEFAULT_ENFORCING` to `enforcing` in `meta-qcom-distro/conf/distro/include/qcom-base.inc`. | | `poky/meta`


For more information, see [poky/meta](https://git.yoctoproject.org/poky). | Provides build tools and recipe files that provide various software components needed for an embedded OS distribution. | | `meta-openembedded`


For more information, see [meta-openembedded](https://git.openembedded.org/meta-openembedded). | Collection of layers for the OpenEmbedded build system. | For information about robotics layers, see [QIRP layers](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-265/architecture.html#component-layers-of-the-qirp-sdk). ## Qualcomm Linux metadata layers The following layers represent the Qualcomm BSP metadata: - [meta-qcom](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-section) - [meta-qcom-hwe](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-hwe-section) - [meta-qcom-realtime](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-realtime-section) The `qcom-wayland` reference distribution is defined in the following layer: - [meta-qcom-distro](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-distro-section) The following layer defines the QIM SDK: - [meta-qcom-qim-product-sdk](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-qim-product-sdk-section) The optional BSP is defined by the following metadata layer: - [meta-qcom-extras](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-extras-section) ### Use of BitBake OVERRIDES in Qualcomm Linux metadata layers The Qualcomm Linux metadata layers use the OVERRIDES mechanism of BitBake to implement two distinct variants of BSP builds: `custom` and `base`. When initiating Qualcomm Linux builds, set the `QCOM_SELECTED_BSP` variable to either `custom` or `base`. This variable is defined in `conf/machine/include/qcom-base.inc` and is set to `custom` by default as follows: QCOM_SELECTED_BSP ??= "custom" Copy to clipboard The value set for `QCOM_SELECTED_BSP` translates into two BitBake OVERRIDES. The following is a mapping table of `QCOM_SELECTED_BSP` to the corresponding BitBake OVERRIDE: | `QCOM_SELECTED_BSP` value | Corresponding BitBake OVERRIDE | | --- | --- | | `custom` | `qcom-custom-bsp` | | `base` | `qcom-base-bsp` | The effective value of the BitBake OVERRIDE sets variables selectively, resulting in inclusion of packages in the image. Note To familiarize yourself with BitBake OVERRIDES, see [Conditional syntax (Overrides)](https://docs.yoctoproject.org/bitbake/2.8/bitbake-user-manual/bitbake-user-manual-metadata.html#conditional-syntax-overrides) and [Yocto Project documentation](https://docs.yoctoproject.org/singleindex.html#term-OVERRIDES). To experiment with the `base` variant of the BSP and how to set `QCOM_SELECTED_BSP` at build time, see [Build base image](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html#build-base-image). Note In this release, the `base` BSP is supported for building exclusively with `qcs9100-ride-sx.conf`. The final image composition depends on whether you choose custom or base for the QCOM\_SELECTED\_BSP variable, as described in the following table: | `QCOM_SELECTED_BSP` variant | Description | | --- | --- | | `custom` | The image includes Qualcomm BSP software components such as the
Qualcomm Adreno^™^ graphics libraries. | | `base` | The image incorporates upstream software components such as the
Mesa 3-D graphics library. | To find examples of how these OVERRIDES select the software components to be built, search the `meta-qcom-hwe` codebase using the `qcom-base-bsp` and `qcom-custom-bsp` OVERRIDES. ### meta-qcom The `meta-qcom` metadata layer is hosted at [git.yoctoproject.org](http://git.yoctoproject.org) and provides recipes to build the Qualcomm OSS. The software image is built using the following recipes from the `meta-qcom` layer: | `recipes-devtools/qdl/qdl_git.bb` | Qualcomm downloader (QDL) flashing tool. QDL communicates
with USB devices displaying ID 05c6:9008 to upload a flash
loader and uses this to flash the images. | | --- | --- | | `recipes-support/pd-mapper/pd-mapper_git.bb` | | | `recipes-support/qrtr/qrtr_git.bb` | Qualcomm QRTR applications and library. | | `recipes-support/initrdscripts/initramfs-module-copy-modules_1.0.bb` | `initramfs-framework` module for copying kernel modules from
`initramfs` to `rootfs`. | ### meta-qcom-hwe The `meta-qcom-hwe` BSP metadata layer is available on [GitHub](https://github.com/quic-yocto/meta-qcom-hwe). It provides additional software support for enabling the Qualcomm device. > > > - **BitBake classes** > > > For an introduction to the BitBake classes, > see [Classes](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/classes). > > > > > > > | `classes/qimage_types.bbclass` | Implements `oe_mkvfatfs()` to generate a VFAT image
using the `mkfs.vfat` tool. | > | --- | --- | > | `classes/qprebuilt.bbclass` | Implements logic to use a prebuilt package instead of fetching and
compiling the source. For any recipe inheriting **qprebuilt**,
this class unpacks the binary packed in a tar.gz archive
and provides these binaries to be packaged using a BitBake task. | > | `classes/qmodule.bbclass` | By default, the Qualcomm BSP enforces signing the kernel module by
enabling `CONFIG_MODULE_SIG_FORCE` in the kernel.
However, some out-of-tree modules may not be properly signed.
To avoid module loading issues, `qmodule.bbclass` inspects
all packages providing kernel modules and signs them if they are
not already signed. | > - **Machine configurations** > > > The Qualcomm Linux machine configuration files are available on > [GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/conf/machine). > > > The files located in the `meta-qcom-hwe/conf/machine/include` directory define and > set the required BitBake variables, which can be commonly used by machine > configurations defined by the Qualcomm BSP. The following table provides an > overview of these files: > > > > > > > | File | Description | > | --- | --- | > | `meta-qcom/conf/machine/include/qcom-common.inc` | This file uses the `qcom` OVERRIDE to set SOC\_FAMILY, allowing recipes to
implement changes specific to the Qualcomm BSP. | > | `meta-qcom-hwe/conf/machine/include/qcom-base.inc` | This include file sets the BitBake variables that are commonly
shared by all machine configurations defined in the Qualcomm BSP.
For example, `PREFERRED_PROVIDER` and `IMAGE_FSTYPES`. | > > > > **Machine configuration files for development kits based on QCS6490** > > > Note > > > For Qualcomm Linux 1.2 and future releases, you must use the new machine configuration > files listed in the following table. The previous machine configuration file, `qcm6490.conf`, > from Qualcomm Linux 1.1 has been replaced with the machine configuration files of Qualcomm Linux 1.2. > > > > > > > | Configuration file | Description | > | --- | --- | > | `conf/machine/qcm6490-idp.conf` | This file is for the
integrated development platform (IDP) with QCM6490. | > | `conf/machine/qcs6490-rb3gen2-core-kit.conf` | This file is for the QCS6490-based
Qualcomm^®^ RB3 Gen 2 development kit. | > | `conf/machine/qcs6490-rb3gen2-vision-kit.conf` | This file is for the QCS6490-based
Qualcomm RB3 Gen 2 development kit with low-/high-resolution
CSI cameras. | > | `conf/machine/include/qcom-qcs6490.inc` | This file defines configuration variables that are shared by
all Qualcomm reference devices based on QCS6490. | > > > > **Machine configuration files for development kits based on QCS9075** > > > > > > > | Configuration file | Description | > | --- | --- | > | `conf/machine/qcs9100-ride-sx.conf` | This file is for QCS9075-based
Qualcomm^®^ IQ-9100 Beta Evaluation Kit (EVK). | > | `conf/machine/include/qcom-qcs9100.inc` | This file defines configuration variables that are
shared by all development kits based on QCS9075. | > > > > **Use of OVERRIDES in** `meta-qcom-hwe` > > > The Qualcomm BSP uses BitBake OVERRIDES to define > two different methods for building the BSP. > > > The metadata layer derives `MACHINEOVERRIDES` from `QCOM_SELECTED_BSP` > in the `meta-qcom-hwe/conf/machine/include/qcom-base.inc` file as follows: > > > MACHINEOVERRIDES =. "qcom-${QCOM_SELECTED_BSP}-bsp:" > Copy to clipboard > > > The two MACHINEOVERRIDES in `meta-qcom-hwe` are `qcom-custom-bsp` > and `qcom-base-bsp`. These overrides are used by machine configuration > files, recipes, and other configuration files within the `meta-qcom-hwe` > BSP layer. The configuration files and recipes use these OVERRIDE constructs > to conditionally set variables and append tasks as needed. > > > The use of MACHINEOVERRIDES in recipes and configuration files determines > whether the final image is composed of Qualcomm BSP software components > or upstream components, based on the effective OVERRIDE at build time. > > > For example, PREFERRED\_PROVIDER for `egl`, `libgl`, `libgles1`, > and `libgles2` is set as follows: > > > > > > > | Effective OVERRIDE | PREFERRED\_PROVIDER for `egl`, `libgl`, `libgles1`, `libgles2` | > | --- | --- | > | `qcom-custom-bsp` | `adreno` | > | `qcom-base-bsp` | `mesa` | > > > > In the BitBake code snippet, the OVERRIDES conditionally sets the variables as follows: > > > # Provider for Graphics Library. > # qcom-base-bsp uses 'mesa' as GL provider > GL_PROVIDER ?= "adreno" > GL_PROVIDER:qcom-base-bsp ?= "mesa" > > PREFERRED_PROVIDER_virtual/egl = "${GL_PROVIDER}" > PREFERRED_PROVIDER_virtual/libgl = "${GL_PROVIDER}" > PREFERRED_PROVIDER_virtual/libgles1 = "${GL_PROVIDER}" > PREFERRED_PROVIDER_virtual/libgles2 = "${GL_PROVIDER}" > > PREFERRED_PROVIDER_virtual/egl-native = "mesa-native" > PREFERRED_PROVIDER_virtual/libgl-native = "mesa-native" > PREFERRED_PROVIDER_virtual/libgles1-native = "mesa-native" > PREFERRED_PROVIDER_virtual/libgles2-native = "mesa-native" > Copy to clipboard > > > Note > > > In this release, the `qcom-base-bsp` OVERRIDE is built only for `qcs9100-ride-sx.conf`. > > - **Kernel cmdline** > > > The `meta-qcom-hwe/conf/machine/include/qcom-qcs6490.inc` and `meta-qcom-hwe/conf/machine/include/qcom-qcs9100.inc` include files > use the `KERNEL_CMDLINE_EXTRA` variable to set the kernel command-line parameters as follows: > > > Tab qcom-qcs6490.inc > Tab qcom-qcs9100.inc > > The following snippet is from the `qcom-qcs6490.inc` file: > > > DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage; FZPU','',d)}" > > # Additional Kernel cmdline parameters for performance optimizations > CONSOLE_CMDLINE = "${@oe.utils.conditional('PERFORMANCE_BUILD','1','console=','console=ttyMSM0,115200n8 earlycon',d)}" > > KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1" > Copy to clipboard > > The following snippet is from the `qcom-qcs9100.inc` file: > > > DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage; FZPU','',d)}" > > # Additional Kernel cmdline parameters for performance optimizations > CONSOLE_CMDLINE = "${@oe.utils.conditional('PERFORMANCE_BUILD','1','console=','console=ttyMSM0,115200n8 earlycon',d)}" > > KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1" > Copy to clipboard > - **Include DTB** > > > To ensure that the correct device tree binary (DTB) is included, the > `KERNEL_DEVICETREE` variable is conditionally set using the > OVERRIDES mechanism. This is managed within each individual > machine configuration file in `meta-qcom-hwe/conf/machine`. > > > In the machine configuration file, `KERNEL_DEVICETREE` is set > differently for custom vs. base variant. The following examples provide > information on how the machine configuration file selects a DTB: > > > Tab linux-qcom-base > Tab linux-qcom-custom > > The following code block shows how you can explicitly set > KERNEL\_DEVICETREE for `linux-qcom-base`, which leads to the > base variant using the upstream DTB: > > > KERNEL_DEVICETREE:pn-linux-qcom-base = " \ > qcom/qcs6490-rb3gen2.dtb \ > " > Copy to clipboard > > The following code block shows how `KERNEL_DEVICETREE` is > set otherwise: > > > KERNEL_DEVICETREE = " \ > qcom/qcs6490-addons-rb3gen2.dtb \ > qcom/qcs5430-fp1-addons-rb3gen2.dtb \ > qcom/qcs5430-fp2-addons-rb3gen2.dtb \ > " > Copy to clipboard > - **Include additional DTBOs** > > > To include an additional device-tree overlay (DTBO) to be overlaid > on the kernel device-tree, use the `KERNEL_TECH_DTBOS` variable > to list the DTBO names. > > > Note > > > The DTBO overlay is supported only for the `custom` variant. > > > The following example from `qcs6490-rb3gen2-core-kit.conf` shows > how DTBOs are used. > > > KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \ > qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \ > qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \ > qcm6490-video.dtbo \ > " > KERNEL_TECH_DTBOS[qcs5430-fp1-addons-rb3gen2] = " \ > qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \ > qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \ > qcm6490-display-rb3.dtbo qcm6490-video.dtbo \ > " > KERNEL_TECH_DTBOS[qcs5430-fp2-addons-rb3gen2] = " \ > qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \ > qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \ > qcm6490-display-rb3.dtbo qcm6490-video.dtbo \ > " > > KERNEL_TECH_DTBO_PROVIDERS = "\ > btdevicetree \ > cameradtb \ > displaydevicetree \ > graphicsdevicetree \ > videodtb \ > wlan-devicetree \ > " > Copy to clipboard > - **Firmware recipes** > > > Qualcomm Linux firmware recipe files are available on > [GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/recipes-firmware). > When the Qualcomm Linux source code is synced, the firmware recipes > are available in the following directory: > `/layers/meta-qcom-hwe/recipes-firmware/firmware`. > > - **Critical boot binaries** > > > Critical boot firmware images are required to boot the kernel on the > device. The following firmware recipes provide the hardware SoC-specific > boot firmware: > > > > > > > | `firmware-qcom-bootbins_1.0.bb` | Handles fetch, unpack, and deploy for critical
boot firmware binaries for compatible targets.
The boot firmwares required for QCS6490 and QCS9075
based machines are provided by the `QCM6490_bootbinaries.zip`
and `QCS9100_bootbinaries.zip` files. | > | --- | --- | > > > > After the build is generated, the firmware binaries in these .zip files > are available for flashing in the following directory: > > > `/build-qcom-wayland/tmp-glibc/deploy/images///` > - **Subsystem firmware binaries** > > > Qualcomm Linux includes firmware binaries that are loaded and run on > the corresponding subsystems. As the Qualcomm hardware SoC bootup, individual > subsystems execute the firmware as they come out of reset: > > > > > > > | `firmware-qcom-hlosfw_1.0.bb` | Handles fetch, unpack, and install for subsystem
firmware binaries, such as aDSP, cDSP, modem, and WLAN.
The firmware files for QCM6490- and QCS9075-based machines
are packed in `QCM6490_MSL.zip` and `QCS9100_HSP.zip` files. | > | --- | --- | > > > > The `firmware-qcom-hlosfw_1.0.bb` recipe does the following: > > > > > > > > > 1. Fetches the subsystem firmware binaries from the remote server based on SRC\_URI. > > 2. Unpacks the .zip file. > > 3. Installs the firmware in `rootfs`. > - **DSP libraries** > > > User space utilities refer to the DSP libraries, which must > be available in the `rootfs` image. > The following firmware recipes provide the hardware SoC-specific DSP libraries: > > > > > > > | `firmware-qcom-dspso_1.0.bb` | Handles fetch, unpack, and install for DSP libraries.
The libraries for QCS6490- and QCS9075-based machines are packed
in `QCM6490_dspso.zip` and `QCS9100_dspso.zip` files. | > | --- | --- | > > > > The `firmware-qcom-dspso_1.0.bb` recipe does the following: > > > > > > > > > 1. Fetches the DSP libraries from the remote server based on SRC\_URI. > > 2. Unpacks the .zip file. > > 3. Installs the DSP libraries in `rootfs`. > - **Installation of boot, subsystem, and dspso** > > > When Qualcomm Linux is built, the build system uses the firmware > recipes to deploy the prebuilt firmware based on the `MACHINE_EXTRA_RDEPENDS` > configuration, which is set in the machine configuration file. > For example, in `qcom-qcs6490.inc`, see the inclusion of > `packagegroup-firmware-qcm6490` in the `MACHINE_EXTRA_RDEPENDS` variable: > > > MACHINE_EXTRA_RDEPENDS += " \ > packagegroup-firmware-qcm6490 \ > " > Copy to clipboard > > > Note > > > The `packagegroup-firmware-qcm6490` recipe is present in > the `/layers/meta-qcom-hwe/recipes-firmware/packagegroups/` directory. > It groups the firmware recipes to generate the image. > > > When Qualcomm Linux is built, based on the configuration in the machine > configuration and the package group recipe file, the respective firmware > recipes from the `/layers/meta-qcom-hwe/recipes-firmware/firmware` > directory are built. > - **Kernel recipes** > > > The Linux kernel recipes used by Qualcomm Linux are in > `/layers/meta-qcom-hwe/recipes-kernel/linux`. > > > Qualcomm Linux supports the long-term support (LTS) Linux kernel v6.6.x. > In the `meta-qcom-hwe` layer, there are two distinct kernel recipes: > > - The `linux-qcom-custom_6.6.bb` recipe supports the custom BSP and fetches > the kernel sources from `qcom.git` hosted at `git.codelinaro.org`. > - The `linux-qcom-base_6.6.bb` recipe supports the base BSP and retrieves > kernel sources from `linux.git` hosted at `git.kernel.org`. > > > > Tab linux-qcom-custom\_6.6.bb > Tab linux-qcom-base\_6.6.bb > > inherit kernel > > COMPATIBLE_MACHINE = "(qcom)" > > SRC_URI = "git://git.codelinaro.org/clo/la/kernel/qcom.git;protocol=https;rev=350dfd604d2ffbe0cac99bf3459b49114aad11f4;branch=kernel.qclinux.1.0.r1-rel \ > ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux.cfg', '', d)} \ > ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux_debug.cfg', '', d)} \ > " > > S = "${WORKDIR}/kernel" > > KERNEL_CONFIG ??= "qcom_defconfig" > Copy to clipboard > > inherit kernel > > COMPATIBLE_MACHINE = "(qcom)" > > SRC_URI = " git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git;protocol=https;branch=linux-6.6.y \ > file://qcom.cfg \ > " > # Apply qcom patches > require ${BPN}-${PV}/configs.inc > require ${BPN}-${PV}/devicetree.inc > require ${BPN}-${PV}/drivers.inc > require ${BPN}-${PV}/dt-bindings.inc > require ${BPN}-${PV}/tools.inc > > KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom.cfg" > > S = "${WORKDIR}/git" > Copy to clipboard > > > The machine configuration files use OVERRIDES to select the appropriate > kernel recipe variant. For example, the `qcom-qcs9100.inc` file chooses > `linux-qcom-base` when you select the base variant. If you > select the custom variant, the kernel is built using the `linux-qcom-custom` > recipe as shown in the following snippet: > > > PREFERRED_PROVIDER_virtual/kernel ?= "linux-qcom-custom" > PREFERRED_PROVIDER_virtual/kernel:qcom-base-bsp ?= "linux-qcom-base" > Copy to clipboard > > > **Kernel configuration** > > > The Qualcomm Linux kernel recipe uses a different set of kernel > configuration and fragments for the `custom` and `base` variants. > > > > > > > | Variant | Configuration and fragments files | > | --- | --- | > | `base` | `defconfig`, `qcom.cfg` | > | `custom` | `qcom_defconfig`, `qcom_addons.config`, `selinux.cfg`,
`qcom_debug.config`, `qcom_addons_debug.config`, `selinux_debug.cfg` | > > > > The description of `defconfig` and `fragments` used for the `custom` > variant are provided in the following table: > > > > > > > | Kernel configuration fragments | Description | > | --- | --- | > | `/arch/arm64/configs/qcom_defconfig` | Base configuration that is aligned to product/performance needs | > | `/arch/arm64/configs/qcom_debug.config` | Debug configuration fragment | > | `/arch/arm64/configs/qcom_addons.config` | Additional Qualcomm downstream additions on top of upstream aligned base | > | `/arch/arm64/configs/qcom_addons_debug.config` | Qualcomm downstream debug enablement | > > > > The Qualcomm Linux `custom` variant recipe `linux-qcom-custom_6.6.bb` > further supports the `perf` and `debug` variations. > The default method to build the kernel using `linux-qcom-custom_6.6.bb` > is `perf`. > > > > > > > | Build variant | Defconfig/config fragments | > | --- | --- | > | `Perf` |

  • arch/arm64/configs/qcom_defconfig


  • arch/arm64/configs/qcom_addons.config


| > | `Debug` |

  • arch/arm64/configs/qcom_defconfig


  • arch/arm64/configs/qcom_debug.config


  • arch/arm64/configs/qcom_addons.config


  • arch/arm64/configs/qcom_addons_debug.config


| > > > > To build the debug kernel image with `linux-qcom-custom_6.6.bb`, > set DEBUG\_BUILD to 1 in the shell. > > > This selection is effective in the following code: > > > KERNEL_CONFIG ??= "qcom_defconfig" > > KERNEL_CONFIG_FRAGMENTS:append = " ${S}/arch/arm64/configs/qcom_addons.config" > KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_debug.config', '', d)}" > KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_addons_debug.config', '', d)}" > > # Enable selinux support > SELINUX_CFG = "${@oe.utils.vartrue('DEBUG_BUILD', 'selinux_debug.cfg', 'selinux.cfg', d)}" > KERNEL_CONFIG_FRAGMENTS:append = " ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', '${WORKDIR}/${SELINUX_CFG}', '', d)}" > Copy to clipboard > > > To autoload kernel modules for Qualcomm platforms, update the > KERNEL\_MODULE\_AUTOLOAD variable in the Qualcomm Linux kernel recipe. > For example, the CoreSight and STM modules are autoloaded as follows: > > > KERNEL_MODULE_AUTOLOAD += "coresight coresight-tmc coresight-funnel" > KERNEL_MODULE_AUTOLOAD += "coresight-replicator coresight-etm4x coresight-stm" > KERNEL_MODULE_AUTOLOAD += "coresight-cti coresight-tpdm coresight-tpda coresight-dummy" > KERNEL_MODULE_AUTOLOAD += "coresight-remote-etm coresight-tgu" > KERNEL_MODULE_AUTOLOAD += "stm_core stm_p_ost stm_console stm_heartbeat stm_ftrace " > Copy to clipboard > - **Licenses** > > > The licenses for recipes in `meta-qcom-hwe` are listed at > `/meta-qcom-hwe/files/common-licenses`. > > > common-licenses/ > ├── BSD-3-Clause-Clear > ├── GPLv2.0-with-linux-syscall-note > └── Qualcomm-Technologies-Inc.-Proprietary > Copy to clipboard > > > Yocto can automatically create SPDX SBOM documents based on image creation. > To enable this feature, inherit the `create-spdx` class in `local.conf` as follows: > > > INHERIT += "create-spdx" > Copy to clipboard > > > After the class is inherited, you can rebuild the image with > the BitBake command: > > > bitbake qcom-multimedia-image > Copy to clipboard > > > The SPDX output can be found in the following directories: > > - For each recipe, the generated files are available in > the `tmp/deploy/spdx/` directory. > - The top-level SPDX output file is in the `tmp/deploy/images/MACHINE/-.spdx.json` directory. ### meta-qcom-distro This layer provides a reference distribution configuration for Qualcomm products. Image recipes and package groups are defined in this layer. - **BitBake classes** The following table provides an introduction to the BitBake classes, which are available at: [Classes](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/classes). Qualcomm Linux supports both SSH and UART serial shell for device access. You can choose either SSH or UART to access the device. You can also use ADB to debug issues when IP interfaces are down or to transfer large files. | `image-adbd.bbclass` | The `image-adbd.bbclass` class in `meta-qti-distro` installs adbd
in the image. The adbd daemon remains disabled unless
`IMAGE_FEATURES` contains the `enable-adbd` feature.
You can disable adbd by manually removing `/var/usb-debugging-enabled`
from `rootfs`. | | --- | --- | | `image-qcom-deploy.bbclass` | Deploys the image files available in
`/build-/tmp-glibc/deploy/images//`.
The generated images are deployed in the `` subdirectory. | - **Distro configuration** The following table provides an introduction to the distro configurations, which are available on [GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/conf/distro). | `conf/distro/qcom-wayland.conf` | This distro configuration file defines the `qcom-wayland` distro.
You can use this file in the following example command.



>
>
> MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland QCOM_SELECTED_BSP=base source setup-environment
> Copy to clipboard



The `meta-qcom-distro/conf/distro/include/qcom-base.inc` configuration
defines common DISTRO\_FEATURES and adds the following features:



>
>
>

    >
  • wayland


  • >
  • vulkan


  • >
  • opengl


  • >




The Yocto Project documentation defines these distro features at
[Distro features](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features). | | --- | --- | | `conf/distro/include/qcom-base.inc` | The INIT\_MANAGER is set to `systemd`.
For Yocto Project documentation on INIT\_MANAGER,
see [INIT_MANAGER](https://docs.yoctoproject.org/4.0.20/singleindex.html#term-INIT_MANAGER).
Other DISTRO\_FEATURES enabled are:


DISTRO_FEATURES:append = ” pam overlayfs acl xattr selinux ptest security virtualization”
Copy to clipboard


To understand the purpose of these DISTRO\_FEATURES, see
[Distro features](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features).


This file selects `systemd` as INIT\_MANAGER and `udev` as the dev
manager. | | `conf/distro/include/qcom-security_flags.inc` | This file includes the security flags as defined in
[security flags](https://git.yoctoproject.org/poky/tree/meta/conf/distro/include/security_flags.inc?h=kirkstone). | - **Package groups** Package groups are defined in `meta-qcom-hwe` and `meta-qcom-distro`. These package groups help you understand the features defined by the Qualcomm BSP. | `packagegroup-qcom.bb` | Package group that contains all the basic packages | | --- | --- | | `packagegroup-qcom-multimedia.bb` | Package group that contains packages to enable multimedia support:



>
>
>

    >
  • packagegroup-container


  • >
  • packagegroup-qcom-audio


  • >
  • packagegroup-qcom-bluetooth


  • >
  • packagegroup-qcom-camera


  • >
  • packagegroup-qcom-display


  • >
  • packagegroup-qcom-fastcv


  • >
  • packagegroup-qcom-graphics


  • >
  • packagegroup-qcom-k8s


  • >
  • packagegroup-qcom-opencv


  • >
  • packagegroup-qcom-sensors


  • >
  • packagegroup-qcom-video


  • >
  • python3-docker-compose


  • >
  • camera-server


  • >
| | `packagegroup-qcom-test-pkgs.bb` | Package group that contains test packages | - **Image recipes** The `meta-qcom-distro` Qualcomm Linux metadata layer defines image recipes, which are available on [GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/recipes-products/images). The following table lists various images, their `IMAGE_FEATURES`, and the functions that the images serve: | Image recipe | Description of the image | | --- | --- | | `qcom-minimal-image.bb` | Defines a small `rootfs` to boot to the shell.


The `IMAGE_FEATURES` enabled are as follows:


IMAGE_FEATURES += "splash tools-debug debug-tweaks enable-adbd read-only-rootfs"
Copy to clipboard


For more information on `IMAGE_FEATURES`, see
[Image features](https://docs.yoctoproject.org/4.0.20/singleindex.html#image-features). | | `qcom-console-image.bb` | Extends `qcom-minimal-image` by adding more packages
and enabling more `IMAGE_FEATURES`:


IMAGE_FEATURES += “package-management ssh-server-openssh”
Copy to clipboard | | `qcom-multimedia-image.bb` | Requires DISTRO\_FEATURE Wayland and it includes
all the multimedia packages in `rootfs`. | | `qcom-multimedia-test-image.bb` | Includes test packages in `rootfs` to test `qcom-multimedia-image`. | | `qcom-multimedia-crossesdk-image.bb` | Generates eSDK for `qcom-multimedia-image`. | | `qcom-guestvm-image.bb` | A minimal kernel-based virtual machine (KVM) image with boot to shell support. | - **QDL flashing tool** QDL is a flashing tool that communicates with the USB devices of ID `05c6:9008` to upload a flash loader to the device. The flash loader flashes the images to universal flash storage (UFS) or embedded multimedia card (eMMC) built into the device. There are two ways to set up the QDL tool on a host machine: - **The QDL tool is built by default in your Qualcomm Linux workspace** For convenience, the QDL tool is integrated in the build workflow. The QDL recipe is available in `/meta-qcom/recipes-devtools/qdl/qdl_git.bb`. This recipe fetches and compiles the QDL tool after which you can BitBake the recipe. The `image-qcom-deploy.bbclass` integrates the QDL tool by default, use this class to ensure that the QDL is generated while building the image: DEPENDS:append = " \ python3-native \ qdl-native \ " Copy to clipboard When the image is built, the QDL binary is generated in the `/build-/tmp-glibc/deploy/image//` directory. This QDL binary is for the host architecture. - **Build the QDL tool as a standalone project** Clone the source project, install dev dependencies, and compile QDL. On the host machine, run the following command: sudo apt-get install git libxml2-dev libusb-1.0-0-dev pkg-config git clone --depth 1 --branch master https://github.com/linux-msm/qdl cd qdl make Copy to clipboard The QDL compiled in this way can be copied and moved around on your host machine as it links to the dynamic linker at `/lib64/ld-linux-x86-64.so.2`, which is native to the host machine you are using. **Prerequisites to run QDL** - A one-time prerequisite on the host machine is required to use the QDL flasher. To ensure that the host machine properly enumerates the Qualcomm device for QDL flashing, do the following: 1. Change the directory to `/etc/udev/rules.d`. 2. Create a file named `51-qcom-usb.rules` in this directory. 3. Add the following line in the `51-qcom-usb.rules` file: SUBSYSTEMS=="usb", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="9008", MODE="0666", GROUP="plugdev" Copy to clipboard - Verify if the host machine is running `ModemManager`. Note Verify this every time you use QDL. Some Linux distributions come with `ModemManager`, a tool for configuring mobile broadband. When the Qualcomm hardware SoC-based device is connected in the USB mode, it is identified as a Qualcomm modem and `ModemManager` tries to configure the device. The `ModemManager` interferes with QDL flashing. Hence, if you have `ModemManager` running, you must disable it before connecting your test device. You can stop `ModemManager` on a Linux distribution with `systemd` by using `systemctl`. To determine how to manage `ModemManager` with QDL flashing, see [QDL and ModemManager](https://docs.qualcomm.com/doc/80-70015-27/topic/debug.html#qdl-and-modemmanager). **Flash using QDL** To run the QDL tool, use the following generic command: qdl [ ] Copy to clipboard This sample generic input shows that the QDL tool expects three types of input files. All these input files are generated under the `/build-/tmp-glibc/deploy/image//` directory. When the image recipe completes successfully, you must perform the steps to flash the device. If you want to use the QDL generated as part of the build, change the directory to `/build-qcom-wayland/tmp-glibc/deploy/image//`, as the Qualcomm Linux workflow generates and deploys QDL at this path. For example: cd /build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/ Copy to clipboard Run the flash command as follows: ./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml Copy to clipboard **Do not copy QDL to other locations** Do not copy or move the QDL binary at `/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/`, which is built as part of the Qualcomm Linux build workflow. Due to its dependencies, ensure that you use it from its current location. To understand these dependencies, run the following command: file qdl Copy to clipboard The output is as follows: qdl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter <workspace>/build-qcom-wayland/tmp-glibc/sysroots-uninative/x86\_64-linux/lib/ld\u0002linux-x86-64.so.2, BuildID[sha1]=430c23d51190ef6c225586c5d63d2a7c9cd50430, for GNU/Linux 3.2.0, stripped This output shows that there is a dependency on `/build-test-distro/tmp-glibc/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2`, which is due to the way Qualcomm Linux builds QDL. To run QDL independently, see [standalone QDL](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#qdl-as-standalone). - **QDL advanced options** QDL supports advanced options that are passed as optional flags to QDL from the command line. These advanced options are described in the following table: | Option | Description | | --- | --- | | `--debug` | Prints debug logs while flashing the image. | | `--storage ` | Use this to define the storage type. If this option is not provided, QDL detects the storage type. | | `--finalize-provisioning` | Irreversible one-time provisioning (OTP) for UFS storage. Use the following safety mechanisms to prevent unintentional device locking:

  • Unless you intend to lock your device, set bConfigDescrLock = 0 in your XML and do not use the command-line parameter --finalize-provisioning.


  • If you want to perform OTP, ensure that your XML includes the bConfigDescrLock = 1 property and provide the command-line parameter --finalize-provisioning.




Note


If there is a mismatch between the command-line parameter and XML, provisioning is not performed. | | `--include` | Points to the path where the images are present. By default, it is NULL, that is, images are present at the same location. This is useful
when QDL is built as a standalone, `--include` is used to point to the path where images are present. | Example usage with the flags: /qdl --storage ufs --include /qcm6490_images/qcom-multimedia-image /qcm6490_images/qcom-multimedia-image/prog_firehose_ddr.elf /qcm6490_images/qcom-multimedia-image/rawprogram*.xml /qcm6490_images/qcom-multimedia-image/patch*.xml Copy to clipboard ### Build Qualcomm Linux The `meta-qcom`, `meta-qcom-hwe`, and `meta-qcom-distro` sections described the machine configurations, distro configurations, image recipes, and OVERRIDES. The [table](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#qcom-selected-bsp) lists the supported values that can be set for `MACHINE`, `DISTRO`, and `QCOM_SELECTED_BSP`. To setup the environment, use these values and run the following command: MACHINE= DISTRO= QCOM_SELECTED_BSP= source setup-environment Copy to clipboard The following table lists the possible image recipes to select and generate an image as per the selected `MACHINE`, `DISTRO`, and `QCOM_SELECTED_BSP`, run the following command: bitbake Copy to clipboard | `QCOM_SELECTED_BSP`

(selected by you) | Effective BitBake OVERRIDE

(derived from `QCOM_SELECTED_BSP`) | MACHINE configuration

(selected by you) | Reference DISTRO configuration

(selected by you) | Image recipe

(selected by you) | | --- | --- | --- | --- | --- | | `custom` | `qcom-custom-bsp` |

  • qcs6490-rb3gen2-core-kit.conf


  • qcs6490-rb3gen2-vision-kit.conf


  • qcs6490-rb3gen2-vision-kit.conf


|

  • qcom-wayland


  • qcom-robotics-ros2-humble


|

  • qcom-minimal-image


  • qcom-console-image


  • qcom-multimedia-image


  • qcom-multimedia-test-image


| | `base` | `qcom-base-bsp` |

  • qcs6490-rb3gen2-core-kit.conf


  • qcs6490-rb3gen2-vision-kit.conf


  • qcs6490-rb3gen2-vision-kit.conf


|

  • qcom-wayland


  • qcom-robotics-ros2-humble


|

  • qcom-minimal-image


  • qcom-console-image


  • qcom-multimedia-image


  • qcom-multimedia-test-image


| | | | | | | To learn more about the supported combinations for building Qualcomm Linux, see [Qualcomm Linux Release Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240929204440). For detailed build instructions, see [GitHub workflow for unregistered users](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html). ### meta-qcom-realtime The `meta-qcom-realtime` metadata layer is available on [GitHub](https://github.com/quic-yocto/meta-qcom-realtime). This layer provides additional software support for building a real-time kernel for Qualcomm devices. - **Kernel recipes** Qualcomm Linux supports the LTS Linux kernel v6.6.x and real-time extensions. It is maintained through the `linux-qcom-custom-rt_6.6.bb` and `linux-qcom-base-rt_6.6.bb` Yocto recipes at `recipes-kernel/linux` under the `meta-qcom-realtime` layer. The pending pre-empt RT patches can be found at [realtime](https://wiki.linuxfoundation.org/realtime/start). These patches are fetched and applied on top of the `linux-qcom-custom-rt_6.6.bb`, which is publicly hosted at [Kernel](https://git.codelinaro.org/clo/la/kernel/qcom.git). To compile a real-time kernel for Qualcomm machines: > > > - If you chose the `custom` OVERRIDE, `conf/layer.conf` selects `linux-qcom-custom-rt`. > - If you chose the `base` OVERRIDE, `conf/layer.conf` selects `linux-qcom-base-rt`. **Kernel configuration** Both recipes append the `qcom_rt.cfg` fragment as follows: KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg" Copy to clipboard - **Enable** `meta-qcom-realtime` **in build** To include `meta-qcom-realtime` in the build, export the `meta-qcom-realtime` layer to EXTRALAYERS in `bblayers.conf`, as described in the following steps: 1. Source the environment. The following is an example to source the environment for the QCS6490-based machine and the `qcom-wayland` distro: MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland source setup-environment Copy to clipboard 2. Open the `build-qcom-wayland/conf/bblayers.conf` file and update the EXTRALAYERS variable as follows: EXTRALAYERS ?= " \ ${WORKSPACE}/layers/meta-qcom-realtime \ " Copy to clipboard 3. Run the build command to rebuild with `meta-qcom-realtime` as follows: bitbake qcom-multimedia-image Copy to clipboard ### meta-qcom-extras This layer is an optional metadata layer for registered users. This layer enables source compilation of select components, which are otherwise present as binary in `meta-qcom-hwe`. If you are entitled to receive this metadata layer, you can use the clone steps shared in the [Qualcomm Linux Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/build_addn_info.html). - **Firmware recipes** Firmware recipes in the `meta-qcom-extras` layer integrate the firmware .zip file that is generated on compiling other subsystems. | |
├── recipes-firmware
| └── firmware
| ├── firmware-qcom-bootbins_1.0.bbappend
| ├── firmware-qcom-dspso_1.0.bbappend
| └── firmware-qcom-hlosfw_1.0.bb
└── packagegroups
└── packagegroup-firmware-qcm6490.bb
Copy to clipboard | The recipes in `meta-qcom-extras` override the recipes in `meta-qcom-hwe`.
The `meta-qcom-hwe` layer uses pre-built firmware binaries by default, while
the `meta-qcom-extras` layer builds the firmware from Qualcomm-proprietary repositories.


The `meta-qcom-extras` layer ignores the pre-built binaries from the
.zip files. These recipes instead search for user-provided .zip files set
in FWZIP\_PATH as follows:



>
>
>

    >
  • firmware-qcom-bootbins_1.0.bbappend: Searches the FWZIP_PATH variable for QCM6490_bootbinaries.zip


  • >
  • firmware-qcom-hlosfw_1.0.bbappend: Searches the FWZIP_PATH variable for QCM6490_fw.zip


  • >
  • firmware-qcom-dspso_1.0.bbappend: Searches the FWZIP_PATH variable for QCM6490_dspso.zip


  • >
| | --- | --- | ### meta-qcom-qim-product-sdk - **BitBake classes** The following table lists the BitBake classes defined in the `meta-qcom-qim-product-sdk` metadata layer: | BitBake class | Description | | --- | --- | | `qim-prod-sdk-pkg.bbclass` |

  • Provides a packaging task to pack the Qualcomm Intelligent Multimedia Product (QIMP) SDK artifacts
    into an archive. It is invoked by the qim-product-sdk recipe.


  • The easy-to-install artifact archives are available in the
    <workspace>/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts
    directory after the recipe build is complete.


| | `qimsdk-pkg.bbclass` |

  • Provides a task to package the Qualcomm Multimedia SDK packages into an
    archive along with an easy-to-use install script. The archives are
    generated with packages to develop, deploy, and debug separately.


  • The easy-to-install artifact archives are available in the
    <workspace>/build-qcom-wayland/tmp-glibc/deploy/qimsdk_artifacts directory.


  • Invoked by the qim-sdk recipe during the build.


| | `tflitesdk-pkg.bbclass` |

  • Provides a packaging task to pack the TensorFlow Lite SDK artifacts into several
    archives to develop, deploy, and debug. It is invoked by the
    tflite-sdk recipe during the build.


  • The easy-to-install artifact archives are available in the
    <workspace>/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts
    directory after the recipe build is complete.


| - **Distro configuration** | `layer.conf` | Configures the project layers with the following information:



>
>
>

    >
  • Recipe file path information


  • >
  • Supported Yocto version


  • >
  • Supported Qualcomm® Hexagon Processor version


  • >
  • Supported Qualcomm® Neural Processing SDK version


  • >
  • Supported Qualcomm Neural Network (QNN) SDK version


  • >
| | --- | --- | - **Image recipes** | Recipe | Description | | --- | --- | | `recipes-gst` | Consists of the upstream GStreamer recipe changes (`.bbapend`) along with Qualcomm recipes:



>
>
>

    >
  • gstreamer1.0-plugins-good_1.20%.bbappend


  • >
  • gstreamer1.0-plugins-qcom-oss-base.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-batch.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-metamux.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mldemux.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlmeta.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlmuxer.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlqnn.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlsnpe.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mltflite.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvclassification.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvconverter.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvdetection.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvpose.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvsegmentation.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-overlay.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-qmmfsrc.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-socket.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-tools.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-vcomposer.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-vsplit.bb


  • >
  • gstreamer1.0-plugins-qcom-oss-vtransform.bb


  • >
  • gstreamer1.0-qcom-oss-sample-apps.bb


  • >
| | `recipes-qcom-ml` | Consists of two recipes:



>
>
>

    >
  • qnn.bb: Used to package QNN SDK


  • >
  • snpe.bb: Used to package Qualcomm Neural Processing SDK


  • >
| | `recipes-qim-product-sdk` | Recipe to install QIM product SDK that has QIM, Qualcomm Neural Processing, QNN, and TensorFlow Lite SDKs | | `recipes-tensorflow-lite` | TensorFlow Lite recipes build and install TensorFlow Lite for the following versions:



>
>
>

    >
  • 2.12.1, 2.13.1, 2.14.1, and 2.15.0


  • >
  • Default version: 2.15.0


  • >
| - **Package groups** | Package group | Description | | --- | --- | | `packagegroup-qcom-gstrecipes-gst` | Package group to enable upstream basic GStreamer along with Qualcomm plug-ins:



>
>
>

    >
  • gstreamer1.0-plugins-qcom-oss-base


  • >
  • gstreamer1.0-plugins-qcom-oss-tools


  • >
  • gstreamer1.0-plugins-qcom-oss-batch


  • >
  • gstreamer1.0-plugins-qcom-oss-metamux


  • >
  • gstreamer1.0-plugins-qcom-oss-mldemux


  • >
  • gstreamer1.0-plugins-qcom-oss-mlmeta


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvconverter


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvclassification


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvdetection


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvpose


  • >
  • gstreamer1.0-plugins-qcom-oss-mlvsegmentation


  • >
  • gstreamer1.0-plugins-qcom-oss-overlay


  • >
  • gstreamer1.0-plugins-qcom-oss-qmmfsrc


  • >
  • gstreamer1.0-plugins-qcom-oss-socket


  • >
  • gstreamer1.0-plugins-qcom-oss-vcomposer


  • >
  • gstreamer1.0-plugins-qcom-oss-vsplit


  • >
  • gstreamer1.0-plugins-qcom-oss-vtransform


  • >
  • gstreamer1.0-qcom-oss-sample-apps


  • >
  • gstreamer1.0-plugins-qcom-oss-mlsnpe


  • >
  • gstreamer1.0-plugins-qcom-oss-mlqnn


  • >
  • gstreamer1.0-plugins-qcom-oss-mltflite


  • >




It also packs the upstream GStreamer packages:



>
>
>

    >
  • cairo


  • >
  • gdk-pixbuf


  • >
  • liba52


  • >
  • libdaemon


  • >
  • libgudev


  • >
  • lame


  • >
  • libpsl


  • >
  • librsvg


  • >
  • libsoup-2.4


  • >
  • libtheora


  • >
  • libwebp


  • >
  • mpg123


  • >
  • orc


  • >
  • sbc


  • >
  • speex


  • >
  • taglib


  • >
| | `packagegroup-qcom-gst-basic` | Package group to enable upstream GStreamer:



>
>
>

    >
  • gstreamer1.0


  • >
  • gstreamer1.0-plugins-base


  • >
  • gstreamer1.0-plugins-good


  • >
  • gstreamer1.0-plugins-bad


  • >
  • gstreamer1.0-rtsp-server


  • >
| | `packagegroup-qcom-qim-product` | Package group to pack the following packages along with an install script:



>
>
>

    >
  • packagegroup-qcom-gst


  • >
  • packagegroup-qcom-ml


  • >
  • install.sh


  • >
| | `packagegroup-qcom-ml` | Package group to pack the Qualcomm ML framework:



>
>
>

    >
  • tensorflow-lite


  • >
  • qnn


  • >
  • snpe


  • >
  • libgomp-dev


  • >
| ## Qualcomm Linux software components This section covers key software components like overlay file systems, initialization scripts, debugging tools, systemd-boot for boot management, partitioning tools, and support for containerization and Kubernetes. It also describes features, such as logging and secondary virtual machines. ## File system overlays Qualcomm Linux uses an overlay file system to create overlays on specific mount points. It is recommended to have a read-only rootfs, but many applications may need read-write access to some parts of the file system. This is achieved using `overlayfs` bbclass while keeping the base rootfs read-only. The `overlayfs-qcom-paths` recipe creates `/var`, `/etc`, and `/opt` as overlay mount points and it inherits the `overlayfs` bbclass. In the recipe, the `overlayfs_mount_point` variable is defined as `mnt-overlay`, which implies that the `mnt-overlay.mount` systemd unit is defined in the BSP and it is installed into the image. At bootup, the `mnt-overlay.mount` systemd unit mounts the `/dev/disk/by-partlabel/overlay` disk partition to all the mount points. The `overlayfs_writable_paths` variable specifies the writable paths used at the runtime, that is, `/opt`, `/etc`, and `/var`. To include `overlayfs` support, it must be added to the DISTRO\_FEATURES. - Overlay for `/var` To see the `/var` overlayfs mount point, run the following mount command: sh-5.1# mount | grep var overlay on /var type overlay (rw,relatime,seclabel,lowerdir=/var,upperdir=/mnt/overlay/upper/var,workdir=/mnt/overlay/workdir/var) Copy to clipboard - Overlay for `/etc` sh-5.1# mount | grep etc /dev/sda11 on /mnt/overlay type ext4 (rw,relatime,rootcontext=system_u:object_r:etc_t:s0,seclabel,stripe=128,inlinecrypt) overlay on /etc type overlay (rw,relatime,seclabel,lowerdir=/etc,upperdir=/mnt/overlay/upper/etc,workdir=/mnt/overlay/workdir/etc) Copy to clipboard - Overlay for `/opt` sh-5.1# mount | grep opt overlay on /opt type overlay (rw,relatime,seclabel,lowerdir=/opt,upperdir=/mnt/overlay/upper/opt,workdir=/mnt/overlay/workdir/opt) Copy to clipboard - Overlay for `/home` sh-5.1# mount | grep home overlay on /home type overlay (rw,relatime,seclabel,lowerdir=/home,upperdir=/mnt/overlay/upper/home,workdir=/mnt/overlay/workdir/home) Copy to clipboard - To resize the overlay partition, use the `resize-partitions.bb` class and `resize-partition.service.in` recipe file. The resize-partition service runs at device bootup to create and set the file system according to the size of the partition. In the resize-partition service, running the command to resize the overlay partition performs the following: - `/sbin/e2fsck -n /dev/disk/by-partlabel/%i` verifies the specified file system based on its partition label for errors, without making any changes. - `/sbin/mkfs.ext4 /dev/disk/by-partlabel/%i` invokes the `mkfs.ext4` utility and formats a partition with the ext4 file system. - `/sbin/resize2fs /dev/disk/by-partlabel/%i` attempts to increase the size of the partition. - `/sbin/tune2fs -O encrypt,stable_inodes /dev/disk/by-partlabel/overlay` modifies various parameters. For example, `encrypt` allows you to encrypt data stored on the file system and the `stable_inodes` option ensures that inode numbers remain stable across file system operations. ## System initscripts System initscripts added to the image by `meta-qcom-hwe` are as follows: | System initscripts | Description | | --- | --- | | `mnt-overlay.mount` | Mounts the `/dev/disk/by-partlabel/overlay` disk partitions to all
the mount points that user `overlayfs`. | | `var-persist.mount` | Mounts the `/dev/disk/by-partlabel/persist` disk partition
to `/var/persist`. | | `android-tools-adbd.service` | Provides the adbd daemon on the device. | | `logrotate.service` | Archives old logs. For more information on this service, see
[Log shim for syslog()](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#logging-shim-for-syslog).


The `logrotate.service` is an upstream system unit.
The `rsyslog.logrotate` configuration file is modified in Qualcomm
Linux to manage on-device logs. The modified `rsyslog.logrotate` file is
in the `meta-qcom-hwe/dynamic-layers/openembedded-layer/recipes-devtools/rsyslog/rsyslog/rsyslog.logrotate`
directory. This file overrides the
default configuration file provided by the upstream at
the `meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog/rsyslog.logrotate`
directory. | | `pd-mapper.service` | Configures and manages protection domains.
The `pd-mapper.service.in` file is updated to run the service as a system user instead of
as the root user by `pd-mapper_git.bbappend` in the Qualcomm Linux BSP layer.


do_install:prepend() {
# convert the service from root user to system user
sed -i "/ExecStart=/i\User=system\nGroup=system" pd-mapper.service.in
}
Copy to clipboard | | `property-vault.service` | Provides the `property_get` and `property_set` functionalities.
For more information on this service,
see [Properties](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#properties-section). | | `persist-property-vault.service` | Runs `set-persist-prop.sh`, which sets the
`le.persistprop.enable` flag to true. Set this flag to use
the persist properties. | | `resize-partition@.service` | Resizes the file system at bootup time according to
the size of the partition.


ExecStart=/bin/sh -c "/sbin/e2fsck -n /dev/disk/by-partlabel/%i; if [ $? -gt 1 ]; then /sbin/mkfs.ext4 /dev/disk/by-partlabel/%i; /sbin/resize2fs /dev/disk/by-partlabel/%i; #COMMAND# fi;"
Copy to clipboard | | `rsyslog.service` | Redirects logs according to a specified configuration.
For more information on this service, see [Log shim for syslog()](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#logging-shim-for-syslog). | | `sys-kernel-debug.mount` | Masks the `sys-kernel-debug.mount` point when `perf` is built. | ## Debug tools The `packagegroup-core-tools-debug` defined in the `/layers/poky/meta` directory adds debug tools as part of `rootfs`. This recipe is appended by `/layers/meta-qcom-hwe/recipes-devtools/` as `packagegroup-core-tools-debug.bbappend`. This append file adds `ltrace`, `perf`, `sysstat`, and `valgrind`. For more information, see [Debug Linux user space](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-12/using_open_source_debug_tools.html). ## systemd-boot The systemd-boot unified extensible firmware interface (UEFI) boot manager provides options to control the boot flow and loads the user-selected boot loader. The configuration files, kernels, initrds, and other EFI images must reside on the EFI partition. To execute Linux kernels directly as EFI images, build them with `CONFIG_EFI_STUB`. The systemd-boot supports two configurations: > > > - Type1: > > > The Type1 configuration uses boot loader specification (BLS) description files. You can find these files in the `/loader/entries/` directory on the EFI system partition (ESP). > - Type2: > > > The Type2 configuration uses unified kernel images (UKI). These images combine the kernel, initrd, and kernel command-line into a single EFI executable. > Type2 offers better security because the UKI contains all the necessary information for the device to boot. Signing a UKI image secures all included entities. > If UEFI secure boot is enabled, the system only loads signed images, making signing a requirement. For more details, see [systemd-boot](https://www.freedesktop.org/software/systemd/man/latest/systemd-boot.html). Note Signing is optional during the development phase. - **UKI** UKI is a combination of a UEFI boot stub program, a Linux kernel image, an initrd, and other resources in a single UEFI portable executable (PE) file. The UEFI boot stub looks for various resources for the kernel invocation inside the UEFI PE binary. This allows combining various resources inside a single PE binary image, which may then be signed using OpenSSL utilities. For more details on UKI, see [unified_kernel_image](https://uapi-group.org/specifications/specs/unified_kernel_image/). The `uki.efi` content is shown in the following table: | Components of uki.efi file | Contents | | --- | --- | | Initrd = Init ramdisk | `initramfs-qcom-image-qcm6490.cpio.gz` | | Linux = Kernel Image | Image | | Efi-arch = Architecture | `aa64` | | Stub = System-boot efi stub | `linuxx64.efi.stub` | | Cmdline = Command-line parameters | `root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,1150200n8 pcie_pme=nomsi earlycon kernel.sched_pelt_multiplier=4` | | OS-release = OS-release |

  • ID = qcom-wayland


  • Name = “QCOM Reference Distro with Wayland”


  • VERSION = “1.0”


  • VERSION_ID = 1.0


  • PRETTY_NAME = “QCOM Reference Distro with Wayland 1.0”


| **Image recipes** `meta-qcom-hwe/recipes-kernel/images` contains the following recipes: - `linux-qcom-uki.bb` generates `uki.efi`. - `esp-qcom-image.bb` generates `efi.bin` using `uki.efi`. The `meta-qcom-distro/classes/image-qcom-deploy.bbclass` invokes the `esp-qcom-image`. - **EFI image** The ESP image contains `efi.bin`, a vfat file. This file contains all the details necessary for UEFI to enable systemd-boot. UEFI mounts the ESP partition and executes systemd-boot manager (`bootaa64.efi`). The systemd-boot manager parses the UKI image, loads the kernel image, and then transfers the control to it. For more information on the structure of ESP, see [EFI system partition](https://wiki.archlinux.org/title/EFI_system_partition). A sample structure of the ESP partition is shown in the following figure. It contains systemd-boot (`bootaa64.efi`) and UKI (`uki.efi`). > > > ![../../_images/efi-bin.png](data:image/png;base64,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) > > **efi.bin file** - **Signing** The secure boot feature can be found in the UEFI standard and it is not enabled on development devices. It adds a layer of protection to the preboot process by maintaining a cryptographically signed list of binaries that are authorized or forbidden to run at boot. It ensures that the machine boot firmware and HLOS boot components (boot manager, kernel, and initramfs) have not been tampered with. UEFI secure boot uses a digital signature to validate the authenticity and integrity of the code that it loads. All the keys are stored in UEFI secure variables. UEFI secure boot is achieved by using the PK, KEK, DB, and DBX keys. To use a secure boot, the keys PK, KEK, and DB are required. While multiple KEK, DB, and DBX certificates can be added, only one platform key is allowed. UEFI secure boot is enabled only when the PK is registered in the system. It is advised to provision PK key in the last step of the secure boot enabling process. For more information on how Qualcomm has implemented the UEFI secure boot feature, see [Secure boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/secure-boot.html). **Host tool to sign HLOS images** When UEFI secure boot is enabled, the EFI and DTB images must be signed. To streamline this process, a host signing tool is used. This command-line Python script runs on a Linux host machine (preferably Ubuntu 18.04 or later versions). It automates the signing of EFI and DTB images in two separate operations, invoked after the build process completes. The tool also combines DTB files. The host signing tool is available for download on [GitHub](https://github.com/quic/host-signing-tool). **Host signing tool overview** The host signing tool runs on a Linux machine with Python3 installed. It can sign either the EFI image or the DTB image in a single operation. To sign both the EFI and DTB images, you must invoke the tool twice with different inputs. ![../../_images/host_tool_design_wbg.png](data:image/png;base64,UklGRn4pAABXRUJQVlA4THIpAAAvHwJyAP8nJEjw/3jrBEzA/Ce2e+DDtm2dEn/PDN0tKgoGdmC3rrGujd296q6tq67dsXbrqmB369qxJgbKIgZgoIIKiPQMM8Pk5/5jis/MZ4b5+P0dPyP6PwH44f//Gzsj7tbJvXv46P2nr77IML/YrWPb1y7rTry0nWfJOr/8tuWNOckiulZ2Jr7buVb3I1IzURxs6kH8uHeL3TIzYJ60cSb+3Ll7HGNq0nVuxK+X3SQzrS+jiH8f+9mU4lsRH9883nTiGhI/3yTeVD79Qnx911TTyB8n5O3sx+aagnqzE/H3DvtN4XkAFalAyD8LioTKxrMnH0HGewU16PjHdP55VO96Qe7G0TA5a7fJ6OAhF3LAV+fuHxBgFEWxpW5t1NAH4LXVJ7sZ1VnJ0kUy0m2BCnx34RxvIxyesNTLCPtd4ME1ES6GCYcxrKSFGDGf4cOgmWkYlctg5YibYf1ywI9ndDfM8zQrf9gZFPQv+PKj7gY5zGNY0DQhg0eBN8/qahC11rCQVdsghy38GTY6GlQ/i4VnFQyqEMWj3QoxqGIsC/8GGdQ0k0f7Ut+g4CgWzgQY1E7BoynbGFTyEguHfAzqBj69g0H+J1k4bFg4r9bRsFP/jwt1TNQD/jfqmYbDJK0qhvK/FTtKOUxcmvjgShIuC+GFqv/w3/8OOYZUr8qXVg+2t0gVbykkfKnychmLVCka/OmdspbpEY9y6/98USosoZLhc8LsLWHzDD6nJrkG+HN7CTdqwu8I+l44X/TnznPh5ZF8j3AxuH4z7zOf89b/v5BkX1K493MBr3SvY8P6XNvgp3O80ikvcuNast/OK53xL3PuGreeDXPayS/51dCAW1XtHfimahKOEbf9ToWRS9XfN4iH+9/4vkH+q+sl/i8/KUmpJ/3NFx1M9gcV0t7K82N7uWxPeq3k9aR7+9at++tJNYDEpW1qtJj0CIBqWd8Xe9rV37O6mo8wuHb1R3yedI6zV3hfd8/LwMPm1HVKL0Gle4Cyp3dvl6q15/8ztqJD1xmTE/m8K86172TlxQ09hpy+tDlLmbudemRCOUhoPynpQwZyBrueVivA4yl+pyUAIJbhlGMvEYCvbT2fQDmQehQAgGSk6z+wMVpJjEohl0kKCkS6CwqkskKFijEHUWm/s1oA1tD4mzdv/HulC92EcoDTVmiLR7ie51kUeRnJry5snf5reL2KJXxIt1eJmg1aD52x7VhsSnpuoWnl2VVP0DOfnNw9tL1vaW3jY8RJT8/P7xFmR9pCF++AUqXLVgwNDS5dKtDLwY603Sp1+fPok7c5JuRU5bmexTT48JHDhw8fOpfDy6iSbm7+rbY9EXmWr9eh3+gZa/8+fP7a1dv/PYu9d/XaxSMb1i4e27djk1BXIhLWGLj22kvGNMQVfc/oWUfzoN+Q4W4XeJGEPb819yKisG5/bD17PyEfRS16//DY+pm9atgRudUdtz3WFJQTaIJWXBQuB1RK0cFoDJH87nCU/1BenFjXnqj0kA2X4jNgilkvrm4aUZaIqg88k8saYtx950XdXlptIiQjqMul1OQ7c2dkGKJcQAOiDmYXJ5joU1kmxuwemmTlvGkdSFRt0oWEXJhyfuLlyaFE/o1vs6baUYJKBVKLZ0ByP/KtElrCYXoBlH3ttuhAVKBdKdeoYsCzOT8177c+FfhS12+Hicn70Q0r5yQ5hZ/OkMH0ZRk3BjnTLNager5xyqyoHAAQP/pr7NS9cRJAc3Z2nC71yxVjdudbfzuC7P18BE5TCpDdxvukickG03UrR3o2WgFzVWYcE7EHMGo19GpUauhk1IwuQKOC9R9T3m6LTPZ5zooCQCnXFDe4kpXi8HLhUA30ygp0yfLz8vLyRAwKRQyYfKkBBXlyA/JFUPNif1IvfbJlE98CEF+d2LN7v/7ho2TyHdNS4tb1nHAgS0fKwSGd/zgj1vF2e6/+O98N58MOujnuUevKrep7BWBmUdDPVYmaDJXn9gia4h8Y5kizCgA8aUX125Wn8dkAHtalkNr29RvwYdKh5Dr+jo68sFLXgYeutaLEr7rTvgLkDnQQDI16FxFY4jaQ29BldYootjOtBDI70oTHbw/UJj4Mn2baUbnhdw2Y7vA3gOPu4zTIHUTjxYBqFG0BttAIBkCMSx0pznjWSwfwMIwXgyx6lBuVOcToGeV4CcAlv/4K5A6kiwCYCFoM9HRel/T69etnZYM/YxPNkAOQDyqWfSt+AdLYDuT1UM9KxzEMsEQwW6UPB2gh1K0E3gEBAQH+9kFvMZs2agDIhhTHGiVLLbxMbYmALx1oOZOv430Z5/HnF5Z0fwKtC1r7tVra91+xdOnSpcsjVJhFm4pvQZPnzrbos6ZfskxYSnPUuna61S/tHlD/H8YYdHHZB/2raYkKgHxwseS9BMjNYiH07yOHLfrBX2czepIvv2d0JF1J4jDmZaqWdBDthg7mJ9+UjxefQduIOdRPo0MD7LNvkwMgul6xZOAkycshkSw0y4OF3zdL3yJaoNIxncZoik5xc3eGeSl/aX/48auoPxyDnyFPC0sDp27dc+z0LbFRn4K8N3yUZL2K3AckNaF5Scmn6lCxQ/YRyZVpSGMaqMAnRRE1ybBw6kgD5tIKXX9Qf3XR5feiW+alWSagMtUCqfpZFXKr+FwBrvuQk4sj+Q5IQU5vOqe1h+YywJny1KBbu8qCBQBOl6D6jby7htMVK+diT7bXGPX2p27t3YiI/Dp1HJln9czTN40GslA4QnDfvJD/74qeXcbsfAVAumBMItThDssePbh5og9NYmTb+j7Xigo/BQAx6/u17T33SjYA1cNZHfrs/XalZ6yVs4bY7mTUx9pE1NW/VHMiGiGxwpIO77mZpavw9q5TOWDiNzcVzNi3O9ucAE1OtgTaTEGuGtEBLVUAcN2nCgNJjkpLkSnTAvIz81TQLc/KAwqzFFbO/T/ZPmgMk9qJard69e7t3urlaX6hFfSXWsd0Xa+7+Lq5eZZerQBwq5aXu2fAReVsN3ty8fD8x7yMjS5Z4rlao/7aUzCOgclbIYyGMVDDFKGGMSJ/eSMhzZEDYL71IrtfDjBWz5KCQu3JOl63EP608shEN1qjRkYZ/xVR54ce0mRfaivc/PSBmEuYSW5Ooa0b+Li2T0cxwNQz6hJVOVgIAIo9pYmGwuqpN2zE8OHDx1SnQWqoFtLAHADn3EvG4IGgHwOd4mHC2+Da0781qN24/34Jil94XYZ6Z0Dnp+bUTmz9eJYqXbp06TJuWu8bO94DgJy+dAyJgjrPdOUPFd7iHHO2/t7WoRZvdMXXoTFS62f0v3fv3LkT1U8ryqXOWy3MpkjIhlHFxbcZm1N6Y6K2TzRaihu1icaIrZ7V0DmTBqpxR9D2s47l9DeQub4BBY78aPvIf8/2VyPy/qhDgjnQLhxE9NMmudWzQqVjmtZDz9BXWsxsigSA98ea0cACm8fecmyPMwLyN32o5YCEgoLr3UPpzzQ1rKqEGk53tLK60SUtIKmm/2et27aMTQK2exuDz/VISMNqN+xJRKMKYV0p/qDh2Qyj2GD/82c8+6gBUqqWSIdsHO1l1IzNQpTM8sc0o14EVanpRETkGVY2PM/qmUPLdE2hfmrgaR2qs/KvdhR8FVjtNfborrp2E5Vg/qI6y4Yl2ixMXynBu0pUJ4T6aPBVZfWs9N+m1rEicIIawH89yvv6hPx8C0BijxAvv8pTRQDe9izlXe6RzUh71OD0/zpvgsFWy7tz36Az8/Jb6Hxz+Z8E6H5z9kYGdMrvn3nNmNWnRLWNIRmAKNkqspQpPeu8tDEUZTHvdWmK+r5B/eSe5PsGbuWn1Ac3SoBXq16qn63elKCG+umKdXEaLXXupaVrzuXoYD4eW7Z0+fKFR8UAk31iwfYElRbz+cSytUkqfkta2/09ECHcMNPNy1kw58sUd08n11UqQPWnu2eAn33ALQCqg4FuAe5k7zv4K5Q7fdxKeAtG5gGqQwHuAT4+66yPGmqOUf5sA4h08i4569JfXqVCSk++sNC53EMgr37nM4kxU1xD8oD7wSERiUeqBmzN1mCnXY3d7251pd81iAkN3pN4b8kuq8M/+Po9br1a19EGYFdyP6CcSiUuAPIBtA5QPIZ2W/toYANtBnCepjP4Vi4wFkBWZY9kHKfpDAy2Fk55kacXt3qS/fbiH41XAjhMYwsBHKA/GWirxOJwxyhgEV0FEE2j1Tjp0K4wPz9f0s3pIu761zhvjdxpG1aLa2s3PW0DWKACcJDmqQCcoelax8Z0bde2hNNDYCXtBXCcJmgwz65suzZt2rQrQTshWkABQw8XWB2SD2/fce3bpHwbwFyFjtlKAKe0VKO9hS26dS+t9W9w1YNvLlT1OQZMEgb1CA8PD+8zPA7IP92TPNpHWRvcblM4Zhf6Mjtf3MvpAXDCU+BZytttTSGw3qFXvk4RAwB50f2pc04xTF6g1qWWyFlInbW9wMTeNWwvMh21pEC/RFN0qeU7FnDXGLuFANDX6QFy+pS5eXTBnm8MgMtOtQqhlwGAjNDKicWvgkH0UNcV/+7KojsqCHpiYrEVy2WazmUB6Xd5WnTv3Rrkctci6ihmJBE+9g8hGRe0/8OHL+k5GkBaz3ljvpqRpt3S4Ol1kUb50qfOp+JXZle6pyegUWHRJfSYnmFqoeVNKLp1y5YtvSm4ZcuWHeJZcG/IAdUck4CdNEtrP83QOkFTGLwNEfTfONjb3S4KuBFIJPDyah4hAm4GUdcVG0aWqSzGNuq2Zn45xyUohnUzpDELZmhaOn8RrgC7nCDv1SAVOFNlswrA+cpb1QBuVl4D4HKXKmWbrlzY6DkK/qBuq9ZMG1LNcZcGuNmvVtmghv3OAu+nNypT6afVsAHkRWcBCTE5et4/jNeS/feR0VK+itb+gMKXH4BPT1P15cXE5Or78vgtXpleW+FCXeqUh8+z9CmTop/LuYNJjFUBOdFfASDzUSYA5D9KBQDRy6eZyIktxCOfdt8A4ByNEAPAm+jH6dCZ+vhlDmwBZ6pevzWwWmi7PQoAL0eEla7S6w0QV3NyLoDL3aqUqVClUtlpeN76r5jf65dvsThTK39Nm5CQ1nPkWtnzmwXXmnq8utncHdigTOXWi/J1nO5RJ7hKl40FXGGa16lzNgD1HJok1yr6Ytx26lyhzMTW5H0ZyKllP2TdnxXOAncFnb4Cz0q5j1vbnEquvIl7perXcBo60NlxixrIGi6st3xZHRojBSQDqfSvvV2DXCuZyZEK1G7aAHfhwHxA/bc/dZjaVeg8X2pB0roKwsbMnNzcKewpbBQ7STjgY2HOYposw0UaKGEUGRLgviA8A8xwx3UyTVZ9pzdAVKiwZpykYI+gUTKYfcK+X9XqL409TgB7XYMSJaKb1amyeXyuR5ty5eKoGoLTwKMg9xN5hflXA5zPWRB8WlzTXuhQac4bxupZyHmbiu6XVAA3hT99xjXqpYJOHeqSoVkAfrc7CkSV93sOIKmhVwwKKpe+BQC7aRyDfrQLAM4FVmQPe+YUwWbn1lIAWCDsrNGspkUAoF5AM+QWBGqZWCSSqsG2NTD+HdfPLrqpMgAvq4bEIyNE2P9xjiGlKqQDGCU8BkSFVEkFkD9AcA+fXcvvPHLo0OEF1IeRdqA4rWeh5VlRfEtNS/u8dkJ6Wlpausag4bQN2vcCy+Tm9qdDWjhEA7ItialavipkCet/1epK93VdDmikY4pUHx6286Z2Zwv1MMNdFufI4yvbv9LxRau/4B7iXe28/Xx9ff2DxjJpDe3eaMWy9HVo+SpVKpf0q1alSqUhUoMG0RUdqeXL5GZ2EV7Q8Q91ybA9hFetxv1VBmQDyOlFUbp2uzVVGIXCk4N8aJtKFyIFzj3GhzpMVhnzzrnisevXrl27eu0tMpoJX2vFVWIHS+1J/ykYNIAu6HgWFJSX1YOO6zgv6P7N9vAy+gmbT59wY3SCEoByPK1ndPxGsxjjABwsUTVfV3aDygta1ui3Swpjsh0rxUOvrCM91ooOqcDOx7r62kkMG0/jGa1Dnk3lkjEUqWMXTZXZHizpXregJ1r3ytvFwZgPagCpVcvk6kpx+IURp0OnYYpeDkt1ycH8SgMYIONXx0rsYKmzLvsLMOwfn5JvAXzrQjuh2UrtMgB8au54HLY8UR+qMPLAnjHBNE1u1Lz2h15F9bYfqdClmOLVsGX4gPF/i43BEw+/mU+Tbq1rcwZ4FmI34c7RDu6OlVlKq66rc64Rsi5Uf8udI12FLb4CyW2oXcStbc1puMimh5zxQnJzI481BTDqjJ97gK+gZyp0YTD5NKlW0sH152xjNGfL2fsF+ji3TACw19vOx6PuseblWcJyRy37czACX3oKXHzcqfc7AHjRilx9XATDM2Dbgyr98NJlJ75ooP162QMGQP7evSJo8k/O3xhbCODrmn9UuOvcMkNRKPvY0XELMncclgFQX1ydBgC5V/5auD9OAQBMRuSiE/nMsW1Slr6FanXL0Hdp1UctKB/vnL/1tRI6FbHrF+9/pQIA8YZDKpud6c52WA0AmrGC2Qw4cK2AyOkouFyZn8fhhbdtEoeE1c/HvHj0F5WPARdmVSbqms5pj0f068/ZffY/tklI/yxHDt4Ozj+dBTduFXjsB6cfcyQO//U/mwTwYM+K5ZvOpYIjZQ26q7ntpIfrzFXcvLI2/R5j8ab3tYTz8k2P3eRRfU29d/mKA/qa/F0T88sERw+yBiqSJQzL4JZnrmQJ95iY7weOYvpaAzUFTWZOL/pp07lwTmtq8o1bnvs7j58xnVOnTTd2xtRqdMCGIJyn4fp1HOSTqeF42WDbwnxw/XouygbHy4f8T5zq7YuXXPnipYEv8nmkrD51wriydpj+OnVu2PAk//wj5Za0yiS041yi4za8f/zKP+eW9BqCG/FcG9eTTtrwnlas/55z0sC5o7iFYd0KE2cVbV4hV0CjAeekcI5iJKd8WDyd3Wl/JVpbyn/aeXgZ7e3l5V17YqyGGzT5YgZQ5MihysnXUmbn6ZNm56j0ibOys7OzxDpycgr15WfJOYTRw+hSc9QdL7eSrHpSm3jrSrWNqFS5kKJ0oYoROZzwefKfWWCuDbj7bkH4kEPfED+/88D9BVqvj/7eoduiu3KtjN1Df+7Ss0f7FQASt3XtNOVYvtabjX3aTrmg4Ajlv+v2ZALI2LLuOQDm2rJ9X7nJY9TjRyw+XkDUOsGqeu3rOvfKvbvG3rl7987ecLIb+pgLnpQq+xaaVTSgXkAjDxp5ropPEzuaB+BjY2rQuaWDz2kNkNWdancNJruuq4FrYdSyUzBNzATeNxA071LD5wtHxPsTrVZB9TtR7RfAQy+ivxhOclsCVg/Z17BrlWBNRVBjFHXuylJUbbvI/GLKV0qCZiNRu/vJ5+2FZbrcSol08f8CxEw6mCxO3+LV5DOYg9TrrSQ6zPuWHIm1PCLTRTGdBIehWUDT0gpenyngiFMCor55EJUgoj3AagHRCDU3LWRnj8OeOdQs3opaKuxZZEBMJ3LvGc0RG6jDZwB9qNU3AM2cIwFZAQBktPKKg2KY/xUAqxzmM1goXAMA59zDc5lf7XfCQPN7VY4Eq5RQjCCq+wqIdiC7tYwlElzKn0RNX1hPK4S9WEDmJmcqv03CCetpCQAsEswGgPF2s6Gt/hT/oI1PHOQ9gh8D2OMwnpENoCOJL18mXqhc/hOOCmpf5RDNo7kHxAC+bZn3lAHU9+cfzIdFOgvxZGryongAzbv65NDjFTcs1VoomK811W4WgLdDA319vB1KxUE1Q7iOgaqPw0ZkdSFPHx8fX2/HCu8hGmfv1mCniCsAJQNtjRI6lQwsFSSTqNmr4gGgWOlN5XaLNQzLGsYEluiapzVFK6aqY6tZ6xZXC4gD7lLJuSeG2dXNQHYXmrh29erVq1eeKwRUUb18hI1SOaPoLRAkk+1bxhcTgJim9jR0+98sb494WWhyzBiaxQCSvt5xUE71bFrKs1ynWKBwID2E4fHtBTMYY75yDkZbHogm2beJLy6gYEkFMkH3xVmmphlIDwEkNfKLQx61lMRfT4X2NJrL6GGyAeCEeyejTj/g2judLRByJwraxBcXgPvzfh/N8pge9nYbTA1TaHB8/uOeVDoO8hEVpq2L3Lf/phKILuu9/aMo4+HyG0zhoP0fxfF9aRUMq0nevhzr5+NoiZA9iVomFBtMMXcZNXlfRE9Kl30HzWpaoDWX/tQaT9OA5w2pRrug4JrescA+AXm5OlPAlG/A0UCq1755oP1hRvkz1fulGvX7ZpR/CY4NDHC2SMieSM3ii09I9g68XkRfps3JBnOz/z9aJ4bc0Do96CKAxLW9+i59cWDsZ6RWDDr8/PG9Ux0F6wHmv9XDOw3efFsCfDo8qvPoI1kwoobgUizXRodbJuROoqYvi08pgUWmEUsYQJkn1yrMV2kp8pQAoMkXqSEXaXCefof2IRoNAJqCXDF0S3Il0GtIOjh3tIWCeBI1fVlsSi5RZKZ5iVq9lSvkcdWdN2gVtSEpnKMYaalQMEnQLN4mktfH3bV64+pOnuOZ4tBFQ6CY4do63hYC6cGhPzVuMeUyWC0u7BWsi3tmYNydn6ldPGMDMc3iQqSAjJ8s/a4gdu6c2UaOLTEw/7uCIsyo10/Ez2mk+SKD8wvURZUU1r94lFIi8IZ1kjDnMWOhvo4IMbJHSnEhL3LSqNFmOGaAm1OnsaNH//b3R4ZbNCbGbJ+RY9Q0uyZSLfWF/rncIM7UmErW7OZtDG4xIbWYEFeRSCgwS6FQKBAIiCqc1XCJ+trRbFPS7HVyOmtMan3aAe33lahzNic88FuXpjEN07W2pDWpbN/pU833j4lhFJbAJVhPLc+lmc4+Z5d5ImM2uwR/1YG/fSg8nQseCajc5nfFuONOXvdg3qlNaQPDJZsERL8cSTWR3c7OcwtgZF4XWqTWhV3+1OMLNxDVWP+q2NaNhsPcN9EkJdcQddyZaQo7XO3nimHsKV/vV9AfGUC9UjmCqO7SeJwrjj0uSXfNTTaVljN6muVzwBYdZNdms+wdW9s8aIEYxsp+p/FSAzS7A6hHBltH2Xupi6ju0qVe7Ehv7t7P8t531tg8YX2ZucX4uByHnoqb9+81xX1HYuNfFXV8/GzS69pssic72zxpkQRGR5V2ugFDVbv9qVs2S6P3FuWBrT0aNdRfjfQLfOzYSe/h5MKus9NeKyytGe2AmSsXU9dcfUFTF8wzxdk9u4YXffea+oj87Fn5250Wy2C0agX1+GYQVLt8qVMeO+HzivTPBQ/i9R8R6KvR050d6a0DB9lOssJ2OHunm1t2RZdI6Gv8RWGa0gI21wh0CYOWXQlggYl0ES6Swfik6oK9MFLztw91ymVlj6Jo1TDwiS77kK2yEx7smK5VJR9AcxTmtpvaFBjQJBPmv0mHXbmZqXjhX3Safc5OCyQwnjlITd8aA2zzpi7ZbBwA64+0nCqtlgIni1/XyzjGwMzF5R1WwJBvXFF1+nsAz4uuMNLVZ5EERZj9k3AJinBHEIV/NDO7OsvygeKYZg71zDG3zVT5C/eEzU6ANgvZ9al6AorypiD0UVGgFznvN6f7gqbLv0Jn8et9PbszMPOsUMEEcAuzodriF9DNAm7VpF6fi0DZh35VFcXffk7zcszp/eoP0MtW7uYxrN+3ug5SrdfmFulQMpljkPQM+tnAnVoUnm7cS+eAyyjCzR6CBWKYEwMD2Urv5+HDsudBa0s0mFYqzUzcgqaCawxmBXdqUJcso8ZQe3kRbPagxRKYlcFsqT4nJLKckGdtRTn5XoSZX/X3ybBUuF2FOuQakRbkshvGb/OgJYWwEKZrPakX0EC5mal70CS1xcKtUOqQY9hSYS2RUZpdrnaLC2GrSS/huhtmfiXI/gEsF/4Npc6ZhuTWpcUwVrPHxXmhFDabjdQgxcwKh1D3AkuGf0OpW6oBezwCvhi1x9l1ngSWQ/Ul8Q3Lr/OtK1VNp0Uw86ulnW7BouFWVer+WY+sE03WGBPh4jyvABYkY1RIRZbLHbeuLlKpRDOTTqJ++RYOd2pQ97e6Lga6vIDhio1u9vPFsCS5a4cMZXnIHeuqN/VUm1lCBbeLsHS4XdXlXx3qsdRPakRhG1oghkVh5BIp2yqrKrGU0z8wb812+iXd8uH2aYmO6EqCazCSeRkhhWUxXWtpkbCKysw+VxDsZKwA/VuEP2UYA2hgy8kLo20wb2Y7hb2AFaG8HK0xjk1byC5P7wwzyyprtwjWhKlzVOGTi5fY/mxFqTrQeLWZ7aMar2wNaR2J9Qgr6l6ISyLMW17PfjZsDZKLm7azu21LovXETKefxWZ2jUKTbQ6maxUlN6fzGvPStKEJ4K96Y4djSBLM+6Kb81Meq69qLC1Vm5emLXXW2CA07DPW0sBY1xJRMO/z/sIY2B5yVvToy26f3v9aSfZdF9PAHPNixlFPhQ3i68hyrB+zjpY7hlXwvQzzfl3d5QlsEKqv7z+y/EFsHa0UulLwnA3m3YO6iS1MGudgFCeZrtXz0Ic4UHCWsSx07dVLbn0V28OWoTk7oXcf43v3Me1eE7/CotSkStW5tpq3LQOQ5Ji/WGNR0qoSJx+3ZXA3Z2lyMzlZziNxOmcsMrEPPNxMkdiUC17U5NtuuVQdNnyYCY/o7daPZ4ttU6taVZOuHrZIwq9JEl/Fm/jLVI2VsoTztnKRiOuYYZzAiVYC+Vfn+kAOcluz429O37GlsS0hzM4SNuOYOB9y5Hwh7Te1FI5CP2vgwLoNbG7cwI1rj0m5JbFuiKmXFXqWDzH50ybmfT+Fm5O7WAPF4ldugxlw+nEn4vBRtjDVSAq8wG1X61Ti7tBFT2xgsU5Ew0Sclh394CE3P3r4MCrlru2L6UNEvlc5jeNv2b4eexARjcz7fqE7aXvctt0oly5mcclirlx0xoLdCdRBI8Q2G4kdWcL+lkvVm3S7PbTd2NtXbcX1fjTAct0oq4cGy203fufA9b0tmKgXGXjDduN7hPPCLdjHmUOGDOlbtc3wIUMGHfwuoTC/oEDyZfxpWUFBgfi7BJ2iqVdgxdvEcqdc+uG/H2ab3/AR38QwHNOejvJHanHmowMr/5y1ZO+Vj/kKzujIH+W8WNnEgfTXmnk/RfNdQcrp3kRUql777sOHh3doWNmRqNKqlxwiT8nQaKV9ytWSpsh0qL9+0wDi1E8qvqPwWBuickPWX/4Enen/7ZjQgKjKyvdcIV3bdIcSiJrVunGvrTnAzbZLJFqPui2RKQ8OadFkwmMNr5H4mxvVWH6PgeGJW1sQtb7ODdLljo2eMMyJYPvuv4bRiAzcLen0DgAzj9ZrVjqWHTqgwogCPuNGA3Ka8QpF+GGXO5XdzQHHcMyleTzwrmS5MznypD60AoW96AyAb51dYnIDQ+Kk4oTnKh5jXwhV/FeGoo3tSV5zReZ3MaBZPMAspFkA8EDQGohw7yADbrq0S//mUUkBLrYlHfKhioko8oxxZL9aaW4z3EtdA6Bp5rnq6YMHD6/Y1yxAaj23L2BW0nZG00bQMVrNYzAPqlLjN2BRvUhot8/cmlG9NwDUAQIXD3d3d3eXut+AvoIZ+NbR6zaQ1MrNrvn5Qt7iUwtq/xWsKkYLPR6a2a4BNLgAUJd2G783MjIyMuIqgHNeNTWP6HclgMJz4QE0TcpTKGZTcBxYzuxCtUTmdTK1lnCNEpq2HodhYHaY/YNNdjuh+3pVuwSe4qGd299g/VUQLRTlmW6uyrijuFa29GVgGY3Q6FAAwGLHvi2rvAIK5AAwiOL4CXV3Cs9iDzsEHt27mW7XlUWh3iSskYSPFX0XPfuacu3PzVoJ3m40VA08HHj8U9r+soHJ/MQDu6A7MEFFYzJpt11GtKNDgGgotc7C1QpULqy6r+tOLXVDct0K4HUpl5q1XNyPKfmJdjRCbQp4e9V0r90IJ59bhu3//TWA1CVjs4DkYxOHTj7wWqaFXVTlAwD1x8PDft/+XANeIsHZ6yx0Mwwrpp3Xmup80DFQh0YBbY0C2iqFCnoXCMZDt0IJDs6fahPaLKgPnQUvtq/YHS/hBnwOpfZ5Wr1F2mKxSFssFmmLxWKR7rRS7idEusViEQenjL1oC+pME3Q8G0jaw+O5AQ9KOs2WIZyqzWR1djj5zZrJ5ZO63bYBSYPtz2vdCaHy4X27+lGFO2zEbjXd7W3Iczt6UPOTrJ75o//KUye5/MSVTBtQXAnnjwDe1qSmdwGcakT1MllYTqYdEtOLBsN2azXc8PFVAJhuH/oS2i/8aTkL14YOHGSygwfXotaVaQD/s9+tHABpe9oC3fOpDQvy3BzTzc2NbkYCPmina1MAqc3onZ6rVFtVdKZ+O5T4oF2udRngc1OK1XOK6sKkFXGMQQUJhjDbXXmhEx4VASjDaaou9SjqbFLyJV4RcgMKhpa4acBFD3t7PuiGj78CwE5Hz3s6Djs5bjMl6RIBuayU6ckZSVTimp6En2hkQz4oIdApDkB+d6oQ8SL52ZZA6llgAg/+0eiQLLIXNCa3VYU6skaTf2MKuqQj72cKS+nHB8mqCDcDQGIXohqtqxCFvwH7T2u4bNGSLHKmaR/HkscqBYCcMeS/+2MPCr4IgJlH5a4inA9CTxqmhU+ra9uTY7NVGWA/piaR+0ZAusiNZkiRN5Y8V6ohGkX+kRqk9aHgS8BSJ4/94In2CKt+1QLePXnwNBkmGFeV+k52cNugXuJGMyUA8n4j979EI4W+kSoAaf0o6OZdH5oo54tySrkd0GWqrypRl8/S+QKP1s40Qwpt8UhyaSX03qmCdlpvKl2S+ovBF6EPdVCZxM1fR2n/WobafwZU84REU6TQLR1K5LldA92p4UTlk8EfPbH3OWQKyVVJKNC2a/sZADRzfcbJoL9wkP82GJjaocwT8EjKEfRzJnvycVRmmvYfcz9Bp/yKGIbKLsDgj1FqPgnvywsXFLJ20NFpB8yQL9Lssitxia2EmtRLxt8hbxRVf8jOhy7U6DV4PKS3o9DHbCR1F4TGgtfD8zAKOV50cXXI+QZ4PiS2IqfJKUWjOFmWKl8C74fsPi4UdvqbcYWvx5Kw5VN8BwDpxvJEzU+/khmi+nh/lgeVmpqN7wKAh+MrEJWfuOdmzJuUtNdxdw7NbErk1esizJhvAu7NaUFE3pUbt+3QuKY/EYWOPyPH9wTA+0uL+oc6k3aldrNO/6eCefNRgCon6UX0o0ePniWly2H2/BS3/vDfd2AnOK8H3+O18jnXt+Z5yCL25nNk9WqzGFabM2fxOZrncSw+j+PMFL6lcowhvOf9YIsUOHtPhGlGRhSPIyNMOTLCkkZGRETsneZrkQROLs58qYujwCLxtz/89789Il9eKLiAw+SrZvPBG5QcxmP/vykOfSdwkoXjfgZ15dU6GFTiHAtXShnUVs6jiVsYVOY2C/fLGtTgE4/2rrZB5aNZSKhkUMkLPNrJAINqf2JBWt8gwQIebYHAoEYiFtDFIGqWxJslNiSD+2jY+MvJIFql4ck0awQGuWwBm098DKv6hCe7X4kMLhnPCuobRp0yebH0X8jwpgp2lggMoxHveLD3/chw4Waw+87DCGp0nfe61JiMDM5kCeOModK/veW1nvUPJGPXgu2kQGOISrbbeC+Z4aFyPt7d2DqAjA7JZg2HjCOyd3Jx46FdXZzsyHjhdrD/7aci4NOHiEwAz0N4vGr/wSQP+/N2fmdhmsq1rjydxwa5iaBgqRMv57xaCpOVrrXn4Vz2FsKElTEVeLcqDzQw7dcDnHg1l76pMHllZG1n3sy17mmYpXhtc39ezK/dJinMNffEiDalea5yLaceV8KsU29E/DmsT+uW5tyqpYVv1dTNIIcGrVqad6s6AoN8mrVqqbdVS1Nu1dKStmpZ9G16DFuw/W4yuFCUlfzBmo+tapDPjQ/mftrRoJbPP1jzKd9EsA2KwgzyS4K5P3UyqKMMfHB2bcMSze6RYb+Ifvjvh/9++O+H/37474f/fvjvh/9syuIwg/yTzC7GsI6Ftj3pvl2cGLGhrEHuSyJ2mXfEbHuDamyO2KU3YpcpR+wy9pjCRpMR4MyNTgKDBE7O5u5IBgudnLmxSp6N5qs7FZdDcm01HsWmcj/8991GOhWb/XJsNOLFc4rLawttND9ECA==) **Linux machine with OpenSSL and sbsign** The host tool expects unsigned EFI or DTB files, along with certificates and keys, as input. After invoking, the tool unpacks the unsigned image, signs the available items using the provided key and certificate, and then repacks the images, replacing the unsigned version with the signed one. To combine DTB files, you must follow a different process than the signing process. Use the tool to either combine a new DTB file with an older one (under `dtb.bin`) or create a new concatenated DTB file from a list of available DTB files. **Working of host signing tool** - **Prerequisites to run the tool** To run this tool, install the following on the Linux host machine: - OpenSSL, sbsign, and mtools utilities - Python3 - pip, subprocess, shlex, socket, glob, and shutil Python modules - **Host signing tool configuration** You must configure the host signing tool before starting the operation. - `config.ini` **file** The host tool expects you to provide the necessary information in a `config.ini` configuration file. Upon bootup, the script reads this file and signs the image accordingly. The following variables are listed in the configuration file: ![../../_images/config_file.png](data:image/png;base64,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) **config.ini file** Variables in config.ini file | Variable in config.ini | Values | Description | | --- | --- | --- | | `operation` | `sign_image/combine_dtb` | Use this configuration to select either signing the image or combining DTB files. | | `image_type` | `efi/dtb` | If `operation == sign_image`, use this configuration to select `efi` or `dtb` to sign separately. | | `combine_dtb_type` | `combine_with_old_dtb/combine_without_old_dtb` | If `operation == combine_dtb`, use this configuration to select the type of combine DTB operation you want to perform.

  • combine_with_old_dtb: combine with DTB from old dtb.bin


  • combine_without_old_dtb: combine a set of DTB files


| | `file_path` | `local/remote` |

  • local: Keys and efi.bin/dtb.bin are present in the same path as the script.


  • remote: Copy efi.bin/dtb.bin and the keys from a remote Linux machine to the current path.


| | `local_machine_private_key_path` | `` | This file establishes an SSH connection with a remote machine if `file_path = remote`. | | `loader_conf_timeout` | `` | The systemd-boot wait time to let you choose to authenticate the binaries.
This option is required to sign `efi.bin`. | | `efi/keys/dtb/combine-dtb_remote_hostname` | `` | If `file_path = remote`, then the host tool selects the host name of
the remote machine to copy the `efi/keys/dtb/combine-dtb` file from the remote machine using SCP. | | `efi/keys/dtb/combine-dtb_remote_username` | `` | If `file_path = remote`, then the host tool selects the user
name of the remote machine to copy the `efi/keys/dtb/combine-dtb` file from
the remote machine using SCP, provided the username is created
on the local machine. | | `efi/keys/dtb/combine-dtb_remote_filepath` | `` | If `file_path = remote`, then the host tool selects the path of
a `efi/key/dtb/combine-dtb` file on the remote machine to copy that file from
the remote machine using SCP. | - **Configure using config.ini file** 1. Operation selection: Specify which operation must be performed by setting the `operation` variable. The options are either `sign_image` or `combine_dtb`. 2. Image selection: If you select `operation == sign_image`, specify which image to sign by setting the `image_type` variable. The options are either `efi` or `dtb`. 3. File location: Indicate the location of the unsigned EFI/DTB image, keys, and certificates using the `file_path` variable. If you select `local` in the configuration file, copy the EFI/DTB image, keys, and certificate files manually to the local working directory. 1. Create an `unsigned_binaries` directory in the same path as the script, and then copy the `efi.bin`/`dtb.bin` image into that directory. 2. Create a `keys` directory in the same path as the script and then copy the `db.auth`, `db.crt`, `db.key`, `KEK.auth`, and `PK.auth` files into that directory. If you want the script to copy the required files automatically from a remote Linux machine on the same network, select `remote` in the configuration file. In the configuration file, provide information for the following variables: > > > - `local_machine_private_key_path` (mandatory) > - `[efi_config]` section (if `operation` is `sign_image` and if `image_type` is `efi`) > - `[keys_config]` section (if `operation` is `sign_image`) > - `[dtb_config]` section (if `operation` is `sign_image` and if `image_type` is `dtb`) > - `[combine_dtb_config]` section (if `operation` is `combine_dtb`) > > > > Note > > > The script supports copying from another Linux machine over SCP within the same network. 4. Loader configuration timeout: If `image_type` is set to `efi` in the configuration file, update the `loader_conf_timeout` variable. 5. Combining DTB selection: If you select `operation == combine_dtb`, specify which type of DTB combination operation must done by setting the `combine_dtb_type` variable. The options are either `combine_with_old_dtb` or `combine_without_old_dtb`. 1. If you select `combine_dtb_type == combine_with_old_dtb`, create an `unsigned_binaries` directory in the same path as the script and copy the `dtb.bin` image to that directory. 2. For both options, create a `dtb_files` directory in the same path as the script and copy all the DTB files that must be combined into that directory (either with old combined DTB from `dtb.bin` or with each other only). 6. Handling missing configuration: If you missed any configuration information, the script runs and prompt you for the missing details through the command line. - **Run host signing tool** 1. Launch the host tool: After completing the code build process and obtaining the unsigned `efi.bin` and `dtb.bin` images, launch the host signing tool. 2. Prepare a host machine: Store the host signing tool files (`signing_tool.py` and `config.ini`) on a Linux machine. Ensure that both the files are in the same working directory. 3. Configure the tool: Set up the host signing tool according to the configuration instructions. 4. Run the tool: Run the following command to launch the host tool from the command line: `$python3 signing_tool.py` 5. Interactive process: The host signing tool displays your selections and operational commands on the screen. It also displays errors in the command line. 6. Signed images: After the tool completes its process, it creates a directory called `signed_binaries` in the same working directory. The signed `efi.bin` or `dtb.bin` image is stored in the directory. The tool deletes other user-created directories after signing. 7. Repeat for both images: Follow this process twice, once for `efi.bin` and once for `dtb.bin`. After each signing operation, delete the `signed_binaries` directory before starting a new operation. - **Host signing tool workflow** > > > The following figure shows the workflow of the host signing tool: > > ![../../_images/host_tool_workflow.png](data:image/png;base64,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) > > **Host signing tool workflow** > > - The host tool requires the `efi.bin` and `dtb.bin` paths (absolute path or network path). > > - `efi.bin` contains `uki.efi` (Linux kernel image) and `bootaa64.efi` (boot loader image). > - `dtb.bin` contains `combined-dtb.dtb`. > - The host tool requires the path of `certificate` and `key` (absolute path or network path) to sign the images. > - The host tool mounts `efi.bin`/`dtb.bin` on the FAT partition, which provides the following directory structure and follows its separate signing process: > > > > > > > > > ![../../_images/1_efi_bin.png](data:image/png;base64,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) > > ![../../_images/1_dtb_bin.png](data:image/png;base64,UklGRkAEAABXRUJQVlA4TDMEAAAvVkEoAAXdbNvq6NFbwlcCJRA6dEgJCh0qdKhwQ0qgBEpQSAmEG1ICHXBdv/gOGs942ONE9B+2JLlxm4Ffbu8C1AE5wQeMj7FRljH+1MAyxo9lxv2xgPHTxPexgNE+/vM/E0RQW1ICUJaUA9SW9eGP/3z85+M/f1WIiP88QEgyfQvloVSg3hBkMHiTDZvF028caOYKEB5KAcrDBOF2FgOCxdP7oBHSc5FAD4eQ3gZqPBcReDhA/KeHshNoKzPnRoA/2gyh9uhAe/uStwH+lIgO4GoJSZSJjZ8E9OgheRpMlIhN0IY5gmJQT9YGuDhTwaLM9J2uVL06GXPk6QyNiaDMXCaadfQ4C4qMwzO1fJEymW6WWSeqg6yuMRm7iCZIQzOoZncK7w1IqaqvTQF8HT2CvtiBo42eCagzQOx9Bwi+jOqBLuhpo3igMiSZIxPctPbdtFnVjZUvAGlcqmQUQcod3aCarDbaBpjugPLsvb80ntku/soFE12B/YKvTgf4Picrcz1cn0Zm5bg2/cQzGrANyVXzMoogBd2gUn+aHCUbVJmk/Mo0iKe6O9AFBTMHM4M+lLodPK/OJIfttD1PwbwJHlz8KaMIUtANSnRBjjchHHf2J+MhMbkXUmvqlRJQ5yxxhkYUXNrkzEAM2VWRUQQp2AzqwoOESdKLIq9/YWGJCfv1NBFvIbHD42+EJwmJ8bRUadGM8XbJQBHw8p326xkyd+68Kar8kg0kKHDjFuKhyt/BwcvsXPz5hVWQgm5QKUe8/5IOHC/9Y49jZ1/VTZtM4kWOd0Hmp2R3OOSySa4qXdwTlKYDjW7QlKwdDMKhflAEykuTgHC1IYRp0SHObYjrt0Hs4yRQv0MjUGxj1OTSXATKo6ttiE1QAfbRTpPBAM8WwNau/oYTriKejbchoycgvPhPk7vY2FbPRLg67iF0pjiHGbbsedcsyiDljlHQZD8YDUJO1nYwTrFpzphdtFf/xTcHgPY5jz2FK5GpD+WqdAKp13LafB2lqnIS11GlSzwIzNRo7NqLQ+X5tQq6TLmoGFS/I3vA55GxjfnmgXBtkXDT1uOOvqx/n/Dxn78y0PcFjG8WFjGWllWNj/98amHDppFAj5vVtzQEBI0IGAGiTAHCClGB+mAaIa0QBSiPQI1/ZLkx+U4Y8QIw6qSpM+7N6qsg9q/g/X1jnXxnIjNNnXFrVl8BMs0q3/jNOPnOdAf+HD0CG0ef1acAypPK/X3vym2T7yzwBb8BjWGe1SePcQlw7xvj5DsTnW9Imd3RZ/UpnPwIuwj3y523Gc45zGO6ZL3lX4Q0IN5/yQmcDH1W32pwa/JdBU71gwKoM/RZfYuCcfLdVcSeeRtSRttZ2SKo6bP6FgXj5LtDapoD0+TZTh9Fn9W3KFgn30UHuiQk7OO8NKXB6kzNPKtPvuxeQeP/7WIAAA==) > - After signing the images, the host tool copies the *Auth* files to the `/loader/keys/authkeys` directory for both `efi.bin` and `dtb.bin`. The *Auth* files must be available with keys and certificates on Target or Security team hosted path. > - The Host tool must configure the wait time in the `systemdboot` loader configuration. This wait time stops the Kernel loading and allows you to review and select the `systemdboot` menu options. The `loader.conf` file must be available in an updated `efi.bin` file. > > > > > > > > > Note > > > > > > The signing process is not followed for the `dtb.bin` file. > > > - The host tool configures `/loader/loader.conf`. > - The syntax for `loader.conf` is `timeout x`, where x = timeout in seconds. > - After the image is signed, the host tool must unmount the `efi.bin/dtb.bin` from the FAT partition. Store the signed `efi.bin/dtb.bin` on the host machine on the similar path as the host tool in the `signed_binaries` directory. > - Following is the directory structure for signed `efi.bin` and `dtb.bin`: > > ![../../_images/efi-bin_and_dtb-bin.png](data:image/png;base64,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) > > **Directory structures of efi.bin and dtb.bin files** > > > > `efi.bin` **signing process** > > > > > > > > > - The host tool uses the `sbsign` utility to sign the `uki.efi` and `bootaa64.efi` images separately. > > - `sbsign` requires `certificate` and `key` for the signing process. Verify the following syntax where `dsk1.key` is key, `dsk1.crt` is certificate, and the output filename is the same as the input file: > > > > > > sbsign --key --cert > > Copy to clipboard > > > > > > > > - Examples: > > - - sbsign –key dsk1.key –cert dsk1.crt bootaa64.efi bootaa64.efi > > Copy to clipboard > > - sbsign --key dsk1.key --cert dsk1.crt uki.efi uki.efi > > Copy to clipboard > > > > `dtb.bin` **signing process** > > > > > > > > > - The host tool requires the path of the `dtb.bin` file. > > - The host tool requires the path of `key` and `certificate` (absolute path or network path) to sign the images. > > - UEFI secure boot requires PE format files for verification. Non-PE files, such as `dtb`, cannot be signed using `sbsign` as this signing tool requires PE format files as input. > > - The host tool uses the `openssl` utility to sign the `dtb` file. Verify the following syntax, where `dsk1.key` is key and `dsk1.crt` is certificate: > > > > > > > > > > > > > > > openssl cms -sign -inkey <.key file> -signer <.crt file> -binary -in --out -outform DER > > > Copy to clipboard > > > > > > > > > > - Example: > > - openssl cms -sign -inkey dsk1.key -signer dsk1.crt -binary -in --out -outform DER > > Copy to clipboard > > > > > > > > > > This command adds the signature for the DTB file in a separate > > file (`foo.dtb.sig`) and does not modify the original file > > (`foo.dtb`). Hence, the host tool must keep both the files > > where the `*.dtb.sig` file is used during the UEFI secure boot > > verification. - **Host signing tool workflow to combine DTB** > > > To combine DTB files using the host tool, do the following: > > 1. Prepare DTB files: Place the new DTB files to be combined in the `dtb_files` directory. > 2. Select operation: Set `operation=combine_dtb` in `config.ini`. > 3. Combine with old DTB: > > 1. To combine the new DTB files with the existing `combined-dtb.dtb` in `dtb.bin`, set `combine_dtb_type=combine_with_old_dtb`. > 2. Ensure that the old `dtb.bin` is in the `unsigned_binaries/` directory. > 3. The host tool takes `combined-dtb.dtb` from the old `dtb.bin` and appends all DTB files from the `dtb_files` directory. > 4. The host tool then creates a `dtb.bin` (vfat), copies all old files/directories from the old `dtb.bin`, and includes the newly created `combined-dtb.dtb` with the appended DTB files. > 5. The host tool places the updated `dtb.bin` in the `unsigned_combined_dtb_bi` directory. > 4. Combine without old DTB: > > 1. To combine only the new DTB files in the `dtb_files` directory, set `combine_dtb_type=combine_without_old_dtb`. > 2. The host tool takes all DTB files from the `dtb_files` directory and creates a `combined-dtb.dtb` file. > 3. The host tool then creates a `dtb.bin` (vfat) and includes the newly created `combined-dtb.dtb`. > 4. The host tool places the updated `dtb.bin` in the `unsigned_combined_dtb_bin` directory. - **Multi-DTB support** Qualcomm supports multiple Qualcomm reference devices based on the same hardware SoC. For example, the QCS6490 reference device variants include the RB3 Gen 2 development core kit and RB3 Gen 2 vision kit. Each Qualcomm reference device variant has its own DTB in the kernel. During bootup, UEFI selects the appropriate DTB based on the specific Qualcomm reference device variant. To facilitate this, all DTBs for Qualcomm reference devices sharing the same hardware SoC are combined and stored in the DTB partition. **Generate combined DTB** To enable multi-DTB support, all supported DTBs are appended one after the other and a combined DTB is generated. ![../../_images/combined_dtb.png](data:image/png;base64,UklGRhIEAABXRUJQVlA4TAYEAAAvz0IPAI/iqrZtVVlHnmsEf2gS+kISlxAMPr2Gq9q2VWUdea4RFCcBNCXQS4BDCAaf7qq2bVVZR55rAncgwYtAer69AgUYzH8A//+/NE1FUURViQhVZWZEhJlxd2VZUlVmRkSIiCAIiAhVJSJEhIiI49jz2WAEnKxZsAHcscbrdROGdyzBFEvABHDBDXCid/X9/jweX03TqetaXdfMjIhwd3Vdc/9gwABgdgfcJwPghjvgihtPHAGTDYI94MAIuNj9wR1wwoARbLcLmLF+OC6vmGJ/BUewB+sDO0CibdtpGz11sMzMTZkhndB4HCgFZ+b//yZ+evLTulpLg4novwO3kRQpfYyV6cWDDxi5bi4DrKvLEOv6MsiK2Zaa/HXxaTnA+jAZoOr02HKA9X48Yls6cZqf8x0TYI1fBqh6/dEEWEtnEdvSs7OR/4z8Z+Q/v6156BOvuc6XjGKfxFovCcEaqzWB+z2iZlkNlmvx+EdKRKs1NViuj0eWqxa4lpqXNAtVjji+kVCbpSyHTLMsB1kvcQ5T8gKU62sqxNQC5doSh1sHVEulma0ZidBaOcfCyxGszW4dEPkByrVFQiVKUF3bOnBaalGgGGQjW6vvpzRMYC+chCUVoz2MckBWlh7RW9cLUK6v9WxL4YkvpHVAubYamet9n7mqgGopXwM2diMQu4XUqObFytIsZ6xVTM8LSK529TyA6PqaqkFT7Q2TFCIQaRW7oUKaoDwB5CpQ8ACQq4MNowJMtZUFiEGkCOsl3co4MV4BcnWcbBgdeK7FZ7ZE14GjagdJTCQirG5zYVXjq/ELmqv9PokSGFdHkLWq0YGlWsiCRiSmp4W2Kn7BcXWeK8FxFWlsV5RAqb6mw3AxTdbe8BD9CixECDA9R5B2APBUPaYYxVfaxvrEbMPrFTjXArEtaC1442vuBkxXdQVJtWUliuKHSLF8PgTJVTyqQRtfOxq1VQ9BUi24vraMQApsismJtGzz+UJgri1+1IM0vt72FpbOkFQdNKrR+D0O0AmWaytlRw94HV+cEyTVVlyePB5pvww2j13vNwO5CtOhD5Bci/3VWmmYYo+UH04uncG1FOJmQbCRsJatVdhP1zZL3Lptv5L1Br4AUwXH8ducfDhXvj3xB0I6gFwdqtTWgeRa7BMvdl0FUEtRcH+hWmCtKva52WuaOVmvZMfwBJpqKGyWjJJG1bjY0AHk6mJDB6jrZkkHUEuRSUIkCRbxt+ydkjEOnMHYet/rCZRrwd8J1vg+730f8jP7IkkHjqqDdbArZYgrYKq/n//nNfKfkf+M/Oe3OCuXAdbn0wBVT95dBlhTOxHb0h0Ft8sh1sx8gKqLs0EO70yIrtMLIbZ0ajnEujR/U5cB) For the RB3 Gen 2 vision kit, the following DTBs are combined to generate the `combined-dtb.dtb` combined DTB. The following code snippet is from the `conf/machine/qcs6490-rb3gen2-vision-kit.conf` file: KERNEL_DEVICETREE = " \ qcom/qcs6490-addons-rb3gen2-video-mezz.dtb \ qcom/qcs6490-addons-rb3gen2-vision-mezz.dtb \ qcom/qcs6490-addons-rb3gen2-ptz-mezz.dtb \ qcom/qcs6490-addons-rb3gen2-ia-mezz.dtb \ qcom/qcs5430-fp1-addons-rb3gen2-vision-mezz.dtb \ qcom/qcs5430-fp2-addons-rb3gen2-vision-mezz.dtb \ qcom/qcs5430-fp2p5-addons-rb3gen2-vision-mezz.dtb \ qcom/qcs5430-fp3-addons-rb3gen2-vision-mezz.dtb \ " Copy to clipboard **DTB partition** - A `vfat` image named `dtb.bin` is generated, which contains the combined DTB image. A dedicated partition named `dtb` is created and `dtb.bin` is flashed on this partition. - The UEFI parses the combined DTB present in the `dtb` partition and selects a matching DTB for the hardware. ![../../_images/Create_sign_DTB.png](data:image/png;base64,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) **Create/sign DTB** ## Partitioning This section describes how you can add, delete, modify, and rename partitions. Qualcomm Linux release provides a pre-generated `partition.xml` file, which you can use directly. The pre-generated file is delivered as part of the `QCM6490_bootbinaries.zip` file. When a build is initiated, the `partition.xml` file from `QCM6490_bootbinaries.zip` is used and steps 3 to 5 are run from [Ptool workflow](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#ptool-workflow) figure. To add, delete, modify, and rename partitions, change the partition layouts for the UFS disk. Qualcomm Linux provides configuration files, which define partitions for the UFS devices. The configuration files are in `meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/`. By modifying these configuration files and integrating these in the build, you can generate a partition layout. When a configuration file from `meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/` is used in Qualcomm Linux builds, the workflow spans all the steps from the [Ptool workflow](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#ptool-workflow) figure. The following table lists the files and tools used for partitioning: | File or tool | Description | | --- | --- | | Partition layout file (optional) | Defines all partitions for storage in JSON format. | | gen\_partition tool (optional) | Reads the partition layout file and generates an internal XML format handled by the Qualcomm Ptool. | | Partition XML (mandatory) | Defines the Qualcomm internal XML format. | | Ptool (mandatory) | Qualcomm Ptool that converts information in partition XML to GPT binaries. | The partition definitions in JSON format (used by the .conf files), existing partitions, and the tool that generates the GUID partition table for Qualcomm reference devices are as follows: Note The following partition layout and examples are specific to UFS. - **Partition layout file** The UFS on the device is partitioned to store various images of the bootchain and the high-level OS. The configuration file contains details about the partitions that are configured for a specific Qualcomm reference device. For the RB3 Gen 2 Qualcomm reference device, the UFS flash partitions are defined in the following configuration file in the workspace: `meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/qcm6490-partitions.conf`. - **Partition layout file syntax** The following examples from the `qcm6490-partitions.conf` file show the syntax of the partition layout file. The first entry in the configuration file defines the disk type, disk size, LBA size (sector size), and whether the last partition should grow till the last usable LBA. # select disk type emmc | nand | ufs mandatory # disk size in bytes is mandatory --disk --type=ufs --size=137438953472 --write-protect-boundary=0 --sector-size-in-bytes=4096 --grow-last-partition Copy to clipboard The following examples of partitions are specified in the `qcm6490-partitions.conf` file. A few partitions are defined in LUN0, with each line representing an individual partition. Note In the following examples, the `firmware-qcom-bootbins_1.0.bb` recipe downloads the `partition.xml` file from [Qualcomm software center](https://softwarecenter.qualcomm.com/) and takes the GUIDs from it. - Example 1: The `ssd` partition of 8 KB is defined for LUN0. This partition does not require a file flashed to be flashed. --partition --lun=0 --name=ssd --size=8KB --type-guid=2C86E742-745E-4FDD-BFD8-B6A7AC638772 Copy to clipboard - Example 2: The `misc` partition of 1024 KB is defined for LUN0. This partition does not require a file to be flashed. --partition --lun=0 --name=misc --size=1024KB --type-guid=82ACC91F-357C-4A68-9C8F-689E1B1A23A1 Copy to clipboard A couple of partitions are defined in LUN1. Each line defines an individual partition: - Example 3: The `xbl_a` partition of 3604 KB is defined for LUN1. The `xbl.elf` file is flashed to this partition. #This is LUN 1 - Boot LUN A --partition --lun=1 --name=xbl_a --size=3604KB --type-guid=DEA0BA2C-CBDD-4805-B4F9-F428251C3E98 --filename=xbl.elf Copy to clipboard - Example 4: The `xbl_config_a` partition of 300 KB is defined for LUN1. The `xbl_config.elf` file is flashed to this partition. #This is LUN 1 - Boot LUN A --partition --lun=1 --name=xbl_config_a --size=512KB --type-guid=5A325AE4-4276-B66D-0ADD-3494DF27706A --filename=xbl_config.elf Copy to clipboard A partition defined in LUN4: - Example 5: The `aop_a` partition of 512 KB is defined for LUN4. The `=aop.mbn` file is flashed to this partition. --partition --lun=4 --name=aop_a --size=512KB --type-guid=D69E90A5-4CAB-0071-F6DF-AB977F141A7F --filename=aop.mbn Copy to clipboard The options used for each partition entry are as follows: - Mandatory options: --lun (mandatory for UFS, optional for emmc. Expressed as number) --name (name for the partition, a string) --size (size of the partition, generally expressed in KB) --type-guid (GUID for the partition) Copy to clipboard - Optional options: --attributes (Optional 64 bit attribute, e.g., 1000000000000004) --filename (Name of the file that is flashed to the partition) --readonly (whether the partition should be read-only, values true or false) --sparse (whether the partition is for a sparsed image, values true or false) Copy to clipboard - **Linux HLOS partitions** | Partitions | Description | | --- | --- | | EFI partition | The ESP contains `Esp.bin` and a `vfat` file. It contains all the
details necessary for UEFI to enable systemd-boot. For more information on this image, see
[EFI image](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#efi-image-section). | | Rootfs partition | This partition is used to flash the `system.img` image file. This image consists of all the
user space libraries and binaries. | | Overlay partition | This partition is left empty. On bootup, a file system is seeded into this partition that is used as an
overlay on a few of the `/var` mount points. The image in this file system works as a writable
storage file system. The associated IMAGE\_FEATURES with this image is `overlay-etc`. | - **Partition tool (Ptool)** To partition the storage on the device, use the `gen_partition` command to generate a `partitions.xml` file, and then process the file with Ptool. Ptool generates a GUID partition table binary that the QDL tool uses to partition the flash. The Ptool workflow is shown in the following figure: ![../../_images/ptool.png](data:image/png;base64,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) **Ptool workflow** The `qcm6490-partitions.conf` file present in the `/layers/meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs` directory define all the partitions. The `gen_partition.py` tool processes and generates `partition.xml`, which is a mandatory input for `ptool.py`. As a final step, Ptool generates the `rawprogram.xml`, `patch.xml`, `gpt_main*.bin`, and `gpt_backup*.bin` files, which are required by the QDL tool to flash the device. To add a partition, make a partition entry in the configuration file; for example `qcm6490-partitions.conf` with a universal unique identifier (UUID). After updating the conf file, to switch the preferred provider of virtual/partconf to `qcom-partition-confs_1.0.bb`, add the following line to `local.conf`. PREFERRED_PROVIDER_virtual/partconf = "qcom-partition-confs" Copy to clipboard After adding the entry, run the BitBake command to generate all necessary files: bitbake Copy to clipboard After the image build is complete, run the following command to flash the image: cd /build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-console-image ./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml Copy to clipboard ## Containerization Docker containers are enabled in Qualcomm Linux. To use Docker, ensure that the containerization features are enabled in Qualcomm BSP, which are integrated and tested. To use containerization on Qualcomm Linux Embedded devices, ensure that the `meta-virtualization` layer is added as part of the workspace. - **Docker** Docker is enabled in `qcom-multimedia-image`: 1. For the `qcom-multimedia-image` image recipe, `packagegroup-container` is included using `meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-multimedia.bb`. 2. After the image is built and flashed, Docker is available on the device. 3. To verify kernel compatibility, run the `check-config.sh` script on the device. To verify the configuration, enable the required kernel configurations and rebuild the image. For more information, see [Kernel compatibility](https://docs.docker.com/engine/install/troubleshoot/#:~:text=Kernel%20compatibility,check%2Dconfig.sh%20script.&text=The%20script%20only%20works%20on%20Linux). 4. To verify the status of the Docker daemon, run the following command and verify the output: | Command | Description | Output | | --- | --- | --- | | `systemctl status docker` | If Docker commands have been run at least once after boot-up | Active (running) | | `systemctl status docker` | If the device has not run any Docker commands after boot-up | Inactive (dead) | | | | | The images pulled from the Docker repository for the `linux/arm64` platform and tested to run successfully on the device are as follows: > > > - `busybox` > - `python` > - `alpine` > - `ubuntu` > - `postgres` > - `mongo` > - `nginx` > - `redis` The following use cases are verified with Docker enabled: - Load Docker images from tar files using the Docker load utility. - Build a Docker image from the Docker file. - Save Docker images that were pulled/built into a `.tar` file. - Load Docker images, which are saved as `.tar` files. - Run multiple container instances of multiple images pulled/built. - Verify the list of Docker images loaded on the device. - Verify the list of active and total containers on the device. - Inspect Docker images using the Docker inspect utility. - Obtain logs from a container using the Docker logs utility. - Stop and kill the container using the Docker stop and Docker kill utilities. - Remove containers and Docker images from the device. - **Hardware node access from Docker** The applications running inside a Docker container need access to device nodes and files from the device (target-host). Applications running inside containers can access the device nodes. This is performed by passing the respective device nodes as an option with the run command for Docker: docker run -it --rm --device= --device= Copy to clipboard The device nodes to be passed are in the `/dev/` directory on the device. Depending on the use case, for example, in a graphics scenario, `/dev/kgsl-3d0` is one of the nodes to be passed to the Docker using `--device=/dev/kgsl-3d0`. The storage partition access from Docker files/directories from the device (target-host) can also be exposed to the inside of a container. To expose files/directories as bind mounts, run the following command: docker run -it --rm --mount type=bind,source=,target= Copy to clipboard Run a docker container exposing multiple directories, files, and device nodes to the inside of the container using the following command: docker run -it --rm --device= --device= --mount type=bind,source=,target= --mount type=bind,source=,target= Copy to clipboard - **Docker-compose** Docker-compose is a tool for defining and running multicontainer applications. It simplifies the management of the entire application stack by allowing you to define services, networks, and volumes in a single, comprehensible YAML configuration file. By default, the Qualcomm Linux release includes Docker-compose in the image. The `python3-docker-compose` package is added to the `packagegroup-qcom-multimedia` package group in the `meta-qcom-distro` metadata layer. **To run docker-compose on the device:** 1. Create or copy the Docker-compose YAML files under the writable path on a device such as `/var` (for example `/var/docker-compose-yaml`) to be used with Docker-compose on the device. 2. Ensure that the Docker images listed in your Docker-compose YAML files are available on the device. The containers started by the Docker-compose utility need these images. 3. To run Docker-compose for multiple YAML files, run the following command: docker-compose -f .yml -f .yml up Copy to clipboard Docker-compose runs and initiates Docker containers as configured in the Docker-compose YAML file. After the Docker-compose command returns, run `docker ps -a` and docker logs `` to verify if the docker containers are running as expected. To know more about Docker-compose, see [Docker-compose overview](https://docs.docker.com/compose). ## Kubernetes overview Kubernetes is an open-source platform used to automate the deployment, scaling, and management of applications running in a container. It helps organize containers across multiple devices, ensuring efficient resource utilization, high availability, and scalability of applications. For more information on Kubernetes, see [https://kubernetes.io/](https://kubernetes.io/). - **Enable Kubernetes** - The Qualcomm Linux release enables Kubernetes by default in `qcom-multimedia-image`, through the following changes: - `packagegroup-qcom-k8s` is defined in `meta-qcom-hwe`. - `packagegroup-qcom-k8s` is included in `recipes-products/packagegroups/packagegroup-qcom-multimedia.bb`. - The Qualcomm Linux kernel has the following kernel configurations enabled in `arch/arm64/configs/qcom_defconfig` to support the Kubernetes runtime: - CONFIG_CGROUP_FAVOR_DYNMODS=y Copy to clipboard - CONFIG_CFS_BANDWIDTH=y Copy to clipboard - CONFIG_CGROUP_HUGETLB=y Copy to clipboard - CONFIG_NETFILTER_XT_MATCH_COMMENT=m Copy to clipboard - CONFIG_IP_NF_TARGET_REDIRECT=m Copy to clipboard - CONFIG_HUGETLBFS=y Copy to clipboard - To verify the status of kubelet, run the following command and verify the output: | Command | Description | Output | | --- | --- | --- | | `systemctl status kubelet` | If the device has been set up at least once as a Kubernetes node using kubeadm after bootup | Active (running) | | `systemctl status kubelet` | If the device has not been set up as a Kubernetes node using kubeadm after bootup | Inactive (dead) | | | | | Kubernetes operates with containers that run as pods, which allow you to package an application along with its dependencies (libraries and configuration files) into a single unit. This simplifies deployment and ensures consistency across different environments and nodes of a cluster. A node in the context of Kubernetes refers to a device or a machine. The Kubernetes architecture has two types of resources: - **Master node/control plane:** The master node is the device that acts as the control plane for Kubernetes. It makes global decisions about the cluster (such as scheduling), and detects and responds to cluster events (such as starting up a new container when a replica field of deployment is not met). - **Worker nodes:** These nodes are devices that contain the necessary services to run containers, managed by the master node. Each worker node runs `Kubelet`, a process responsible for communication between the Kubernetes master node and the worker node; it manages the pods running on a machine. A pod is the smallest unit of execution in Kubernetes. It represents a single instance of a running process in a cluster acting as an abstraction to the containers run by Kubernetes. - **Kubernetes nodes example** The following is an example of two devices connected as nodes to a common access point: - **Master node**: One of the devices is designated as the master node. - **Worker node**: The other device serves as the worker node. Deployments and pods created from the master node run on the worker node. Deployments and pods are created using YAML files. These files define the preferred state of deployments and pods at the time of creation. Users can enter the shell of these pods/containers to debug, monitor, and perform other tasks from both the master node and the worker node. - **Set up a device as a master node** To set up a device as a master node, do the following: 1. Connect the device to Wi-Fi. 2. To initialize the Kubernetes control plane, run the following command: kubeadm init --ignore-preflight-errors=SystemVerification --apiserver-advertise-address= Copy to clipboard Note `` is the IP address of the `wlan0` interface, which is the output of the `ifconfig` command after connecting the device to Wi-Fi. 3. To start using the cluster, run the following commands as the root user: mount -o remount, rw / mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config Copy to clipboard After initializing of the device as master node/control plane using `kubeadm init`, `kubeadm` prints the command that must be used for any device to join the cluster as a worker node. - **Set up a device as a worker node** To set up the device as a worker node and join the cluster, run the `kubeadm join` command, where `kubeadm` prints after initializing the master node. Note To suppress an error that Kubernetes reports when running Docker with the vfs graph driver, run the `--ignore-preflight-errors=SystemVerification flag` with the `kubeadm join` command. Note Each node in a cluster is expected to have a different hostname. To add multiple devices with the same hostname to a cluster, use the `hostname ` command to change their hostnames if necessary. - **Create deployment and pods from a master node** To create deployments and pods on the master node, run the following command: kubectl apply -f Copy to clipboard Create your own YAML file at a location such as `/var`. Example for YAML files are as follows: - YAML file to create a deployment with the Ubuntu image: **ubuntu-deployment.yaml** apiVersion: apps/v1 kind: Deployment metadata: labels: app: ubuntu-deployment name: ubuntu-deployment spec: replicas: 2 selector: matchLabels: app: ubuntu-deployment template: metadata: labels: app: ubuntu-deployment spec: containers: - name: ubuntu-depl-pod image: ubuntu:latest command: ["sleep", "3650d"] Copy to clipboard - YAML file to create a pod with the Ubuntu image: **ubuntu-pod.yaml** apiVersion: v1 kind: Pod metadata: name: ubuntu-pod labels: app: ubuntu-pod spec: containers: - name: ubuntu image: ubuntu:latest command: ["sleep", "604800"] imagePullPolicy: IfNotPresent restartPolicy: Always Copy to clipboard - **Use Kubernetes pods with** `kubectl` - **Use** `kubectl` **get nodes in the cluster** To list the nodes in the cluster, run the following command on the master node: kubectl get nodes Copy to clipboard - **Use** `kubectl` **get deployments present in the cluster** To list the deployments present in the cluster, run the following command on the master node: kubectl get deployment Copy to clipboard - **Use** `kubectl` **get pods present in the cluster** To list the pods present in the cluster, run the following command on the master node: kubectl get pods Copy to clipboard - **Access the shell of a pod from the master node** To access the shell instance of a pod from the master node, run the following command on the master node: kubectl exec -it -- Copy to clipboard - **Access shell of a pod from the worker node** To access the shell instance of a pod (container) using Docker, run the following command on the worker node: docker exec -it Copy to clipboard Note `` is obtained by listing all the containers using the `docker ps -a` command. **Changes made in Docker and Kubernetes in contrast to the upstreamsolution** - The `meta-qcom-hwe`/`recipes-containers`/`docker`/`docker-ce_git.bbappend` recipe changes `/lib/systemd/system/docker.service`. During this change, `--exec-opt native.cgroupdriver=systemd` is passed to a `dockerd` command that runs as part of `ExecStart` of the service. This is performed to keep parity with `cgroupdriver` between Docker and Kubernetes. - The `meta-qcom-hwe`/`recipes-containers`/`kubernetes`/`kubernetes_git.bbappend` recipe changes `/lib/systemd/system/kubelet.service.d/10-kubeadm.conf`. During this change, `--fail-swap-on=false` is passed as part of `KUBELET_EXTRA_ARGS`. This is performed because Kubernetes expected the swap to be **OFF**. As the platform software of Qualcomm has zram enabled, swap is set to **ON**. - The upstream `kubelet.service` attempts to start automatically upon device bootup, even if the device is not configured as a Kubernetes node. However, this behavior consumes resources and impacts power efficiency. To address this, `kubelet.service` is modified by removing `WantedBy=multi-user.target` in the `meta-qcom-hwe/recipes-containers/kubernetes/kubernetes_git.bbappend` file. With `WantedBy=multi-user.target` deleted, the upstream `kubelet.service` starts when the device is set up as a Kubernetes node using `kubeadm`, rather than automatically in `multi-user.target`. ## Properties Properties (`property-vault`) provide functionality to store and share key-value pairs stored as strings across the system. Any software component can share any value for a particular key and any other process can access the value by using the same key. `property-vault` allows you to define persistent properties across reboot. Components can use `property-vault` to share specific information, which might be relevant to any other module on the device. These key-value pairs can be accessed using the command-line interface (CLI). Note `property-vault` is compatible only with `qcom-custom-bsp`. - **Configure properties using CLI** To set a property using the CLI, use the following command: setprop "my-key" "my-value" Copy to clipboard To access a property using the CLI, use the following command: getprop "my-key" Copy to clipboard Result of `the getprop "my-key"` command: my-value To set a property using the CLI and persist it across reboots, use the following command: setprop "persist.my-key" "my-value" Copy to clipboard - **Properties in C/C++ source files** To use the properties in C/C++ source files, do the following: 1. To use properties such as `property-vault` in a recipe, for example, `example-recipe.bb`, add a dependency on `property-vault`: DEPENDS = "glib-2.0 property-vault" RDEPENDS:${PN} = "property-vault" Copy to clipboard 2. Change `make` files: 1. If you are using `automake`: `configure.ac` ... PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes, AC_MSG_ERROR(GLib >= 2.16 is required)) GLIB_CFLAGS="$GLIB_CFLAGS" GLIB_LIBS="$GLIB_LIBS" AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) AC_CONFIG_FILES([Makefile]) ... Copy to clipboard `Makefile.am` root_sbindir = "/sbin" root_sbin_PROGRAMS = property-test property_test_SOURCES = source.c property_test_CFLAGS = @GLIB_CFLAGS@ property_test_LDFLAGS = @GLIB_LIBS@ -lpropertyvault Copy to clipboard 2. If you are using `cmake`: `CMakeList.txt` set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -lpthread -lrt -lm -lglib-2.0 -ldl -latomic") target_link_libraries (techteamlocalibname propertyvault) Copy to clipboard 3. Modify the source files to `get` and `set` properties: `source.c` #include "properties.h" int main() { // setting a property property_set("my-key", "my-value"); // getting a property char paramstr[PROPERTY_VALUE_MAX]; property_get("my-key", paramstr, ""); // value gets stored in paramstr // setting a property and persisting it across reboot property_set("persist.my-key", "my-value"); return 0; } Copy to clipboard ## Log shim for syslog() Logs from Qualcomm-proprietary and open-source projects are recorded into `syslog`. `syslog()` is used to write logs on the device. Use `rsyslog` as the logging system to process logs according to specified rules. `rsyslog` can accept inputs not only from the system and kernel messages, but also from applications that use `syslog protocol` for logging. When an application makes a `syslog` call, `rsyslog` redirects these logs based on its configuration. The `rsyslog` configuration is found in the `/etc/rsyslog.conf` or `/etc/ryslog.d` directory. Use the `logrotate` service for archiving old logs. Note Logging shim is compatible only with `custom` variant. ## Persist partition The persist partition defined for the UFS is used to store persistent data that the BSP software components require across reboots. User-requested operations must not erase this data during the device lifecycle. - **Persist mount point** The `/var/persist` directory serves as a mount point for a file system, which is created on the partition named persist. The `overlayfs-qcom-paths_1.0.bb` recipe is responsible for creating the directory on the rootfs and installing the `var-persist.mount` systemd unit to `local-fs.target`. At bootup, the `var-persist.mount` systemd unit mounts `/dev/disk/by-partlabel/persist` on `/var/persist`. To display the persist mount point, run the mount command as follows: sh-5.1# mount | grep persist /dev/sda10 on /var/persist type ext4 (rw,relatime,rootcontext=system_u:object_r:qcom_persist_t:s0,seclabel,stripe=128) Copy to clipboard - **Resize persist partition** Resize the overlay partition using the `resize-partitions.bb` recipe and `resize-partition.service.in` files. The resize-partition service runs when the device boots up to create and set the file system according to the size of the partition. ## Secondary virtual machine This section provides the steps for creating Qualcomm Linux host and guest virtual machine (VM) images, including the essential VM management tools such as `crosvm` and `qemu`, along with the commands to launch the guest VM. The following subsections explain how to enable VM support for an image. 1. **Set up the host.** To install clang on the host machine, run the following command: sudo apt install clang-11 Copy to clipboard 2. **Enable the meta-rust layer.** The meta-rust layer provides Rust compiler (rustc) and package manager (cargo) to compile crosvm, which is implemented in the Rust language. Add the meta-rust layer to EXTRALAYERS in the `meta-qcom-distro/conf/bblayers.conf` directory. `vi conf/bblayers.conf` EXTRALAYERS ?= " \ ${WORKSPACE}/layers/meta-rust \ " Copy to clipboard 3. **Upgrade the Rust version.** Create the `meta-qcom-distro/conf/distro/include/rust_version.inc` file with the following content: `vi meta-qcom-distro/conf/distro/include/rust_version.inc` # include this in your distribution to easily switch between versions # just by changing RUST_VERSION variable RUST_VERSION ?= "1.73.0" PREFERRED_VERSION_cargo ?= "${RUST_VERSION}" PREFERRED_VERSION_cargo-native ?= "${RUST_VERSION}" PREFERRED_VERSION_libstd-rs ?= "${RUST_VERSION}" PREFERRED_VERSION_rust ?= "${RUST_VERSION}" PREFERRED_VERSION_rust-cross-${TARGET_ARCH} ?= "${RUST_VERSION}" PREFERRED_VERSION_rust-llvm ?= "${RUST_VERSION}" PREFERRED_VERSION_rust-llvm-native ?= "${RUST_VERSION}" PREFERRED_VERSION_rust-native ?= "${RUST_VERSION}" Copy to clipboard Include the `rust_version.inc` file in the `meta-qcom-distro/conf/distro/qcom-wayland.conf` directory. `conf/distro/qcom-wayland.conf` require conf/distro/include/rust_version.inc Copy to clipboard 4. **Add crosvm to the VM package.** To add crosvm to the host VM packagegroup, run the following command: `vi meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-vm-host.bb` RDEPENDS:packagegroup-qcom-vm-host:append:qcom-custom-bsp = "\ crosvm \ " Copy to clipboard 5. **Build the host VM and the guest VM images.** - To build a Host VM image, run the following command: bitbake qcom-console-image Copy to clipboard - To build a Guest VM image, run the following command: bitbake multiconfig:qcom-guestvm:qcom-guestvm-image Copy to clipboard **Guest VM artifacts** > > > 1. The guest VM build command creates a folder named `tmp-qcom-guestvm-glibc` for the Guest VM image. > 2. The Guest VM kernel and rootfs images are generated in the `tmp-qcom-guestvm-glibc/deploy/images/` directory. > 3. Use the `tmp-qcom-guestvm-glibc/deploy/images//Image` file as the Guest VM kernel image. > 4. Use the `tmp-qcom-guestvm-glibc/deploy/images//qcom-guestvm-image-.ext4` file as the rootfs. > 5. After loading the host build, copy both these images to the disk. 6. **Launch Guest VM.** To launch Guest VM, use the crosvm virtual machine manager (VMM) and the Gunyah hypervisor. Ensure that the Guest VM kernel and the root file system are in the `/var/gunyah` directory on your device and run the following command: crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor gunyah --protected-vm-without-firmware \ --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 --serial=type=stdout,hardware=serial,earlycon,num=1 \ --root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4 --no-balloon --no-rng --params \ "earlyprintk=serial panic=0" /var/gunyah/Image Copy to clipboard - `--root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4` specifies the path to the root file system for the guest VM. - `/var/gunyah/Image` specifies the path to the kernel image. For more information, see [Virtualization](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/features.html#virtualization). ## Handle out-of-tree kernel modules and device tree using recipes To build an out-of-tree kernel module, see [Add kernel module](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#add-kernel-module). Note The out-of-kernel device tree is supported only for the `custom` variant. For device-tree/device-tree blob management, see [Platform support](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#platform-support_0). Last Published: Oct 14, 2024 [Previous Topic Overview](https://docs.qualcomm.com/bundle/publicresource/80-70015-27/topics/intro_yocto_linux_qualcomm.md) [Next Topic User customizations](https://docs.qualcomm.com/bundle/publicresource/80-70015-27/topics/user_customizations.md) Source: [https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html)