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

往期知识点记录:

移植安全子系统

安全子系统提供网络设备连接、认证鉴权等功能,依赖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"

修改如下:

    {
      "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"

    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"

    #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"

    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来选择安全子系统特性。

{
   "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"

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服务。

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

适配实例

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

修改如下:

    { 
        "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子系统接口定义的头文件如下:

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"文件如下:

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"

修改如下:

    { 
        subsystem": "iot_hardware", 
        components": [ 
            { "component": "iot_controller", "features":[] }
        ] 
    },
  1. 添加适配文件。

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

在"vendor_adapter_dir"目录下进行适配:

    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内容如下:

    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"文件中进行如下配置即可:

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

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念

2.构建第一个ArkTS应用

3.......

开发基础知识:

1.应用基础知识

2.配置文件

3.应用数据管理

4.应用安全管理

5.应用隐私保护

6.三方应用调用管控机制

7.资源分类与访问

8.学习ArkTS语言

9.......

基于ArkTS 开发

1.Ability开发

2.UI开发

3.公共事件与通知

4.窗口管理

5.媒体

6.安全

7.网络与链接

8.电话服务

9.数据管理

10.后台任务(Background Task)管理

11.设备管理

12.设备使用信息统计

13.DFX

14.国际化开发

15.折叠屏系列

16.......

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

OpenHarmony 开发环境搭建

《OpenHarmony源码解析》 :https://gitcode.com/HarmonyOS_MN/733GH/overview

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ......
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ......

OpenHarmony 设备开发学习手册 :https://gitcode.com/HarmonyOS_MN/733GH/overview


相关推荐
m0_739312874 分钟前
【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
stm32·单片机·嵌入式硬件
HarmonyOS_SDK13 分钟前
免弹窗、预授权,默认界面扫码能力打造系统级扫码体验
harmonyos
CV金科2 小时前
蓝桥杯-STM32G431RBT6(串口)
c语言·stm32·单片机·嵌入式硬件·蓝桥杯
追风小老头折腾程序2 小时前
实战06-LazyForEach
harmonyos
让开,我要吃人了3 小时前
OpenHarmony鸿蒙( Beta5.0)摄像头实践开发详解
驱动开发·华为·移动开发·harmonyos·鸿蒙·鸿蒙系统·openharmony
硬核科技3 小时前
变压器在电源中的核心作用
网络·单片机·嵌入式硬件·硬件工程·智能硬件·开关电源
CV金科4 小时前
蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)
c语言·stm32·单片机·嵌入式硬件·mcu·算法·bug
培林将军4 小时前
C51单片机-单按键输入识别,键盘消抖
单片机·嵌入式硬件·计算机外设
hong1616885 小时前
单片机(Microcontroller)原理及应用
单片机·嵌入式硬件