如何確定使用的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章