高通GKI内核开发说明(6125A14为例)

1、GKI 2.0 defconfig 生成关系

编译系统会将一下defconfig配置文件合并成一个独立的.config文件

base        :msm-kernel/arch/arm64/configs/gki_defconfig
vendor merge:msm-kernel/arch/arm64/configs/vendor/trinket_GKI.config
userdebug ??:msm-kernel/arch/arm64/configs/consolidate.fragment
userdebug ??:msm-kernel/arch/arm64/configs/vendor/trinket_consolidate.config

以上文件最终生成:
msm-kernel/arch/arm64/configs/vendor/trinket-consolidate_defconfig
or
msm-kernel/arch/arm64/configs/vendor/trinket-gki_defconfig
 

注意:consolidate相关宏应该只会用于userdebug的kernel,这点暂时没有完全确认。

 

2、 DLKM 生成关系

DLKM (dynamic load kernel module)

kernel源码生成路径:
kernel_platform/out/msm-kernel-trinket-consolidate/msm-kernel
or
kernel_platform/out/msm-kernel-trinket-gki/msm-kernel

kernel module拷贝路径:
device/qcom/trinket-kernel/vendor_dlkm

kernel module打包路径:
./out/target/product/trinket/vendor_ramdisk/lib/modules/extcon-usb-gpio.ko
./out/target/product/trinket/vendor_dlkm/lib/modules/extcon-usb-gpio.ko
 

vendor DLKM打包到ramdisk image,ramdisk 现在又会打包到vendor_boot.img

板子内module路径如下:/vendor_dlkm/lib/modules

板子内modprobe 配置文件如下:

/vendor_dlkm/lib/modules/modules.alias /vendor_dlkm/lib/modules/modules.blocklist /vendor_dlkm/lib/modules/modules.dep /vendor_dlkm/lib/modules/modules.load (用于指示在第一阶段 init 期间加载的模块及相应的加载顺序) /vendor_dlkm/lib/modules/modules.softdep

 

3、GKI 内核驱动添加方法

将需要增加的kernel module config添加到 msm-kernel/arch/arm64/configs/vendor/trinket_GKI.config ,比如

CONFIG_EXTCON_USB_GPIO=m

编译系统会编译module并打包到vendor DLKM分区,同时生成对应的modprobe配置。

如需详细了解内核模块配置文件,请参阅内核模块支持

 

4、6125_A13_LA30 dtbo配置说明

kernel 本身使用的overlay:

kernel_platform/qcom/proprietary/devicetree

 

vendor使用的overlay:

vendor/qcom/proprietary/***-devicetree

 

工作原理:

编译工具链会自动查找vendor/qcom/proprietary/下的所有-devicetree结尾的文件夹,并编译文件夹下面的dtb和kernel module。

生成的dtbo文件将会覆盖合并到kernel 本身使用的overlay上。

 

创建一个新的vendor overlay:

在vendor/qcom/proprietary 下创建“-devicetree”结尾的文件夹,如
mkdir usb-devicetree

在该文件夹下面放置以下内容:
drwxrwxr-x 2 gezhengyang gezhengyang 4096 May 13 17:09 bindings
-rwxrwxr-x 1 gezhengyang gezhengyang 165 May 13 17:50 Kbuild
-rwxrwxr-x 1 gezhengyang gezhengyang 220 May 13 17:05 Makefile
-rwxrwxr-x 1 gezhengyang gezhengyang 725 May 13 17:38 trinket-usb-iot-idp-overlay.dts
-rwxrwxr-x 1 gezhengyang gezhengyang 952 May 13 17:37 usb.dtsi

bindings文件夹从display-devicetree拷贝

Kbuild文件内容如下:

ifeq ($(CONFIG_ARCH_TRINKET),y)
dtbo-y += trinket-usb-iot-idp-overlay.dtbo
endif
​
always-y    := $(dtb-y) $(dtbo-y)
subdir-y    := $(dts-dirs)
clean-files := *.dtb *.dtbo

 

Makefile文件内容如下:

KBUILD_OPTIONS += KBUILD_EXTMOD_DTS=.
​
all: dtbs
​
%:
    $(MAKE) -C $(KERNEL_SRC) M=$(M) $@ $(KBUILD_OPTIONS)
​
modules_install:
    $(MAKE) M=$(M) -C $(KERNEL_SRC) modules_install
​
clean:
    $(MAKE) -C $(KERNEL_SRC) M=$(M) clean

 

trinket-usb-iot-idp-overlay.dts文件内容如下:

/dts-v1/;
/plugin/;
​
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/clock/qcom,rpmcc.h>
#include <dt-bindings/clock/qcom,dispcc-trinket.h>
#include <dt-bindings/clock/qcom,gcc-trinket.h>
#include <dt-bindings/clock/qcom,gpucc-trinket.h>
#include <dt-bindings/clock/qcom,videocc-trinket.h>
#include <dt-bindings/interconnect/qcom,icc.h>
#include <dt-bindings/interconnect/qcom,trinket.h>
#include <dt-bindings/regulator/qcom,rpmh-regulator-levels.h>
#include <dt-bindings/gpio/gpio.h>
​
#include "usb.dtsi"/ {
    model = "Qualcomm Technologies, Inc. TRINKET IOT IDP Overlay";
    compatible = "qcom,trinket-iot";
    qcom,msm-id = <467 0x10000>, <468 0x10000>, <394 0x10000>;
    qcom,board-id = <34 0>;
};
​

 

usb.dtsi文件内容如下:

&tlmm{
    usb_vbus_default: usb_vbus_default {
        mux {
            pins = "gpio118";
            function = "gpio";
        };
​
        config {
            pins = "gpio118";
            drive-strength = <2>;
            bias-pull-up;
        };
    };
​
    usb_detect_default: usb_detect_default {
        mux {
            pins = "gpio43", "gpio132";
            function = "gpio";
        };
​
        config {
            pins = "gpio43", "gpio132";
            drive-strength = <2>;
            bias-pull-up;
        };
    };
};
​
&soc {
    micro_usb_extcon: usb_detect {
        compatible = "linux,extcon-usb-gpio";
        vbus-gpio = <&tlmm 132 0x00>;
        id-gpio = <&tlmm 43 0x00>;
        pinctrl-names = "default";
        pinctrl-0 = <&usb_detect_default>;
    };
​
    // oem_otg_ext_vreg: oem_otg_ext_vreg {
    //  compatible = "regulator-fixed";
    //  regulator-name = "oem_otg_ext_vreg";
    //  gpio = <&tlmm 118 0x0>;
    //  enable-active-high;
    //  pinctrl-names = "default";
    //  pinctrl-0 = <&usb_vbus_default>;
    // };
};
​
&usb0 {
    extcon = <&micro_usb_extcon>, <&eud>;
    // vbus_dwc3-supply = <&oem_otg_ext_vreg>;
};

5、手动编译方法

构建kernel

cd VENDOR_BUILD
cd kernel_platform
cd msm-kernel/arch/arm64/boot/dts/
ln -s ../../../../../qcom/proprietary/devicetree/ vendor
cd -
BUILD_CONFIG=./msm-kernel/build.config.msm.trinket ./build/all-variants.sh "./build/build.sh"
cd ..
cp -r kernel_platform/out .

 

 

构建TARGET

source build/envsetup.sh
lunch trinket-userdebug
rm -rf out/target/product/trinket/obj/DLKM_OBJ/     # 不删除可能会导致编译不通过
rm -rf out/target/product/trinket/obj/PACKAGING/    # 不删除可能会导致编译不通过
mkdir -p out/target/product/trinket/
kernel_platform/build/android/prepare_vendor.sh trinket consolidate
bash build.sh -j32 dist --target_only

 

 

构建QSSI

source build/envsetup.sh
lunch qssi-userdebug
bash build.sh -j32 dist --qssi_only

 

 

打包Super

python QSSI/vendor/qcom/opensource/core-utils/build/build_image_standalone.py --image super --qssi_build_path QSSI --target_build_path TARGET --merged_build_path TARGET --target_lunch trinket --no_tmp --output_ota --skip_qiifa

 

重编kernel

如需更新kernel module,可以将device/qcom/trinket-kernel/下生成的.ko模块adb push到开发板的/vendor_dlkm/lib/modules文件夹。如需更新所有module和dtbo,可以用fastboot falsh vendor_boot vendor_boot.img

cd kernel_platform
BUILD_CONFIG=./msm-kernel/build.config.msm.trinket SKIP_MRPROPER=1 SKIP_DEFCONFIG=1 ./build/all-variants.sh "./build/build.sh"
cd ..
rm -rf device/qcom/trinket-kernel/  # 删除编译生成的kernel module
source build/envsetup.sh
lunch trinket-userdebug
kernel_platform/build/android/prepare_vendor.sh trinket consolidate ./kernel_platform/out/msm-kernel-trinket-consolidate
quick-build vendorbootimage

 

quick-build 脚本内容如下:

可以先touch quick-build,将以下文本放到脚本里面,并给脚本添加可执行权限,最后将脚本放到系统的/usr/bin目录下即可全局执行该脚本。

#!/bin/bash
​
# get build target
for arg in "$@"
do
    BUILD_TARGET+="$arg "
done
​
# get number of logical cpu
THREAD_NUM=$(grep 'processor' /proc/cpuinfo | sort -u | wc -l)
​
echo "Android top dir:     ${ANDROID_BUILD_TOP}"
echo "Android taget:       ${TARGET_PRODUCT}"
echo "Build target:        ${BUILD_TARGET}"
echo "Build thread num:    -j${THREAD_NUM}"
echo "========================  start ninjia building  ========================"if [ -z "$ANDROID_BUILD_TOP" ] || [ -z "$TARGET_PRODUCT" ] || [ -z "$BUILD_TARGET" ] || [ -z "$THREAD_NUM" ];  then
echo "argument error!"
else
# echo "argument ok!"
time ${ANDROID_BUILD_TOP}/prebuilts/build-tools/linux-x86/bin/ninja -f ${ANDROID_BUILD_TOP}/out/combined-${TARGET_PRODUCT}.ninja -j${THREAD_NUM} ${BUILD_TARGET} | tee quick-build.log
fi

 

 
posted @ 2025-08-01 15:26  PYPYN  阅读(483)  评论(0)    收藏  举报