# 開發核心

可使用 Yocto 建置工作流程或獨立開發 Qualcomm Linux 核心。

## 使用 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)。

## 擷取核心原始碼

從 CodeLinaro 存放庫擷取核心原始碼，以作為 BitBake 建置的一部分。

**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

備註

先前命令的機器名稱與 SoC-board-variant 名稱相同。例如，就 QCS6490 SoC 而言，`QCS6490` 是機器名稱，`rb3gen2` 是機板，`Visionkit` 是變體。

欲深入瞭解如何設定和取得原始碼，請參閱 [Qualcomm Linux 建置指南](https://docs.qualcomm.com/doc/80-70020-254/topic/build_landing_page.html)。

## 擷取核心配方

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

## 將核心原始碼解壓縮

在複製元層(meta layer)之後，請解壓核心原始碼以進行開發與客製化。

若要將原始碼解壓縮，請執行以下命令：

# 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

備註

如果是自訂 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

備註

如果是自訂 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

備註

若要編譯自訂 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`。

備註

如果是自訂 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

備註

如果是自訂 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-3TC/topic/getting_started_chapter2.html)。

## 建立除錯建置

若要建立除錯建置，請在殼層中以引數形式傳遞 `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

備註

如果是自訂 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 類型 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-3TC/topic/getting_started_chapter2.html#bring-up-the-device)。

## 自訂 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 裝置樹原始碼 列出裝置樹並維持清楚的分離，包含下游附加內容以明確佈建與上游一致的基礎。

下游內容是託管在核心原始碼之外的。不在核心樹（out-of-tree）的驅動程式會將其裝置樹覆蓋（device tree overlay）新增項目維護在核心之外。在建構過程中，對應的裝置樹覆蓋會與基礎的板級 DTB（Device Tree Blob）合併，產生一個統一的 DTB，並與開機映像一起使用。

下圖所示為 QCS6490 上的自訂 BSP 裝置樹疊加以及 DTB 產生的建置流程：

備註

- 基礎 BSP 遵循相同的建置流程，但沒有 **addons** 下游裝置樹檔案。
- 所有支援的 Qualcomm 硬體 SoC 都遵循相同的 DT 疊加和 DTB 產生建置流程。

<?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="12.3611in" height="9.91319in" viewbox="0 0 890 713.75" xml:space="preserve" color-interpolation-filters="sRGB" class="st26" aria-label="../_images/device-tree.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"></v:ud>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-width: 2 }
.svg-1 .st2 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st3 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st4 { fill: #8d8df7; stroke: #fafafa; stroke-width: 1.5 }
.svg-1 .st5 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.916672em }
.svg-1 .st6 { fill: #8d8df7; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st7 { fill: #6280cc; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st8 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-1 .st9 { font-size: 1em }
.svg-1 .st10 { fill: none; stroke: #7c8aa3; stroke-width: 1.25 }
.svg-1 .st11 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st12 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st13 { fill: #d2d7e1; stroke: none; stroke-width: 1.25 }
.svg-1 .st14 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.916672em }
.svg-1 .st15 { marker-start: url("#mrkr4-106"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st16 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.45454545454545 }
.svg-1 .st17 { marker-start: url("#mrkr4-127"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st18 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313432835821 }
.svg-1 .st19 { marker-end: url("#mrkr4-161"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st20 { fill: #8d8df7; stroke: #8d8df7; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st21 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st22 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-1 .st23 { fill: #007884; stroke: none; stroke-width: 2 }
.svg-1 .st24 { fill: #6280cc; stroke: none; stroke-width: 2 }
.svg-1 .st25 { fill: #7c8aa3; stroke: none; stroke-width: 2 }
.svg-1 .st26 { 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="st16" v:arrowtype="4" v:arrowsize="1" v:setback="4.16" refx="4.16" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.2) "></use>	</marker>	<marker id="mrkr4-127" class="st18" v:arrowtype="4" v:arrowsize="2" v:setback="5.12" refx="5.12" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.68) "></use>	</marker>	<marker id="mrkr4-161" class="st18" v:arrowtype="4" v:arrowsize="2" v:setback="5.36" refx="-5.36" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.68,-2.68) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1070-1" v:mid="1070" v:groupcontext="shape" transform="translate(20,-20)">		<title>Sheet.1070</title>		<rect x="0" y="40" width="850" height="673.75" rx="4" ry="4" class="st1"></rect>	</g>	<g id="shape1030-3" v:mid="1030" v:groupcontext="shape" transform="translate(20.9091,-194.78)">		<title>Sheet.1030</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 713.75 L848.54 713.75" class="st2"></path>	</g>	<g id="shape1051-6" v:mid="1051" v:groupcontext="shape" transform="translate(675,1335) rotate(180)">		<title>Sheet.1051</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 713.75 L505.87 713.75" class="st3"></path>	</g>	<g id="shape1000-9" v:mid="1000" v:groupcontext="shape" transform="translate(46.1875,-641.094)">		<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="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2" ry="2" class="st4"></rect>		<text x="172.65" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Kernel</text>		</g>	<g id="shape1001-12" v:mid="1001" v:groupcontext="shape" transform="translate(46.1875,-568.226)">		<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="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="159.57" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>sc7280.dtsi</text>		</g>	<g id="shape1002-15" v:mid="1002" v:groupcontext="shape" transform="translate(46.1875,-531.792)">		<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="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2.88" ry="2.88" class="st7"></rect>		<text x="154.46" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490.dtsi</text>		</g>	<g id="shape1004-18" v:mid="1004" v:groupcontext="shape" transform="translate(117,-481.696)">		<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="63" cy="700.087" width="126" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="126" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="10.95" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dts</text>		</g>	<g id="shape1005-21" v:mid="1005" v:groupcontext="shape" transform="translate(258,-481.696)">		<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.25" cy="700.087" width="164.5" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="164.5" height="27.3253" rx="2.88" ry="2.88" class="st7"></rect>		<text x="23.98" y="703.69" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons.dtsi</text>		</g>	<g id="shape1007-24" v:mid="1007" v:groupcontext="shape" transform="translate(258,-418.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.25" cy="693.877" width="164.5" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="164.5" height="39.7459" rx="2.88" ry="2.88" class="st7"></rect>		<text x="33.8" y="690.28" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="48.79" dy="1.2em" class="st9">rb3gen2.dtsi</tspan></text>		</g>	<g id="shape1008-28" v:mid="1008" v:groupcontext="shape" transform="translate(258.511,-363.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.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="10.22" y="701.75" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dts</text>		</g>	<g id="shape1009-31" v:mid="1009" v:groupcontext="shape" transform="translate(258.511,-325.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.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="53.85" dy="1.2em" class="st9">ia.mezz.dts</tspan></text>		</g>	<g id="shape1010-35" v:mid="1010" v:groupcontext="shape" transform="translate(258.511,-286.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.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="8.76" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-ptz-<tspan x="59.62" dy="1.2em" class="st9">mezz.dts</tspan></text>		</g>	<g id="shape1011-39" v:mid="1011" v:groupcontext="shape" transform="translate(258.511,-248.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.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="44.95" dy="1.2em" class="st9">video</tspan>-mezz.dts</text>		</g>	<g id="shape1012-43" v:mid="1012" v:groupcontext="shape" transform="translate(258.511,-209.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.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="43.76" dy="1.2em" class="st9">vision</tspan>-mezz.dts</text>		</g>	<g id="shape1013-47" v:mid="1013" v:groupcontext="shape" transform="translate(250,-202.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>		<rect x="0" y="514.859" width="180" height="198.891" rx="2" ry="2" class="st10"></rect>	</g>	<g id="shape1014-49" v:mid="1014" v:groupcontext="shape" transform="translate(478.187,-642.693)">		<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="81" cy="700.087" width="162" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="162" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="61.84" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Camera</text>		</g>	<g id="shape1015-52" v:mid="1015" v:groupcontext="shape" transform="translate(476.687,-555.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.5" cy="694.338" width="165" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="165" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="28.83" y="697.64" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-camera.dtsi</text>		</g>	<g id="shape1017-55" v:mid="1017" v:groupcontext="shape" transform="translate(476.687,-484.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.5" cy="694.338" width="165" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="165" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="20.09" y="691.04" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="50.02" dy="1.2em" class="st9">rb3gen2.dtso</tspan></text>		</g>	<g id="shape1019-59" v:mid="1019" v:groupcontext="shape" transform="translate(674.5,-642.693)">		<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.5" cy="700.087" width="171" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="171" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="51.68" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Component N</text>		</g>	<g id="shape1020-62" v:mid="1020" v:groupcontext="shape" transform="translate(672.917,-555.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.0833" cy="694.338" width="174.17" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="174.167" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="18.36" y="697.64" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-&#60;component&#62;.dtsi</text>		</g>	<g id="shape1021-65" v:mid="1021" v:groupcontext="shape" transform="translate(672.917,-484.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.0833" cy="694.338" width="174.17" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="174.167" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="42.67" y="691.04" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="41.26" dy="1.2em" class="st9">&#60;component&#62;.dtso</tspan></text>		</g>	<g id="shape1023-69" v:mid="1023" v:groupcontext="shape" transform="translate(117,-143.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="63" cy="693.877" width="126" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="126" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="10.7" y="697.18" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dtb</text>		</g>	<g id="shape1026-72" v:mid="1026" v:groupcontext="shape" transform="translate(475.344,-143.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.6562" cy="693.877" width="169.32" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="169.312" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="22.25" y="690.58" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="51.93" dy="1.2em" class="st9">rb3gen2.dtbo</tspan></text>		</g>	<g id="shape1028-76" v:mid="1028" v:groupcontext="shape" transform="translate(675,-82.4013)">		<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="85" cy="698.451" width="170" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="170" height="30.5986" rx="2" ry="2" class="st11"></rect>		<text x="40.58" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="38.92" dy="1.2em" class="st9">&#60;component&#62;.dtbo</tspan></text>		</g>	<g id="shape1052-80" v:mid="1052" v:groupcontext="shape" transform="translate(674.805,1325) rotate(180)">		<title>Sheet.1052</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 713.75 L482.76 713.75" class="st3"></path>	</g>	<g id="shape1029-83" v:mid="1029" v:groupcontext="shape" transform="translate(370.187,-84.038)">		<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.5" cy="700.087" width="153" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="153" height="27.3253" rx="2.88" ry="2.88" class="st12"></rect>		<text x="25.01" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Build time fdt overlay</text>		</g>	<g id="shape1031-86" v:mid="1031" v:groupcontext="shape" transform="translate(45.7576,-605.907)">		<title>Sheet.1031</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 713.75 L799.24 713.75" class="st2"></path>	</g>	<g id="shape1032-89" v:mid="1032" v:groupcontext="shape" transform="translate(-271.562,518.97) rotate(-90)">		<title>Sheet.1032</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 713.75 L482.75 713.75" class="st2"></path>	</g>	<g id="shape1033-92" v:mid="1033" v:groupcontext="shape" transform="translate(-55.5625,518.97) rotate(-90)">		<title>Sheet.1033</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 713.75 L482.75 713.75" class="st2"></path>	</g>	<g id="shape1035-95" v:mid="1035" v:groupcontext="shape" transform="translate(478.687,-614)">		<title>Sheet.1035</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.5" cy="702" width="161" height="23.5"></v:textrect>		<rect x="0" y="690.25" width="161" height="23.5" rx="2" ry="2" class="st13"></rect>		<text x="34.93" y="705.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>(Board dependent)</text>		</g>	<g id="shape1036-98" v:mid="1036" v:groupcontext="shape" transform="translate(674.5,-614)">		<title>Sheet.1036</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.5" cy="702" width="171" height="23.5"></v:textrect>		<rect x="0" y="690.25" width="171" height="23.5" rx="2" ry="2" class="st13"></rect>		<text x="35.56" y="705.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>(Board independent)</text>		</g>	<g id="shape1037-101" v:mid="1037" v:groupcontext="shape" transform="translate(-533.75,204.729) rotate(-90)">		<title>Sheet.1037</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="M6.24 713.75 L6.6 713.75 L22.77 713.75" class="st15"></path>	</g>	<g id="shape1040-107" v:mid="1040" v:groupcontext="shape" transform="translate(-373.25,255.733) rotate(-90)">		<title>Sheet.1040</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="M6.24 713.75 L6.6 713.75 L23.33 713.75" class="st15"></path>	</g>	<g id="shape1041-112" v:mid="1041" v:groupcontext="shape" transform="translate(-373.25,312.66) rotate(-90)">		<title>Sheet.1041</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="M6.24 713.75 L6.6 713.75 L17.18 713.75" class="st15"></path>	</g>	<g id="shape1043-117" v:mid="1043" v:groupcontext="shape" transform="translate(-533.837,530.042) rotate(-89.9832)">		<title>Sheet.1043</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="M6.24 713.75 L6.6 713.75 L298.2 713.75" class="st15"></path>	</g>	<g id="shape1045-122" v:mid="1045" v:groupcontext="shape" transform="translate(-153.747,532.178) rotate(-90.1547)">		<title>Sheet.1045</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="M7.68 713.75 L8.04 713.75 L301 713.75" class="st17"></path>	</g>	<g id="shape1046-128" v:mid="1046" v:groupcontext="shape" transform="translate(46.25,600.75) rotate(-90)">		<title>Sheet.1046</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="M7.68 713.75 L8.04 713.75 L371.5 713.75" class="st17"></path>	</g>	<g id="shape1047-133" v:mid="1047" v:groupcontext="shape" transform="translate(46.25,190.426) rotate(-90)">		<title>Sheet.1047</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="M7.68 713.75 L8.04 713.75 L32.35 713.75" class="st17"></path>	</g>	<g id="shape1048-138" v:mid="1048" v:groupcontext="shape" transform="translate(-154.562,190.426) rotate(-90)">		<title>Sheet.1048</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="M7.68 713.75 L8.04 713.75 L32.35 713.75" class="st17"></path>	</g>	<g id="shape1050-143" v:mid="1050" v:groupcontext="shape" transform="translate(882.873,572.059) rotate(90.1406)">		<title>Sheet.1050</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="M7.68 713.75 L8.04 713.75 L50.94 713.75" class="st17"></path>	</g>	<g id="shape1054-148" v:mid="1054" v:groupcontext="shape" transform="translate(904.625,570.014) rotate(90)">		<title>Sheet.1054</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="M7.68 713.75 L8.04 713.75 L41.29 713.75" class="st17"></path>	</g>	<g id="shape1060-153" v:mid="1060" v:groupcontext="shape" transform="translate(933.75,232.054) rotate(90)">		<title>Sheet.1060</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 713.75 L173.06 713.75" class="st3"></path>	</g>	<g id="shape1061-156" v:mid="1061" v:groupcontext="shape" v:layermember="0" transform="translate(220,-317.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 722.75 L0 729.75 L21.96 729.75" class="st19"></path>	</g>	<g id="shape1062-162" v:mid="1062" v:groupcontext="shape" transform="translate(258.523,-143.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.9886" cy="693.877" width="163.98" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="163.977" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="9.97" y="697.18" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dtb</text>		</g>	<g id="shape1063-165" v:mid="1063" v:groupcontext="shape" transform="translate(-372.972,549.762) rotate(-91.5664)">		<title>Sheet.1063</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="M6.24 713.75 L6.6 713.75 L18.71 713.75" class="st15"></path>	</g>	<g id="shape1057-170" v:mid="1057" v:groupcontext="shape" transform="translate(463,-36.5)">		<title>Sheet.1057</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>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st20"></rect>	</g>	<g id="shape1073-172" v:mid="1073" v:groupcontext="shape" transform="translate(-153.751,608.741) rotate(-89.9985)">		<title>Sheet.1073</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="M6.24 713.75 L6.6 713.75 L38.76 713.75" class="st15"></path>	</g>	<g id="shape1074-177" v:mid="1074" v:groupcontext="shape" transform="translate(1054.26,569.997) rotate(90)">		<title>Sheet.1074</title>		<path d="M0 713.75 L31.21 713.75" class="st19"></path>	</g>	<g id="shape1079-182" v:mid="1079" v:groupcontext="shape" transform="translate(480.5,-38.1439)">		<title>Sheet.1079</title>		<desc>Upstream</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="30.75" cy="706.85" width="61.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="61.5" height="13.8" class="st21"></rect>		<text x="4.71" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Upstream</text>		</g>	<g id="shape1080-185" v:mid="1080" v:groupcontext="shape" transform="translate(553,-36.5)">		<title>Sheet.1080</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>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st23"></rect>	</g>	<g id="shape1081-187" v:mid="1081" v:groupcontext="shape" transform="translate(570.5,-38.1439)">		<title>Sheet.1081</title>		<desc>Open source</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="38.25" cy="706.85" width="76.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="76.5" height="13.8" class="st21"></rect>		<text x="4.61" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Open source</text>		</g>	<g id="shape1082-190" v:mid="1082" v:groupcontext="shape" transform="translate(654.852,-36.5)">		<title>Sheet.1082</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>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st24"></rect>	</g>	<g id="shape1083-192" v:mid="1083" v:groupcontext="shape" transform="translate(672.352,-38.1439)">		<title>Sheet.1083</title>		<desc>Downstream</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="38.25" cy="706.85" width="76.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="76.5" height="13.8" class="st21"></rect>		<text x="4.29" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Downstream</text>		</g>	<g id="shape1084-195" v:mid="1084" v:groupcontext="shape" transform="translate(760.602,-36.5)">		<title>Sheet.1084</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>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st25"></rect>	</g>	<g id="shape1085-197" v:mid="1085" v:groupcontext="shape" transform="translate(778.102,-38.1439)">		<title>Sheet.1085</title>		<desc>Build blobs</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="34.5" cy="706.85" width="69" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="69" height="13.8" class="st21"></rect>		<text x="4.97" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Build blobs</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

備註

請參考不同 SoC 的 `meta-qcom-hwe/conf/machine/*.conf` 目錄中的機器組態檔。自訂 BSP 變體的 DTB 檔案名稱包含 `addons`。

**啟動時選擇 DTB**

自訂 DTB 被封裝為 UKI 映像的一部分，並在 EFI 中更新映像以使用所選的 DTB 啟動。

使用 ukify 工具產生 UKI 映像。ukify 工具是 Yocto 建置的一部分，位於 `tmp-glibc/sysroots-components/x86_64/systemd-boot-native/usr/bin/ukify` 建置目錄中。

若要產生 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. 透過 `KERNEL_DEVICETREE` 變數迭代 DTBO 檔案名稱。
3. 針對每個基礎 DTB，DTBO 合併任務會疊加 `KERNEL_TECH_DTBOS` 變數中列出的 DTBO。
4. 完成疊加流程後，產生最終 DTB 輸出。

## 獨立於 Yocto 之外編譯核心

也可以在無 Yocto 建置系統支援的情況下編譯 Qualcomm Linux 核心。

**前置條件**

佈建以下相依性以設定核心編譯流程：

> 
> 
> - aarch64 工具鏈
> - systemd-boot EFI stub，以納入為 UKI 映像的一部分
> - systemd ukify 工具，將核心映像、initramfs 和 DTB 封裝至 UKI 映像中
> - initramfs 與 UKI 映像
> - 包含已更新 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

**設定 aliases**

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 site](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

**為啟動 / 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

**為支援裝置樹的目標產生 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** 被集中在映像目錄中，並準備在 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-3TC/topic/getting_started_chapter2.html#flash-images-and-boot)。

備註

若要建置額外的樹外核心模組，請仰賴完整的 Yocto 建置機制。

Last Published: Jan 01, 2026

[Previous Topic
設定啟動後（postboot）的參數](https://docs.qualcomm.com/bundle/publicresource/80-70020-3TC/topics/post-boot-settings.md) [Next Topic
配置遠端處理器 (remoteproc) 子系統](https://docs.qualcomm.com/bundle/publicresource/80-70020-3TC/topics/remoteproc-overview.md)