编译LineageOS android_kernel_xiaomi_sdm845内核遇DTB错误求助
编译LineageOS sdm845内核时遇到DTB引用错误
环境与操作步骤
- 克隆内核仓库:
git clone https://github.com/LineageOS/android_kernel_xiaomi_sdm845.git
- 编写的编译脚本如下:
#!/bin/bash # TODO: 增加选择菜单 # 计时器 START_SEC=$(date +%s) # 获取当前路径 CURRENT_DIR=$(pwd) # 设置目标内核 TARGET_KERNEL="android_kernel_xiaomi_sdm845" # 设置编译目录 TARGET_KERNEL_DIR="$CURRENT_DIR/$TARGET_KERNEL" CLANG_DIR="$HOME/toolchains/neutron-clang" # CLANG_DIR="$CURRENT_DIR/toolchains/tc-build/install" ANYKERNEL_DIR="$CURRENT_DIR/AnyKernel3" # 参数设定 CC="$CLANG_DIR/bin/clang" THREAD=$(($(nproc --all) / 2)) ARCH=arm64 OUT_DIR="$CURRENT_DIR/out/${TARGET_KERNEL}" # 使用 neutron-clang 无需使用 Triple CROSS_COMPILE=aarch64-linux-gnu- # CROSS_COMPILE_COMPAT=arm-linux-gnueabi- CC_ADDITION_FLAGS="AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump STRIP=llvm-strip LLVM_IAS=1 LLVM=1" # 编译参数 args="-j$THREAD \ O=$OUT_DIR \ ARCH=$ARCH \ CROSS_COMPILE=$CROSS_COMPILE \ CROSS_COMPILE_COMPAT=$CROSS_COMPILE_COMPAT \ $CC_ADDITION_FLAGS \ CC=$CC" # 添加proton-clang到路径搜索目录中 export PATH="$CLANG_DIR/bin:$PATH" #export DEFCONFIG_PATH=arch/arm64/configs DEFCONFIG_NAME=sdm845_defconfig # 准备KernelSU # 构建默认配置 make_defconfig() { echo "------------------------------" echo " Building Kernel Defconfig " echo "------------------------------" cd $TARGET_KERNEL_DIR echo ${args} make ${args} $DEFCONFIG_NAME cd ${TARGET_KERNEL_DIR} || exit } # 内核构建 build_kernel() { echo "------------------------------" echo " Building Kernel " echo "------------------------------" cd $TARGET_KERNEL_DIR make ${args} END_SEC=$(date +%s) COST_SEC=$(($END_SEC - $START_SEC)) echo "Kernel Build Costed $(($COST_SEC / 60))min $(($COST_SEC % 60))s" #find ${OUT_DIR}/$dts_source -name '*.dtb' -exec cat {} + >${OUT_DIR}/arch/arm64/boot/dtb cd $CURRENT_DIR } # 构建AnyKernel3包 buildAnyKernel() { echo "------------------------------" echo " Build flashable zip " echo "------------------------------" cd $CURRENT_DIR cp -rf $OUT_DIR/arch/arm64/boot/Image $ANYKERNEL_DIR/Image #cp -rf $OUT_DIR/arch/arm64/boot/dtb $ANYKERNEL_DIR/dtb; #cp -rf $OUT_DIR/arch/arm64/boot/dtbo.img $ANYKERNEL_DIR/dtbo.img; cd $ANYKERNEL_DIR OUTPUT_FILE=KSU_${TARGET_KERNEL}-Thyme-$(date +"%y.%m.%d").zip zip -r $OUTPUT_FILE * mv $OUTPUT_FILE $CURRENT_DIR/$OUTPUT_FILE rm -rf $OUTPUT_FILE echo "The output is $OUTPUT_FILE" cd $CURRENT_DIR } main() { make_defconfig && \ build_kernel # && \ # buildAnyKernel } # 构建工具链 buildCBL(){ cd toolchains/tc-build ./build-llvm.py -I "$CURRENT_DIR/toolchains/CBL-Tools" cd $CURRENT_DIR } # 执行程序并输出日志 main 2>&1 | tee "$CURRENT_DIR/build_kernel.log"
- 执行
./build.sh时出现错误:
arch/arm64/boot/dts/qcom/sdm845-v2-qvr-evt.dtb: ERROR (phandle_references): /soc/i2c@894000/synaptics_dsx@20: Reference to non-existent node or label "ts_int_active" arch/arm64/boot/dts/qcom/sdm845-v2-qvr-evt.dtb: ERROR (phandle_references): /soc/i2c@894000/synaptics_dsx@20: Reference to non-existent node or label "ts_reset_active" ERROR: Input tree has errors, aborting (use -f to force output)
解决方案
1. 禁用有问题的设备树文件
编辑内核目录下的arch/arm64/boot/dts/qcom/Makefile,找到包含sdm845-v2-qvr-evt.dtb的行,在行首添加#注释掉,跳过该设备树的编译。
2. 补全缺失的节点定义
打开arch/arm64/boot/dts/qcom/sdm845-v2-qvr-evt.dts文件,找到synaptics_dsx@20节点的引用部分,在同一文件或其依赖的头文件中添加缺失的节点定义,示例:
ts_int_active: ts-int-active { compatible = "gpio-active-high"; gpios = <&tlmm 100 GPIO_ACTIVE_HIGH>; // 根据设备实际硬件调整GPIO编号 }; ts_reset_active: ts-reset-active { compatible = "gpio-active-high"; gpios = <&tlmm 101 GPIO_ACTIVE_HIGH>; // 根据设备实际硬件调整GPIO编号 };
GPIO编号可参考同系列正常设备的树文件确认。
3. 强制编译(仅临时测试用)
在编译参数中添加DTC_FLAGS="-f"忽略错误,修改脚本中的args变量:
args="-j$THREAD \ O=$OUT_DIR \ ARCH=$ARCH \ CROSS_COMPILE=$CROSS_COMPILE \ CROSS_COMPILE_COMPAT=$CROSS_COMPILE_COMPAT \ $CC_ADDITION_FLAGS \ CC=$CC \ DTC_FLAGS=\"-f\""
此方法仅能绕过编译错误,可能导致内核在对应设备上无法正常工作。
4. 切换到稳定分支
若当前为开发分支,尝试切换到LineageOS稳定分支重新编译:
cd android_kernel_xiaomi_sdm845 git checkout lineage-20.0 # 替换为对应版本的稳定分支
内容的提问来源于stack exchange,提问作者yg lin
相关产品推荐
相关产品推荐

