帶你熟悉鴻蒙輕內核Kconfig使用指南

摘要:本文介紹了Kconfig的基礎知識,和鴻蒙輕內核的圖形化配置及進階的使用方法。

本文分享自華爲雲社區《鴻蒙輕內核Kconfig使用筆記》,作者: zhushy。

1、 Kconfig簡介

Kconfig語言定義了一套完整的規則來表述配置項及配置項間的關係,詳細內容可以參考Linux官方文檔Kconfig Language,此處不贅述。鴻蒙輕內核使用的是Python的開源三方庫kconfiglib(menuconfig只是其提供的命令之一,相關命令還有genconfig, savedefconfig等等),官方主頁爲https://pypi.org/project/kconfiglib

1.1 Kconfig和.config文件

Kconfig是配置項的描述文件,支持設置配置項及其默認值,依賴關係等等,比如kernel\liteos_a\Kconfig,該文件還會繼續依賴各個模塊的Kconfig文件。

產品配置文件,如vendor\hisilicon\hispark_taurus\kernel_configs\debug.config,提供配置項及在產品中這些配置項的設置值,可能和內核配置項的默認取值不一致,屬於產品對內核配置項的定製。這些配置文件在BUILD.gn或makefile文件中使用。

另外還會生成一個C語言頭文件,提供配置項的宏定義版,在C語言程序中使用。

1.2 操作簡介

下載OpenHarmony源代碼後,使用hb set設置產品解決方案後,然後在kernel/liteos_m或liteos_a目錄下執行make help可獲得一個總體的幫助說明,如下圖所示:

其中與Kconfig有關的爲xxconfig類目標,這類目標通過args接收額外的參數,比如:

make menuconfig args="--help"

通過args="–help"就可以瞭解xxconfig類命令的使用詳細說明。

支持的參數有文件類型FSTYPE,版本類別TEE、RELEASE等版本,默認爲DEBUG版本。還支持通過CONFIG參數指定產品配置文件路徑,該參數優先級較高。

注意:OpenHarmony支持使用ninja+gn來編譯構建,內核使用的kconfig配置工具依舊使用makefile進行維護的。

2、 配置內核

liteos_a內核使用Kconfig方式進行配置,在內核目錄kernel/liteos_a下執行make menuconfig等命令即可。liteos_m內核類似,以liteos_a爲例進行講解。

需要注意:在操作前,需要使用hb set設置產品,否則會提示:The selected product (None) is not a liteos_a kernel type product. Stop。

2.1 支持的參數

上文,我們知道了make menuconfig支持參數,我們詳細看下代碼。文件位置在kernel/liteos_a/Makefile,代碼片段如下:
如果指定了CONFIG參數,則使用用戶指定的產品配置文件。如果開啓了TEE,則使用TEE版本的產品配置文件。如果開啓了RELEASE,則使用release版本產品配置文件,否則使用debug版本的產品配置文件。

ifeq ($(TEE:1=y),y)
tee = _tee
endif
ifeq ($(RELEASE:1=y),y)
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/release$(tee).config
else
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).config
endif

KCONFIG_CONFIG ?= $(CONFIG)

2.2 menuconfig內核配置

使用make menuconfig進行內核配置,Makefile源碼片段如下:

update_config menuconfig:
	$(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig $(args) && savedefconfig --out "$(CONFIG)"

可以看出,update_config和menuconfig這2個target效果相同,一般使用make menuconfig即可。執行的操作包含如下3個:

  • 判斷產品配置文件是否存在,如果存在則把配置文件複製到內核根目錄並命名爲.config
  • 展示menuconfig用戶配置界面,供開發者進行內核配置
  • 保存最小配置到產品產品文件,可以使用make savedefconfig args="–help"查看命令的解釋。

設置產品後,要修改產品的.config配置,目前可以在內核目錄下執行make menuconfig,沒有make參數的情況下該命令默認會自動找到你hb set時所選擇的產品的debug.config配置進行menuconfig配置,如果想要修改產品的release.config配置則可以使用參數RELEASE=1。前提是產品有預置release.config配置。同樣的,可以使用參數TEE=1來修改產品的tee版本的.config配置。命令如下:

make update_config RELEASE=1
make update_config TEE=1

另外,如果想手動指定產品配置,而不是自動使用hb set時所選擇的產品的配置,則可以使用CONFIG=/path/to/the/xx.config參數,如:

make update_config CONFIG=../../vendor/hisilicon/hispark_aries/config/release.config

3、Kconfig高級語法

Kconfig大部分工程師都瞭解,快速介紹幾個鴻蒙輕內核中使用到的稍微高級的語法。

  • osource

我們知道kconfig使用source來引用其他kconfig文件,而osource等於optional source,表示可選的,如果osource指定的kconfig文件不存在,也不報錯。類似,makefile中的include和-include的差異。

  • rsource

rsource等於 relative source,後面引用的kconfig文件支持相對路徑。路徑相對於包含rsource語句的kconfig而言。

  • orsource

等於osource+rsource。

kconf的幾個命令如下“

  • –oldconfig

基於提供的.config文件,根據Kconfig文件修改配置文件

  • –silentoldconfig

等同於oldconfig,靜默模式,並修改deps依賴即生成頭文件。

  • –olddefconfig

等同於silentoldconfig,對於新符號使用默認值

  • –savedefconfig <file>

把當前最小的配置保持到文件<file>

4、 hb set、Makefile和kconfig的關係

我們知道在make menuconfig 之前,必須使用hb set設置產品解決方案,下面看下具體是如何做到的。

在kernel\liteos_m\Makefile文件中,有如下makefile片段。⑴處使用makefile foreach命令和shell sed命令循環處理hb set輸出的每一行,把“key:value”格式去掉多餘的[OHOS INFO]字符,把空格轉換爲下劃線,即轉換的格式爲“key=value”,然後轉換爲makefile的變量形式。hb env的輸出、shell命令的輸出見下文。

ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
⑵處判斷解析hb set獲取的ohos_kernel內核是否等於liteos_m,如果不等於,則說明未使用hb set設置產品解決解決方案,或者設置的不是liteos_m內核。設置liteos_a\linux內核時,不能在kernel\liteos_m目錄下執行make menuconfig。除了ohos_kernel,生成的變量還有ohos_product、ohos_product_path、ohos_device_path、ohos_device_company等等。

⑶處的makefile片段表明,makefile還有make help裏面沒有提到的參數用法。可以使用make PRODUCT_PATH=XX_Device_Path_XXX等命令來替代使用hb set設置的產品解決方案對應的設備路徑。⑷處將這些設置導出爲環境變量。在kernel\liteos_m\Kconfig文件中會使用這些環境變量。

    ohos_kernel ?= liteos_m
⑴  $(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line)))
⑵  ifneq ($(ohos_kernel),liteos_m)
    $(error The selected product ($(ohos_product)) is not a liteos_m kernel type product)
    endif

⑶  ifeq ($(PRODUCT_PATH),)
    PRODUCT_PATH:=$(ohos_product_path)
    endif

    ifeq ($(DEVICE_PATH),)
    DEVICE_PATH:=$(ohos_device_path)
    endif

    ifeq ($(BOARD_COMPANY),)
    BOARD_COMPANY:=$(ohos_device_company)
    endif
    ...
⑷  export BOARD_COMPANY
    export DEVICE_PATH
    export PRODUCT_PATH
hb env的輸出類似如下:
[OHOS INFO] root path: /home/zhushy/openharmony
[OHOS INFO] board: v200zr
[OHOS INFO] kernel: liteos_m
[OHOS INFO] product: iotlink_demo
[OHOS INFO] product path: /home/zhushy/openharmony/vendor/bestechnic/iotlink_demo
[OHOS INFO] device path: /home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
[OHOS INFO] device company: fnlink

執行shell命令hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g'的輸出如下:

ohos_root_path=/home/zhushy/openharmony
ohos_board=v200zr
ohos_kernel=liteos_m
ohos_product=iotlink_demo
ohos_product_path=/home/zhushy/openharmony/vendor/bestechnic/iotlink_demo
ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
ohos_device_company=fnlink

5、 芯片、單板、擴展板的Kconfig配置

在執行make menuconfig,進入platform配置路徑後,可以看到如下圖所示的配置界面,支持對擴展板、單板、芯片系列等配置。總體感覺這塊後續應該還需要繼續優化調整。hb set設置產品解決方案時,已經確定了芯片和開發板,這些也只能在Kconfig界面上展示,是無法配置的。擴展板倒是可以繼續選擇。後續等支持的開發板和解決方案豐富起來時,hb set設置和kconfig界面設置需要更好的來協作。比如hb set可以支持一系列開發板和解決方案,具體的選擇哪些開發板和解決方案,可以kconfig界面上來配置,hb set只提供默認值等等。

我們來看下對應的makefile片段,深入瞭解下Kconfig配置的規則。⑴處可以在開發板設備下提供下配置選項,如device\board\fnlink\v200zr\liteos_m目錄下維護Kconfig文件提供可定製的配置項。⑵處提供設備的公司名稱用來定位構建路徑等,這個配置項config SOC_COMPANY只提供string類型、prompt提示、help幫助信息等屬性。後續在SOC部分的配置裏,如device\soc\bestechnic\Kconfig.liteos_m.soc,繼續提供這個配置項的默認值default信息。Kconfig裏,運行對同一個config配置項多處出現。

⑶處設置擴展板shields、⑷到⑸用於配置開發板信息,⑹到⑺用於配置芯片族和芯片信息。下文分別詳細分析。

    # Device Kconfig import
⑴  osource "$(DEVICE_PATH)/Kconfig"

⑵  config SOC_COMPANY
        string "SoC company name to locate soc build path"
        help
        This option specifies the SoC company name, used to locate the build path for soc. This option is set by the
        SoC's Kconfig file, and should be exactly the same with SoC company path, and the user should generally avoid
        modifying it via the menu configuration.

⑶  orsource "../../device/board/*/Kconfig.liteos_m.shields"

⑷  orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"

    choice
        prompt "Board Selection"

    orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"

⑸  endchoice

⑹  orsource "../../device/soc/*/Kconfig.liteos_m.defconfig"

    choice
        prompt "SoC Series Selection"

    orsource "../../device/soc/*/Kconfig.liteos_m.series"

    endchoice

⑺  orsource "../../device/soc/*/Kconfig.liteos_m.soc"

5.1 擴展板配置

上面的小節中"../../device/board/*/Kconfig.liteos_m.shields"用於配置擴展板信息,使用*通配符匹配所有的擴展板,可以將所有擴展板配置信息都加載進來。設計者認爲不同單板廠商的擴展板可以兼容使用吧。還比較有意思的是,Kconfig文件採用liteos_m.shields作爲後綴,一方面指明內核類型,又指明是擴展板的配置。fnlink的擴展板設置路徑爲device\board\fnlink\Kconfig.liteos_m.shields,其內容如下。可以看到又進一步包含shields目錄下面Kconfig.liteos_m.shields。

orsource "shields/Kconfig.liteos_m.shields"

文件device\board\fnlink\shields\Kconfig.liteos_m.shields的內容如下:⑴處爲各個開發板的默認配置項取值,界面上不會顯示。⑵處用於展示,並讓開發者界面上選擇需要的開發板。選擇開發板時,對應的一些依賴配置項會被打開,可以自行參考文件device\board\fnlink\shields\v200zr-evb-t1\Kconfig.liteos_m.shield。

⑴  orsource "*/Kconfig.liteos_m.defconfig.shield"

    choice
        prompt "shield Selection"

⑵      orsource "*/Kconfig.liteos_m.shield"

    endchoice

下面附上fnlink擴展板目錄shields下相關的文件信息:

shields
├── BUILD.gn
├── Kconfig.liteos_m.shields
├── v200zr-evb-t0
│   ├── BUILD.gn
│   ├── Kconfig.liteos_m.defconfig.shield
│   ├── Kconfig.liteos_m.shield
└── v200zr-evb-t1
    ├── BUILD.gn
    ├── Kconfig.liteos_m.defconfig.shield
    ├── Kconfig.liteos_m.shield

5.2 開發板配置

文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"提供指定公司的開發板的默認配置項信息,如文件device\board\fnlink\Kconfig.liteos_m.defconfig.boards內容如下,又進一步引入公司各個開發板的默認配置項信息,可以具體查看文件device\board\fnlink\v200zr\Kconfig.liteos_m.defconfig.board瞭解下公司開發板默認配置項信息。默認配置項信息不會在配置界面上進行展示。

orsource "*/Kconfig.liteos_m.defconfig.board"

文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"提供指定公司開發板的配置項信息,如文件device\board\fnlink\Kconfig.liteos_m.boards的配置項如下,又進一步引入公司各個開發板的默認配置項信息,可以具體查看文件device\board\fnlink\v200zr\Kconfig.liteos_m.board瞭解下公司開發板配置項信息。這些配置項用於在界面上供開發者選擇所需的開發板。因爲開發板依賴SoC配置項,SoC在hb set時已經確認,這裏的配置在界面上只起到展示作用,開發者並不能進行選擇配置,這塊預計後續會繼續優化。

orsource "*/Kconfig.liteos_m.board"

device\board\fnlink\v200zr\Kconfig.liteos_m.board內容如下:

config BOARD_V200ZR
    bool "select board V200Z-R"
    depends on SOC_BES2600W

5.3 芯片配置

文件"../../device/soc/*/Kconfig.liteos_m.defconfig"提供芯片系列的默認配置項信息,如文件device\soc\bestechnic\Kconfig.liteos_m.defconfig內容如下,又進一步把各個芯片型號的默認配置信息引入進來,如device\soc\bestechnic\bes2600\Kconfig.liteos_m.defconfig.series。

rsource "*/Kconfig.liteos_m.defconfig.series"

config HALS_COMMUCATION_WIFI_LITE
    bool "WIFI LITE"
    default y

在"SoC Series Selection"Soc系列選擇項中,使用的"../../device/soc/*/Kconfig.liteos_m.series"會把SoC各個系列的配置項引入進來,如device\soc\bestechnic\Kconfig.liteos_m.series,文件內容如下,會進一步把文件device\soc\bestechnic\bes2600\Kconfig.liteos_m.series引入進來。細心的同學可能已經注意到,文件Kconfig.liteos_m.series在目錄bestechnic和目錄bestechnic\bes2600下都有,屬於同名文件。所以,Kconfig中的路徑通配符*只通配了一級目錄。

rsource "*/Kconfig.liteos_m.series"

SoC和SoC Serial的配置項類似,可以自行查看。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章