高通GKI内核开发说明(6125A14为例)
编译系统会将一下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 = <µ_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

浙公网安备 33010602011771号