鴻蒙輕內(nèi)核Kconfig使用筆記-進(jìn)階
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
在《鴻蒙輕內(nèi)核Kconfig使用筆記》一文介紹了Kconfig的基礎(chǔ)知識,和鴻蒙輕內(nèi)核的圖形化配置。本文繼續(xù)介紹些進(jìn)階的使用方法。本文中所涉及的源碼,均可以在開源站點(diǎn)https://gitee.com/openharmony/kernel_liteos_m 獲取,涉及開發(fā)板時(shí)以fnlink v200zr為例, 芯片開發(fā)板相關(guān)工程路徑如下:
- https://gitee.com/openharmony/vendor_bestechnic
- https://gitee.com/openharmony/device_soc_bestechnic
- https://gitee.com/openharmony/device_board_fnlink
本文在前文的基礎(chǔ)上,再介紹下hb set、Makefile和kconfig的關(guān)系,然后介紹下如何使用Kconfig圖形化配置芯片、設(shè)備和產(chǎn)品方案。
1、 hb set、Makefile和kconfig的關(guān)系
我們知道在make menuconfig 之前,必須使用hb set設(shè)置產(chǎn)品解決方案,下面看下具體是如何做到的。
在kernel\liteos_m\Makefile文件中,有如下makefile片段。⑴處使用makefile foreach命令和shell sed命令循環(huán)處理hb set輸出的每一行,把“key:value”格式去掉多余的[OHOS INFO]字符,把空格轉(zhuǎn)換為下劃線,即轉(zhuǎn)換的格式為“key=value”,然后轉(zhuǎn)換為makefile的變量形式。hb env的輸出、shell命令的輸出見下文。
- ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
⑵處判斷解析hb set獲取的ohos_kernel內(nèi)核是否等于liteos_m,如果不等于,則說明未使用hb set設(shè)置產(chǎn)品解決解決方案,或者設(shè)置的不是liteos_m內(nèi)核。設(shè)置liteos_a\linux內(nèi)核時(shí),不能在kernel\liteos_m目錄下執(zhí)行make menuconfig。除了ohos_kernel,生成的變量還有ohos_product、ohos_product_path、ohos_device_path、ohos_device_company等等。
⑶處的makefile片段表明,makefile還有make help里面沒有提到的參數(shù)用法??梢允褂胢ake PRODUCT_PATH=XX_Device_Path_XXX等命令來替代使用hb set設(shè)置的產(chǎn)品解決方案對應(yīng)的設(shè)備路徑。⑷處將這些設(shè)置導(dǎo)出為環(huán)境變量。在kernel\liteos_m\Kconfig文件中會使用這些環(huán)境變量。
- 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
執(zhí)行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
2、 芯片、單板、擴(kuò)展板的Kconfig配置
在執(zhí)行make menuconfig,進(jìn)入platform配置路徑后,可以看到如下圖所示的配置界面,支持對擴(kuò)展板、單板、芯片系列等配置。總體感覺這塊后續(xù)應(yīng)該還需要繼續(xù)優(yōu)化調(diào)整。hb set設(shè)置產(chǎn)品解決方案時(shí),已經(jīng)確定了芯片和開發(fā)板,這些也只能在Kconfig界面上展示,是無法配置的。擴(kuò)展板倒是可以繼續(xù)選擇。后續(xù)等支持的開發(fā)板和解決方案豐富起來時(shí),hb set設(shè)置和kconfig界面設(shè)置需要更好的來協(xié)作。比如hb set可以支持一系列開發(fā)板和解決方案,具體的選擇哪些開發(fā)板和解決方案,可以kconfig界面上來配置,hb set只提供默認(rèn)值等等。

我們來看下對應(yīng)的makefile片段,深入了解下Kconfig配置的規(guī)則。⑴處可以在開發(fā)板設(shè)備下提供下配置選項(xiàng),如device\board\fnlink\v200zr\liteos_m目錄下維護(hù)Kconfig文件提供可定制的配置項(xiàng)。⑵處提供設(shè)備的公司名稱用來定位構(gòu)建路徑等,這個(gè)配置項(xiàng)config SOC_COMPANY只提供string類型、prompt提示、help幫助信息等屬性。后續(xù)在SOC部分的配置里,如device\soc\bestechnic\Kconfig.liteos_m.soc,繼續(xù)提供這個(gè)配置項(xiàng)的默認(rèn)值default信息。Kconfig里,運(yùn)行對同一個(gè)config配置項(xiàng)多處出現(xiàn)。
⑶處設(shè)置擴(kuò)展板shields、⑷到⑸用于配置開發(fā)板信息,⑹到⑺用于配置芯片族和芯片信息。下文分別詳細(xì)分析。
- # 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"
2.1 擴(kuò)展板配置
上面的小節(jié)中"../../device/board/*/Kconfig.liteos_m.shields"用于配置擴(kuò)展板信息,使用*通配符匹配所有的擴(kuò)展板,可以將所有擴(kuò)展板配置信息都加載進(jìn)來。設(shè)計(jì)者認(rèn)為不同單板廠商的擴(kuò)展板可以兼容使用吧。還比較有意思的是,Kconfig文件采用liteos_m.shields作為后綴,一方面指明內(nèi)核類型,又指明是擴(kuò)展板的配置。fnlink的擴(kuò)展板設(shè)置路徑為device\board\fnlink\Kconfig.liteos_m.shields,其內(nèi)容如下。可以看到又進(jìn)一步包含shields目錄下面Kconfig.liteos_m.shields。
- orsource "shields/Kconfig.liteos_m.shields"
文件device\board\fnlink\shields\Kconfig.liteos_m.shields的內(nèi)容如下:⑴處為各個(gè)開發(fā)板的默認(rèn)配置項(xiàng)取值,界面上不會顯示。⑵處用于展示,并讓開發(fā)者界面上選擇需要的開發(fā)板。選擇開發(fā)板時(shí),對應(yīng)的一些依賴配置項(xiàng)會被打開,可以自行參考文件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擴(kuò)展板目錄shields下相關(guān)的文件信息:
- 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
2.2 開發(fā)板配置
文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"提供指定公司的開發(fā)板的默認(rèn)配置項(xiàng)信息,如文件device\board\fnlink\Kconfig.liteos_m.defconfig.boards內(nèi)容如下,又進(jìn)一步引入公司各個(gè)開發(fā)板的默認(rèn)配置項(xiàng)信息,可以具體查看文件device\board\fnlink\v200zr\Kconfig.liteos_m.defconfig.board了解下公司開發(fā)板默認(rèn)配置項(xiàng)信息。默認(rèn)配置項(xiàng)信息不會在配置界面上進(jìn)行展示。
- orsource "*/Kconfig.liteos_m.defconfig.board"
文件"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"提供指定公司開發(fā)板的配置項(xiàng)信息,如文件device\board\fnlink\Kconfig.liteos_m.boards的配置項(xiàng)如下,又進(jìn)一步引入公司各個(gè)開發(fā)板的默認(rèn)配置項(xiàng)信息,可以具體查看文件device\board\fnlink\v200zr\Kconfig.liteos_m.board了解下公司開發(fā)板配置項(xiàng)信息。這些配置項(xiàng)用于在界面上供開發(fā)者選擇所需的開發(fā)板。因?yàn)殚_發(fā)板依賴SoC配置項(xiàng),SoC在hb set時(shí)已經(jīng)確認(rèn),這里的配置在界面上只起到展示作用,開發(fā)者并不能進(jìn)行選擇配置,這塊預(yù)計(jì)后續(xù)會繼續(xù)優(yōu)化。
- orsource "*/Kconfig.liteos_m.board"
device\board\fnlink\v200zr\Kconfig.liteos_m.board內(nèi)容如下:
- config BOARD_V200ZR
- bool "select board V200Z-R"
- depends on SOC_BES2600W
2.3 芯片配置
文件"../../device/soc/*/Kconfig.liteos_m.defconfig"提供芯片系列的默認(rèn)配置項(xiàng)信息,如文件device\soc\bestechnic\Kconfig.liteos_m.defconfig內(nèi)容如下,又進(jìn)一步把各個(gè)芯片型號的默認(rèn)配置信息引入進(jìn)來,如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系列選擇項(xiàng)中,使用的"../../device/soc/*/Kconfig.liteos_m.series"會把SoC各個(gè)系列的配置項(xiàng)引入進(jìn)來,如device\soc\bestechnic\Kconfig.liteos_m.series,文件內(nèi)容如下,會進(jìn)一步把文件device\soc\bestechnic\bes2600\Kconfig.liteos_m.series引入進(jìn)來。細(xì)心的同學(xué)可能已經(jīng)注意到,文件Kconfig.liteos_m.series在目錄bestechnic和目錄bestechnic\bes2600下都有,屬于同名文件。所以,Kconfig中的路徑通配符*只通配了一級目錄。
- rsource "*/Kconfig.liteos_m.series"
SoC和SoC Serial的配置項(xiàng)類似,可以自行查看。
小結(jié)
本文在前文的基礎(chǔ)上,先介紹下hb set、Makefile和kconfig的關(guān)系,然后介紹下如何使用Kconfig圖形化配置芯片、設(shè)備和產(chǎn)品方案。因?yàn)闀r(shí)間關(guān)系,倉促寫作,或能力限制,若有失誤之處,請各位讀者多多指正。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)