# Phát triển kernel

Có thể phát triển Qualcomm Linux kernel độc lập hoặc bằng quy trình build Yocto.

## Sử dụng Yocto để phát triển kernel

Lớp `meta-qcom-hwe` Qualcomm Linux hỗ trợ các recipe `linux-qcom-base_6.6.bb` và `linux-qcom-custom_6.6.bb` để tải và build Qualcomm Linux kernel cho các máy được hỗ trợ.

Để phát triển kernel bằng quy trình phát triển Yocto, hãy tham khảo các phần sau. Để biết thêm thông tin về các điều khoản của Yocto, bản vá máy chủ và cách áp dụng chúng, hãy xem trang [Yocto Project Linux Kernel Development](https://docs.yoctoproject.org/1.5/kernel-dev/kernel-dev.html#applying-patches).

## Truy xuất nguồn kernel

Tải xuống mã nguồn kernel từ CodeLinaro repository trong bản build bằng BitBake.

**Yocto kernel**

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

Ghi chú

Tên máy cho các lệnh trước đó giống với tên biến thể bo mạch SoC. Ví dụ: đối với QCS6490 SoC, `QCS6490` là tên máy, `rb3gen2` là bo mạch và `Visionkit` là biến thể.

Để biết thêm thông tin về cách thiết lập và lấy mã nguồn, hãy xem [Hướng dẫn build Qualcomm Linux](https://docs.qualcomm.com/doc/80-70020-254/topic/build_landing_page.html).

## Truy xuất recipe kernel

Qualcomm Linux duy trì lớp `meta-qcom-hwe` và lưu trữ các tệp recipe kernel tại các vị trí sau:

- BSP cơ sở: Tệp `meta-qcom-hwe/recipes-kernel/linux//linux-qcom-base_6.6.bb`.
- BSP tùy chỉnh: Tệp `meta-qcom-hwe/recipes-kernel/linux//linux-qcom-custom_6.6.bb`.

`PREFERRED_PROVIDER_virtual/kernel` được định nghĩa là `linux-qcom-base` hoặc `linux-qcom-custom` trong tệp `meta-qcom-hwe/conf/machine/include/qcom-base.inc`.

Đối với recipe kernel, hãy chạy các lệnh sau:

# 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

## Giải nén mã nguồn kernel

Giải nén mã nguồn kernel để phát triển và tùy chỉnh sau khi sao chép lớp meta.

Để giải nén mã nguồn, hãy chạy các lệnh sau:

# 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

Ghi chú

Đối với biến thể BSP tùy chỉnh, hãy sử dụng `linux-qcom-custom`.

## Thực hiện thay đổi kernel

Các thay đổi hoặc tùy chỉnh kernel được thực hiện trong không gian làm việc `build-qcom-wayland/workspace/sources/linux-qcom-base`.

Để sửa đổi cấu hình kernel, hãy chạy các lệnh sau:

# 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

Ghi chú

Đối với biến thể BSP tùy chỉnh, hãy sử dụng `linux-qcom-custom`.

## Commit thay đổi kernel

Để commit các thay đổi của bạn, hãy chạy các lệnh Git sau:

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

## Tạo ảnh kernel

Sau khi thực hiện xong các thay đổi, để biện dịch kernel và tạo ảnh, hãy chạy các lệnh sau:

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

Ghi chú

Để biên dịch BSP tùy chỉnh, hãy sử dụng `linux-qcom-custom`.

## Duy trì thay đổi kernel

Sử dụng Devtool để phát triển và xuất bản vá cũng như tạo tệp ghép nối trong lớp `meta-mylayer`. Để tạo lớp của riêng bạn, trước tiên hãy thêm lớp đó vào tệp `bbappend` của kernel máy chủ và thực hiện thay đổi.

Để tạo và thêm các bản vá kernel vào lớp meta, hãy chạy các lệnh sau:

# 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

Sau khi chạy lệnh `devtool finish`, lớp `~/meta-mylayer` sẽ được cập nhật với nội dung sau:

- Những thay đổi tương ứng của kernel được lưu trữ dưới dạng bản vá trong `meta-mylayer/recipes-kernel/linux/linux-qcom-base/*.patch`.
- Thêm và cập nhật `meta-mylayer/recipes-kernel/linux/linux-qcom-base_%.bbappend SRC_URI` bằng các bản vá này.
- Xóa `build-qcom-wayland/workspace` sau khi quá trình phát triển hoàn tất.

Ghi chú

Đối với biến thể BSP tùy chỉnh, hãy sử dụng `linux-qcom-custom`.

## Dọn dẹp không gian làm việc

Để dọn dẹp không gian làm việc, hãy sử dụng các lệnh Devtool và BitBake sau:

# 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

## Đặt cấu hình kernel

Hệ thống build Yocto được dùng để sửa đổi cấu hình kernel trong khi gọi `menuconfig`.

Để sửa đổi cấu hình kernel, hãy chạy các lệnh sau:

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

Ngoài ra, hãy sử dụng Devtool để sửa đổi cấu hình kernel:

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

Ghi chú

Đối với biến thể BSP tùy chỉnh, hãy sử dụng `linux-qcom-custom`.

Để biết thêm thông tin chi tiết liên quan đến Yocto về cấu hình kernel, hãy xem [Configuring the Kernel](https://docs.yoctoproject.org/4.3.1/kernel-dev/common.html#configuring-the-kernel).

Tệp recipe kernel `linux-kernel-qcom-base_6.6.bb` hoặc `linux-qcom-custom_6.6.bb` sử dụng các đoạn cấu hình sau để build ảnh:

Ví dụ: `linux-qcom-custom_6.6.bb` sử dụng các đoạn sau để thêm vào kernel:

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

Để tạo bản debug build bằng cách sử dụng các đoạn cấu hình gỡ lỗi, hãy chạy các lệnh sau:

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

Để biết thêm thông tin về các đoạn cấu hình khác nhau, hãy xem [Bắt đầu với Qualcomm Linux kernel](https://docs.qualcomm.com/doc/80-70020-3VI/topic/getting_started_chapter2.html).

## Tạo bản debug build

Để tạo bản debug build, hãy truyền `DEBUG_BUILD=1` thành đối số trong shell:

# 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

Ghi chú

Đối với biến thể BSP tùy chỉnh, hãy sử dụng `QCOM_SELECTED_BSP=custom`.

## Cập nhật các tham số dòng lệnh kernel

Để cập nhật dòng lệnh kernel, hãy sửa đổi biến cấu hình Yocto `KERNEL_CMDLINE_EXTRA` trong tệp bao gồm máy dành riêng cho SoC tương ứng. Ví dụ: `meta-qcom-hwe/conf/machine/include/qcom-<SoC>.inc`.

Để cập nhật dòng lệnh kernel, hãy sửa đổi biến sau:

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

### Cập nhật ảnh ESP

Để biên dịch trình quản lý khởi động systemd-boot và ảnh kernel thành tệp ảnh UKI loại 2 được đóng gói, hãy sử dụng:

Hệ thống build Yocto cho SoC phần cứng tạo ra tất cả các ảnh cần thiết và ảnh khởi động gói dưới dạng `efi.bin` được flash vào phân vùng EFI. Tệp `efi.bin` bao gồm trình quản lý khởi động systemd-boot và ảnh kernel, được đóng gói dưới dạng định dạng ảnh UKI loại 2.

Build lại ảnh EFI sau khi cập nhật mã nguồn kernel, cấu hình hoặc DTS và flash `efi.bin` đã tạo vào phân vùng 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

Để biết thêm thông tin về định dạng ảnh UKI loại 2, hãy xem [Type #2 EFI Unified Kernel Images](https://uapi-group.org/specifications/specs/boot_loader_specification/#type-2-efi-unified-kernel-images).

Để biết thêm thông tin về ESP, hãy xem Khởi động và [Khởi động thiết bị](https://docs.qualcomm.com/doc/80-70020-3VI/topic/getting_started_chapter2.html#bring-up-the-device).

## Tùy chỉnh gói initramfs

Để cập nhật gói initramfs, hãy sửa đổi danh sách `PACKAGE_INSTALL` trong tệp `meta-qcom-hwe/recipes-kernel/images/initramfs-qcom-image.bbappend`:

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

## Thêm một mô-đun kernel

Để biên dịch các mô-đun kernel không nằm trong cây mã nguồn chính bằng hệ thống build Yocto, hãy sử dụng quy trình sau:

1. Tạo một `Makefile` cho kernel driver không nằm trong cây mã nguồn chính.

> 
> 
> Sau đây là `Makefile` mẫu cho kernel driver không nằm trong cây mã nguồn chính:

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. Tích hợp mô-đun vào hệ thống build Yocto.

> 
> 
> Xem ví dụ sau để tích hợp mô-đun kernel bằng lớp mô-đun 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

Để biết thêm thông tin về mô-đun không nằm trong cây mã nguồn chính, hãy xem phần [Working with Out-of-Tree Modules](https://docs.yoctoproject.org/kernel-dev/common.html#working-with-out-of-tree-modules).

## Đặt cấu hình tính năng hỗ trợ DTB

Qualcomm Linux sử dụng các quy trình sau để chọn tệp device tree, thay đổi cấu hình kernel và build các mô-đun kernel không nằm trong cây mã nguồn chính.

## Platform device tree

Linux của Qualcomm hỗ trợ tính năng device tree overlay để duy trì và gộp các blob device tree nằm ngoài cấu hình gốc với các blob device tree cơ bản. Hỗ trợ device tree cho SoC được cung cấp trong mã nguồn kernel tại thư mục `arch/arm64/boot/dts/qcom`.

Mã nguồn Qualcomm device tree liệt kê các cấu hình device tree và duy trì sự phân tách rõ ràng để chứa các phần bổ sung từ downstream, nhằm cung cấp riêng biệt phần cấu hình cơ bản đã được đồng bộ với upstream.

Nội dung từ downstream được lưu trữ bên ngoài mã nguồn kernel. Các driver nằm ngoài cây nguồn (out-of-tree drivers) duy trì các phần bổ sung device tree overlay của chúng bên ngoài kernel. Trong quá trình build, các overlay tương ứng sẽ được gộp với DTB cơ bản của board để tạo ra một DTB hợp nhất, được sử dụng cùng với các ảnh khởi động (boot images).

Hình sau đây minh họa quy trình build device tree overlay, và tạo DTB cho BSP tùy chỉnh trên QCS6490:

Ghi chú

- BSP cơ bản tuân theo cùng một quy trình build mà không có các tệp **addons** downstream device-tree.
- Tất cả các SoC phần cứng Qualcomm được hỗ trợ đều tuân theo cùng một quy trình build để tạo DT overlay và 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>

**Hình: Device tree overlay trên QCS6490**

Hệ thống build sử dụng công cụ `fdt_overlay` để cung cấp khả năng xử lý  ghép chồng device tree ngoài mã nguồn chính trong quá trình build.

Quá trình hợp nhất DTBO hỗ trợ gộp các tệp DTBO được liệt kê trong tệp `meta-qcom-hwe/conf/machine/<SoC>-<board>-<variant>.conf`.

Sau đây là ví dụ về cách các biến device tree được liệt kê trên QCS6490. Xem tệp cấu hình máy cụ thể cho từng bo mạch để biết thông tin cụ thể cho từng nền tảng.

# 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

Để cập nhật tính năng hỗ trợ DTB trong kernel và chọn DTB khi khởi động, hãy sử dụng quy trình sau:

**Hỗ trợ build DTB trong kernel**

Để tích hợp device tree của một nền tảng mới vào bản build kernel, hãy cập nhật `Makefile`.

Ví dụ sau đây mô tả cách tùy chỉnh DTB cho SoC QCS6490. Lặp lại phương pháp sau để thêm DTB mới.

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

**Đưa DTB vào trong cấu hình máy**

Cấu hình máy Yocto cũng được cập nhật để bao gồm device tree blob tương ứng. Ví dụ: để thêm device tree hỗ trợ máy QCS6490, hãy sử dụng tệp sau:

`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

Ghi chú

Xem các tệp cấu hình máy trong thư mục `meta-qcom-hwe/conf/machine/*.conf` để biết các SoC khác nhau. Tên tệp DTB cho biến thể BSP tùy chỉnh có chứa `addons`.

**Chọn DTB khi khởi động**

DTB tùy chỉnh được đóng gói như một phần của ảnh UKI được cập nhật trong EFI để khởi động với DTB đã chọn.

Tạo ảnh UKI bằng công cụ ukify. Công cụ ukify có sẵn trong hệ thống build Yocto trong thư mục build `tmp-glibc/sysroots-components/x86_64/systemd-boot-native/usr/bin/ukify`.

Để tạo ảnh UKI, hãy chạy lệnh sau:

# 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

Lệnh build ukify tạo ra ảnh `uki.efi` với DTB bo mạch tùy chỉnh.

Để cập nhật ảnh `uki.efi` trong phân vùng ESP, hãy thực hiện như sau:

# 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

Để biết thêm thông tin đặc tả device tree, hãy xem [The Devicetree Specification](https://www.devicetree.org/specifications/).

Để biết tài liệu về Linux kernel dành cho device tree, hãy xem [Linux and the Devicetree](https://docs.kernel.org/devicetree/usage-model.html).

**Trình tự gộp DTBO**

Tác vụ `merge_dtbos()` trong lớp `image-qcom-deploy.bbclass` sẽ gộp các DTBO bằng công cụ `fdt_overlay`.

Quá trình lặp lại tác vụ `merge_dtbos()` diễn ra theo trình tự sau:

1. Tên tệp DTBO được liệt kê trong tệp cấu hình.
2. Tên tệp DTBO được lặp lại thông qua biến `KERNEL_DEVICETREE`.
3. Đối với mỗi DTB cơ sở, tác vụ gộp DTBO sẽ ghép chồng các DTBO được liệt kê trong biến `KERNEL_TECH_DTBOS`.
4. Sau khi quá trình overlay hoàn tất, tệp DTB cuối cùng sẽ được tạo ra.

## Biên dịch kernel độc lập với Yocto

Bạn cũng có thể biên dịch Qualcomm Linux kernel mà không cần hỗ trợ hệ thống Yocto build.

**Điều kiện tiên quyết**

Cung cấp các phần phụ thuộc sau để thiết lập quy trình biên dịch kernel:

> 
> 
> - aarch64 toolchain
> - stub EFI systemd-boot để thêm nó vào ảnh UKI
> - công cụ systemd ukify để đóng gói ảnh kernel, initramfs và DTB vào ảnh UKI
> - initramfs với ảnh UKI
> - ảnh ESP mang UKI đã cập nhật và phải được flash để khởi động thiết bị

Những phần phụ thuộc này cùng với các công cụ cần thiết đã được cung cấp với [docker](https://git.codelinaro.org/clo/la/kernel/qcom).  có thể được dùng để phát triển kernel độc lập.

**Thiết lập docker**

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

**Thiết lập các alias**

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

**Lấy mã nguồn kernel Linux**

Sao chép mã nguồn kernel Linux từ git repository được lưu trữ tại [CodeLinaro](https://git.codelinaro.org/clo/la/kernel/qcom).

Để sao chép repository và lấy mã nguồn, hãy chạy các lệnh sau:

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

**Lấy ramdisk**

Bạn có thể sử dụng initramfs tùy chỉnh. Để tham khảo, bạn có thể lấy initramfs cho arm64 được lưu trữ tại [Linaro Snapshots site](https://snapshots.linaro.org/member-builds/qcomlt/testimages/arm64/latest/), bằng cách sử dụng lệnh sau:

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

**Lấy tệp nhị phân 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

**Build kernel**

Có thể sử dụng `arch/arm64/configs/qcom_defconfig` để đặt cấu hình kernel và build bằng cách làm theo các hướng dẫn bên dưới:

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

**Đóng gói DLKM vào ramdisk**

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

**Tạo efi.bin cho phân vùng boot/ESP**

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

**Tạo dtb.bin cho các đích hỗ trợ device tree**

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** và **dtb.bin** đã tạo được tập hợp trong thư mục ảnh và sẵn sàng để khởi động trên QCS6490 RB3Gen2.

**Flash tệp nhị phân và khởi động**

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

Để biết thêm thông tin về cách flash ảnh EFI và khởi động lại, hãy xem [Khởi động thiết bị](https://docs.qualcomm.com/doc/80-70020-3VI/topic/getting_started_chapter2.html#flash-images-and-boot).

Ghi chú

Để build thêm các kernel mô-đun nằm ngoài mã nguồn chính, hãy dựa vào toàn bộ cơ chế build Yocto.

Last Published: Jan 01, 2026

[Previous Topic
Đặt cấu hình cài đặt postboot](https://docs.qualcomm.com/bundle/publicresource/80-70020-3VI/topics/post-boot-settings.md) [Next Topic
Đặt cấu hình các hệ thống con bộ xử lý từ xa (remoteproc)](https://docs.qualcomm.com/bundle/publicresource/80-70020-3VI/topics/remoteproc-overview.md)