如何确定使用的kernel defconfig和dts配置文件 比较实用 新手福利

如何确定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文件
TARGET_BUILD_VARIANT

2. 控制kernel编译的AndroidKernel.mk

在内核源码中的kernel/msm-4.14/AndroidKernel.mk文件确定了具体使用哪个config文件

ifeq ($(shell echo $(KERNEL_DEFCONFIG) | grep vendor),)
KERNEL_DEFCONFIG := vendor/$(KERNEL_DEFCONFIG)
endif
发布了56 篇原创文章 · 获赞 53 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_42082222/article/details/104663389
今日推荐