前言¶
概述
本文章是基于视觉SS928V100开发板,进行OpenHarmony 5.1.0 Release小型系统相关功能的移植;主要包括解决方案集成,产品配置添加,内核移植适配、编译,XTS认证,图形增强特性,媒体增强特性的适配案例总结。
读者对象
本文档主要适用于视觉OpenHarmony Small系统升级的操作人员。操作人员必须具备以下经验和技能:
熟悉OpenHarmony源码编译构建。
熟悉视觉类芯片SDK版本。
符号约定
在本文中可能出现下列标志,它们所代表的含义如下。
符号 |
说明 |
|---|---|
|
表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。 |
|
表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。 |
|
表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。 |
|
用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。 |
|
对正文中重点信息的补充说明。 “说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。 |
修改记录
文档版本 |
发布日期 |
修改说明 |
|---|---|---|
00B01 |
2025-09-15 |
第1次临时版本发布。 |
芯片解决方案配置¶
本方案移植架构上采用Borad和SoC解耦的设计思路,芯片目录规划如下:
device_board_hisilicon
本目录用于存放SS928V100的开发板相关内容,支持运行小型系统的开发板;介绍了单板、内核、工具链和编译器等信息。
device/board/hisilicon/hispark_ss928v100/ ├── BUILD.gn ├── linux │ ├── BUILD.gn │ ├── config.gni #用于描述这个产品样例所使用的单板、内核、工具链、编译器等信息 │ ├── LICENSE ├── ohos.build #定义一个device_hispark_ss928v100子系统,该设备下module_list字段列出了设备需要加载的模块 └── README_zh.md
device_soc_hisilicon
本目录用于存放芯片相关内容,包含HDI实现(display、media、middleware)、芯片SDK(用户态库、头文件、驱动源码、MPP Sample等)
device/soc/hisilicon
├── common
│ ├── hal
│ │ ├── BUILD.gn
│ │ ├── build.sh
│ │ ├── display
│ │ │ ├── BUILD.gn
│ │ │ ├── ...
│ │ │ └── ss928 #支持SS928V100和SS927V100的媒体中间件
│ │ ├── LICENSE
│ │ ├── media
│ │ │ ├── audio
│ │ │ ├── build
│ │ │ ├── BUILD.gn
│ │ │ ├── build.sh
│ │ │ ├── camera
│ │ │ ├── codec
│ │ │ ├── common
│ │ │ ├── format
│ │ │ ├── Makefile
│ │ │ └── ...
│ │ ├── middleware #媒体中间件
│ │ │ ├── source #支持SS928V100和SS927V100的媒体中间件
│ │ │ └── ...
│ │ └── ...
│ └── ...
└── ss928v100
├── burn
│ └── emmc_burn_table.xml #烧写emmc介质的镜像分区表
├── kernel
│ └── arch
├── NOTICE
├── README_zh.md
├── sdk_linux
│ ├── BUILD.gn
│ ├── build.sh #编译SDK入口:编译ko、atf
│ ├── config.gni
│ ├── open_source #编译SDK依赖的开源软件,提供配置指导和定制补丁
│ ├── smp #SDK软件,自研,包括内核驱动源码、sample实例代码,闭源库
│ ├── ss928v100_sdk_patch_001.patch #OpenHarmony环境上编译SDK制作的patch
│ └── ss928v100_sdk_patch_002.patch #基于编译内核fip.bin ATF制作的patch
├── soc.gni
└── uboot
└── LICENSE
说明: 基于device/soc/hisilicon/ss928v100/sdk_linux主要是基于芯片SDK的适配,下面将展开详细介绍:
该目录下的smp和open_source目录内容为芯片SDK提供内容,可以直接从SDK中拷贝使用
ss928v100_sdk_patch_001.patch和ss928v100_sdk_patch_002.patch:由于SDK和OpenHarmony代码、编译环境差异,需要在OpenHarmony下应用定制补丁
uboot:已提供源码,需自行编译生成
SDK编译适配¶
配置OpenHarmony环境上编译芯片SDK的相关参数。
修改文件device/soc/hisilicon/ss928v100/sdk_linux/BUILD.gn,配置芯片SDK编译的相关参数。
ohos_root_path:OpenHarmony源码目录;
outdir:编译out目录;
y:是否为Lite型系统;
clang_dir:编译工具链路径;
linux_kernel_version:指定使用的内核版本;
chip:芯片型号。
if (defined(ohos_lite)) { build_ext_component("sdk_make") { exec_path = rebase_path(".", root_build_dir) outdir = rebase_path("$root_out_dir") clang_dir = "" if (ohos_build_compiler_dir != "") { clang_dir = rebase_path("$ohos_build_compiler_dir") } chip = "ss928v100" if (board_name == "hispark_ss927v100") { chip = "ss927v100" } command = "./build.sh ${ohos_root_path} ${outdir} y ${clang_dir} ${linux_kernel_version} ${chip}" deps = [ "//kernel/linux/build:linux_kernel" ] } not_needed(sdk_modules_name_list) } else { sdk_tmp_root_path = root_out_dir sdk_tmp_dir = "$sdk_tmp_root_path/sdk_linux/src_tmp" sdk_tmp_mods_dir = "$sdk_tmp_dir/out/ko" ...
配置SDK编译工具链。
SDK包中提供内核驱动源码和Sample源码,可以通过源码进行编译。在编译前,需要配置编译工具链,将编译工具链路径加入到环境变量中。
将Clang编译工具链路径加到环境变量中,执行:export PATH=/path/to/toolchains:$PATH
例如,Clang所在的路径为/path/to/llvm_clang/bin,则执行:export PATH=/path/to/llvm_clang/bin:$PATH
在OpenHarmony环境上编ko和atf。
修改device/soc/hisilicon/ss928v100/sdk_linux/build.sh
set -e OHOS_ROOT_PATH=$1 OUTDIR=$2 OHOS_LITE=$3 COMPILER_DIR=$4 CHIP=$6 export KERNEL_VERSION="$5" if [ -z "${OHOS_ROOT_PATH}" ];then OHOS_ROOT_PATH=$(pwd)/../../../.. else echo "OHOS_ROOT_PATH=${OHOS_ROOT_PATH}" fi export OHOS_ROOT_PATH if [ ${COMPILER_DIR} != "" ];then export COMPILER_PATH=${COMPILER_DIR}/bin fi SDK_LINUX_SRC_PATH=${OHOS_ROOT_PATH}/device/soc/hisilicon/ss928v100/sdk_linux SDK_LINUX_TMP_PATH=${OUTDIR}/sdk_linux/src_tmp SDK_LINUX_SMP_PATH=${SDK_LINUX_TMP_PATH}/smp SDK_LINUX_OPEN_PATH=${SDK_LINUX_TMP_PATH}/open_source SDK_LINUX_ATF_PATH=${SDK_LINUX_TMP_PATH}/open_source/trusted-firmware-a SYSROOT_PATH=${OHOS_ROOT_PATH}/out/hispark_${CHIP}/ipcamera_hispark_${CHIP}_linux/sysroot export SYSROOT_PATH OSDRV_CROSS_PATH=${OHOS_ROOT_PATH}/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu ... echo "Add patchs to sdk..." pushd ${SDK_LINUX_SMP_PATH} patch -p1 < ./ss928v100_sdk_patch_001.patch popd echo "Add patchs to atf..." pushd ${SDK_LINUX_ATF_PATH} patch -p1 < ./ss928v100_sdk_patch_002.patch popd echo "compile ko..." pushd "${SDK_LINUX_SMP_PATH}/a55_linux/mpp/out/obj" && \ make clean OHOS_LITE=y CHIP="${CHIP}" SYSROOT_PATH="${SYSROOT_PATH}" && \ make -j OHOS_LITE=y CHIP="${CHIP}" SYSROOT_PATH="${SYSROOT_PATH}" && popd echo "compile atf..." pushd ${SDK_LINUX_OPEN_PATH}/trusted-firmware-a && make clean OHOS_LITE=y && make -j OHOS_LITE=y CHIP=${CHIP} KERNEL_VER=${KERNEL_VERSION} OSDRV_CROSS=${OSDRV_CROSS_PATH}&& popd ... pushd ${SDK_LINUX_SMP_PATH}/a55_linux/mpp/out/lib for lib_name in "${sdk_libs_name_set[@]}"; do if [ -f "$lib_name" ]; then cp -f $lib_name ${OUTDIR} fi done popd mkdir -p ${SDK_LINUX_TMP_PATH}/out cp -rf ${SDK_LINUX_SMP_PATH}/a55_linux/mpp/out/ko ${SDK_LINUX_TMP_PATH}/out # copy images and burn_table file cp -rf ${SDK_LINUX_SRC_PATH}/../burn/* ${OUTDIR} # cp uImage,exe atf, flip.bin改名uImage,并替换掉; cp -rf ${SDK_LINUX_OPEN_PATH}/trusted-firmware-a/trusted-firmware-a-2.2/build/${CHIP}/release/fip.bin ${OUTDIR} # $(hide) cp -rf $(KERNEL_OBJ_TMP_PATH)/arch/$(KERNEL_ARCH)/boot/uImage $(OUT_DIR)
说明:此处重点关注几个关键变量:OHOS_ROOT_PATH、COMPILER_PATH、SYSROOT_PATH
编译生成的ko和fip.bin后,会拷贝到outdir下面,最终会一起打包进rootfs
编译SDK sample。
进入sdk/smp/a55_linux/mpp/sample,执行:make
编译完成后,各sample可执行文件位于sdk/smp/a55_linux/mpp/sample对应的目录下。
说明:
sample中使用了SDK_init和SDK_exit来进行MPP各个模块的初始化和退出。hnr需要使用pqp模块,SDK_init中默认未初始化pqp模块,因此需要单独对hnr的sample进行重编,具体步骤为:将sdk/smp/a55_linux/mpp/sample/common/sdk_module_init.h头文件中的宏定义INIT_PQP修改为1;
进入hnr目录重编,命令如下。
cd sdk/smp/a55_linux/mpp/sample/hnr make clean make
SDK打包进文件系统¶
修改文件device/soc/hisilicon/ss928v100/sdk_linux/BUILD.gn,将芯片SDK自带的用户态lib库文件拷贝进outdir中,从而被打包进rootfs中。
sdk_libs_name_set:为在OpenHarmony环境上运行SDK Sample所必须依赖的用户态lib库文件。
#####################################################################
sdk_libs_name_set = [
"libaac_comm.so",
"libaac_dec.so",
"libaac_enc.so",
"libaac_sbr_dec.so",
"libaac_sbr_enc.so",
"libaiv.so",
...
]
if (defined(ohos_lite)) {
lib_lite_abspath = rebase_path("$SDK_LINUX_LIB_LITE_PATH", ".")
sdk_linux_libs_targets = []
foreach(lib, sdk_libs_name_set) {
copy("$lib") {
sources = [ "$lib_lite_abspath/$lib" ]
outputs = [ "$root_out_dir/$lib" ]
}
sdk_linux_libs_targets += [ ":$lib" ]
}
group("sdk_linux_lite_libs") {
deps = sdk_linux_libs_targets
}
} else {
not_needed([
SDK_LINUX_LIB_LITE_PATH,
SDK_LINUX_PATH,
])
not_needed(sdk_libs_name_set)
}
修改文件third_party/musl/scripts/build_lite/BUILD.gn,将运行SDK lib库文件依赖的编译器库文件打包进文件系统。
if (!is_llvm_build) {
# copy C/C++ runtime libraries to lib out dir
if (ohos_build_compiler == "clang") {
runtime_libs = [
"libc++.so",
"libc.so",
"libomp.so",
]
compiler_cmd = "$ohos_current_cxx_command --target=$target_triple --sysroot=$sysroot_path $arch_cflags"
}
ko和fip.bin已经在SDK编译适配说明。
产品配置¶
产品目录规划为:
vendor/hisilicon/hispark_ss928v100_linux/ #hispark_ss928v100_linux小系统相关配置
├── BUILD.gn
├── config.json #定义当前产品集成subsystem范围,添加到config.json才会加入编译构建
├── fs.yml #指导构建打包生成rootfs,将组件编译产物打包设置文件属性、权限、创建软链接,制作文件系统镜像
├── hals
├── hdf_config
├── init_configs
│ ├── BUILD.gn
│ ├── etc #定义系统初始化启动脚本,用于创建和挂载设备节点、加载ko文件等
│ └── init_linux_openharmony.cfg #定义系统启动时的初始化参数和配置,由init进程解析加载
└── ohos.build
Linux内核适配¶
OpenHarmony 5.1.0 Release的和SS928V100 sdk的内核均是来源于Linux-6.6,内核适配主要是兼容2种内核代码差异,代码模型如图1所示。
图 1 SS928V100内核适配代码模型

OpenHarmony内核适配SS928V100¶
基于同一Linux 6.6版本下,SS928V100 SDK 的内核适配OpenHarmony主要分为以下3个子仓适配。
说明:
kernel/linux/config/linux-6.6/arch/arm64/configs/hispark_ss928v100_small_defconfig
kernel/linux/patches/linux-6.6/hispark_ss928v100_patch 以上目录和文件,生成方法见《OpenHarmony内核适配SS928V100 SDK 内核6.6特性指导文档》。
kernel/linux/build
修改文件kernel/linux/build/kernel_module_build.sh
if [ "$BUILD_TYPE" == "small" ];then LINUX_KERNEL_OUT=${OUT_DIR}/kernel/${KERNEL_VERSION} elif [ "$BUILD_TYPE" == "standard" ];then LINUX_KERNEL_OUT=${OUT_DIR}/kernel/src_tmp/${KERNEL_VERSION} fi if [ "$DEVICE_NAME" == "hispark_ss927v100" ];then LINUX_KERNEL_OBJ_OUT=${OUT_DIR}/kernel/${KERNEL_VERSION} elif [ "$DEVICE_NAME" == "hispark_ss928v100" ];then LINUX_KERNEL_OBJ_OUT=${OUT_DIR}/kernel/${KERNEL_VERSION} else LINUX_KERNEL_OBJ_OUT=${OUT_DIR}/kernel/OBJ/${KERNEL_VERSION} fi export OHOS_ROOT_PATH=$(pwd)/../../.. # it needs adaptation for more device target kernel_image="" if [ "$KERNEL_ARCH" == "arm" ];then kernel_image="uImage" elif [ "$KERNEL_ARCH" == "arm64" ];then kernel_image="Image" elif [ "$KERNEL_ARCH" == "x86_64" ];then kernel_image="bzImage" elif [ "$KERNEL_ARCH" == "loongarch64" ];then kernel_image="vmlinuz.efi" fi if [ "$DEVICE_NAME" == "hispark_ss927v100" ] || [ "$DEVICE_NAME" == "hispark_ss928v100" ]; then kernel_image="uImage" fi export KERNEL_IMAGE=${kernel_image}
修改kernel/linux/build/kernel.mk
... KERNEL_SRC_TMP_PATH := $(OUT_DIR)/kernel/${KERNEL_VERSION} ifeq ($(DEVICE_NAME), hispark_ss927v100) KERNEL_OBJ_TMP_PATH := $(OUT_DIR)/kernel/${KERNEL_VERSION} else ifeq ($(DEVICE_NAME), hispark_ss928v100) KERNEL_OBJ_TMP_PATH := $(OUT_DIR)/kernel/${KERNEL_VERSION} else KERNEL_OBJ_TMP_PATH := $(OUT_DIR)/kernel/OBJ/${KERNEL_VERSION} endif ifeq ($(BUILD_TYPE), standard) BOOT_IMAGE_PATH = $(OHOS_BUILD_HOME)/device/board/hisilicon/hispark_taurus/uboot/prebuilts ... CLANG_CC := $(CLANG_HOST_TOOLCHAIN)/clang ifeq ($(DEVICE_NAME), hispark_ss928v100) KERNEL_ARCH := arm64 DEVICE_DTS_PATH := $(OHOS_BUILD_HOME)/device/soc/hisilicon/ss928v100/kernel/arch/$(KERNEL_ARCH)/boot/dts/vendor KERNEL_TMP_DTS_PATH := $(KERNEL_SRC_TMP_PATH)/arch/arm64/boot/dts/vendor else ifeq ($(DEVICE_NAME), hispark_ss927v100) KERNEL_ARCH := arm64 DEVICE_DTS_PATH := $(OHOS_BUILD_HOME)/device/soc/hisilicon/ss927v100/kernel/arch/$(KERNEL_ARCH)/boot/dts/vendor KERNEL_TMP_DTS_PATH := $(KERNEL_SRC_TMP_PATH)/arch/arm64/boot/dts/vendor endif KERNEL_CROSS_COMPILE := ... ifneq ($(DEVICE_NAME), $(filter $(DEVICE_NAME), hispark_ss927v100 hispark_ss928v100)) export KBUILD_OUTPUT=$(KERNEL_OBJ_TMP_PATH) endif $(KERNEL_IMAGE_FILE): $(hide) echo "build kernel..." ifeq ($(DEVICE_NAME), hispark_phoenix) $(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfP $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/ $(hide) cd $(KERNEL_SRC_TMP_PATH)/drivers && rm -rf common && ln -s $(SDK_SOURCE_DIR)/common/drv ./common && cd - $(hide) cd $(KERNEL_SRC_TMP_PATH)/drivers && rm -rf msp && ln -s $(SDK_SOURCE_DIR)/msp/drv ./msp && cd - else $(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/ endif $(hide) $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME) ifeq ($(DEVICE_NAME), hispark_ss927v100) $(hide) chmod 755 $(DEVICE_PATCH_DIR)/patch_ss927v100.sh $(hide) cd $(KERNEL_SRC_TMP_PATH);$(DEVICE_PATCH_DIR)/patch_ss927v100.sh $(DEVICE_PATCH_DIR) else ifeq ($(DEVICE_NAME), hispark_ss928v100) $(hide) chmod 755 $(DEVICE_PATCH_DIR)/patch_ss928v100.sh $(hide) cd $(KERNEL_SRC_TMP_PATH);$(DEVICE_PATCH_DIR)/patch_ss928v100.sh $(DEVICE_PATCH_DIR) else ifeq ($(PRODUCT_PATH), vendor/hisilicon/watchos) $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(PRODUCT_PATCH_FILE) else $(hide) cd $(KERNEL_SRC_TMP_PATH) && test -f $(DEVICE_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) || true endif ifneq ($(findstring $(BUILD_TYPE), small),) ifneq ($(DEVICE_NAME), $(filter $(DEVICE_NAME), hispark_ss927v100 hispark_ss928v100)) $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(SMALL_PATCH_FILE) endif endif ifeq ($(UNIFIED_COLLECTION_PATCH_FILE), $(wildcard $(UNIFIED_COLLECTION_PATCH_FILE))) $(hide) $(UNIFIED_COLLECTION_PATCH_FILE) $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(DEVICE_NAME) $(KERNEL_VERSION) endif $(hide) cp -rf $(KERNEL_CONFIG_PATH)/. $(KERNEL_SRC_TMP_PATH)/ $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) distclean $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE) ifeq ($(KERNEL_VERSION), linux-5.10) $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_prepare endif $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 $(KERNEL_IMAGE) endif ifeq ($(DEVICE_NAME), $(filter $(DEVICE_NAME), hispark_ss928v100 hispark_ss927v100)) echo "$(KERNEL_OBJ_TMP_PATH)/arch/$(KERNEL_ARCH)/boot/uImage" $(hide) cp -rf $(KERNEL_OBJ_TMP_PATH)/arch/$(KERNEL_ARCH)/boot/uImage $(OUT_DIR) $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) scripts/module.lds endif
kernel/linux/config
新增kernel/linux/config/linux-6.6/arch/arm64/configs/hispark_ss928v100_small_defconfig
kernel/linux/patches
新增如下patch目录kernel/linux/patches/linux-6.6/hispark_ss928v100_patch,目录结构规划如下。
hispark_ss928v100_patch #ss928 sdk集成oh内核后的patch
├── oh_feature.patch #OH特性的内核部分patch,和sdk内核代码不存在冲突
├── oh_ss928.patch #OH特性和ss928 sdk内核特性合并patch
└── patch_ss928v100.sh #执行应用patch脚本文件
内核编译调试¶
在OpenHarmony环境下整编kernel。
在ohos代码根目录下执行命令,整编Linux-6.6内核。
./build.sh --product-name=ipcamera_hispark_ss928v100_linux --build-target linux_kernel --ccache --no-prebuilt-sdk
说明:
OpenHarmony支持多套内核版本Linux-5.10、Linux-6.6,默认匹配最高的内核版本;若要指定Linux-5.10 内核版本可以增加参数--gn-args linux_kernel_version=\"linux-5.10\"。
可以参考kernel/linux/build/README_zh.md文档编译。直接使用Makefile编译调试kernel。
通过在kernel/linux/build/BUILD.gn中增加编译kernel的command打印出来,从而实现手动调试Makefile,加粗部分为修改代码。
if (os_level == "mini" || os_level == "small") { build_ext_component("linux_kernel") { no_default_deps = true exec_path = rebase_path(".", root_build_dir) outdir = rebase_path("$root_out_dir") build_type = "small" product_path_rebase = rebase_path(product_path, ohos_root_path) command = "./kernel_module_build.sh ${outdir} ${build_type} ${target_cpu} ${product_path_rebase} ${board_name} ${linux_kernel_version}" print("++++++++ command: $command") }
在ohos目录下整编一次产品。
./build.sh --product-name=ipcamera_hispark_ss928v100_linux --build-target linux_kernel --ccache --no-prebuilt-sdk在out/hispark_ss928v100/ipcamera_hispark_ss928v100_linux/build.log中查找步骤1增加打印,找到执行命令。
在Linux终端下进入kernel/linux/build目录,执行上述步骤1中打印出的调试编译内核的命令即可触发编译。
XTS最小集子系统适配¶
OpenHarmony子系统适配只需要在vendor/hisilicon/hispark_ss928v100_linux/config.json中增加对应子系统和部件,这样编译系统会将该部件纳入编译目标中。
本章节主要介绍SS928V100适配L1(不带屏)设备满足XTS认证的依赖的子系统集,如下仅提供参考。
添加依赖的OpenHarmony子系统集¶
"subsystems": [
{
"subsystem": "systemabilitymgr",
"components": [
{ "component": "samgr_lite", "features":[] },
{ "component": "safwk_lite", "features":[] }
]
},
{
"subsystem": "hiviewdfx",
"components": [
{ "component": "hilog_lite", "features":[] },
{ "component": "faultloggerd", "features":[] }
]
},
{
"subsystem": "security",
"components": [
{ "component": "permission_lite", "features":[] },
{ "component": "appverify", "features":[] },
{ "component": "device_auth", "features":[] },
{ "component": "huks", "features":
[
"huks_config_file = \"hks_config_small.h\"",
"huks_uid_trust_list_define = \"{}\""
]
}
]
},
{
"subsystem": "startup",
"components": [
{ "component": "bootstrap_lite", "features":[] },
{ "component": "init", "features":["init_feature_begetctl_liteos=true"] },
{ "component": "appspawn", "features":[] }
]
},
{
"subsystem": "kernel",
"components": [
{ "component": "linux", "features":[] }
]
},
{
"subsystem": "hdf",
"components": [
{ "component": "hdf_core", "features":[ "hdf_core_platform_test_support = true" ] }
]
},
{
"subsystem": "bundlemanager",
"components": [
{ "component": "bundle_framework_lite", "features":[] }
]
},
{
"subsystem": "developtools",
"components": [
{ "component": "syscap_codec", "features":[] }
]
},
{
"subsystem": "xts",
"components": [
{ "component": "acts", "features":[] },
{ "component": "tools", "features":[] },
{ "component": "device_attest_lite", "features":[] }
]
},
{
"subsystem": "communication",
"components": [
{ "component": "dhcp", "features":[] }
]
}
],
添加系统启动服务配置¶
修改vendor/hisilicon/hispark_ss928v100_linux/init_configs/init_linux_openharmony.cfg新增启动服务。
"start ueventd",
"start shell",
"start apphilogcat",
"start foundation",
"start bundle_daemon",
"start faultloggerd",
"start devattest_service",
"start huks_server"
子系统部件适配SS928V100¶
参照添加依赖的OpenHarmony子系统集,适配SS928V100修改、解决编译问题。
修改acts编译gn文件¶
修改test/xts/acts/build_lite/BUILD.gn文件,注释第106行和107行,ActsBundleMgrTest和ActsAbilityMgrTest为带屏设备需要。
} else if (ohos_kernel_type == "linux") {
all_features += [
"//test/xts/acts/distributeddatamgr_lite/kv_store_posix:ActsKvStoreTest",
"//test/xts/acts/startup_lite/syspara_posix:ActsParameterTest",
"//test/xts/acts/startup_lite/bootstrap_posix:ActsBootstrapTest",
"//test/xts/acts/communication_lite/lwip_posix:ActsLwipTest",
"//test/xts/acts/security_lite:securitytest",
#"//test/xts/acts/multimedia_lite/camera_lite_posix/camera_native:ActsMediaCameraTest",
#"//test/xts/acts/multimedia_lite/media_lite_posix/player_native:ActsMediaPlayerTest",
#"//test/xts/acts/multimedia_lite/media_lite_posix/recorder_native:ActsMediaRecorderTest",
"//test/xts/acts/distributed_schedule_lite/system_ability_manager_posix:ActsSamgrTest",
#"//test/xts/acts/appexecfwk_lite/appexecfwk_posix:ActsBundleMgrTest",
#"//test/xts/acts/ability_lite/ability_posix:ActsAbilityMgrTest",
"//test/xts/acts/ai_lite/ai_engine_posix/base:ActsAiEngineTest",
"//test/xts/acts/xts_lite/device_attest_lite/device_attestStart_posix:ActsDeviceAttestStartTest",
"//test/xts/acts/xts_lite/device_attest_lite/device_attestQuerry_posix:ActsDeviceAttestQuerryTest",
]
}
XTS测试用例问题修复¶
修改test/xts/acts/distributed_schedule_lite/system_ability_manager_posix/src/LiteIPCClientTest.cpp文件, 原生代码如下:
此用例是因为了验证SAMGR_GetRemoteIdentity接口当服务不存在时获取到无效的IPC服务地址,因此加粗部分svcIdentity.token返回的是一个无效指针数据值为-1,在64位系统下占用8个字节,与0xffffffff做相等比较时会导致用例无法有效执行。
HWTEST_F(LiteIPCClientTest, testIPCClient0130, Function | MediumTest | Level2)
{
SvcIdentity svcIdentity = SAMGR_GetRemoteIdentity("noExistService", "noExistFeature");
ASSERT_EQ(svcIdentity.handle == 0xffffffff, TRUE);
ASSERT_EQ(svcIdentity.token == 0xffffffff, TRUE);
};
修改后代码如下:
HWTEST_F(LiteIPCClientTest, testIPCClient0130, Function | MediumTest | Level2)
{
SvcIdentity svcIdentity = SAMGR_GetRemoteIdentity("noExistService", "noExistFeature");
ASSERT_EQ(svcIdentity.handle == 0xffffffff, TRUE);
// token type is uintptr_t
ASSERT_EQ(svcIdentity.token == INVALID_INDEX, TRUE);
};
xts工具问题修复¶
修改test/xts/tools/lite/build/suite.py文件,源生代码如下:
说明: 此部分代码是用于将编译打包xdevice工具打包,当前编译生成的xdevice-0.0.0-py3.11.egg和xdevice_ohos-0.0.0-py.3.11.egg文件安装默认时,默认会从外网下载xdevice,用户若能正常下载可跳过此章节。
class XDeviceBuilder:
"""
To build XTS as a egg package
@arguments(project_dir, output_dirs)
"""
def __init__(self, arguments):
parser = argparse.ArgumentParser()
parser.add_argument('--project_dir', help='', required=True)
parser.add_argument('--output_dirs', help='', required=True)
self.args = parser.parse_args(arguments)
def build_xdevice(self):
"""
build xdevice package
:return:
"""
ohos_dir = os.path.join(self.args.project_dir, 'plugins', 'ohos')
command = [utils.get_python_cmd(), "setup.py", "install", "--user"]
factory_script = os.path.join(self.args.project_dir, "factory.sh")
if os.path.exists(factory_script):
os.chmod(factory_script, 0o775)
command = factory_script
可将xdevice打包改成tar.gz文件格式打包工具。
command = [utils.get_python_cmd(), "setup.py", "sdist"]
带屏XTS最小集子系统适配¶
修改acts编译gn文件¶
修改test/xts/acts/build_lite/BUILD.gn文件,放开第106行和107行参与acts套件编译,ActsBundleMgrTest和ActsAbilityMgrTest为带屏设备需要。
} else if (ohos_kernel_type == "linux") {
all_features += [
"//test/xts/acts/distributeddatamgr_lite/kv_store_posix:ActsKvStoreTest",
"//test/xts/acts/startup_lite/syspara_posix:ActsParameterTest",
"//test/xts/acts/startup_lite/bootstrap_posix:ActsBootstrapTest",
"//test/xts/acts/communication_lite/lwip_posix:ActsLwipTest",
"//test/xts/acts/security_lite:securitytest",
#"//test/xts/acts/multimedia_lite/camera_lite_posix/camera_native:ActsMediaCameraTest",
#"//test/xts/acts/multimedia_lite/media_lite_posix/player_native:ActsMediaPlayerTest",
#"//test/xts/acts/multimedia_lite/media_lite_posix/recorder_native:ActsMediaRecorderTest",
"//test/xts/acts/distributed_schedule_lite/system_ability_manager_posix:ActsSamgrTest",
"//test/xts/acts/appexecfwk_lite/appexecfwk_posix:ActsBundleMgrTest",
"//test/xts/acts/ability_lite/ability_posix:ActsAbilityMgrTest",
"//test/xts/acts/ai_lite/ai_engine_posix/base:ActsAiEngineTest",
"//test/xts/acts/xts_lite/device_attest_lite/device_attestStart_posix:ActsDeviceAttestStartTest",
"//test/xts/acts/xts_lite/device_attest_lite/device_attestQuerry_posix:ActsDeviceAttestQuerryTest",
]
}
config.json中添加依赖子系统¶
在vendor/hisilicon/hispark_ss928v100_linux/config.json中增加ability子系统,为带屏测试套件编译所需。
{
"subsystem": "ability",
"components": [
{ "component": "ability_lite", "features":[ "ability_lite_enable_ohos_appexecfwk_feature_ability = true" ] },
{ "component": "dmsfwk_lite", "features":[] }
]
},
添加系统启动服务配置¶
修改vendor/hisilicon/hispark_ss928v100_linux/init_configs/init_linux_openharmony.cfg新增启动服务,加粗部分为新增修改。
"start ueventd",
"start shell",
"start apphilogcat",
"start foundation",
"start bundle_daemon",
"start appspawn",
"start faultloggerd",
"start devattest_service",
"start huks_server"
完成以上修改acts编译gn文件至添加系统启动服务配置操作就可以运行L1带屏设备的acts套件,若遇到执行ActsAbilityMgrTest模块卡死情况,则需要适配security_appverify组件,解决hap校验问题即可。
xts测试用例问题修复¶
修改test/xts/acts/ability_lite/ability_posix/src/AbilityMgrTest.cpp测试用例,源生代码如下:
此用例是因为了验证DisConnectAbility接口,而下述代码加粗部分g_errorcode==16为异常保护,会导致用例无法有效执行;但是DisConnectAbility和ConnectAbility要成对出现,会导致用例失败。
HWTEST_F(AbilityMgrTest, testDisConnectAbility, Function | MediumTest | Level1)
{
printf("------start testDisConnectAbility------\n");
Want want = { nullptr };
ElementName element = { nullptr };
SetElementBundleName(&element, "com.openharmony.testnative");
SetElementAbilityName(&element, "ServiceAbility");
SetWantElement(&want, element);
sem_init(&g_sem, 0, 0);
int result = ConnectAbility(&want, &g_conn, this);
struct timespec ts = {};
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += WAIT_TIMEOUT;
sem_timedwait(&g_sem, &ts);
printf("sem exit \n");
printf("ret of connect is %d \n ", result);
if (g_errorCode == 16) {
result = DisconnectAbility(&g_conn);
usleep(900000);
EXPECT_EQ(result, 0);
printf("ret of disconnect is %d \n ", result);
}
ClearElement(&element);
ClearWant(&want);
printf("------end testDisConnectAbility------\n");
}
估可以去掉源生g_errorcode==16,或者将DisConnectAbility和ConnectAbility场景移至最后执行,本文采取去掉异常保护,修改后代码。
HWTEST_F(AbilityMgrTest, testDisConnectAbility, Function | MediumTest | Level1)
{
printf("------start testDisConnectAbility------\n");
Want want = { nullptr };
ElementName element = { nullptr };
SetElementBundleName(&element, "com.openharmony.testnative");
SetElementAbilityName(&element, "ServiceAbility");
SetWantElement(&want, element);
sem_init(&g_sem, 0, 0);
int result = ConnectAbility(&want, &g_conn, this);
struct timespec ts = {};
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += WAIT_TIMEOUT;
sem_timedwait(&g_sem, &ts);
printf("sem exit \n");
printf("ret of connect is %d \n ", result);
result = DisconnectAbility(&g_conn);
usleep(900000);
EXPECT_EQ(result, 0);
printf("ret of disconnect is %d \n ", result);
ClearElement(&element);
ClearWant(&want);
printf("------end testDisConnectAbility------\n");
}
单步调试xts的testcase¶
本小节主要介绍xts测试过程中,出现卡死或单个testcase执行失败场景,定位具体用例失败原因。
以ActsAbilityMgrTest为例说明。重新NFS挂载好单板后,在板端执行观察用例执行情况。
./ActsAbilityMgrTest.bin --gtest_output=xml:/storage/test_root/aafwk/reportsn --gtest_output=xml:/storage/test_root/aafwk/reports
图形¶
OpenHarmony增加图形子系统,需要在vendor/hisilicon/hispark_ss928v100_linux/config.json中增加对应子系统和部件,同时在device/soc/hisilicon目录中是芯片相关的适配,其中图形的适配代码存在于device/soc/hisilicon/common/hal/display中。
config.json中新增图形子系统依赖的部件¶
在vendor/hisilicon/hispark_ss928v100_linux/config.json文件,"subsystems"标签中添加如下代码:
{
"subsystem": "arkui",
"components": [
{ "component": "ui_lite", "features":[ "ui_lite_enable_graphic_font_config = true" ] }
]
},
{
"subsystem": "graphic",
"components": [
{ "component": "graphic_utils_lite", "features":[] },
{ "component": "surface_lite", "features":[] }
]
},
{
"subsystem": "window",
"components": [
{ "component": "window_manager_lite", "features":[] }
]
}
device/soc/hisilicon下新增SS928V100图形相关驱动代码¶
在device/soc/hisilicon/common/hal/display下新增SS928V100目录,用于放置SS928V100图形驱动相关代码。图形驱动HDI接口的整体介绍可以参考drivers/peripheral/display/README_zh.md文档中的描述。
**注意:**相比于Hi3516DV300芯片适配,SS928V100的sdk经过用户态整改后,需要在用户态先执行sdk各模块的init操作,再调用sdk接口。如果只启动图形功能,需要在InitDisplay里调用SdkInit完成几个模块的初始化接口调用:
static void SdkInit()
{
td_s32 ret;
ret = osal_init();
if (ret != 0) {
HDF_LOGE("%s: osal_init error:%d", __func__, ret);
}
ret = ot_base_mod_init();
if (ret != 0) {
HDF_LOGE("%s: BaseModInit error:%d", __func__, ret);
}
ret = ot_sys_mod_init();
if (ret != 0) {
HDF_LOGE("%s: SysModInit error:%d", __func__, ret);
}
ret = ot_rgn_mod_init();
if (ret != 0) {
HDF_LOGE("%s: ot_rgn_mod_init error:%d", __func__, ret);
}
ret = ot_vo_mod_init();
if (ret != 0) {
HDF_LOGE("%s: VoModInit error:%d", __func__, ret);
}
}
同时,需要在DeinitDisplay函数里调用SdkExit完成去初始化:
static void SdkExit()
{
ot_vo_mod_exit();
ot_rgn_mod_exit();
ot_sys_mod_exit();
ot_base_mod_exit();
osal_exit();
}
device/soc/hisilicon下SS928V100驱动代码编译适配¶
在device/soc/hisilicon/common/hal/display/BUILD.GN里增加SS928V100的编译命令:
if (board_name == "hispark_ss928v100" || board_name == "hispark_ss927v100") {
shared_library("display_layer") {
output_name = "display_layer"
sources = [
"//drivers/peripheral/display/hal/disp_hal.c",
"ss928/src/display_layer.c",
"ss928/src/display_overlay_layer.c",
"ss928/src/vpss_resmng.c",
"ss928/src/hdmi.c",
"ss928/src/vo_parameter_calc.c",
"ss928/src/bt1120.c"
]
include_dirs = [
"./ss928/include",
"./ss928/include/adapt",
"//drivers/peripheral/base",
"//drivers/peripheral/display/hal",
"//drivers/peripheral/display/interfaces/include",
"//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
]
deps = [
"//third_party/bounds_checking_function:libsec_shared",
"//drivers/hdf_core/adapter/uhdf2/utils:libhdf_utils"
]
defines = ["__USER__"]
cflags = [
"-Wall",
"-Wextra",
"-Werror",
"-fsigned-char",
"-fno-common",
"-fno-strict-aliasing",
"-Wno-format",
"-Wno-format-extra-args",
"-Wno-error=implicit-function-declaration",
]
if (ohos_kernel_type == "linux") {
include_dirs += [
"//device/soc/hisilicon/ss928v100/sdk_linux/smp/a55_linux/mpp/out/include"
]
deps += ["//device/soc/hisilicon/ss928v100/sdk_linux:hispark_ss928v100_sdk"]
}
defines += [ "ENABLE_H8" ]
defines += [ "DISENABLE_DISP" ]
defines += [ "__HDMI_SUPPORT__" ]
ldflags = [
"-lss_mpi",
"-lss_voice_engine",
"-lss_hdmi",
"-lot_osal",
"-lot_base",
"-lot_sys",
"-lot_vo",
"-lot_rgn",
"-lot_irq",
]
defines += [ "VPSS_GRP_START_ID=100" ]
ldflags += [
"-lss_dnvqe",
"-lss_upvqe"
]
}
shared_library("display_gfx") {
output_name = "display_gfx"
sources = [ "ss928/src/display_gfx.c" ]
include_dirs = [
"./ss928/include",
"./ss928/include/adapt",
"//drivers/peripheral/base",
"//drivers/peripheral/display/hal",
"//drivers/peripheral/display/interfaces/include",
"//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
]
defines = [ "__USER__" ]
deps = [
"//third_party/bounds_checking_function:libsec_shared",
"//drivers/hdf_core/adapter/uhdf2/utils:libhdf_utils"
]
cflags = [
"-Wall",
"-Wextra",
"-Werror",
"-fsigned-char",
"-fno-common",
"-fno-strict-aliasing",
"-Wno-format",
"-Wno-format-extra-args",
]
include_dirs += [
"//device/soc/hisilicon/ss928v100/sdk_linux/smp/a55_linux/mpp/out/include"
]
deps += ["//device/soc/hisilicon/ss928v100/sdk_linux:hispark_ss928v100_sdk"]
defines += [ "ENABLE_H8" ]
ldflags = [ "-lss_tde" ]
}
shared_library("display_gralloc") {
output_name = "display_gralloc"
sources = [ "ss928/src/display_gralloc.c" ]
include_dirs = [
"./ss928/include",
"./ss928/include/adapt",
"//drivers/peripheral/base",
"//drivers/peripheral/display/hal",
"//drivers/peripheral/display/interfaces/include",
"//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
]
defines = [ "__USER__" ]
deps = [
"//third_party/bounds_checking_function:libsec_shared",
"//drivers/hdf_core/adapter/uhdf2/utils:libhdf_utils"
]
cflags = [
"-Wall",
"-Wextra",
"-Werror",
"-fsigned-char",
"-fno-common",
"-fno-strict-aliasing",
"-Wno-format",
"-Wno-format-extra-args",
]
include_dirs += [
"//device/soc/hisilicon/ss928v100/sdk_linux/smp/a55_linux/mpp/out/include"
]
deps += ["//device/soc/hisilicon/ss928v100/sdk_linux:hispark_ss928v100_sdk"]
defines += [ "ENABLE_H8" ]
ldflags = [
"-lss_mpi",
"-lss_voice_engine",
]
ldflags += [
"-lss_dnvqe",
"-lss_upvqe"
]
}
lite_component("hdi_display") {
features = [
":display_layer",
":display_gfx",
":display_gralloc"
]
}
}
图形服务开机自启动适配¶
在vendor/hisilicon/hispark_ss928v100_linux/init_configs/init_linux_openharmony.cfg中增加图形子系统的启动命令,并修改图形服务的启动权限,可以在单板商店后自动启动图形服务。
在"cmds"中增加如下行:
"start wms_server",
由于SDK用户态整改,图形子系统调用sdk部分接口打开/dev下设备时需要增加权限,在“services”中找到name为wms_server的项,修改caps如下:
{
"name" : "wms_server",
"path" : ["/bin/wms_server"],
"uid" : 10,
"gid" : 10,
"once" : 1,
"importance" : 0,
"caps" : [1, 17, 21, 23]
}
媒体¶
OpenHarmony增加媒体子系统,需要在vendor/hisilicon/hispark_ss928v100_linux/config.json中增加对应子系统和部件,同时在device/soc/hisilicon目录中是芯片相关的适配,其中图形的适配代码存在于device/soc/hisilicon/common/hal/media中。
config.json中新增媒体子系统依赖的部件¶
在vendor/hisilicon/hispark_ss928v100_linux/config.json文件,"subsystems"标签中添加如下代码:
{
"subsystem": "multimedia",
"components": [
{ "component": "camera_lite", "features":[] },
{ "component": "media_lite", "features":[] },
{ "component": "audio_lite", "features":[] },
{ "component": "camera_service", "features":[] }
]
},
device/soc/hisilicon下适配SS928V100媒体代码¶
在device/soc/hisilicon/common/hal/media下新增SS928V100目录,用于放置SS928V100媒体相关适配代码。
**注意:**相比于Hi3516DV300芯片适配,SS928V100的sdk经过用户态整改后,需要在用户态先执行sdk各模块的init操作,再调用sdk接口。启动媒体功能,需要在HalCameraInit里调用SDK_init完成几个模块的初始化接口调用,并对应地在HalCameraDeinit调用SDK_exit完成去初始化,如下图所示:

在对应的device/soc/hisilicon/common/hal/media/camera/source/BUILD.gn文件中新增对sdk发布的部分so的依赖:
ldflags += [ "-lot_osal" ]
ldflags += [ "-lot_irq" ]
ldflags += [ "-lss_isp" ]
ldflags += [ "-lot_mpi_isp" ]
ldflags += [ "-lot_isp" ]
ldflags += [ "-lot_base" ]
ldflags += [ "-lss_crb" ]
ldflags += [ "-lss_ir_auto" ]
ldflags += [ "-lss_awb" ]
ldflags += [ "-lss_ive" ]
ldflags += [ "-lss_dnvqe" ]
ldflags += [ "-lss_drc" ]
ldflags += [ "-lss_ldci" ]
ldflags += [ "-lss_upvqe" ]
ldflags += [ "-lss_dehaze" ]
ldflags += [ "-lss_voice_engine" ]
ldflags += [ "-lss_ae" ]
ldflags += [ "-lss_bnr" ]
ldflags += [ "-lss_acs" ]
ldflags += [ "-lss_extend_stats" ]
ldflags += [ "-lss_calcflicker" ]
ldflags += [ "-lss_hdmi" ]
ldflags += [ "-lot_sys" ]
ldflags += [ "-lot_chnl" ]
ldflags += [ "-lot_rgn" ]
ldflags += [ "-lot_dis" ]
ldflags += [ "-lot_vpp" ]
ldflags += [ "-lot_vi" ]
ldflags += [ "-lot_vpss" ]
ldflags += [ "-lot_vo" ]
ldflags += [ "-lot_vedu" ]
ldflags += [ "-lot_rc" ]
ldflags += [ "-lot_venc" ]
ldflags += [ "-lot_h264e" ]
ldflags += [ "-lot_h265e" ]
ldflags += [ "-lot_jpege" ]
ldflags += [ "-lot_jpegd" ]
ldflags += [ "-lot_vfmw" ]
ldflags += [ "-lot_vdec" ]
ldflags += [ "-lot_aio" ]
ldflags += [ "-lot_ai" ]
ldflags += [ "-lot_ao" ]
ldflags += [ "-lot_aenc" ]
ldflags += [ "-lot_adec" ]
ldflags += [ "-lot_acodec" ]
middleware相关适配
在device/soc/hisilicon/common/hal/middleware/BUILD.gn中,新增分支处理SS928V100适配,如下图:

foundation/multimedia/media_lite/services下新增sensor相关ini配置¶
在foundation/multimedia/media_lite/services下新增cameradev_hy_s0603_928.ini,并在对应的foundation/multimedia/media_lite/services/BUILD.gn文件中新增SS928V100的ini拷贝动作,如下图:

媒体服务开机自启动适配¶
在vendor/hisilicon/hispark_ss928v100_linux/init_configs/init_linux_openharmony.cfg中增加媒体子系统的启动命令,在"cmds"中增加如下行:
"start media_server",




