在《鸿蒙轻内核Kconfig使用笔记》一文介绍了Kconfig的基础知识,和鸿蒙轻内核的图形化配置。本文继续介绍些进阶的使用方法。本文中所涉及的源码,均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取,涉及开发板时以fnlink v200zr为例, 芯片开发板相关工程路径如下:
- https://gitee.com/openharmony/vendor_bestechnic
- https://gitee.com/openharmony/device_soc_bestechnic
- https://gitee.com/openharmony/device_board_fnlink
本文在前文的基础上,再介绍下hb set、Makefile和kconfig的关系,然后介绍下如何使用Kconfig图形化配置芯片、设备和产品方案。
1、 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
2、 芯片、单板、扩展板的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"
2.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
2.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
2.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的配置项类似,可以自行查看。
小结
本文在前文的基础上,先介绍下hb set、Makefile和kconfig的关系,然后介绍下如何使用Kconfig图形化配置芯片、设备和产品方案。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。