如何确定Dragonboard410c使用的kernel defconfig和dts配置文件
展开
各个平台内核defconfig配置文件一般都是在kernel/arch/arm64/configs/目录下,但往往这个目录下放了好几个项目的defconfig文件,那我们如何找到自己项目的对应defconfig文件呢?
一般我们编译前都会输入下面两条命令:
source build/envsetup.sh
lunch msm8916_64-userdebug
我们可以看到TARGET_PRODUCT=msm8916_64,我们直接去搜这个项目名
在这个目录下可以找到AndroidBoard.mk文件,打开可以发现
从前面知道TARGET_BUILD_VARIANT=userdebug,因此可以确定Dragonboard410c的defconfig配置文件是msm_defconfig
那对应的DTS文件又是哪些呢?
找高通平台的dts文件最直接简单的方法是直接看开机kernel log
过滤关键字
打开apq8016-sbc.dts文件
再打开include进来的apq8016-sbc.dtsi文件
这样,其他的dtsi文件也找到了。
补充:
高通平台defconfig文件的确定
(1)命令执行追溯
Source build/envsetup.sh
执行envsetup.sh脚本,把(TARGET_DEVICE)/BoardConfig.mk包含了进来:
build/envsetup.sh:
function gettop
{
local TOPFILE=build/core/envsetup.mk
................
}
build/core/envsetup.mk:
board_config_mk := \
$(strip $(sort $(wildcard \
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
)))
BoardConfig.mk中有如下内容
ifeq ($(KERNEL_DEFCONFIG),) //如果make命令中未指定KERNEL_DEFCONFIG的值,则在此处指定它的值
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msm8909-1gb-perf_defconfig
else
KERNEL_DEFCONFIG := msm8909-1gb_defconfig
endif
endif
include kernel/AndroidKernel.mk
(2)进入Kernel/AndroidKernel.mk
KERNEL_HEADER_DEFCONFIG := $(strip$(KERNEL_HEADER_DEFCONFIG))
ifeq ($(KERNEL_HEADER_DEFCONFIG),)
KERNEL_HEADER_DEFCONFIG:= $(KERNEL_DEFCONFIG)
endif
KERNEL_OUT :=$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
KERNEL_CONFIG :=$(KERNEL_OUT)/.config //----------------------------目标文件
$(KERNEL_CONFIG): $(KERNEL_OUT)
$(MAKE) -C kernel O=../$(KERNEL_OUT)ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG)
$(hide) if [ ! -z"$(KERNEL_CONFIG_OVERRIDE)" ]; then /
echo "Overridingkernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; /
echo$(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; /
$(MAKE) -C kernelO=../$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE)oldconfig; fi
(3)kernel/scripts/kconfig/Makefile
%_defconfig: $(obj)/conf
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
在编译内核时执行上述命令生成.config文件,该命令展开后如下所示:
scripts/kconfig/conf --defconfig=arch/arm64/configs/.msmxxx_defconfig Kconfig
其中.msmxxx_defconfig的值就是KERNEL_DEFCONFIG的值
————————————————
Android Kernel如何确定使用哪个defconfig文件?
答案:
device/厂商名/项目名/AndroidBoard.mk 决定了使用哪个def_config文件
1. 项目控制的AndroidBoard.mk
以device/qcom/sm6150/AndroidBoard.mk为例子
因为KERNEL_DEFCONFIG被定义为sdmsteppe-perf_defconfig、sdmsteppe_defconfig文件,所以kernel编译时会使用这两个中的一个。
#----------------------------------------------------------------------
# Compile Linux Kernel
#----------------------------------------------------------------------
ifeq ($(KERNEL_DEFCONFIG),)
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := vendor/sdmsteppe-perf_defconfig
else
KERNEL_DEFCONFIG := vendor/sdmsteppe_defconfig
endif
endif
而TARGET_BUILD_VARIANT变量是在Android编译系统中定义的
这个变量决定了编译的是userdebug还是eng版本
也会决定具体是使用sdmsteppe-perf_defconfig,还是sdmsteppe_defconfig文件
2. 控制kernel编译的AndroidKernel.mk
在内核源码中的kernel/msm-4.14/AndroidKernel.mk文件确定了具体使用哪个config文件
ifeq ($(shell echo $(KERNEL_DEFCONFIG) | grep vendor),)
KERNEL_DEFCONFIG := vendor/$(KERNEL_DEFCONFIG)
endif