# 开发内核

Qualcomm Linux 内核可以使用 Yocto 编译工作流或独立开发。

## 使用 Yocto 开发内核

Qualcomm Linux `meta-qcom-hwe` 层支持 `linux-qcom-base_6.6.bb` 和 `linux-qcom-custom_6.6.bb` 配方，这些配方为受支持的机器获取并编译 Qualcomm Linux 内核。

要使用 Yocto 开发工作流开发内核，请参阅以下部分。有关 Yocto 配置、主机补丁及其应用方法的更多信息，请参阅 [Yocto Project Linux Kernel Development](https://docs.yoctoproject.org/1.5/kernel-dev/kernel-dev.html#applying-patches)。

## 获取内核源代码

内核源代码可作为 BitBake 编译版本的一部分从 Codelinaro 存储库中获取。

**Yocto 内核**

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
    bitbake qcom-console-image
    
    # kernel source is downloaded under following location
      ls build-qcom-wayland/tmp-glibc/work-shared/<SoC>-<board>-<variant>/kernel-source/
      arch     Documentation  ipc       MAINTAINERS  samples   virt
      block    drivers        Kbuild    Makefile     scripts
      certs    fs             Kconfig   mm           security
      COPYING  include        kernel    net          sound
      CREDITS  init           lib       README       tools
      crypto   io_uring       LICENSES  rust         usr
    Copy to clipboard

Note

该命令的计算机名称与 SoC-board-variant 名称相同。例如，对于 QCS6490 SoC，机器名称为 `QCS6490`，板卡为 `rb3gen2`，变体为 `Visionkit`。

有关设置和获取源代码的更多信息，请参见 [Qualcomm Linux 编译指南](bundle/publicresource/topics/80-70020-254)。

## 获取内核配方

Qualcomm Linux 维护 `meta-qcom-hwe` 层，并将内核配方文件托管在以下位置：

- 基本 BSP：`meta-qcom-hwe/recipes-kernel/linux//linux-qcom-base_6.6.bb` 文件。
- 自定义 BSP：`meta-qcom-hwe/recipes-kernel/linux//linux-qcom-custom_6.6.bb` 文件。

`PREFERRED_PROVIDER_virtual/kernel` 在 `meta-qcom-hwe/conf/machine/include/qcom-base.inc` 文件中定义为 `linux-qcom-base` 或 `linux-qcom-custom`。

如需获取内核配方，运行以下命令：

# kernel recipe location
       ls -l meta-qcom-hwe/recipes-kernel/linux/
       linux-kernel-headers-install_6.6.bb
       linux-kernel-qcom-headers_6.6.bb
       linux-qcom-base-6.6
       linux-qcom-base_6.6.bb
       linux-qcom-custom
       linux-qcom-custom_6.6.bb
    Copy to clipboard

## 解压内核源代码

克隆元数据层后，解包内核源代码，以便进行开发和定制。

要解包源代码，请运行以下命令：

# unpack kernel
    # checkout kernel source aligned to upstream LTS base with patches applied from recipe
    # Following would checkout kernel source in build-qcom-wayland/workspace/sources/linux-qcom-base/
    $  devtool modify linux-qcom-base
    Copy to clipboard

Note

对于定制 BSP 变体，请使用 `linux-qcom-custom`。

## 更改内核

内核的更改或定制在 `build-qcom-wayland/workspace/sources/linux-qcom-base` 工作区进行。

若要修改内核配置，可运行以下命令：

# Modify sources in build-qcom-wayland/workspace/sources/linux-qcom-base, or update kernel configuration by running makemenufonfig
      devtool menuconfig linux-qcom-base
    
    # config fragment is updated in following location
      ls build-qcom-wayland/workspace/sources/linux-qcom-base/oe-local-files/devtool-fragment.cfg
    devtool-fragment.cfg
    
    # you may do other changes to kernel and commit
    Copy to clipboard

Note

对于定制 BSP 变体，请使用 `linux-qcom-custom`。

## 提交内核更改

要提交更改，请运行以下 Git 命令：

cd build-qcom-wayland/workspace/sources/linux-qcom-base
    git add .
    git commit -s -m "my changes"
    Copy to clipboard

## 编译内核镜像

完成更改后，若要编译内核和镜像，请运行以下命令：

> 
> 
> # to build kernel use
>       devtool build linux-qcom-base
>     Copy to clipboard

# and following to build the image
      devtool build-image qcom-console-image
    Copy to clipboard

# built images are produced in standard location
      ls build-qcom-wayland/tmp-glibc/deploy/images/<SoC>-<board>-<variant>/
    Copy to clipboard

Note

要编译定制 BSP，使用 `linux-qcom-custom`。

## 维护内核更改

使用 Devtool 开发并导出补丁，并在 `meta-mylayer` 层创建一个附加文件。要创建自己的层，首先将其添加到主机内核 `bbappend` 文件并进行更改。

运行以下命令，在元数据层创建并添加内核补丁：

# create your own layer first and add it to host kernel bbappend and changes
      bitbake-layers create-layer ~/meta-mylayer
    # mkdir -p ~/meta-mylayer/recipes-kernel/linux/linux-qcom-base
      bitbake-layers add-layer ~/meta-mylayer
    
    # following would update the meta-mylayer recipe and the change
      devtool finish linux-qcom-base ~/meta-mylayer
    
    # devtool finish shall populate the meta-mylayer recipes along with patches,
    
      ls -R meta-mylayer/recipes-kernel/
    meta-mylayer/recipes-kernel/:
    linux
    
    meta-mylayer/recipes-kernel/linux:
    linux-qcom-base  linux-qcom-base_%.bbappend
    
    meta-mylayer/recipes-kernel/linux/linux-qcom-base:
    0001-my-patch.patch  devtool-fragment.cfg
    
      less meta-mylayer/recipes-kernel/linux/linux-qcom-base%.bbappend
    FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
    
    SRC_URI += "file://devtool-fragment.cfg \
                file://0001-my-patch.patch"
    Copy to clipboard

运行 `devtool finish` 命令后，`~/meta-mylayer` 层会更新以下内容：

- 相应的内核更改以补丁形式托管在 `meta-mylayer/recipes-kernel/linux/linux-qcom-base/*.patch`。
- 使用这些补丁添加和更新 `meta-mylayer/recipes-kernel/linux/linux-qcom-base_%.bbappend SRC_URI`。
- 开发完成后移除 `build-qcom-wayland/workspace`。

Note

对于定制 BSP 变体，请使用 `linux-qcom-custom`。

## 清理工作区

使用以下 Devtool 和 BitBake 命令清理工作区：

# to remove layer
      bitbake-layers remove-layer ~/meta-mylayer
    
    # to clean complete workspace
      bitbake -c cleanall <recipe-name>
    
    # reset using Devtool
      devtool reset linux-qcom-base
    
    # manually delete the workspace directory
      rm -rf build-qcom-wayland/workspace/sources/linux-qcom-base
    Copy to clipboard

## 配置内核

Yocto 编译系统用于修改内核配置，同时调用 `menuconfig`。

若要修改内核配置，可运行以下命令：

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
     bitbake linux-qcom-base -c menuconfig
    
    # Above would update .config in kernel build directory build-qcom-wayland/tmp-glibc/work/<SoC>-<board>-<variant>/linux-qcom-base/6.6-r0/build/
    # one can create a config fragment for modifications made by issuing following
    
      bitbake linux-qcom-base -c diffconfig
    
    # Above would create fragment.cfg in build directory build-qcom-wayland/tmp-glibc/work/<SoC>-<board>-<variant>/linux-qcom-base/6.6-r0/
    Copy to clipboard

或者，使用 Devtool 工具修改内核配置：

devtool modify linux-qcom-base
     devtool menuconfig linux-qcom-base
     devtool finish linux-qcom-base ~/meta-mylayer
    
    # this would create a config fragment as a patch and update in your meta layer
    Copy to clipboard

Note

对于定制 BSP 变体，请使用 `linux-qcom-custom`。

有关内核配置的更多 Yocto 相关信息，请参阅 [Configuring the Kernel](https://docs.yoctoproject.org/4.3.1/kernel-dev/common.html#configuring-the-kernel)。

`linux-kernel-qcom-base_6.6.bb` 或 `linux-qcom-custom_6.6.bb` 内核配方文件使用以下配置片段来编译镜像：

例如，`linux-qcom-custom_6.6.bb` 使用以下片段来追加内核：

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

若要使用调试配置片段生成调试版本，可运行以下命令：

# Set DEBUG_BUILD to 1 to compile debug-enabled build
    
      source setup-environment
      DEBUG_BUILD=1 bitbake linux-kernel-custom
    Copy to clipboard

有关不同配置片段的更多信息，请参阅 [Qualcomm Linux 内核入门](https://docs.qualcomm.com/doc/80-70020-3SC/topic/getting_started_chapter2.html)。

## 创建调试编译版本

要创建调试编译版本，请在 shell 中将 `DEBUG_BUILD=1` 作为参数传递：

# setup the build environment
      export SHELL=/bin/bash
    
      MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland QCOM_SELECTED_BSP=base source setup-environment
    
    # build qcom linux console image
      DEBUG_BUILD=1 bitbake qcom-console-image
    Copy to clipboard

Note

对于定制 BSP 变体，请使用 `QCOM_SELECTED_BSP=custom`。

## 更新内核命令行参数

要更新内核命令行，请在相应的 SoC 特定机器包含文件中修改 Yocto 配置变量 `KERNEL_CMDLINE_EXTRA`。例如，`meta-qcom-hwe/conf/machine/include/qcom-<SoC>.inc`。

要更新内核命令行，请修改以下变量：

KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon"
    Copy to clipboard

### 更新 ESP 镜像

使用以下步骤编译 systemd-boot 启动管理器和内核镜像，将其打包为 UKI type-2 镜像文件：

针对硬件 SoC 的 Yocto 编译版本会生成所有需要的镜像，并将启动镜像打包为 `efi.bin`，以便刷写到 EFI 分区中。`efi.bin` 文件由 systemd-boot 启动管理器和内核镜像组成，它们被封装为 UKI type-2 镜像格式。

更新内核源、配置或 DTS 后重新编译 EFI 镜像，并刷写生成的 `efi.bin` 到 EFI 分区。

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
    
    # build qcom linux console image
      DEBUG_BUILD=1 bitbake qcom-console-image
    
    # build images are produced in following directory
      ls build-qcom-wayland/tmp-glibc/deploy/images/<SoC>-<qcom>-<variant>/efi.bin
    efi.bin
    
    # reboot into fastboot
      fastboot flash efi efi.bin
      fastboot flash dtb_a dtb.bin
    Copy to clipboard

有关 UKI type-2 镜像格式的更多信息，请参见 [Type #2 EFI Unified Kernel Images](https://uapi-group.org/specifications/specs/boot_loader_specification/#type-2-efi-unified-kernel-images)。

有关 ESP 的更多信息，请参阅[启动](https://docs.qualcomm.com/doc/80-70020-3SC/topic/features.html#boot)和[调通设备](https://docs.qualcomm.com/doc/80-70020-3SC/topic/getting_started_chapter2.html#flash-images-and-boot)。

## 自定义 initramfs 包

要更新 initramfs 包，请修改 `meta-qcom-hwe/recipes-kernel/images/initramfs-qcom-image.bbappend` 文件中的 `PACKAGE_INSTALL` 列表：

less meta-qcom-hwe/recipes-kernel/images/initramfs-qcom-image.bbappend
    
    # Add additional packages needed as part of initrd
    PACKAGE_INSTALL += " \
        e2fsprogs \
        e2fsprogs-e2fsck \
        e2fsprogs-mke2fs \
        e2fsprogs-resize2fs \
        e2fsprogs-tune2fs \
        ${VIRTUAL-RUNTIME_dev_manager} \
        os-release-initrd \
        "
    Copy to clipboard

## 添加内核模块

按照以下步骤，通过 Yocto 编译系统编译树外的内核模块：

1. 为树外内核驱动程序创建 `Makefile`。

> 
> 
> 以下是树外内核驱动程序的 `Makefile` 示例：

all: modules
    obj-m := hello.o
    
    SRC := $(shell pwd)
    
    modules:
      $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules $(KBUILD_OPTIONS)
    
    modules_install:
      $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
    Copy to clipboard

2. 将模块集成到 Yocto 编译系统中。请参阅以下示例，了解如何使用 Yocto 模块类集成内核模块。

DESCRIPTION = "${SUMMARY}"
    LICENSE = "GPL-2.0-only"
    LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/${LICENSE};md5=801f80980d171dd6425610833a22dbe6"
    
    inherit module
    
    SRC_URI += "file://Makefile \
                file://hello.c  \
                file://COPYING  \
                "
    S = "${WORKDIR}"
    
    EXTRA_OEMAKE += "MACHINE='${MACHINE}'"
    MAKE_TARGETS = "modules"
    MODULES_INSTALL_TARGET = "modules_install"
    
    # Kernel module to be autoloaded
        KERNEL_MODULE_AUTOLOAD += "hello"
    
    # The inherit of module.bbclass will automatically name module packages with
    # "kernel-module-" prefix as required by the oe-core build environment.
    
    RPROVIDES_${PN} += "kernel-module-hello"
    Copy to clipboard

有关树外模块的更多信息，请参见 [Working with Out-of-Tree Modules](https://docs.yoctoproject.org/kernel-dev/common.html#working-with-out-of-tree-modules)。

## 配置 DTB 支持

Qualcomm Linux 按照以下步骤来选择设备树文件、更改内核配置以及编译树外内核模块。

## 平台设备树

Qualcomm Linux 支持设备树叠加功能，以维护设备外树 blob 并将其与基线设备树 blob 合并。SoC 设备树支持存在于 `arch/arm64/boot/dts/qcom` 目录中的内核源代码中。

Qualcomm 设备树源文件列出了设备树，并进行明确区分，以包含下游增加的配置，同时支持与上游对齐的基本配置。

下游内容托管在内核源代码之外。树外驱动程序在内核之外维护增加的设备树叠加内容。在编译过程中，相应的设备树叠加文件与基本的板级 DTB 合并，生成统一的 DTB，与启动镜像配合使用。

下图显示了 QCS6490 上设备树叠加的编译过程以及自定义 BSP 的 DTB 生成：

Note

- 基本 BSP 遵循相同的编译过程，不包含 **addons** 下游设备树文件。
- 对于 DT 叠加 和 DTB 生成，所有支持的 Qualcomm 硬件 SoC 都遵循相同的编译流程。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export device-tree.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11.8611in" height="9.41319in" viewbox="0 0 853.999 677.749" xml:space="preserve" color-interpolation-filters="sRGB" class="st29" aria-label="../_images/device-tree.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false"></v:documentproperties>
<style>.svg-1 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-width: 2 }
.svg-1 .st2 { fill: none }
.svg-1 .st3 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st4 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st5 { fill: #8d8df7; stroke: #fafafa; stroke-width: 1.5 }
.svg-1 .st6 { fill: #ffffff; font-family: Microsoft YaHei UI; font-size: 0.916672em }
.svg-1 .st7 { fill: #8d8df7; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st8 { fill: #ffffff; font-family: Calibri; font-size: 0.916672em }
.svg-1 .st9 { fill: #6280cc; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st10 { fill: #ffffff; font-family: Calibri; font-size: 1.00001em }
.svg-1 .st11 { font-size: 1em }
.svg-1 .st12 { fill: none; stroke: #7c8aa3; stroke-width: 1.25 }
.svg-1 .st13 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st14 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st15 { font-family: Roboto; font-size: 1em }
.svg-1 .st16 { fill: #d2d7e1; stroke: none; stroke-width: 1.25 }
.svg-1 .st17 { fill: #000000; font-family: Microsoft YaHei UI; font-size: 0.916672em }
.svg-1 .st18 { marker-start: url("#mrkr4-106"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st19 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.45454523168344 }
.svg-1 .st20 { marker-start: url("#mrkr4-127"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st21 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313411810636 }
.svg-1 .st22 { marker-end: url("#mrkr4-161"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st23 { fill: #8d8df7; stroke: #8d8df7; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st24 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st25 { fill: #000000; font-family: Microsoft YaHei UI; font-size: 1.00001em }
.svg-1 .st26 { fill: #007884; stroke: none; stroke-width: 2 }
.svg-1 .st27 { fill: #6280cc; stroke: none; stroke-width: 2 }
.svg-1 .st28 { fill: #7c8aa3; stroke: none; stroke-width: 2 }
.svg-1 .st29 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-106" class="st19" v:arrowtype="4" v:arrowsize="1" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.2000010786527) "></use>	</marker>	<marker id="mrkr4-127" class="st21" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.6800015101137) "></use>	</marker>	<marker id="mrkr4-161" class="st21" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.6800015101137,-2.6800015101137) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(2,-2)">		<title>Sheet.1</title>		<path d="M-0 673.75 A4.00009 4.00009 -180 0 0 4 677.75 L846 677.75 A4.00009 4.00009 -180 0 0 850 673.75 L850 8 A4.00009					 4.00009 -180 0 0 846 4 L4 4 A4.00009 4.00009 -180 0 0 0 8 L0 673.75 Z" class="st1"></path>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(2.9091,-176.78)">		<title>Sheet.2</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L848.54 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L848.54 677.75" class="st3"></path>	</g>	<g id="shape3-6" v:mid="3" v:groupcontext="shape" transform="translate(656.999,1281) rotate(180)">		<title>Sheet.3</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L505.87 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L505.87 677.75" class="st4"></path>	</g>	<g id="shape4-9" v:mid="4" v:groupcontext="shape" transform="translate(28.1875,-623.093)">		<title>Rectangle.1000</title>		<desc>Kernel</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L374.31 677.75 A2.00004 2.00004 -180 0 0 376.31 675.75 L376.31					 652.42 A2.00004 2.00004 -180 0 0 374.31 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st5"></path>		<text x="177.16" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>内核</text>		</g>	<g id="shape5-12" v:mid="5" v:groupcontext="shape" transform="translate(28.1875,-550.225)">		<title>Rectangle.1001</title>		<desc>sc7280.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L374.31 677.75 A2.00004 2.00004 -180 0 0 376.31 675.75 L376.31					 652.42 A2.00004 2.00004 -180 0 0 374.31 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st7"></path>		<text x="162.99" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>sc7280.dtsi</text>		</g>	<g id="shape6-15" v:mid="6" v:groupcontext="shape" transform="translate(28.1875,-513.791)">		<title>Rectangle.1002</title>		<desc>qcm6490.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L373.43 677.75 A2.88006 2.88006 -180 0 0 376.31 674.87 L376.31					 653.3 A2.88006 2.88006 -180 0 0 373.43 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 0 653.3 L0 674.87 Z" class="st9"></path>		<text x="157.86" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490.dtsi</text>		</g>	<g id="shape7-18" v:mid="7" v:groupcontext="shape" transform="translate(98.9999,-463.695)">		<title>Rectangle.1004</title>		<desc>qcs6490-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="62.9999" cy="664.086" width="126" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L124 677.75 A2.00004 2.00004 -180 0 0 126 675.75 L126 652.42 A2.00004					 2.00004 -180 0 0 124 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st7"></path>		<text x="15.93" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dts</text>		</g>	<g id="shape8-21" v:mid="8" v:groupcontext="shape" transform="translate(240,-463.695)">		<title>Rectangle.1005</title>		<desc>qcm6490-addons.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.2499" cy="664.086" width="164.5" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.62 677.75 A2.88006 2.88006 -180 0 0 164.5 674.87 L164.5					 653.3 A2.88006 2.88006 -180 0 0 161.62 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 0 653.3 L0 674.87 Z" class="st9"></path>		<text x="29.52" y="667.69" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons.dtsi</text>		</g>	<g id="shape9-24" v:mid="9" v:groupcontext="shape" transform="translate(240,-400.271)">		<title>Rectangle.1007</title>		<desc>qcm6490-addons-rb3gen2.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.2499" cy="657.876" width="164.5" height="39.7459"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.62 677.75 A2.88006 2.88006 -180 0 0 164.5 674.87 L164.5					 640.88 A2.88006 2.88006 -180 0 0 161.62 638 L2.88 638 A2.88006 2.88006 -180 0 0 -0 640.88 L0 674.87 Z" class="st9"></path>		<text x="7.4" y="661.48" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-rb3gen2.dtsi</text>		</g>	<g id="shape10-27" v:mid="10" v:groupcontext="shape" transform="translate(240.511,-345.884)">		<title>Rectangle.1008</title>		<desc>qcs6490-addons-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="16.88" y="665.75" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dts</text>		</g>	<g id="shape11-30" v:mid="11" v:groupcontext="shape" transform="translate(240.511,-307.288)">		<title>Rectangle.1009</title>		<desc>qcs6490-addons-rb3gen2-ia.mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="23.47" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="56.96" dy="1.2em" class="st11">ia.mezz.dts</tspan></text>		</g>	<g id="shape12-34" v:mid="12" v:groupcontext="shape" transform="translate(240.511,-268.692)">		<title>Rectangle.1010</title>		<desc>qcs6490-addons-rb3gen2-ptz-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="14.88" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-ptz-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape13-38" v:mid="13" v:groupcontext="shape" transform="translate(240.511,-230.096)">		<title>Rectangle.1011</title>		<desc>qcs6490-addons-rb3gen2-video-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="9.51" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-video-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape14-42" v:mid="14" v:groupcontext="shape" transform="translate(240.511,-191.5)">		<title>Rectangle.1012</title>		<desc>qcs6490-addons-rb3gen2-vision-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="8.83" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-vision-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape15-46" v:mid="15" v:groupcontext="shape" transform="translate(232,-184.199)">		<title>Rectangle.1013</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L178 677.75 A2.00004 2.00004 -180 0 0 180 675.75 L180 480.86 A2.00004					 2.00004 -180 0 0 178 478.86 L2 478.86 A2.00004 2.00004 -180 0 0 -0 480.86 L0 675.75 Z" class="st12"></path>	</g>	<g id="shape16-48" v:mid="16" v:groupcontext="shape" transform="translate(460.187,-624.692)">		<title>Rectangle.1014</title>		<desc>Camera</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.9999" cy="664.086" width="162" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L160 677.75 A2.00004 2.00004 -180 0 0 162 675.75 L162 652.42 A2.00004					 2.00004 -180 0 0 160 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 0 652.42 L0 675.75 Z" class="st7"></path>		<text x="64.5" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>摄像头</text>		</g>	<g id="shape17-51" v:mid="17" v:groupcontext="shape" transform="translate(458.687,-537.676)">		<title>Rectangle.1015</title>		<desc>qcm6490-camera.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.4999" cy="658.338" width="165" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L162.12 677.75 A2.88006 2.88006 -180 0 0 165 674.87 L165 641.81					 A2.88006 2.88006 -180 0 0 162.12 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 0 641.81 L0 674.87 Z" class="st9"></path>		<text x="33.88" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-camera.dtsi</text>		</g>	<g id="shape18-54" v:mid="18" v:groupcontext="shape" transform="translate(458.687,-466.5)">		<title>Rectangle.1017</title>		<desc>qcs6490-addons-camera-rb3gen2.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.4999" cy="658.338" width="165" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L162.12 677.75 A2.88006 2.88006 -180 0 0 165 674.87 L165 641.81					 A2.88006 2.88006 -180 0 0 162.12 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 -0 641.81 L0 674.87 Z" class="st9"></path>		<text x="25.93" y="655.04" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="52.73" dy="1.2em" class="st11">rb3gen2.dtso</tspan></text>		</g>	<g id="shape19-58" v:mid="19" v:groupcontext="shape" transform="translate(656.499,-624.692)">		<title>Rectangle.1019</title>		<desc>Component N</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.4999" cy="664.086" width="171" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L169 677.75 A2.00004 2.00004 -180 0 0 171 675.75 L171 652.42 A2.00004					 2.00004 -180 0 0 169 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 0 652.42 L0 675.75 Z" class="st7"></path>		<text x="68.4" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>组件 <tspan class="st11" v:langid="1033">N</tspan></text>		</g>	<g id="shape20-62" v:mid="20" v:groupcontext="shape" transform="translate(654.916,-537.676)">		<title>Rectangle.1020</title>		<desc>qcm6490-&#60;component&#62;.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0832" cy="658.338" width="174.17" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L171.29 677.75 A2.88006 2.88006 -180 0 0 174.17 674.87 L174.17					 641.81 A2.88006 2.88006 -180 0 0 171.29 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 -0 641.81 L0 674.87					 Z" class="st9"></path>		<text x="23.86" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-&#60;component&#62;.dtsi</text>		</g>	<g id="shape21-65" v:mid="21" v:groupcontext="shape" transform="translate(654.916,-466.5)">		<title>Rectangle.1021</title>		<desc>qcm6490-addons-&#60;component&#62;.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0832" cy="658.338" width="174.17" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L171.29 677.75 A2.88006 2.88006 -180 0 0 174.17 674.87 L174.17					 641.81 A2.88006 2.88006 -180 0 0 171.29 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 0 641.81 L0 674.87					 Z" class="st9"></path>		<text x="4.18" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-&#60;component&#62;.dtso</text>		</g>	<g id="shape22-68" v:mid="22" v:groupcontext="shape" transform="translate(98.9999,-125.753)">		<title>Rectangle.1023</title>		<desc>qcs6490-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="62.9999" cy="657.876" width="126" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L124 677.75 A2.00004 2.00004 -180 0 0 126 675.75 L126 640 A2.00004					 2.00004 -180 0 0 124 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="15.19" y="661.18" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dtb</text>		</g>	<g id="shape23-71" v:mid="23" v:groupcontext="shape" transform="translate(457.344,-125.753)">		<title>Rectangle.1026</title>		<desc>qcs6490-addons-camera-rb3gen2.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="84.6561" cy="657.876" width="169.32" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L167.31 677.75 A2.00004 2.00004 -180 0 0 169.31 675.75 L169.31					 640 A2.00004 2.00004 -180 0 0 167.31 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="28.09" y="654.58" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="54.15" dy="1.2em" class="st11">rb3gen2.dtbo</tspan></text>		</g>	<g id="shape24-75" v:mid="24" v:groupcontext="shape" transform="translate(656.999,-64.4016)">		<title>Rectangle.1028</title>		<desc>qcm6490-addons-&#60;component&#62;.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="84.9999" cy="662.451" width="170" height="30.5986"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L168 677.75 A2.00004 2.00004 -180 0 0 170 675.75 L170 649.15 A2.00004					 2.00004 -180 0 0 168 647.15 L2 647.15 A2.00004 2.00004 -180 0 0 0 649.15 L0 675.75 Z" class="st13"></path>		<text x="44.52" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="41.84" dy="1.2em" class="st11">&#60;component&#62;.dtbo</tspan></text>		</g>	<g id="shape25-79" v:mid="25" v:groupcontext="shape" transform="translate(656.804,1271) rotate(180)">		<title>Sheet.25</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.76 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.76 677.75" class="st4"></path>	</g>	<g id="shape26-82" v:mid="26" v:groupcontext="shape" transform="translate(352.187,-66.0376)">		<title>Rectangle.1029</title>		<desc>Build time fdt overlay</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="76.4999" cy="664.086" width="153" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L150.12 677.75 A2.88006 2.88006 -180 0 0 153 674.87 L153 653.3					 A2.88006 2.88006 -180 0 0 150.12 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 -0 653.3 L0 674.87 Z" class="st14"></path>		<text x="33.7" y="667.43" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>编译时间 <tspan class="st15" v:langid="1033">fdt </tspan>叠加</text>		</g>	<g id="shape27-86" v:mid="27" v:groupcontext="shape" transform="translate(27.7576,-587.906)">		<title>Sheet.27</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L799.24 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L799.24 677.75" class="st3"></path>	</g>	<g id="shape28-89" v:mid="28" v:groupcontext="shape" transform="translate(-253.562,500.97) rotate(-90)">		<title>Sheet.28</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.75 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.75 677.75" class="st3"></path>	</g>	<g id="shape29-92" v:mid="29" v:groupcontext="shape" transform="translate(-37.5625,500.97) rotate(-90)">		<title>Sheet.29</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.75 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.75 677.75" class="st3"></path>	</g>	<g id="shape30-95" v:mid="30" v:groupcontext="shape" transform="translate(460.687,-595.999)">		<title>Sheet.30</title>		<desc>(Board dependent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.4999" cy="665.999" width="161" height="23.5"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L159 677.75 A2.00004 2.00004 -180 0 0 161 675.75 L161 656.25 A2.00004					 2.00004 -180 0 0 159 654.25 L2 654.25 A2.00004 2.00004 -180 0 0 -0 656.25 L0 675.75 Z" class="st16"></path>		<text x="42" y="669.3" class="st17" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>（依赖于主板）</text>		</g>	<g id="shape31-98" v:mid="31" v:groupcontext="shape" transform="translate(656.499,-595.999)">		<title>Sheet.31</title>		<desc>(Board independent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.4999" cy="665.999" width="171" height="23.5"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L169 677.75 A2.00004 2.00004 -180 0 0 171 675.75 L171 656.25 A2.00004					 2.00004 -180 0 0 169 654.25 L2 654.25 A2.00004 2.00004 -180 0 0 0 656.25 L0 675.75 Z" class="st16"></path>		<text x="47" y="669.3" class="st17" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>（依赖于主板）</text>		</g>	<g id="shape32-101" v:mid="32" v:groupcontext="shape" transform="translate(-515.75,186.729) rotate(-90)">		<title>Sheet.32</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L22.77 677.75" class="st18"></path>	</g>	<g id="shape33-107" v:mid="33" v:groupcontext="shape" transform="translate(-355.25,237.733) rotate(-90)">		<title>Sheet.33</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L23.33 677.75" class="st18"></path>	</g>	<g id="shape34-112" v:mid="34" v:groupcontext="shape" transform="translate(-355.25,294.66) rotate(-90)">		<title>Sheet.34</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L17.18 677.75" class="st18"></path>	</g>	<g id="shape35-117" v:mid="35" v:groupcontext="shape" transform="translate(-515.837,512.052) rotate(-89.9832)">		<title>Sheet.35</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L298.2 677.75" class="st18"></path>	</g>	<g id="shape36-122" v:mid="36" v:groupcontext="shape" transform="translate(-135.747,514.08) rotate(-90.1547)">		<title>Sheet.36</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L301 677.75" class="st20"></path>	</g>	<g id="shape37-128" v:mid="37" v:groupcontext="shape" transform="translate(64.2499,582.749) rotate(-90)">		<title>Sheet.37</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L371.5 677.75" class="st20"></path>	</g>	<g id="shape38-133" v:mid="38" v:groupcontext="shape" transform="translate(64.2499,172.426) rotate(-90)">		<title>Sheet.38</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L32.35 677.75" class="st20"></path>	</g>	<g id="shape39-138" v:mid="39" v:groupcontext="shape" transform="translate(-136.562,172.426) rotate(-90)">		<title>Sheet.39</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L32.35 677.75" class="st20"></path>	</g>	<g id="shape40-143" v:mid="40" v:groupcontext="shape" transform="translate(828.872,553.97) rotate(90.1406)">		<title>Sheet.40</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L50.94 677.75" class="st20"></path>	</g>	<g id="shape41-148" v:mid="41" v:groupcontext="shape" transform="translate(850.624,552.014) rotate(90)">		<title>Sheet.41</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L41.29 677.75" class="st20"></path>	</g>	<g id="shape42-153" v:mid="42" v:groupcontext="shape" transform="translate(879.749,214.054) rotate(90)">		<title>Sheet.42</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L173.06 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L173.06 677.75" class="st4"></path>	</g>	<g id="shape43-156" v:mid="43" v:groupcontext="shape" v:layermember="0" transform="translate(202,-283.64)">		<title>Dynamic connector.1061</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 670.75 L0 677.75 L21.96 677.75 L30 677.75" class="st22"></path>	</g>	<g id="shape44-162" v:mid="44" v:groupcontext="shape" transform="translate(240.523,-125.753)">		<title>Rectangle.1062</title>		<desc>qcs6490-addons-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="657.876" width="163.98" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L161.98 677.75 A2.00004 2.00004 -180 0 0 163.98 675.75 L163.98					 640 A2.00004 2.00004 -180 0 0 161.98 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="16.14" y="661.18" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dtb</text>		</g>	<g id="shape45-165" v:mid="45" v:groupcontext="shape" transform="translate(-354.985,530.777) rotate(-91.5664)">		<title>Sheet.45</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L18.71 677.75" class="st18"></path>	</g>	<g id="shape46-170" v:mid="46" v:groupcontext="shape" transform="translate(493.2,-18.5002)">		<title>Sheet.46</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st23"></path>	</g>	<g id="shape47-172" v:mid="47" v:groupcontext="shape" transform="translate(-135.751,590.741) rotate(-89.9985)">		<title>Sheet.47</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L38.76 677.75" class="st18"></path>	</g>	<g id="shape48-177" v:mid="48" v:groupcontext="shape" transform="translate(1000.26,551.997) rotate(90)">		<title>Sheet.48</title>		<path d="M0 677.75 L31.21 677.75 L39.25 677.75" class="st22"></path>	</g>	<g id="shape49-182" v:mid="49" v:groupcontext="shape" transform="translate(510.7,-20.1441)">		<title>Sheet.49</title>		<desc>Upstream</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="22.5502" cy="670.849" width="45.11" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="45.1004" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>上游</text>		</g>	<g id="shape50-185" v:mid="50" v:groupcontext="shape" transform="translate(576.334,-18.5002)">		<title>Sheet.50</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st26"></path>	</g>	<g id="shape51-187" v:mid="51" v:groupcontext="shape" transform="translate(594,-20.1441)">		<title>Sheet.51</title>		<desc>Open source</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="17.1503" cy="670.849" width="34.31" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="34.3005" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>下游</text>		</g>	<g id="shape52-190" v:mid="52" v:groupcontext="shape" transform="translate(659.468,-18.5002)">		<title>Sheet.52</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st27"></path>	</g>	<g id="shape53-192" v:mid="53" v:groupcontext="shape" transform="translate(678.176,-20.1441)">		<title>Sheet.53</title>		<desc>Downstream</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="31.0243" cy="670.849" width="62.05" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="62.0486" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>开源代码</text>		</g>	<g id="shape54-195" v:mid="54" v:groupcontext="shape" transform="translate(742.601,-18.5002)">		<title>Sheet.54</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st28"></path>	</g>	<g id="shape55-197" v:mid="55" v:groupcontext="shape" transform="translate(760.101,-20.1441)">		<title>Sheet.55</title>		<desc>Build blobs</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="32.1493" cy="670.849" width="64.3" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="64.2987" height="13.8" class="st24"></rect>		<text x="4" y="674.49" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>编译 <tspan class="st15" v:langid="1033">blob</tspan></text>		</g></g>
</svg>

**图：QCS6490 上的设备树叠加**

构建系统使用 `fdt_overlay` 工具用于在构建期间配置树外设备树叠加处理。

DTBO 合并流程支持合并 `meta-qcom-hwe/conf/machine/<SoC>-<board>-<variant>.conf` 文件中列出的 DTBO 文件。

以下是如何在 QCS6490 上枚举设备树变量的示例。有关平台特定的信息，可参见电路板特定的机器配置文件。

# List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/<SoC>-addons-<Variant>.dtb \
                         "
    # Additional list of dtbos to be overlaid on top of base kernel devicetree files
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    # For example:
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    "
    Copy to clipboard

按照以下步骤更新内核中支持的 DTB，并在启动时选择 DTB：

**内核中的 DTB 编译支持**

要将新平台的设备树集成到内核编译中，可更新 `Makefile`。

以下示例展示了为 QCS6490 SoC 定制 DTB 的方法。复制以下方法以添加新的 DTB。

diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
    index 183aeba47193..a7815c774f7c 100644
    --- a/arch/arm64/boot/dts/qcom/Makefile
    +++ b/arch/arm64/boot/dts/qcom/Makefile
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-addons-rb3gen2.dtb
    +dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-my-board.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-rb3gen2.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs404-evb-1000.dtb
    Copy to clipboard

**在机器配置中包含 DTB**

Yocto 机器配置也进行了更新，包括相应的设备树 blob。例如，要添加支持 QCS6490 机器的设备树，请使用以下文件：

`meta-qcom-hwe/conf/machine/qcs6490-rb3gen2-core-kit.conf`：

OUT_OF_KERNEL_DTSO - qcs6490-rb3gen2-core-kit.conf
    # List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/qcs6490-my-board.dtb   \
                         qcom/qcs6490-addons-rb3gen2.dtb \
                         qcom/qcs6490-my-board.dtb   \
                         "

    # Additional list of DTBOs to be overylaid on top of base kernel devicetree
    # See how existing boards are managing it in the following example:
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    Copy to clipboard

Note

请参见 `meta-qcom-hwe/conf/machine/*.conf` 目录中有关不同 SoC 的机器配置文件。定制 BSP 版本的 DTB 文件名包含 `addons`。

**启动时选择 DTB**

定制 DTB 将作为 UKI 镜像的一部分打包，该镜像可在 EFI 中更新，从而通过所选 DTB 启动。

使用 ukify 工具生成 UKI 镜像。ukify 工具是 `tmp-glibc/sysroots-components/x86_64/systemd-boot-native/usr/bin/ukify` 编译目录中 Yocto 编译的一部分。

要生成 UKI 镜像，请运行以下命令：

# Note - ukify tool need python 3.10 version or above
    
       ukify build --efi-arch=aa64  \
                --stub=<build-path>/tmp-glibc/deploy/images/<SoC>/linuxaa64.efi.stub \
                --linux=<build-path>/tmp-glibc/deploy/images/<SoC>/Image \
                --initrd=<build-path>/tmp-glibc/deploy/images/<SoC>/initramfs-qcom-image-<SoC>.cpio.gz \
                --cmdline="console=ttyMSM0,115200n8 earlycon qcom_geni_serial.con_enabled=1 kernel.sched_pelt_multiplier=4 mem_sleep_default=s2idle" \
                --devicetree=<build-path>/tmp-glibc/deploy/images/<SoC>/<SoC>-my-board.dtb \
                --output=./uki.efi
    Copy to clipboard

ukify 编译命令生成带有自定义板卡 DTB `uki.efi` 的镜像。

要更新 ESP 分区中的 `uki.efi` 镜像，请执行以下操作：

# Following may need sudo privilege
    
    # Take the yocto build generated efi.bin and mount it locally
      mount <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin  /mnt --options rw
    
    # Overwrite the uki.efi with one packaged above
      cp uki.efi /mnt/EFI/Linux/uki.efi
      umount /mnt
    
    # now efi.bin carries packaged uki.efi which can be flashed to the target and booted
    # UEFI shall now pick the <SoC>-my-board.dtb that is part of uki.efi image
    
    # reboot into fastboot and flash efi.bin
      fastboot flash efi <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin
    Copy to clipboard

有关设备树规范的更多信息，请参见 [The Devicetree Specification](https://www.devicetree.org/specifications/)。

有关设备树的 Linux 内核文档，请参见 [Linux and the Devicetree](https://docs.kernel.org/devicetree/usage-model.html)。

**DTBO 合并序列**

`image-qcom-deploy.bbclass` 分类中的 `merge_dtbos()` 任务使用 `fdt_overlay` 工具合并 DTBO。

`merge_dtbos()` 任务迭代按以下顺序进行：

1. 在配置文件中列出 DTBO 文件名。
2. DTBO 文件名通过 `KERNEL_DEVICETREE` 变量进行迭代。
3. 对于每个基础 DTB，DTBO 合并任务叠加 `KERNEL_TECH_DTBOS` 变量中列出的 DTBO。
4. 叠加过程完成后，将生成最终的 DTB 输出。

## 独立于 Yocto 编译内核

Qualcomm Linux 内核也可以在没有 Yocto 编译系统支持的情况下编译。

**前提条件**

配置以下依赖项以设置内核编译过程：

> 
> 
> - aarch64 工具链
> - systemd-boot EFI 存根，将其作为 UKI 镜像的一部分包含在内
> - systemd ukify 工具，用于将内核镜像、initramfs 和 DTB 打包到 UKI 镜像中
> - 包含 UKI 镜像的 initramfs
> - 携带更新后 UKI 的 ESP 镜像，必须刷写该镜像才能启动设备。

这些依赖项以及必要的工具已通过 [docker](https://git.codelinaro.org/clo/la/kernel/qcom) 配置，可用于独立开发内核。

**设置 Docker**

git clone git@github.com:qualcomm-linux/kmake-image.git
    cd kmake-image
    docker build -t kmake-image .
    cd ..
    Copy to clipboard

**设置别名**

alias kmake-image-run='docker run -it --rm --user $(id -u):$(id -g) --workdir="$PWD" -v "$(dirname $PWD)":"$(dirname $PWD)" kmake-image'
    alias kmake='kmake-image-run make'
    Copy to clipboard

**获取 Linux 内核源代码**

从 [CodeLinaro](https://git.codelinaro.org/clo/la/kernel/qcom) 托管的 git 代码仓库克隆 Linux 内核源代码。

要克隆代码仓库并获取源代码，请运行以下命令：

git clone https://git.codelinaro.org/clo/la/kernel/qcom kernel
    cd kernel
    git checkout <released sha>
    # e.g.
    git checkout origin/kernel.qclinux.1.0.r2-rel
    cd ..
    Copy to clipboard

**获取 ramdisk**

您可以使用定制 initramfs。作为参考，您可以访问托管在 [Linaro Snapshots 站](https://snapshots.linaro.org/member-builds/qcomlt/testimages/arm64/latest/)上的 arm64 的 initramfs，可使用以下命令：

mkdir artifacts
    wget https://snapshots.linaro.org/member-builds/qcomlt/testimages/arm64/latest/initramfs-test-image-qemuarm64-*.rootfs.cpio.gz -O artifacts/ramdisk.gz
    Copy to clipboard

**获取 systemd-boot 二进制文件**

wget -O artifacts/systemd-boot-efi.deb http://ports.ubuntu.com/pool/universe/s/systemd/systemd-boot-efi_255.4-1ubuntu8_arm64.deb
    dpkg-deb -xv artifacts/systemd-boot-efi.deb artifacts/systemd
    Copy to clipboard

**编译内核**

可使用 `arch/arm64/configs/qcom_defconfig` 配置内核并按照以下说明进行编译：

cd kernel
    kmake O=../kobj qcom_defconfig
    kmake O=../kobj -j$(nproc)
    kmake O=../kobj -j$(nproc) dir-pkg INSTALL_MOD_STRIP=1
    Copy to clipboard

**将 DLKM 打包到 ramdisk**

(cd ../kobj/tar-install ; find lib/modules | cpio -o -H newc -R +0:+0 | gzip -9 >> ../../artifacts/ramdisk.gz)
    Copy to clipboard

**为 boot/ESP 分区生成 efi.bin**

cd ..
    kmake-image-run generate_boot_bins.sh efi --ramdisk artifacts/ramdisk.gz \
       --systemd-boot artifacts/systemd/usr/lib/systemd/boot/efi/systemd-bootaa64.efi \
       --stub artifacts/systemd/usr/lib/systemd/boot/efi/linuxaa64.efi.stub \
       --linux kobj/arch/arm64/boot/Image \
       --cmdline "${CMDLINE}" \
       --output images
    Copy to clipboard

**为支持 devicetree 的目标生成 dtb.bin**

kmake-image-run generate_boot_bins.sh dtb --input kobj/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dtb \
    --output images
    Copy to clipboard

生成的 **efi.bin** 和 **dtb.bin** 集中在 images 目录中，可以在 QCS6490 RB3Gen2 上启动。

**刷写二进制文件并启动**

fastboot flash efi images/efi.bin
    fastboot flash dtb_a images/dtb.bin
    fastboot reboot
    Copy to clipboard

有关如何刷写 EFI 镜像并重新启动的更多信息，请参阅[调通设备](https://docs.qualcomm.com/doc/80-70020-3SC/topic/getting_started_chapter2.html#flash-images-and-boot)。

Note

要编译额外的树外内核模块，需依赖完整的 Yocto 编译机制。

Last Published: Jul 22, 2025

[Previous Topic
配置启动后设置](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/post-boot-settings.md) [Next Topic
配置远程处理器 (remoteproc) 子系统](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/remoteproc-overview.md)