OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)

轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 ,进行轻量带屏开发板的标准移植,开发了智能开关面板样例,同时实现了ace_engine_litearkui_ui_liteaafwk_liteappexecfwk_liteHDF等部件基于OpenHarmony LiteOS-M内核的适配。移植架构上采用BoardSoC分离的方案,工具链Newlib C库与Musl C库可选,LiteOS-M内核编译采用gn结合Kconfig图形化配置等需求。

编译构建

目录规划

本案例在芯片移植架构方面进行了一些改进,以前的芯片适配目录规划为:

device
└── <device_company>
    └── <device_name>

这样会导致,小熊派BearPi-HM Nano开发板与润和的HiSpark Pegasus开发板使用小海思的hi3861SoC时,需要在这两款开发板里面都放置一份重复的代码。为了解决该问题,本案例将单板厂商与SoC厂商进行分离,可以参考 Board和SoC解耦的设计思路 ,并把芯片适配目录规划为:

device
├── board                                --- 单板厂商目录
│   └── fnlink                           --- 单板厂商名字:欧智通
│       └── v200zr                       --- 单板名:v200zr
└── soc									 --- SoC厂商目录
    └── bestechnic                       --- SoC厂商名字:恒玄
        └── bes2600						 --- SoC Series名:bes2600是一个系列,里面包含bes2600w等SoC名

产品样例目录规划为:

vendor
└── bestechnic							 --- 开发产品样例厂商目录,恒玄开发的带屏样例,因此以bestechnic命名
    └── display_demo         			 --- 产品名字:以智能开关面板的带屏显示样例

预编译适配

在进行移植之前,需要进行预编译适配。

预编译适配主要使用hb set命令,设置整个项目的根目录、单板目录、产品目录、单板公司名等环境变量,为编译做准备。

具体的预编译适配步骤如下:

  1. vendor/bestechnic/display_demo目录下新增config.json文件,用于描述这个产品样例所使用的单板、内核等信息,描述信息可参考如下内容:
{
  "product_name": "display_demo",       --- 用于hb set进行选择时,显示的产品名称
  "type": "mini",                       --- 构建系统的类型,mini/small/standard
  "version": "3.0",                     --- 构建系统的版本,1.0/2.0/3.0
  "device_company": "fnlink",           --- 单板厂商名,用于编译时找到/device/board/fnlink目录
  "board": "v200zr",                    --- 单板名,用于编译时找到/device/board/fnlink/v200zr目录
  "kernel_type": "liteos_m",            --- 内核类型,因为OpenHarmony支持多内核,一块单板可能适配了多个内核,所以需要指定某个内核进行编译
  "kernel_version": "3.0.0",            --- 内核版本,一块单板可能适配了多个linux内核版本,所以需要指定某个具体的内核版本进行编译
  "subsystems": [ ]                     --- 选择所需要编译构建的子系统
}
  1. device/board/fnlink/v200zr/liteos_m目录下新增config.gni文件,用于描述这个产品样例所使用的单板、内核等信息,描述信息可参考如下内容:
# Kernel type, e.g. "linux", "liteos_a", "liteos_m".
kernel_type = "liteos_m"                --- 内核类型,跟config.json中kernel_type对应

# Kernel version.
kernel_version = "3.0.0"                --- 内核版本,跟config.json中kernel_version对应
  1. 验证hb set配置是否正确,输入hb set能够显示如下图片表示配置正确。

执行hb set输入项目根目录,并且回车,hb命令会遍历所有//vendor/<product_company>/<product_name>目录下的config.json,给出可选产品编译选项,config.jsonproduct_name用于显示产品名,device_companyboard用于关联出//device/board/<device_company>/<board>目录,并且匹配<any_dir_name>/config.gni文件,如果能够匹配多个文件,表示该单板适配了多个内核,那么可以根据config.jsonkernel_typekernel_version来唯一匹配config.gnikernel_typekernel_version,即可确定了需要编译适配了哪个内核的单板。

     	通过`hb env`可以查看选择出来的预编译环境变量。

在执行hb build之前,需要准备好LiteOS-M内核适配,具体适配步骤请参 内核移植。

内核移植

内核移植需要完成LiteOS-M Kconfig适配、gn的编译构建和内核启动最小适配。

LiteOS-M Kconfig适配

//kernel/liteos_m目录下执行make menuconfig命令,完成编译配置选项的选择。在Makefile文件中,会将hb env的结果转换成环境变量,即PRODUCT_PATHDEVICE_PATHBOARD_COMPANY。如下代码块所示:

$(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
--- 将hb env的每一行输出转化为变量形式,例如将[OHOS INFO] device company: fnlink转换为ohos_device_company=fnlink

……

ifeq ($(BOARD_COMPANY),)
BOARD_COMPANY:=$(ohos_device_company)
endif
……
export BOARD_COMPANY
--- 将ohos_device_company转化为BOARD_COMPANY环境变量

//kernel/liteos_m/Kconfig文件中使用这些导出的环境变量,Kconfiglib采用ulfalizer开发基于python的版本,源码地址功能介绍连接参考,里面用到了orsource关键字,其中o表示optional,表示这个文件是否存在可选,r表示relative,表示这个文件相对当前文件的相对路径。

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"                                 --- 将所有扩展板配置信息加载进来,因为单板厂商A提供扩展板可以给单板厂商B使用,所以这里使用*匹配所有的扩展板,而非BOARD_COMPANY。另外由于OpenHarmony支持多内核设计,Kconfig文件采用liteos_m作为后缀,在进行单板适配过程中,其他内核在适配过程中,可以使用对应的内核名作为后缀名进行扩展。

orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"         --- 加载BOARD_COMPANY的所有单板预定义配置

choice
    prompt "Board Selection"

orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"                   --- 提供Board选择列表

endchoice

orsource "../../device/soc/*/Kconfig.liteos_m.defconfig"                                 --- 加载所有SoC的默认配置定义

choice
    prompt "SoC Series Selection"

orsource "../../device/soc/*/Kconfig.liteos_m.series"                                    --- 提供所有SoC Series选择列表

endchoice

orsource "../../device/soc/*/Kconfig.liteos_m.soc"                                       --- 加载所有SoC配置

//kernel/liteos_m/Kconfig文件可以看出需要在//device/board/fnlink目录下新增如下Kconfig文件进行适配:

├── v200zr                                       --- v200zr单板配置目录
│   ├── Kconfig.liteos_m.board                   --- 提供v200zr单板的配置选项
│   ├── Kconfig.liteos_m.defconfig.board         --- 提供v200zr单板的默认配置项
│   └── liteos_m
│       └── config.gni
├── Kconfig.liteos_m.boards                      --- 提供fnlink单板厂商下Boards配置信息
├── Kconfig.liteos_m.defconfig.boards			 --- 提供fnlink单板厂商下Boards默认配置信息
├── Kconfig.liteos_m.shields					 --- 提供fnlink单板厂商下扩展板配置信息
└── shields										 --- fnlink单板厂商的扩展板目录
    ├── v200zr-t0								 --- fnlink单板厂商的扩展板v200zr-t0
    │   ├── Kconfig.liteos_m.defconfig.shield	 --- 扩展板v200zr-t0默认配置
    │   └── Kconfig.liteos_m.shield				 --- 扩展板v200zr-t0配置信息
    ├── v200zr-t1
    │   ├── Kconfig.liteos_m.defconfig.shield
    │   └── Kconfig.liteos_m.shield
    └── Kconfig.liteos_m.shields

在 v200zr/Kconfig.liteos_m.board需要配置选择该单板的选项,以及它依赖的SoC,如下:

config BOARD_v200zr
    bool "select board v200zr"
    depends on SOC_BES2600W		 --- v200zr单板用的bes2600w的SoC,只有 bes2600w的SoC被选择后,v200zr单板配置选项才可见,可以被选择。

在 v200zr/Kconfig.liteos_m.defconfig.board需要配置选择该单板后,默认定义 BOARD 的名字为 "v200zr" ,如下:

if BOARD_v200zr
config BOARD
    string		 --- string后没有带提示,因此用户不可见
    default "v200zr"

endif # BOARD_v200zr

//kernel/liteos_m/Kconfig文件可以看出需要在//device/soc/bestechnic目录下新增如下Kconfig文件进行适配:

.
├── bes2600									 --- bes2600 SoC系列
│   ├── Kconfig.liteos_m.defconfig.bes2600w	 --- bestechnic芯片厂商bes2600w SoC Series配置
│   ├── Kconfig.liteos_m.defconfig.series	 --- bestechnic芯片厂商bes2600默认配置
│   ├── Kconfig.liteos_m.series				 --- bestechnic芯片厂商bes2600 SoC Series配置
│   └── Kconfig.liteos_m.soc				 --- bestechnic芯片厂商bes2600 SoC配置
├── Kconfig.liteos_m.defconfig				 --- bestechnic芯片厂商SoC默认配置
├── Kconfig.liteos_m.series					 --- bestechnic芯片厂商SoC Series配置
└── Kconfig.liteos_m.soc					 --- bestechnic芯片厂商 SoC配置

在 bes2600/Kconfig.liteos_m.series 需要配置bes2600 SoC series,以及它的芯片架构等信息,如下:

config SOC_SERIES_BES2600			 --- 提供bes2600 SoC Series选项
    bool "Bestechnic 2600 Series"
    select ARM						 --- 选择bes2600后,默认选择ARM架构
    select SOC_COMPANY_BESTECHNIC    --- 选择bes2600后,默认选择bestechnic芯片公司,驱动会依赖这个宏配置,选择配置编译对应厂商的驱动
    select CPU_CORTEX_M33			 --- 选择bes2600后,默认选择cortex-m33 CPU
    help
        Enable support for Bestechnic 2600 series

在 bes2600/Kconfig.liteos_m.soc 需要提供bes2600 SoC series下有多少个具体的SoC可供选择,如下:

choice
    prompt "Bestechnic 2600 series SoC"
    depends on SOC_SERIES_BES2600	 --- 只有选择了bes2600 Series后,才会出现如下配置选项

config SOC_BES2600W					 --- 增加bes2600w SoC配置选择项
    bool "SoC BES2600w"

endchoice

在 bes2600/Kconfig.liteos_m.defconfig.series 需要提供bes2600 SoC series选择后的默认配置,如下:

if SOC_SERIES_BES2600							 --- 选择了bes2600 Series后,才会增加如下默认配置选项

rsource "Kconfig.liteos_m.defconfig.bes2600w"	 --- 增加bes2600w SoC的默认配置

config SOC_SERIES								 --- 增加SOC_SERIES的默认配置
    string
    default "bes2600"

en
<think>好的,我现在需要帮助用户了解如何将鸿蒙轻量系统(LiteOS)移植到其他硬件平台。首先,我应该回顾用户提供的引用内容,看看里面有哪些有用的信息。 根据引用[1],HarmonyOS轻量系统使用LiteOS-M内核,小型和标准系统使用LiteOS-A或Linux。用户问的是轻量系统,所以可能是指LiteOS-M。引用[3]提到个将LiteOS移植到ESP32的项目,这应该是个实际的案例。引用[4]指出移植LiteOS-A需要注意初始化和硬件配置,这可能对移植过程有帮助。引用[5]给出了LiteOS-A的代码示例,虽然用户问的是轻量系统,但代码结构可能有参考价值。 接下来,我需要整理移植的基本步骤。根据引用中的信息,移植大概需要以下几个步骤:硬件选型、获取源码、配置内核、驱动适配、任务开发、编译调试。每个步骤需要详细说明,并结合引用中的具体内容。 例如,在硬件选型部分,引用[3]提到ESP32芯片,说明需要选择支持的硬件。获取源码部分,引用[3]提到从鸿蒙开源仓库获取,可能需要提供具体的仓库地址或分支。配置内核部分,引用[4]提到初始化和定制化配置,可能需要修改特定文件。驱动适配部分,引用[5]的代码示例展示了GPIO控制,说明需要实现HAL层的接口。编译调试部分,引用[3]提到使用工具链,可能需要具体说明如何配置编译环境。 另外,用户可能需要的文档或教程在哪里?引用[3]中的项目可能提供资源文件,引用[4]和[5]的代码示例可以作为参考。可能需要指导用户查阅官方文档和开源社区。 还需要生成相关问题,考虑用户可能遇到的后续问题,比如移植常见错误、性能优化、具体芯片移植案例等。 最后,确保回答符合格式要求:使用中文,行内公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,所以可能不需要。结构清晰,分步骤说明,引用正确标识。</think>### HarmonyOS LiteOS移植教程 根据技术文档和开源项目实践,LiteOS移植需要遵循以下核心步骤: #### 、硬件选型与准备 1. **选择兼容芯片**:优先选择支持RISC-V/ARM Cortex-M架构的芯片,例如ESP32[^3]、STM32等 2. **硬件特性验证**:确认目标硬件满足LiteOS-M的最小系统要求: - 16KB以上RAM - 支持中断控制器 - 具备定时器模块 #### 二、源码获取与配置 1. 从鸿蒙开源仓库获取LiteOS-M内核: ```bash git clone https://gitee.com/openharmony/kernel_liteos_m.git ``` 2. 关键目录结构: ``` kernel_liteos_m/ ├── arch/ # 架构相关代码 ├── components/ # 可选组件 └── kernel/ # 核心内核 ``` #### 三、内核移植流程 1. **架构适配**(以ARM Cortex-M3为例): - 在`arch/arm/cortex-m3`中实现: - 中断向量表`los_interrupt.c` - 上下文切换`los_context.S` - 系统时钟配置`los_timer.c` 2. **板级支持包(BSP)开发**: ```c // board/your_board/hal_platform_init.c void HalClockInit(void) { // 配置系统时钟 SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock / 1000); } ``` #### 四、驱动开发规范 1. 遵循HDF驱动框架: ```c #include "hdf_device_desc.h" static int32_t GpioDriverInit(struct HdfDeviceObject *device) { // GPIO初始化代码 return HDF_SUCCESS; } struct HdfDriverEntry g_gpioDriverEntry = { .moduleVersion = 1, .moduleName = "HDF_GPIO_MODULE", .Bind = GpioDriverBind, .Init = GpioDriverInit, .Release = GpioDriverRelease, }; ``` #### 五、编译系统配置 修改`build/lite/product/your_product.json`: ```json { "product_name": "your_product", "device_company": "your_vendor", "target_cpu": "cortex-m3", "kernel_type": "liteos_m" } ``` #### 六、验证与调试 1. 烧录后通过串口输出调试信息: ```c #include "los_sys.h" void main() { LOS_KernelInit(); printf("System init success!\n"); LOS_Start(); } ``` ### 关键文档资源 1. 官方移植指南:[OpenHarmony移植文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/porting-minimum-system.md) 2. ESP32移植案例:[鸿蒙LiteOS移植到ESP32项目](https://gitee.com/your_project)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值