文档概述
说明:

1.文章由移远通信技术股份有限公司提供
2.以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改18107158288(微信同号)

一、环境信息

软件版本:OH 5.1
硬件信息:hi3516DV300

二、背景介绍

目前笔者收集了一下在 OpenHarmony 上支持的小型系统的设备如下:

芯片型号 厂商 核心架构 典型应用场景 备注
Hi3516DV300 华为海思 Cortex-A7 智能摄像头、视觉 AI 开发套件 社区适配非常成熟的明星芯片,有润和软件等公司推出的官方开发板。
RK2206 瑞芯微 Cortex-M4 低功耗物联网、智能家居设备 虽有 Cortex-M 内核,但在 OpenHarmony 体系中被归类为小型系统,适用于轻量级、低功耗场景。
Hi3516DV500 华为海思 高端智能摄像头、视频处理 作为 Hi3516 系列的升级款,已出现在标准系统和小型系统的支持列表中。
ASR1601/1603/1606 翱捷科技 蜂窝物联网设备、Tracker、共享设备 Cat.1 系列芯片,具备高性能、多制式、低功耗特点,已广泛应用于鸿蒙物联网设备。
ASR3601/3603 翱捷科技 儿童手表、功能机、POS 机 面向可穿戴及功能机领域的多模 Cat.1 芯片。
SSD202 星宸科技 Cortex-A7 双核 智能显示终端、楼宇对讲、家电彩屏 主打显示驱动的小型系统芯片。

同时,笔者也发现了一个问题:Linux 内核普遍被认为是给标准系统用的,这么多小型系统设备,哪些是支持 Linux 内核+小型系统的呢?功夫不负有心人,总算让笔者找到了一款 Linux 内核+小型系统的设备——hi3516DV300。

Hi3516DV300 是海思(HISILICON)推出的一款主打智能视觉处理的 SoC 芯片,广泛应用于安防监控、人脸识别、AI 机器视觉等嵌入式场景。以下是关于该芯片的核心信息整理:

核心特性与性能

处理器架构:双核 ARM Cortex-A7 @ 900MHz,支持 NEON 加速和 FPU 浮点运算单元,适合中低算力需求的边缘计算任务。

AI 算力:集成神经网络加速引擎,提供高达 1.0 Tops 的 AI 算力,可支持基础的人脸检测、跟踪、校正等智能分析功能。

视频编解码能力

  • 支持 H.264/H.265 编码与解码
  • 最大编码分辨率可达 2688×1944@20fps
  • 支持多码流实时编码(如 1080P + 720P + 360P 同时编码)
  • JPEG 最高支持 16M 像素(4608×3456)@10fps 编码

ISP 图像处理:支持 3D 去噪、动态对比度增强、图像缩放、旋转、Mirror/Flip 等功能,支持 WDR(宽动态范围)与 Lean 模式切换。

三、环境搭建

明确了产品信息,那么就需要去搭建源码编译环境了,建议在 Ubuntu 20.04 上进行搭建,可以优先下载 5.1 版本的 OpenHarmony 代码。

我们去官网下载。首先我们打开官网网址:
https://gitcode.com/openharmony

然后找到源码下载章节:
在这里插入图片描述

点击这个下载说明,找到这个操作步骤,Release Notes 这个然后接着点击。

在这里插入图片描述

选择自己需要下载的版本,我们这边选择 5.1 版本。
在这里插入图片描述

然后就使用 repo+http 的方式下载源码。点击进去有文档教程,这样我们的源码就下载好了。现在就剩解决编译问题了。

四丶编译源码

代码下载之后,就使用编译命令编译了,编译命令如下:
./build.sh --product-name ipcamera_hispark_taurus_linux --ccache --no-prebuilt-sdk
在编译的时候,会有报错:

修改点总览

序号 文件 问题类型 关键改动
1 kernel.gni 配置层 linux-6.6 → linux-5.10
2 wifi_native/BUILD.gn 依赖 添加 wpa_supplicant 依赖
3 hi_irq/Makefile Shell 语法 exit1 → exit 1
4 cfg.mak 配置同步 linux-4.19.y → linux-5.10.y
5 build.sh 工具链模式 添加 CONFIG_USER_LLVM=y
6 Makefile.linux.param LLVM 工具链 LLVM=1, LLVM_IAS=1, LD/AR/NM
7 cbb/Makefile.linux 工具路径 strip 使用绝对路径

详细说明

修改点 1:build/ohos/kernel/kernel.gni

修改内容

\\diff

  • linux_kernel_version = “linux-6.6”
  • linux_kernel_version = “linux-5.10”
    \\
❌ 不修改的错误

\
FAILED: hispark_taurus_small.patch not found
Error: File not found in linux-6.6/patches/
\\

🔍 根本原因
  • OpenHarmony 仅为 hispark_taurus 提供了 linux-4.19 和 linux-5.10 的补丁文件
  • 默认的 linux-6.6 在 \device/board/hisilicon/hispark_taurus/linux/patches/\ 中不存在
  • GN 编译查找 \hispark_taurus_small.patch\,找不到就编译失败
✅ 为什么修改能解决
  • 将内核版本设为 linux-5.10,编译系统可以找到对应的补丁文件
  • 内核成功应用补丁,顺利编译

修改点 2:foundation/communication/wifi/…/wifi_native/BUILD.gn

修改内容

\\diff
“//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared”,

  • “//third_party/wpa_supplicant/wpa_supplicant-2.9:wpa_supplicant”,
    \\
❌ 不修改的错误

\
ld.lld: error: undefined reference to ‘wpa_xxx’ functions
ld.lld: unable to find library -lwpa_client
\\

🔍 根本原因
  • \wifi_native\ 在链接时指定了 -lwpa_client\,但没有声明编译时依赖
  • Ninja 构建系统不知道要先构建 wpa_supplicant
  • 链接时 wpa_supplicant 库还未生成,导致链接器找不到符号
✅ 为什么修改能解决
  • 添加显式依赖后,Ninja 确保 wpa_supplicant 在 wifi_native 之前编译完成
  • 链接时库文件已存在,链接器可以正确解析所有符号

修改点 3:device/soc/hisilicon/hi3516dv300/sdk_linux/drv/interdrv/common/hi_irq/Makefile

修改内容

\\diff

  • cd $@; make || exit1;
  • cd $@; make || exit 1;
    \\
❌ 不修改的错误

\
/bin/sh: exit1: command not found
make: *** [Makefile:21: kernel] Error 127
\\

🔍 根本原因
  • Shell 中 \exit1\ 被当作"命令名"而不是 \exit\ 命令的参数
  • Shell 试图执行一个叫 \exit1\ 的程序,导致"命令未找到"
✅ 为什么修改能解决
  • \exit 1\ 是正确的 Shell 语法:\exit\ 是命令,\1\ 是退出码参数
  • make 规则正确执行,子进程失败时返回正确的错误码

修改点 4:device/soc/hisilicon/hi3516dv300/sdk_linux/drv/mpp/cfg.mak

修改内容

\\diff

  • export CONFIG_KERNEL_VERSION=linux-4.19.y
  • export CONFIG_KERNEL_VERSION=linux-5.10.y
  • export CONFIG_LINUX_4_19_y=y
  • export CONFIG_LINUX_5_10_y=y
    \\
❌ 不修改的错误

\
Error: Kernel version mismatch
SDK configured for linux-4.19 but kernel is linux-5.10
\\

🔍 根本原因
  • 两层配置不同步(多层构建系统问题)
  • GN 层设为 linux-5.10,SDK Make 层还是 linux-4.19
  • SDK 编译时查找 4.19 的内核头文件,但实际内核是 5.10,API 不兼容
✅ 为什么修改能解决
  • cfg.mak 更新为 linux-5.10 后,SDK 驱动模块能找到正确的内核头文件
  • 头文件 API 和编译参数保持一致,编译通过

修改点 5:device/soc/hisilicon/hi3516dv300/sdk_linux/build.sh

修改内容

\\diff

  • CONFIG_USER_LLVM=y # 添加到 make 命令
    \\
❌ 不修改的错误

\
/usr/bin/as: unrecognized option ‘-EL’
Error: assembler error - ARM flags not recognized
\\

🔍 根本原因
  • 没有 \CONFIG_USER_LLVM=y\,Kbuild 不知道要用 LLVM 工具链
  • clang 生成 ARM 汇编,Kbuild 用 host 的 /usr/bin/as(x86 汇编器)处理
  • x86 汇编器不认识 -EL(ARM 小端标志),报错
✅ 为什么修改能解决
  • 传入 \CONFIG_USER_LLVM=y\ 后,Kbuild 启用 LLVM 模式
  • 使用 clang 的汇编器处理 ARM 代码
  • ARM 汇编标志被正确识别

修改点 6:device/soc/hisilicon/hi3516dv300/sdk_linux/drv/mpp/Makefile.linux.param

Part A:导出变量块(lines 89-107)

修改内容:

  • 添加完整的 \CROSS_PATH\ 路径定义
  • 添加 \HOSTCC\ 导出
  • 删除注释行和错误的 “ar” 定义
Part B:COMPILER_TRIPLE 块(lines 138-145)

修改内容:

  • 添加 \LLVM=1\ 标志
  • 添加 \LLVM_IAS=1\ 标志
  • 添加 \LD=/ld.lld\
  • 添加 \AR=/llvm-ar\
  • 添加 \NM=/llvm-nm\
❌ 不修改的错误
  • 缺 LLVM=1 和 LLVM_IAS=1:/usr/bin/as: unrecognized option ‘-EL’\
  • 缺 LD/AR/NM:\ld.lld/ar/nm command not found\
🔍 根本原因
  • Kbuild 默认用 GCC 工具链,即使传入 \CC=clang\ 也不会改变
  • clang 生成的 ARM 汇编被 x86 汇编器处理 → 错误
  • Kbuild 需要 LD/AR/NM 三个工具,不指定时用 GNU 默认值,在 PATH 中找不到
✅ 为什么修改能解决
  • \LLVM=1\:启用 LLVM 工具链模式
  • \LLVM_IAS=1\:启用 LLVM 集成汇编器(关键!直接解决 -EL 问题)
  • \LD/AR/NM\:显式指定 LLVM 工具的完整路径

修改点 7:device/soc/hisilicon/hi3516dv300/sdk_linux/drv/mpp/cbb/Makefile.linux

修改内容

\\diff

  • @\strip
  • @/\strip
    \\
❌ 不修改的错误

\
arm-linux-gnueabi-strip: command not found
\\

🔍 根本原因
  • \\ 仅是前缀,不包含路径信息
  • 在 OHOS_LITE 环境的 PATH 中找不到 \rm-linux-gnueabi-strip\
  • 依赖 PATH 环境变量是不稳定的做法
✅ 为什么修改能解决
  • \\ 是绝对路径,使用完整的绝对路径
  • shell 直接执行,不依赖 PATH
  • 增强可靠性和可移植性

在这里插入图片描述

五、参考文档

https://gitcode.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v5.1.0-release.md
https://device.harmonyos.com/cn/docs/documentation/guide/ide-hi3516dv300-compile-0000001146686054
https://device.harmonyos.com/cn/docs/documentation/guide/upload_hi3516_small_system-0000001326267405

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐