鸿蒙Harmony构建开发:芯片部件特性配置解决方案总结

芯片解决方案配置规则

  • 芯片解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。
  • 芯片解决方案是一个特殊的部件,源码路径规则为:device/{开发板}/{芯片解决方案厂商}
  • 芯片解决方案部件会随产品选择的开发板默认编译。
  • 芯片解决方案目录树规则如下:
  device                                      
  └── board                                   
      └── company                            # 芯片解决方案厂商
           └──  hispark_aries                # 开发板名称
                 ├── BUILD.gn                # 编译脚本
                 ├── hals                    # OS南向接口适配
                 ├── linux                   # 可选,linux内核版本
                 │   └── config.gni          # linux版本编译配置
                 └── liteos_a                # 可选,liteos内核版本
                     └── config.gni          # liteos_a版本编译配置

注意:config.gni为开发板编译相关的配置,编译时会采用该配置文件中的参数编译所有OS部件,编译阶段系统全局可见。

  • config.gni的关键字段介绍如下:
  kernel_type:            开发板使用的内核类型,例如:“liteos_a”, “liteos_m”, “linux”。
  kernel_version:         开发使用的内核版本,例如:“4.19”。
  board_cpu:              开发板CPU类型,例如:“cortex-a7”, “riscv32”。
  board_arch:             开发芯片arch, 例如: “armv7-a”, “rv32imac”。
  board_toolchain:        开发板自定义的编译工具链名称,例如:“gcc-arm-none-eabi”。若为空,则使用默认为ohos-clang。
  board_toolchain_prefix:编译工具链前缀,例如:“gcc-arm-none-eabi”。
  board_toolchain_type:  编译工具链类型,目前支持gcc和clang。例如:“gcc” ,“clang”。
  board_cflags:          开发板配置的c文件编译选项。
  board_cxx_flags:       开发板配置的cpp文件编译选项。
  board_ld_flags:        开发板配置的链接选项。

 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助!

新增并编译芯片解决方案

编译构建支持添加新的芯片解决方案厂商,具体步骤如下:

  1. 创建芯片解决方案目录。 按照芯片解决方案配置规则创建目录,以芯片厂商realtek的“rtl8720“开发板为例, 在代码根目录执行:

    mkdir -p device/board/realtek/rtl8720
    
  2. 创建内核适配目录,并编写开发板编译配置config.gni文件。 以realtek的“rtl8720“开发板的liteos_a适配为例,device/board/realtek/rtl8720/liteos_a/config.gni的内容如下:

    # Kernel type, e.g. "linux", "liteos_a", "liteos_m".
    kernel_type = "liteos_a"
    
    # Kernel version.
    kernel_version = "3.0.0"
    
    # Board CPU type, e.g. "cortex-a7", "riscv32".
    board_cpu = "real-m300"
    
    # Board arch, e.g. "armv7-a", "rv32imac".
    board_arch = ""
    
    # Toolchain name used for system compiling.
    # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
    # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain.
    board_toolchain = "gcc-arm-none-eabi"
    
    # The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc.
    board_toolchain_path =
        rebase_path("//prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin",
                    root_build_dir)
    
    # Compiler prefix.
    board_toolchain_prefix = "gcc-arm-none-eabi-"
    
    # Compiler type, "gcc" or "clang".
    board_toolchain_type = "gcc"
    
    # Board related common compile flags.
    board_cflags = []
    board_cxx_flags = []
    board_ld_flags = []
    
  3. 编写编译脚本。 在开发板目录下创建BUILD.gn,target名称应与开发板名称一致。以realtek的rtl8720开发板为例,device/board/realtek/rtl8720/BUILD.gn内容可以是:

    group("rtl8720") { # target类型也可以shared_library, static_library, executable
      # 具体内容
      ......
    }
    
  4. 编译芯片解决方案。 在开发板目录下执行hb build,即可启动芯片解决方案的编译。

特性配置规则

下面介绍feature的声明、定义以及使用方法。

  • feature的声明

    在部件的bundle.json文件中通过feature_list来声明部件的feature列表,每个feature都必须以"{部件名}"开头。示例如下:

    {
      "name": "@ohos/xxx",
      "component": {
        "name": "partName",
        "subsystem": "subsystemName",
        "features": [
          "{partName}_feature_A"
        ]
      }
    }
    
     features中可以为部件声明多个feature。
    
  • feature的定义

    在部件内可通过以下方式定义feature的默认值: 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助!

    declare_args() {
      {partName}_feature_A = true
    }
    

    该值是此部件的默认值,产品可以在部件列表中重载该feature的值。

    feature需给部件内多个模块使用时,建议把feature定义在部件的全局gni文件中,各个模块的BUILD.gn中import该gni文件。

  • feature的使用

    BUILD.gn文件中可通过以下方式进行根据feature决定部分代码或模块参与编译:

    if ({partName}_feature_A) {
        sources += [ "xxx.c" ]
    }
    
    # 某个特性引入的依赖,需要通过该feature进行隔离
    if ({partName}_feature_A) {
        deps += [ "xxx" ]
        external_deps += [ "xxx" ]
    }
    
    # bundle.json中不支持if判断,如果bundle.json中包含的sub_component需要被裁减,可以定义group进行裁减判断
    group("testGroup") {
      deps = []
      if ({partName}_feature_A) {
        deps += [ "xxx" ]
      }
    }
    

    也可以通过以下方式为模块定义代码宏进行代码级差异化配置:

    if ({partName}_feature_A) {
        defines += ["FEATUREA_DEFINE"]
    }

SysCap(SystemCapability,系统能力)是部件向开发者提供的接口的集合。

部件配置系统能力

部件配置系统能力是为了方便某个特定部件是否要打开或关闭特定的系统能力。

部件配置系统能力的位置在部件目录下的bundle.json,配置示例如下所示:

  "component": {
        "name": "wifi",
        "subsystem": "communication",
        "syscap": [
            "SystemCapability.Communication.WiFi.STA = true",
            "SystemCapability.Communication.WiFi.AP = true",
            "SystemCapability.Communication.WiFi.P2P = false",
            "SystemCapability.Communication.WiFi.Core = false",
            "SystemCapability.Communication.WiFi.HotspotExt"
          ]
        ],
        ...
  }

在component下加入关键字syscap,对内部配置相应的系统能力。系统能力若无赋值,则默认为true,若有赋值,则按实际值为准。若值为true,则表示该部件默认开启此系统能力,若值为false,则表明该部件默认关闭此系统能力。

以上配置表明,WIFI的STA、AP、和HotspotExt三个系统能力是打开的,而P2P和Core是关闭的。

产品配置系统能力

产品配置系统能力是为了方便某个特定产品是否要打开或关闭特定的系统能力,若无配置,则以部件侧的配置为准,产品配置系统能力的位置在vender/{company}/{product}/config.json。

如果要对产品的系统能力进行精细化配置,可在产品配置中加入syscap关键字,并对要配置的系统能力赋值。产品侧的配置优先级大于部件系统能力默认配置,若某一个系统能力在部件侧默认配置为false,在产品侧配置为true,则这个系统能力的最终配置为true。示例如下:

{
      "subsystem": "communication",
      "components": [
        ...
        {
          "component": "wifi",
          "features": [],
          "syscap": [
            "SystemCapability.Communication.WiFi.AP = false",
            "SystemCapability.Communication.WiFi.P2P = true",
            "SystemCapability.Communication.WiFi.HotspotExt = false"
          ]
        },
        ...

以上配置表明,WiFi的AP和HotspotExt系统能力是关闭的,而P2P是打开的。综合部件侧的配置,最终STA、P2P为打开系统能力,而AP、Core和HotspotExt为关闭的系统能力。

部件侧配置和产品侧配置的作用

一般来说,当产品没有特性化差异的时候,我们仅需在部件侧配置系统能力,部件侧配置的系统能力是我们的基础,只有当产品存在特性化差异,需要关闭某个默认打开的系统能力或打开某个系统默认关闭的系统能力时,我们才会需要在产品侧配置。 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助!

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值