OpenHarmony 平头哥玄铁架构 轻量系统移植—润和 W800 移植分享 第三章 Openharmony 子系统适配(转载)
本文转自51CTO.COM开源基础软件社区,原文链接请点击文章结尾的“阅读原文”。
本方案基于OpenHarmony LiteOS-M内核,使用联盛德W800芯片的润和软件海王星系列Neptune100开发板,进行开发移植。
移植架构采用Board
与SoC
分离方案,支持通过Kconfig图形化配置编译选项,增加玄铁ck804ef
架构移植,实现了HDF
、XTS
等子系统及组件的适配。
第三章 Openharmony子系统适配
子系统的编译选项入口在相应产品config.json下,如:vendor/hihope/neptune_iotlink_demo/config.json 。
WiFi_Lite组件
首先,在config.json文件中,增加communication子系统的wifi_lite部件,如下:
{
"subsystem": "communication",
"components": [
{
"component": "wifi_lite",
"optional": "true"
}
]
},
wifi_lite部件在 build/lite/components/communication.json文件中,描述如下:
{
"component": "wifi_lite",
"targets": [
"//foundation/communication/wifi_lite:wifi" --- wifi_lite的编译目标
],
},
在本案例中,wifi适配源码可见device/soc/winnermicro/wm800/board/src/wifi/ wm_wifi.c,如下:
int tls_wifi_netif_add_status_event(tls_wifi_netif_status_event_fn event_fn) ---用于增加wifi事件功能
{
u32 cpu_sr;
struct tls_wifi_netif_status_event *evt;
//if exist, remove from event list first.
tls_wifi_netif_remove_status_event(event_fn);
evt = tls_mem_alloc(sizeof(struct tls_wifi_netif_status_event));
if(evt==NULL)
return -1;
memset(evt, 0, sizeof(struct tls_wifi_netif_status_event));
evt->status_callback = event_fn;
cpu_sr = tls_os_set_critical();
dl_list_add_tail(&wifi_netif_status_event.list, &evt->list);
tls_os_release_critical(cpu_sr);
return 0;
}
系统服务管理子系统适配
系统服务管理子系统适配添加samgr_lite部件,直接在config.json配置,如下:
{
"subsystem": "distributedschedule",
"components": [
{
"component": "samgr_lite"
}
]
},
公共基础库子系统适配
公共基础库子系统适配添加了kv_store、file部件,直接在config.json配置,如下:
{
"subsystem": "utils",
"components": [
{
"component": "kv_store",
"features": [
"enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true"
]
},
{ "component": "file", "features":[] }
]
},
适配kv_store部件时,键值对会写到文件中。在轻量系统中,文件操作相关接口有POSIX接口与HalFiles接口这两套实现。
因为对接内核的文件系统,采用POSIX相关的接口,所以features需要增加enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true。
启动恢复子系统适配
启动恢复子系统适配添加了bootstrap_lite、syspara_lite部件,直接在config.json配置,如下:
{
"subsystem": "startup",
"components": [
{
"component": "bootstrap_lite"
},
{
"component": "syspara_lite",
"features": [
"enable_ohos_startup_syspara_lite_use_posix_file_api = true",
"config_ohos_startup_syspara_lite_data_path = \"/data/\""
]
}
]
},
适配bootstrap_lite部件时,需要在链接脚本文件device/soc/winnermicro/ wm800/ board/ld/w800/gcc_csky.ld中手动新增如下段:
.zinitcall_array :
{
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_core_start = .);
KEEP (*(SORT(.zinitcall.core*)))
KEEP (*(.zinitcall.core*))
PROVIDE_HIDDEN (__zinitcall_core_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_device_start = .);
KEEP (*(SORT(.zinitcall.device*)))
KEEP (*(.zinitcall.device*))
PROVIDE_HIDDEN (__zinitcall_device_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_bsp_start = .);
KEEP (*(SORT(.zinitcall.bsp*)))
KEEP (*(.zinitcall.bsp*))
PROVIDE_HIDDEN (__zinitcall_bsp_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_sys_service_start = .);
KEEP (*(SORT(.zinitcall.sys.service*)))
KEEP (*(.zinitcall.sys.service*))
PROVIDE_HIDDEN (__zinitcall_sys_service_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_app_service_start = .);
KEEP (*(SORT(.zinitcall.app.service*)))
KEEP (*(.zinitcall.app.service*))
PROVIDE_HIDDEN (__zinitcall_app_service_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_sys_feature_start = .);
KEEP (*(SORT(.zinitcall.sys.feature*)))
KEEP (*(.zinitcall.sys.feature*))
PROVIDE_HIDDEN (__zinitcall_sys_feature_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_app_feature_start = .);
KEEP (*(SORT(.zinitcall.app.feature*)))
KEEP (*(.zinitcall.app.feature*))
PROVIDE_HIDDEN (__zinitcall_app_feature_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_run_start = .);
KEEP (*(SORT(.zinitcall.run*)))
KEEP (*(.zinitcall.run*))
PROVIDE_HIDDEN (__zinitcall_run_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_test_start = .);
KEEP (*(SORT(.zinitcall.test*)))
KEEP (*(.zinitcall.test*))
PROVIDE_HIDDEN (__zinitcall_test_end = .);
. = ALIGN(0x4) ;
PROVIDE_HIDDEN (__zinitcall_exit_start = .);
KEEP (*(SORT(.zinitcall.exit*)))
KEEP (*(.zinitcall.exit*))
PROVIDE_HIDDEN (__zinitcall_exit_end = .);
} > REGION_RODATA
需要新增上述段是因为bootstrap_init提供的对外接口,见utils/native/lite/include/ohos_init.h文件,采用的是灌段的形式,最终会保存到上述链接段中。主要的服务自动初始化宏如下表格所示:
接口名 | 描述 |
---|---|
SYS_SERVICE_INIT(func) | 标识核心系统服务的初始化启动入口 |
SYS_FEATURE_INIT(func) | 标识核心系统功能的初始化启动入口 |
APP_SERVICE_INIT(func) | 标识应用层服务的初始化启动入口 |
APP_FEATURE_INIT(func) | 标识应用层功能的初始化启动入口 |
通过上面加载的组件编译出来的lib文件需要手动加入强制链接。
如在 vendor/hihope/neptune_iotlink_demo/config.json 中配置了bootstrap_lite 部件:
{
"subsystem": "startup",
"components": [
{
"component": "bootstrap_lite"
},
...
]
},
bootstrap_lite部件会编译base/startup/bootstrap_lite/services/source/bootstrap_service.c,该文件中,通过SYS_SERVICE_INIT将Init函数符号灌段到__zinitcall_sys_service_start和__zinitcall_sys_service_end中,由于Init函数是没有显式调用它,所以需要将它强制链接到最终的镜像。如下:
static void Init(void)
{
static Bootstrap bootstrap;
bootstrap.GetName = GetName;
bootstrap.Initialize = Initialize;
bootstrap.MessageHandle = MessageHandle;
bootstrap.GetTaskConfig = GetTaskConfig;
bootstrap.flag = FALSE;
SAMGR_GetInstance()->RegisterService((Service *)&bootstrap);
}
SYS_SERVICE_INIT(Init); --- 通过SYS启动即SYS_INIT启动就需要强制链接生成的lib
在base/startup/bootstrap_lite/services/source/BUILD.gn文件中,描述了在out/neptune100/neptune_iotlink_demo/libs 生成 libbootstrap.a,如下:
static_library("bootstrap") {
sources = [
"bootstrap_service.c",
"system_init.c",
]
...
适配syspara_lite部件时,系统参数会最终写到文件中进行持久化保存。在轻量系统中,文件操作相关接口有POSIX接口与HalFiles接口这两套实现。
因为对接内核的文件系统,采用POSIX相关的接口,所以features字段中需要增加enable_ohos_startup_syspara_lite_use_posix_file_api = true。
XTS子系统适配
XTS子系统的适配,直接在config.json中加入组件选项:
{
"subsystem": "xts",
"components": [
{
"component": "xts_acts",
"features":
[
"config_ohos_xts_acts_utils_lite_kv_store_data_path = \"/data\"",
"enable_ohos_test_xts_acts_use_thirdparty_lwip = true"
]
},
{ "component": "xts_tools", "features":[] }
]
}
另外,XTS功能也使用了list来组织,在config.json文件中增减相应模块:
"bin_list": [
{
"enable": "true",
"force_link_libs": [
"module_ActsParameterTest",
"module_ActsBootstrapTest",
"module_ActsDfxFuncTest",
"module_ActsHieventLiteTest",
"module_ActsSamgrTest",
"module_ActsUtilsFileTest",
"module_ActsKvStoreTest",
"module_ActsWifiServiceTest"
]
}
],
其它组件的适配过程与官方以及其它厂商的过程类似,不再赘述。
写在最后
我们最近正带着大家玩嗨OpenHarmony。如果你有好玩的东东,欢迎投稿,让我们一起嗨起来!有点子,有想法,有Demo,立刻联系我们:
合作邮箱:zzliang@atomsource.org