前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(二)

OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(二)

原创
作者头像
小帅聊鸿蒙
发布2025-06-22 21:11:17
发布2025-06-22 21:11:17
5600
代码可运行
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记
运行总次数:0
代码可运行

移植安全子系统

安全子系统提供网络设备连接、认证鉴权等功能,依赖mbedtls实现硬件随机数以及联网功能。

由于每个厂商芯片硬件与实现硬件随机数的方式不同,需要适配硬件随机数接口。

移植指导

OpenHarmony提供了mbedtls的开源三方库,路径为“//third_party/mbedtls”。此库中提供了“mbedtls_platform_entropy_poll”、“mbedtls_hardclock_poll”、“mbedtls_havege_poll”、“mbedtls_hardware_poll”等几种产生随机数的方式。厂商需要根据芯片适配“mbedtls_hardware_poll”方式。

移植实例

  1. “config.json”添加文件系统。 路径:“vendor/MyVendorCompany/MyProduct/config.json”

修改如下:

代码语言:shell
复制
    {
      "subsystem": "security",
      "components": [
        { "component": "hichainsdk", "features":[] },
        { "component": "huks", "features":[]}
      ]
    },
  1. 配置宏,打开硬件随机数接口相关代码。 根据mbedtls的编译文件可以看出,配置宏的位置在"MBEDTLS_CONFIG_FILE=<…/port/config/config_liteos_m.h>"文件中。

路径:“third_party/mbedtls/BUILD.gn”

代码语言:shell
复制
    if (ohos_kernel_type == "liteos_m") {
      defines += [
        "__unix__",
        "MBEDTLS_CONFIG_FILE=<../port/config/config_liteos_m.h>",
      ]
    }

根据代码我们可以看出需要配置“MBEDTLS_NO_PLATFORM_ENTROPY”、“MBEDTLS_ENTROPY_HARDWARE_ALT”两个宏,才能编译硬件随机数的相关代码。

路径:“third_party/mbedtls/library/entropy.c”

代码语言:shell
复制
    #if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)
    #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
        mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL,
                                    MBEDTLS_ENTROPY_MIN_PLATFORM,
                                    MBEDTLS_ENTROPY_SOURCE_STRONG );
    #endif
    ......
    #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
        mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL,
                                    MBEDTLS_ENTROPY_MIN_HARDWARE,
                                    MBEDTLS_ENTROPY_SOURCE_STRONG );
    #endif
    ......
    #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */
    }
  1. 适配硬件随机数接口 接口定义如下:

路径:“third_party/mbedtls/include/mbedtls/entropy_poll.h”

代码语言:c
代码运行次数:0
运行
复制
    int mbedtls_hardware_poll( void *data,unsigned char *output, size_t len, size_t *olen );

表1 安全子系统配置项

配置项

意义

disable_huks_binary

是否编译HUKS源码。 (1) 默认值: false,不编译HUKS源码。 (2) 其他值: true,编译HUKS源码。

disable_authenticate

是否需要裁剪hichain认证功能。 (1) 默认值: true,不裁剪。 (2) 其他值: false,裁剪hichain认证功能。

huks_use_lite_storage

是否采用轻量化存储方案。无文件系统、仅有flash存储的设备,可采用轻量化存储方案。 (1) 默认值: true,使用轻量化存储。 (2) 其他值: false,不使用轻量化存储。

huks_use_hardware_root_key

是否使用硬件根密钥。设备存在硬件根密钥能力时,需要根据自身能力适配硬件根密钥方案;HUKS提供的RKC方案仅为模拟实现。 (1) 默认值:false,默认值,默认无硬件根密钥。 (2) 其他值:true,设备具有硬件根密钥相关能力时,应自行适配。

huks_config_file

是否使用HUKS默认配置文件。 (1) 默认值:“”:使用HUKS默认配置文件hks_config.h。 (2) 其他文件:产品可在HUKS支持能力集合中自行选择所要支持的特性。

 说明: 在添加安全子系统时,可直接通过配置feature来选择安全子系统特性。

代码语言:shell
复制
{
   "subsystem": "security",
   "components": [
     { "component": "hichainsdk", "features":[] },
     { "component": "huks", "features":
       [
         "disable_huks_binary = false",
         "disable_authenticate = false"
       ]
     }
   ]
 },

移植通信子系统

通信子系统目前涉及Wi-Fi和蓝牙适配,厂商应当根据芯片自身情况进行适配。

移植指导

Wi-Fi编译文件内容如下:

路径:“foundation/communication/wifi_lite/BUILD.gn”

代码语言:c
代码运行次数:0
运行
复制
group("wifi") {
  deps = [ "$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiservice:wifiservice" ]
}

从中可以看到厂商适配相关接口的.c文件存放目录应为“$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiservice”,且该目录下BUILD.gn文件中的目标应为“wifiservice”。需要厂商适配的Wi-Fi接口见表1 、表2 和表3,蓝牙接口见表4和表5。

表1 wifi_device.h

接口

作用

EnableWifi

启用Wi-Fista模式。

DisableWifi

禁用Wi-Fi sta模式。

IsWifiActive

检查Wi-Fi sta模式是否启用。

Scan

扫描热点信息。

GetScanInfoList

获取所有扫描到的热点列表。

AddDeviceConfig

配置连接到的热点信息。

GetDeviceConfigs

获取配置连接到的热点信息。

RemoveDevice

删除指定的热点配置信息。

ConnectTo

接到指定的热点。

Disconnect

断开Wi-Fi连接。

GetLinkedInfo

获取热点连接信息。

RegisterWifiEvent

为指定的Wi-Fi事件注册回调。

UnRegisterWifiEvent

取消注册以前为指定Wi-Fi事件注册的回调。

GetDeviceMacAddress

获取设备的MAC地址。

AdvanceScan

根据指定参数启动Wi-Fi扫描。

表2 wifi_hotspot_config.h

接口

作用

SetBand

设置该热点的频段。

GetBand

获取该热点的频段。

表3 wifi_hotspot.h

接口

作用

EnableHotspot

启用Ap热点模式。

DisableHotspot

禁用Ap热点模式。

SetHotspotConfig

设置指定的热点配置。

GetHotspotConfig

获取指定的热点配置。

IsHotspotActive

检查Ap热点模式是否启用。

GetStationList

获取连接到此热点的一系列STA。

GetSignalLevel

获取指定接收信号强度指示器(RSSI)和频带指示的信号电平。

DisassociateSta

使用指定的MAC地址断开与STA的连接。

AddTxPowerInfo

将hotspot功率发送到beacon。

表4 ohos_bt_gatt.h

接口

作用

InitBtStack

初始化蓝牙协议栈。

EnableBtStack

使能蓝牙协议栈。

DisableBtStack

禁用蓝牙协议栈。

SetDeviceName

设置蓝牙设备名称。

BleSetAdvData

设置广播数据。

BleStartAdv

开始广播。

BleStartAdvEx

传入构建好的广播数据,参数,开启蓝牙广播。

BleStopAdv

停止发送广播。

BleUpdateAdv

更新advertising参数。

BleSetSecurityIoCap

设置蓝牙的IO能力为NONE,配对方式为justworks。

BleSetSecurityAuthReq

设置蓝牙是否需要配对绑定。

BleGattSecurityRsp

响应安全连接请求。

ReadBtMacAddr

获取设备MAC地址。

BleSetScanParameters

设置扫描参数。

BleStartScan

开始扫描。

BleStopScan

停止扫描。

BleGattRegisterCallbacks

注册gap,GATT事件回调函数。

表5 ohos_bt_gatt_server.h

接口

作用

BleGattsRegister

使用指定的应用程序UUID注册GATT服务器。

BleGattsUnRegister

断开GATT服务器与客户端的连接。

BleGattsDisconnect

断开GATT服务器与客户端的连接。

BleGattsAddService

添加了一个服务。

BleGattsAddIncludedService

将包含的服务添加到指定的服务。

BleGattsAddCharacteristic

向指定的服务添加特征。

BleGattsAddDescriptor

将描述符添加到指定的特征。

BleGattsStartService

启动一个服务。

BleGattsStopService

停止服务。

BleGattsDeleteService

删除一个服务。

BleGattsClearServices

清除所有服务。

BleGattsSendResponse

向接收到读取或写入请求的客户端发送响应。

BleGattsSendIndication

设备侧向APP发送蓝牙数据。

BleGattsSetEncryption

设置GATT连接的加密类型。

BleGattsRegisterCallbacks

注册GATT服务器回调。

BleGattsStartServiceEx

根据传入的服务列表,创建gatt服务。

BleGattsStopServiceEx

传入gatt服务句柄,停止gatt服务。

 说明: 不同版本接口可能存在差异,需要根据当前版本的具体文件进行适配。

DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
代码语言:erlang
复制
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

适配实例

  1. 在“config.json”中添加communication子系统。 路径:“vendor/MyVendorCompany/MyProduct/config.json”

修改如下:

代码语言:c
代码运行次数:0
运行
复制
    { 
        "subsystem": "communication", 
        "components": [ 
            { "component": "wifi_lite", "features":[] }
        ] 
    },
  1. 添加适配文件。

在“vendor/MyVendorCompany/MyProduct/config.json”文件中,通常将配置“ohos_board_adapter_dir”配置为 “//vendor/MyVendorCompany/MyProduct/adapter”。

在“ohos_board_adapter_dir”目录下根据上述适配指导中提到的头文件,适配Wi-Fi、蓝牙接口。

移植外设驱动子系统

外设驱动子系统提供OpenHarmony专有的外部设备操作接口。本模块提供设备操作接口有:FLASH, GPIO, I2C, PWM, UART, WATCHDOG等。

OpenHarmony提供了两种驱动适配方式:使用外设驱动子系统、使用HDF驱动框架。由于轻量级系统的资源有限,这里建议使用IOT子系统方式。

移植指导

厂商需要根据OpenHarmony提供的接口定义实现其功能,IOT子系统接口定义的头文件如下:

代码语言:shell
复制
base/iot_hardware/peripheral/
├── BUILD.gn
└── interfaces
    └── kits
        ├── iot_errno.h
        ├── iot_flash.h
        ├── iot_gpio.h
        ├── iot_i2c.h
        ├── iot_pwm.h
        ├── iot_uart.h
        ├── iot_watchdog.h
        ├── lowpower.h
        └── reset.h

其中“base/iot_hardware/peripheral/BUILD.gn”文件如下:

代码语言:c
代码运行次数:0
运行
复制
import("//build/lite/config/subsystem/lite_subsystem.gni")
import("//build/lite/ndk/ndk.gni")

lite_subsystem("iothardware") {
  subsystem_components = [
    "$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware",
  ]
}
if (ohos_kernel_type == "liteos_m") {
  ndk_lib("iothardware_ndk") {
    deps = [
      "$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware", #依赖厂商的适配
    ]
    head_files = [ "//base/iot_hardware/peripheral/interfaces/kits" ]
  }
}

从中可以看到厂商适配相关接口的存放目录应为“$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite”,且该目录下BUILD.gn文件中的目标应为hal_iothardware。

移植实例

  1. 在“config.json”中添加iot_hardware子系统。 路径:“vendor/MyVendorCompany/MyProduct/config.json”

修改如下:

代码语言:shell
复制
    { 
        subsystem": "iot_hardware", 
        components": [ 
            { "component": "iot_controller", "features":[] }
        ] 
    },
  1. 添加适配文件。

在“vendor/MyVendorCompany/MyProduct/config.json”文件中,通常将配置“vendor_adapter_dir”配置为 “//device/MyDeviceCompany/MyBoard/adapter”。

在“vendor_adapter_dir”目录下进行适配:

代码语言:shell
复制
    hals/iot_hardware/wifiiot_lite
    ├── BUILD.gn
    ├── iot_flash.c
    ├── iot_gpio.c
    ├── iot_i2c.c
    ├── iot_lowpower.c
    ├── iot_pwm.c
    ├── iot_reset.c
    ├── iot_uart.c
    └── iot_watchdog.c

其中BUILD.gn内容如下:

代码语言:c
代码运行次数:0
运行
复制
    static_library("hal_iothardware") {   #目标名
        sources = [                       #厂商适配的源文件
          "iot_watchdog.c",
          "iot_reset.c",
          "iot_flash.c",
          "iot_i2c.c",
          "iot_gpio.c",
          "iot_pwm.c",
          "iot_uart.c"
        ]
        include_dirs = [ ]
    }

其中,“include_dirs”需要根据工程实际情况包含两个路径:

  • iot子系统的头文件路径
  • 适配iot子系统所使用到的SDK的头文件路径

配置其他子系统

除上述子系统之外,还有一些必要但是无需进行移植的子系统。如:分布式任务调度子系统、DFX子系统。

这些子系统添加方式比较简单,在“vendor/MyVendorCompany/MyProduct/config.json”文件中进行如下配置即可:

代码语言:c
代码运行次数:0
运行
复制
{
  "subsystem": "distributed_schedule",
  "components": [
    { "component": "system_ability_manager", "features":[] }  # 此处部件名不同版本可能有变化,请根据实际代码填写
  ]
},
{
  "subsystem": "hiviewdfx",
  "components": [
    { "component": "hilog_lite", "features":[] },
    { "component": "hievent_lite", "features":[] }
  ]
},

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 移植安全子系统
  • 移植指导
  • 移植实例
  • 移植通信子系统
  • 移植指导
    • DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
  • 适配实例
  • 移植外设驱动子系统
  • 移植指导
  • 移植实例
  • 配置其他子系统
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档