内核开发¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
目标与适用范围¶
本章节指导用户在完成定制化需求(驱动/ 配置/ 补丁等)后,重新编译内核与DTB,并在Debian系统中完成替换。
适用平台:Quectel Pi H1(基于Pi-H1 Linux SDK)。
适用系统:Debian 13。
前置准备¶
开发环境要求¶
可用的Linux宿主机环境(Ubuntu/ Debian系均可,具体以SDK要求为准)。
建议预留不少于200 GB空闲磁盘空间(用于源码sources、downloads、sstate-cache、build-qcom-wayland 构建目录、prebuild根文件系统与打包产物)。
必须使用Bash执行SDK脚本:quectel_build/compile/build.sh 为 #!/bin/bash 脚本,内部使用数组、[[ ]]、source 等Bash特性。Ubuntu等发行版默认将 /bin/sh 软链接到 dash,若以 sh 方式执行会解析报错;请确认 /bin/sh 指向 bash(ls -l /bin/sh),或直接在Bash终端中执行本文命令。
获取/ 准备SDK¶
请确保已获取Pi-H1 Linux SDK,并使用与当前Debian镜像匹配的SDK版本(或同一release/ tag)。若SDK与镜像版本不匹配,可能出现以下问题:
内核版本/ 模块版本不一致导致驱动加载失败。
设备树二进制文件(DTB)不匹配导致外设不可用或无法启动。
编译命令流程¶
本章节的主要流程:完成环境初始化与项目配置后,通过SDK提供的目标命令按需单项构建内核与DTB,用于替换Debian系统中的内核/ DTB。
进入SDK目录¶
cd your/path/to/Pi-H1-Linux-SDK/
初始化编译环境¶
source quectel_build/compile/build.sh
备注
该脚本会加载SDK的编译函数(例如 buildconfig/buildkernel/builddtb/buildpackage 等),并设置必要的环境变量。
若未执行 source,后续命令通常会提示“command not found”或缺少环境变量。
执行此命令后,终端会自动切换到 build-qcom-wayland 目录,这是正常现象。后续的 buildconfig、buildkernel、builddtb、buildpackage 命令都将在此目录下执行。
选择编译配置¶
buildconfig QSM565DWF SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X STD
备注
QSM565DWF:目标平台/ 产品族配置(选择正确的平台非常关键,影响内核配置、设备树、打包规则等)。
SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X:项目版本/ 配置(示例),实际请按提示中的有效字段选择。
STD:标准构建配置(不同配置可能影响编译选项、调试符号、打包内容等)。
您也可以根据提示输入定制的 project_name、project_rev 和 custom_name,从提示的 Valid Projects 和 Valid CUST_NAME 中选择当前有效的字段。
配置成功后,您会看到当前的构建配置信息(示例):
MACHINE = qcm6490-idp
DISTRO = qcom-wayland
BUILDTYPE = default
BSP-TYPE = qcom-custom-bsp
以及确认的项目配置(示例):
Current QUECTEL_PROJECT_NAME = QSM565DWF
Current QUECTEL_PROJECT_REV = SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X
Current QUECTEL_CUSTOM_NAME = STD
打开内核编译开关¶
setopenkernel
备注
该步骤用于在SDK构建体系中启用内核相关构建流程(包含kernel与dtb,以及随内核构建的kernel modules)。
如果不执行此步骤,后续 buildkernel、builddtb、buildpackage 可能不会产出预期的内核/ DTB文件,或走到默认的“闭源/预置产物”分支(具体以SDK规则为准)。
单项构建内核(生成efi.bin)¶
buildkernel
备注
该命令在SDK环境中触发内核构建,并生成启动所需的内核产物 efi.bin。
产物输出目录:构建完成后,efi.bin 位于 Pi-H1-Linux-SDK/quectel_build/output/efi.bin。
烧录包替换原则:output/ 下的 efi.bin 需要拷贝覆盖到 buildpackage 生成的固件包目录中,作为最终交付/ 烧录使用的内核文件(见 步骤7)。
单项构建DTB(生成dtb.bin)¶
builddtb
备注
该命令生成设备树产物 dtb.bin(可能包含多个dtb的打包/ 集合)。
产物输出目录:构建完成后,dtb.bin 位于 Pi-H1-Linux-SDK/quectel_build/output/dtb.bin。
烧录包替换原则:output/ 下的 dtb.bin 需要拷贝覆盖到 buildpackage 生成的固件包目录中,作为最终交付/ 烧录使用的DTB文件(见 步骤7)。
生成固件包目录并替换内核/DTB¶
执行 buildpackage 生成固件包目录(TARGET_DIR),然后用 quectel_build/output/ 下的新产物覆盖固件包目录中的对应文件。
buildpackage
备注
该步骤通常耗时10~20秒,成功后会生成固件包目录(示例):Pi-H1-Linux-SDK/quectel_build/SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X/。
关键点:buildpackage 生成的目录即最终烧录包/ 交付包所在位置。定制内核/ DTB后,需要用以下文件覆盖替换:
来源:Pi-H1-Linux-SDK/quectel_build/output/efi.bin
来源:Pi-H1-Linux-SDK/quectel_build/output/dtb.bin
目标:Pi-H1-Linux-SDK/quectel_build/SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X/ 目录中对应的 efi.bin 和 dtb.bin
示例(实际以固件包目录内的文件名为准):
# 进入SDK根目录
cd Pi-H1-Linux-SDK
# 用单项构建产物覆盖固件包中的文件
cp -f quectel_build/output/efi.bin quectel_build/SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X/efi.bin
cp -f quectel_build/output/dtb.bin quectel_build/SG565DWFPARL1A01_BL01BP01K0M01_QDP_LP6.6.0XX.01.00X_V0X/dtb.bin
产物说明¶
本节帮助用户快速识别需要替换的文件:
efi.bin:整个EFI系统分区(ESP)的分区镜像,对应GPT分区表中标签为 efi 的分区(类型GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B,容量500 MB,FAT16文件系统)。
镜像内包含systemd-boot引导器(/EFI/BOOT/bootaa64.efi)、启动项配置(/boot/loader/loader.conf、/boot/loader/entries/*.conf)以及统一内核镜像UKI(/EFI/Linux/linux-qcm6490-idp.efi,由内核 Image、initramfs 与内核命令行打包而成)。
加载规则:由XBL/ ABL(UEFI)阶段按ESP分区类型直接加载该分区内的 /EFI/BOOT/bootaa64.efi,再由systemd-boot加载UKI中的内核;它不是Debian根文件系统 /boot 目录下的普通内核文件,替换时须按分区镜像烧录。
dtb.bin:dtb 分区的分区镜像,对应GPT分区表中标签为 dtb_a 的分区(容量64 MB,FAT文件系统)。镜像内为合并后的设备树 combined-dtb.dtb。
加载规则:该分区不由Debian系统加载,而是在XBL/ ABL(UEFI)阶段由引导程序读取并传递给内核;替换设备树必须重新烧录 dtb 分区,而不是替换根文件系统中的文件。
package:SDK的汇总产物,建议作为交付物,内部通常包含 efi.bin、dtb.bin 及必要的附属文件(实际结构以 package 内容为准)。
验证与回滚¶
验证¶
建议至少进行以下两类验证:
内核版本验证:在板端执行 uname -r 核对内核版本号(如 6.6.116-qli-1.7-ver.1.1,以本次编译产物为准);执行 uname -a 查看版本号后的编译时间戳,或 cat /proc/version 查看编译时间与编译器信息,确认运行的是本次重新编译的内核,而不是旧内核。
功能点验证:针对定制的驱动/ 配置项进行最小闭环测试(例如外设枚举、驱动加载、dmesg 关键字等)。
回滚¶
建议采用以下回滚策略:
始终保留一份可启动的旧内核/ 旧DTB(文件级备份或双启动项)。
本平台启动链路为XBL/ ABL(UEFI)+ systemd-boot,不使用extlinux/ grub;ESP(efi 分区)中的 /boot/loader/entries/*.conf 即启动项,可通过新增启动项(由 loader.conf 的 default 指定默认项)的方式验证新内核,确认稳定后再覆盖正式文件。
常见问题¶
执行build命令提示找不到:检查是否已执行 source quectel_build/compile/build.sh。
buildkernel/ builddtb无产物:检查是否已通过 buildconfig 选择正确的配置,并执行 setopenkernel。
镜像替换后无法启动:优先回滚到备份文件;检查启动项引用的内核/ DTB路径是否与实际一致。
DTB修改未生效:设备树由 dtb 分区(标签 dtb_a)在ABL阶段加载,请先确认已将新的 dtb.bin 覆盖到固件包目录并重新烧录该分区。判定是否生效:
在板端执行 cat /proc/device-tree/model(应与本次编译的DTS中 model 属性一致)和 cat /proc/device-tree/compatible。
或找到被改动的节点后读取对应属性(用 ls /proc/device-tree/ 逐级定位节点,再 cat 该节点下的属性文件),与源码中的改动逐项核对。
内核模块版本不匹配:确认 /lib/modules/
<kernel_version>/ 与 uname -r 一致,并执行 depmod -a。