分区布局
Qualcomm Linux 2.0 支持一种更新的分区布局管理方法。作为 Qualcomm Linux 2.0 支持的meta-qcom 层的一部分,分区布局不再打包在 boot-binaries 归档中的 partition.xml 里,而是维护在 qcom-ptool 仓库中,并在构建机器时供 meta-qcom 使用。
meta-qcom/conf/machine/iq-9075-evk.conf 中的 QCOM_PARTITION_FILES_SUBDIR 配置变量选择合适的平台目录,例如 platforms/iq-9075-evk/ufs/partitions.conf,该输入被传递给 ptool 配方(qcom-ptool_git.bb)以生成最终的分区布局。
有关如何管理分区布局的说明,请参阅 Qualcomm Linux Yocto 指南。
容器和编排更新
启用 Docker 和 Docker-compose 已得到简化。qcom-multimedia-image 镜像现在包含来自 meta-virtualization 层的上游 packagegroup-container,而不是使用 Qualcomm 定义的容器 packagegroup。Docker 所需的所有内核依赖项均已在 Qualcomm 内核树中启用,因此您无需运行兼容性脚本或修改内核配置。
启用 Kubernetes 已重新设计并与多媒体镜像解耦。Kubernetes 现在不再通过 packagegroup-qcom-k8s 启用,而是通过构建名为 qcom-container-orchestration-image 的新专用镜像来启用。该配方位于 meta-qcom-distro/recipes-products/images/qcom-container-orchestration-image.bb。新镜像使用来自 meta-virtualization layer 的上游 Kubernetes 和容器编排软件包。
迁移设备树和设备树覆盖
Qualcomm Linux 1.0 支持串联式多 DTB,而 Qualcomm Linux 2.0 支持基于 FIT 的多 DTB。 Qualcomm Linux 1.0 将机器配置中列出的所有 DTB 一个接一个地追加,生成组合 DTB。生成的虚拟文件分配表(VFAT)镜像dtb.bin 包含组合的 DTB 镜像。dtb.bin 镜像被烧录到 Qualcomm 开发套件上的专用分区 dtb。统一可扩展固件接口(UEFI)解析 dtb 分区中的组合 DTB,并为硬件选择匹配的 DTB。
Qualcomm Linux 2.0 使用 KERNEL_DEVICETREE 变量中列出的所有 DTB 和 DTBO 文件生成 FIT 镜像。FIT 要求为各配置定义相应的 compatible 字符串。单个 DTB 可以映射到多个 compatible 字符串。例如,对于 conf/machine/rb3gen2-core-kit.conf 中的 qcom/qcs6490-rb3gen2.dtb DTB,与该 DTB 对应的 compatible 字符串 qcom,qcs5430-iot 和 qcom,qcs6490-iot 在 conf/machine/include/fit-dtb-compatible.inc 中定义如下:
qcom/qcs9100-ride.dtb 定义了 compatible qcom,qcs9100-qam,如下所示:
conf/machine/include/fit-dtb-compatible.inc 中相应地定义 FIT_DTB_COMPATIBLE。例如,compatible 字符串 qcom,qcs5430-iot-subtype2 映射到 qcs6490-rb3gen2.dtb 和 qcs6490-rb3gen2-vision-mezzanine.dtbo。示例如下:
KERNEL_TECH_DTBOS[dtb-name] 中列出的 DTB 覆盖在构建时与 dtb-name 合并,所有此类合并后的 DTB 首尾相连串联,生成组合 DTB。
KERNEL_DEVICETREE 和 LINUX_QCOM_KERNEL_DEVICETREE 中列出的 DTB 和 DTB 覆盖被打包到生成的 FIT 镜像的 image 部分。
configurations 部分生成 FIT_DTB_COMPATIBLE 中所列的配置:
Qualcomm Linux 2.0 中的 UEFI 增强
Qualcomm Linux 2.0 中的 UEFI 增强支持基于 FIT 的 DTB 和 DTBO 管理。 UEFI 通过匹配 compatible 字符串,为其启动的平台选择合适的 DTB 或 DTB + DTBO 组合。为了推导这些 compatible 字符串,UEFI 解析存储在 FIT 镜像中的元数据 blob。UEFI 将推导出的 compatible 字符串与配置中定义的字符串进行匹配。有关元数据的更多信息,请参阅 Qualcomm DTB 元数据。 典型配置如下:Qualcomm DTB 元数据概述
Qualcomm DTB 元数据是一个公开的 GitHub 项目,提供以下内容:- 基于 FIT 的 DTB 打包/选择规范。
qcom-metadata.dts源文件,它被编译为元数据 DTB,供固件用于将硬件标识符匹配到 FIT 配置。
- 元数据定义源文件(
qcom-metadata.dts),它将允许的 compatible 字符串后缀标记分组到节点中,例如soc、soc-sku、board、board-subtype-*、softsku和oem。 - 参考 FIT ITS 模板(例如
qcom-fitimage.its和qcom-next-fitimage.its),其中每个配置声明以下内容:- 一个 compatible
qcom,<soc>-<...suffixes...>字符串 - 要按顺序应用的基础 DTB 和可选覆盖
- 一个 compatible
qcom-dtb-metadata 读取以下内容:
- 硬件 ID(芯片 ID/版本、CDT 板卡数据、检测到的存储、DDR 大小等)
- 编译后的元数据 DTB
- FIT 配置,以选择其 compatible 标记与元数据定义及硬件报告相匹配的配置
使用 qcom-dtb-metadata 的好处
qcom-dtb-metadata 仓库是一种与上游对齐、被广泛接受的机制(FIT),用于在单个发布版本必须支持多种 SoC/开发板时支持动态设备树选择。相比多 DTB 解决方案,qcom-dtb-metadata 仓库的好处如下:
- 标准容器和结构化选择
- FIT 是一种成熟且广泛使用的格式。它支持在单个镜像中包含多个配置。
- 该设计强制要求 compatible 字符串后缀必须在元数据中定义,防止在未更新规范的情况下使用不明标记。
- 构建时验证以防止不匹配
- 执行构建时检查,以检测 FIT compatible 后缀与元数据定义之间的差异。
- 与多 DTB+DTBO 工作流兼容
- Qualcomm DTB 元数据文档描述了基础 DTB+覆盖。即运行时覆盖参数(例如
CamX和EL2KVM),由于它们是运行时控制而非元数据定义的,因此检查脚本会对其进行特殊处理。
- Qualcomm DTB 元数据文档描述了基础 DTB+覆盖。即运行时覆盖参数(例如
- Qualcomm 固件集成细节
- 当前的 Qualcomm UEFI 固件仅支持外部 FIT。
- mkimage -E -B 8(外部数据 + 8 字节对齐)
- 硬编码的文件名要求:
qclinux_fit.img
- 当前的 Qualcomm UEFI 固件仅支持外部 FIT。
FIT 配置和元数据配对条目
FIT 配置条目是 ITS 中的一个配置,包含以下内容:元数据条目描述每个标记的含义。compatible 字符串中使用的标记必须作为子节点存在于相应的元数据组节点之下。Qualcomm DTB 元数据文档定义了固件比较的组和位字段。例如:
- Compatible:
qcom,<tokens...>- 对 FDT 的引用:
fdt-<board>.dtb(以及可选的覆盖)
soc→msm-id:<chip-id chip-version>,带有芯片 ID/版本的位解释。soc-sku→msm-id:其中某些位表示封装 ID/代工厂 ID。board→board-id:带有类型、主版本和次版本的位定义。board-subtype-*→board-subtype:根据子类型类别(外设子类型、存储类型或内存大小)使用不同的位片段。oem→oem-idsoftsku→softsku-id
推荐的标记顺序(模式)
您可以按照 Qualcomm DTB 元数据文档中描述的规范模式来提高可读性。添加 QCS9100 板卡变体
要向qcom-dtb-metadata 添加 QCS9100 板卡变体,请执行以下操作:
- 使用仓库中建议的模式,选择您要用于该变体的标记(板卡修订版、存储、内存等)。
- 对于您要在 compatible 字符串中使用的每个标记,确保在正确的组(
soc、board、board-subtype-*等)下存在相应的子节点。如果引入了新后缀,请将其添加到元数据中的相关节点下。 - 在
conf/machine/include/fit-dtb-compatible.inc中添加FIT_DTB_COMPATIBLE["key"]条目。 - 使用构建命令,通过更新后的元数据 DTB 构建 FIT 镜像。
- 为预期应用这些 FIT 更改的机器烧录
.qcomflash/目录。 - 启动时,验证日志中显示新添加的 compatible。UEFI 启动日志会打印以下内容:
ParseFitDt:BoardParam 日志行中的配置,其组成部分构成您添加的 compatibleFitLoadDtbFromFdt:您映射到您的 compatible 的配置fdt-<DTB>
固件管理中的变更
Qualcomm Linux 1.0 在meta-qcom-hwe 中支持固件配方。meta-qcom-hwe/recipes-firmware/firmware 固件配方从 Qualcomm® Software Center 获取固件二进制文件。
Qualcomm Linux 2.0 使用来自 oe-core 中 linux-firmware 配方的上游固件。由 oe-core 中的 linux-firmware 配方定义的软件包被包含在 meta-qcom 的机器配置文件中。
不受支持的配方和相关软件组件
Qualcomm Linux 1.0 中的以下配方和软件组件在 Qualcomm Linux 2.0 中不受支持:
property-vault_1.0.bbsyslog-plumber_1.0.bb
音频中的变更
音频的 OpenEmbedded 元数据层组织变更如下: 在 Qualcomm Linux 1.0 中,与 AudioReach 相关的配方属于meta-qcom-hwe。
在 Qualcomm Linux 2.0 中,它们属于 meta-audioreach OpenEmbedded 层。配方变更如下:
- AudioReach 1.0 配方使用
qcom-*命名约定,而 AudioReach 2.0 配方使用audioreach-*。例如,AudioReach 1.0 中的qcom-args在 AudioReach 2.0 中现在是audioreach-graphservices。 - 音频软件包名称已从
packagegroup-qcom-audio更改为packagegroup-audioreach。 - 为下游驱动添加了额外的配方
audioreach-kernel。
设备树和驱动中的变更
Qualcomm Linux 1.0 依赖多个特定于配置的 DT 音频节点。 Qualcomm Linux 2.0 引入了在所有音频设置中重复使用的单一、统一的 DT 音频配置。音频设备树处理中的变更
在 Qualcomm Linux 1.0 中,每个自定义音频配置维护单独的 DT 音频节点。overlay 音频驱动基于各个 DT 节点进行探测,这需要为不同的音频使用场景维护多个 DT 变体。 在 Qualcomm Linux 2.0 中,所有配置使用单一的通用 DT 音频节点。重复使用同一节点来探测和绑定 overlay 音频驱动,消除了冗余并降低了 DT 复杂性。Qualcomm Linux 2.0 中设备树的变更
每个数字音频接口(DAI)链路使用显式平台绑定。sound 节点下的每个 DAI 链路现在显式定义其平台 Qualcomm Hexagon Q6 DSP(Q6)音频处理管理器(APM)。 添加了新的 Q6 APM DAI 容器。GPR 节点下还添加了 Q6 APM DAI 容器节点,为音频路由提供集中式 DAI 定义。Qualcomm Linux 2.0 中移除的设备树节点
由于在统一 DT 和 overlay 探测模型下不再需要,以下节点已被移除:spf-coreaudio-pktspf-core-platformmsm-audio-memmsm-audio-mem-cma
Overlay 驱动中的变更
Overlay 驱动现在使用共享的 DT 音频节点进行探测。不需要特定于配置的 DT 变体。在新架构中,overlay 探测不需要已移除的节点。Audioreach 用户空间源码组织的变更
AudioReach 源码现在从AudioReach/meta-audioreach GitHub 项目获取。用户空间 API 没有变更。
摄像头中的变更
从 Qualcomm Linux 1.0 升级到 Qualcomm Linux 2.0 时,请考虑摄像头方面的以下变更。OpenEmbedded 层中摄像头的变更
下表列出了 OpenEmbedded 层中摄像头可动态加载内核模块(DLKM)的变更: 表:摄像头 DLKM 变更
下表列出了 OpenEmbedded 层中摄像头设备树的变更:
表:摄像头 DTB 变更
下表列出了 OpenEmbedded 层中摄像头固件的变更:
表:摄像头固件变更
下表列出了 OpenEmbedded 层中 CamX 用户空间的变更:
表:CamX 用户空间变更
注意
Qualcomm Linux 2.0 中未启用
meta-qcom-extras 配方。
摄像头设备树从 Qualcomm Linux 1.0 迁移到 Qualcomm Linux 2.0
在 Qualcomm Linux 2.0 中,摄像头设备树更改已集成到树内内核中,位于内核源码的arch/arm64/boot/dts/qcom/ 目录下。这些更改作为 Qualcomm Linux 2.0 中 linux-qcom 配方的一部分包含在内。下表列出了特定于目标的摄像头设备树源文件。对于每个目标,DT 源先包含摄像头 SoC,然后是摄像头传感器。
表:特定于目标的摄像头设备树源文件
注意
将摄像头子系统 SoC 设备树与摄像头传感器设备树组合,即可创建 overlay 摄像头 DTBO。
摄像头被覆盖到基础之上。下表列出了摄像头 overlay。对于每个目标,DT 二进制先包含基础 DT,然后是摄像头 overlay DTBO:
表:基础 DTB 和摄像头 overlay DTBO
编译摄像头 DTS 的 BitBake 命令
下表列出了编译摄像头 DTS 的 BitBake 命令: 表:摄像头设备树编译命令摄像头 DLKM 从 Qualcomm Linux 1.0 迁移到 2.0
摄像头 DLKM 的配方名称和源码路径在 Qualcomm Linux 2.0 中已更改。在 Qualcomm Linux 1.0 中,配方名称为cameradlkm。在 Qualcomm Linux 2.0 中,它已重命名为 camx-dlkm,并且源码路径已更改。
下表列出了修改摄像头 DLKM 源码的命令:
表:修改摄像头 DLKM 源码的命令
下表根据目标平台列出了摄像头 DLKM 源代码的位置:
下表列出了编译摄像头 DLKM 源码的 BitBake 命令:
CamX 用户空间源码组织的变更
在 Qualcomm Linux 2.0 中,CamX 用户空间二进制文件通过meta qcom 配方发布。CamX 用户空间源码位于 meta qcom extras 中,后者目前未在 Qualcomm Linux 2.0 主线中启用。
启用摄像头功能
Qualcomm Linux 2.0 的qcom-multimedia-proprietary-image 默认安装下游摄像头软件包,但不启用摄像头功能。要为 qcom-multimedia-proprietary-image 启用摄像头功能,请在设备 shell 中运行以下命令:
显示中的变更
显示的 OpenEmbedded 元数据层组织变更如下: 在 Qualcomm Linux 1.0 中,Yocto 的 GBM 后端使用meta-qcom-hwe 中单独的镜像源仓库。meta-qcom-hwe OpenEmbedded 层使用 msm_be.bb 配方,该配方获取 Mesa 22.04 并为后端应用补丁。编译由基于图形驱动的 packagegroup 启用。
在 Qualcomm Linux 2.0 中,msm-gbm-backend.bb 配方在 meta-qcom 中处理 GBM 后端,并从 CodeLinaro 获取源码。它在编译时添加了从 qcom-adreno 到 msm-gbm-backend 的运行时依赖。
图形中的变更
升级到 Qualcomm Linux 2.0 时,请考虑 KMD 和用户模式驱动(UMD)组件中图形所需的以下变更。 KMD 中进行了以下变更:- 统一的设备树架构
- 从 Qualcomm® Adreno™ GPU TZ 调速器过渡到用于 GPU 动态时钟和电压调节(DCVS)的 Simple On‑Demand 调速器
- 更新内核图形支持层(KGSL)驱动分发工作流
- 重构的 OpenEmbedded 元数据层
- 重新组织的配方
- 修订的头文件使用方式
- 更新的固件处理
- 集成 OpenGL Vendor-Neutral Dispatch(GLVND),提供厂商中立的用户空间接口
- 简化维护
- 与上游 Yocto 实践对齐
- 精简的图形栈
重新组织的元数据层
在 Qualcomm Linux 2.0 中,与图形相关的 OE 元数据已被整合。之前位于meta-qcom-hwe 中的图形配方现已移至 meta-qcom。好处如下:
- 更易于维护
- 图形构建产物的单一事实来源
- 与上游 Yocto 层结构对齐
更新的 Adreno 配方
Adreno 图形配方现在位于meta-qcom/recipes-graphics/adreno/。请更新您的构建配置,改为引用来自 meta-qcom 而非 meta-qcom-hwe 的配方。
移除导出的图形用户空间头文件
厂商图形配方不再导出以下头文件:- EGL
- OpenGL/OpenGL ES
- OpenCL
- EGL、OpenGL 和 OpenGL ES:由 GLVND include 路径提供
- OpenCL:由 OpenCL loader 提供
- Adreno 专用 OpenCL 扩展:仅
cl_ext_qcom.h由 Adreno 软件包提供
- 跨厂商一致的 API 接口
- 改进的应用可移植性
- 降低厂商特定的耦合
- 必须更新应用的 include 路径,以依赖 GLVND 和 OpenCL loader 头文件
- 不再支持对厂商导出头文件的直接依赖
更新的 KGSL 配方
KGSL 驱动的分发和获取机制在 Qualcomm Linux 2.0 中已更新。源代码现在通过 GitHub 上的只读开发模型进行管理。 仓库详细信息如下:- 源码仓库:
github.com/qualcomm-linux/kgsl - 分支:
gfx-kernel.le.0.0 - 开发模型:私有、封闭
固件处理中的变更
在 Qualcomm Linux 1.0 中,固件二进制文件作为 Adreno 图形配方的一部分发布。 在 Qualcomm Linux 2.0 中,固件不随 Adreno 图形栈一起发布。您必须从 Linux 固件仓库获取。 注意 确保在创建根文件系统期间存在相应的 Qualcomm 固件文件。 注意 固件打包和部署必须独立于图形配方进行处理。Overlay 启用
GLVND 用于用户空间图形栈。它为以下内容提供厂商中立的调度:- OpenGL
- EGL
- GLX
链接和运行时行为变更
启用 GLVND 后,应用不再直接链接到厂商特定的 EGL/GLES 库。它们改为链接 GLVND 库。厂商库在运行时被动态选择和加载。安装的组件
在 Qualcomm Linux 2.0 中,图形安装以下组件:- GLVND 核心库
- 仅厂商特定的 EGL/GLES 加载器库
Adreno ICD
Adreno 提供10_EGL_adreno.json ICD 文件。GLVND 使用此文件在运行时选择 Adreno 厂商实现。
应用级影响
由于 GLVND 存在于应用与厂商库之间,应用级影响如下:- 应用必须使用
eglGetProcAddress()获取扩展 API。 - 静态链接到厂商特定符号不再有效。
- 厂商库选择在运行时根据 ICD 优先级进行。
环境变量和 overlay 行为
GLVND 环境控制
可以使用环境变量控制和调试 GLVND 行为。通过环境变量选择厂商
当存在多个厂商或 overlay 时,GLVND 使用__EGL_VENDOR_LIBRARY_FILENAMES 变量。此变量显式指定 GLVND 必须使用的 ICD 文件。例如,以下命令强制 GLVND 在运行时选择 Adreno 厂商实现:
为内核模块启用 overlay
要启用 overlay 配置,需要调整一个特定的模块参数。skip_gpu DRM 模块参数在标准配置(Config #1)中默认为 0。对于 overlay 支持(Config #2),该参数被设置为 1,随后加载 msm_kgsl 模块。
在 Config #2 中,overlay 通过 asoc-blacklist.conf 启用。文件路径为 /etc/modprobe.d/asoc-blacklist.conf。
上游和统一设备树
在 Qualcomm Linux 2.0 中,KGSL 驱动已升级以支持上游设备树。因此,上游设备树现在同时兼容 DRM 和 KGSL 驱动。与 Qualcomm Linux 1.0 不同,这种统一消除了为 DRM 和 KGSL 维护单独的 Base 和 Custom DT 的需求。 关键变更如下:- 配方弃用:在过渡到
meta-qcom2.0 的过程中,不再需要 Qualcomm Linux 1.0 中用于维护下游 DT 的单独配方(qcom-graphicsdevicetree_git.bb)。 - 统一维护:这一转变通过消除对不同 DT 维护工作流的需求,简化了开发过程。
GPU DCVS 调速器过渡
GPU DCVS 调速器实现经历了重大修改:- Qualcomm Linux 1.0 使用 Adreno TZ 调速器。
- Qualcomm Linux 2.0 过渡到上游 Simple On-Demand 调速器。
- 性能:Simple On-Demand 调速器提供改进的性能效率。
- 功耗:作为性能提升的权衡,您可能会看到功耗略有增加。
Qualcomm® Intelligent Multimedia(IM)SDK 中的变更
Qualcomm IM SDK 的 OpenEmbedded 元数据层组织变更如下。GStreamer 插件配方
在 Qualcomm Linux 1.0 中,每个 GStreamer 插件都有一个配方文件。在 Qualcomm Linux 2.0 中,它们被整合如下:- 单一配方
gst-plugins-imsdk_git.bb现在负责所有 GStreamer 插件的编译。 - 配方是统一的,但每个插件仍继续生成单独的软件包。这确保您仍然可以根据需要仅安装特定的插件软件包,而无需使用全部插件。
摄像头服务配方更新
camera-server.bb 已重命名为 camera-service.bb。更新后的配方现在从 GitHub 获取源代码,与上游最佳实践保持一致。
该配方生成多个子软件包,例如 client、common 和特定于目标的库。因此,qtiqmmfsrc GStreamer 插件仅依赖 client 软件包,而不依赖整个服务。这种模块化实现了与其他层和组件更清晰的集成。
qcom-multimedia-image 中包含的插件
qcom-multimedia-image 包含所有标准 GStreamer 插件,以下依赖专有库的插件除外:
qtimlqnnqtimlsnpeqtismartvencbinqtiqmmfsrc
qcom-multimedia-proprietary-image 中包含的插件
专有镜像包含所有插件,包括专有插件。这确保了需要专有依赖可用的开发、调试和产品构建具备完整功能。
已弃用的 QIM 插件
以下下游插件在 Qualcomm Linux 2.0 中已弃用:qtimlvclassificationqtimlvdetectionqtimlvposeqtimlvsuperresolutionqtimlvsegmentationqtimlaclassification
qtiqmmfsrc 插件属性根据 SoC 从摄像头元数据填充,而不是固定的硬编码。
示例应用中的变更
Qualcomm Linux 2.0 使用标准化的、与机器无关的方法来编译示例应用。它将开发环境从特定于目标的工具链转变为构建工具独立安装程序,使构建工具与特定设备镜像解耦。Qualcomm Linux 2.0 使用 RPM 打包而非 OPKG,因为它与标准打包机制对齐,并提供更强的软件包和依赖管理。 注意 除打包更新外,迁移到 Qualcomm Linux 2.0 不需要对现有示例应用进行任何额外更改。 下表列出了 Qualcomm Linux 1.0 与 Qualcomm Linux 2.0 中示例应用支持的关键差异: 表:示例应用比较
有关更多信息,请参阅:
视频中的变更
视频的 OpenEmbedded 元数据层组织变更如下:- 视频驱动配方已重命名并从
meta-qcom-hwe移至meta-qcom。- Qualcomm Linux 1.0:
qcom-videodlkm_1.0.bb - Qualcomm Linux 2.0:
recipes-kernel/iris-video-module/iris-video-dlkm_git.bb
- Qualcomm Linux 1.0:
- 视频固件配方已从
meta-qcom-hwe迁移到标准 Linux 固件配方。- Qualcomm Linux 1.0:
qcom-video-firmware_1.0.bb - Qualcomm Linux 2.0:OpenEmbedded-core 中现有的
linux-firmware_<version>.bb
- Qualcomm Linux 1.0:
- 视频设备树配置已从早期的 overlay DT 迁移到主线内核中已提供的 DT。
- Qualcomm Linux 1.0:
qcom-videodtb_1.0.bb - Qualcomm Linux 2.0:DT 是主线内核 DT 的一部分。
- Qualcomm Linux 1.0:

