1. 项目概述为什么海思SS928的SDK安装是开发的第一道坎拿到一块海思SS928的开发板第一件事是什么不是急着写代码也不是马上看原理图而是把开发环境特别是SDK给稳稳当当地装好。这听起来像是废话但恰恰是新手和老手都容易栽跟头的地方。我见过太多人兴致勃勃地开始结果在SDK安装这一步卡了好几天不是编译报错就是环境变量不对最后热情都磨没了。SS928作为海思面向高端智能视觉和边缘计算的主力芯片其SDK包罗万象从Bootloader、内核、根文件系统到丰富的媒体处理、AI推理库是一个庞大的系统工程环境。它的安装远不是双击一个“setup.exe”那么简单而是一个需要理解交叉编译链、源码树结构、依赖库关系的系统性操作。今天我就结合自己趟过的坑把SS928 SDK在Ubuntu开发主机上的完整安装、配置与验证过程掰开揉碎了讲清楚。目标只有一个让你一次成功把精力留给后面更精彩的开发工作。2. 环境准备打造一个“纯净”且“够用”的Ubuntu工作站在开始安装SDK之前一个稳定、合规的基础操作系统环境至关重要。强烈不建议在Windows下通过WSL或虚拟机套虚拟机的方式进行直接使用物理机安装Ubuntu是最稳妥的方案。2.1 操作系统选择与安装对于海思平台开发Ubuntu 18.04 LTS或20.04 LTS是经过广泛验证的版本社区资源丰富兼容性问题最少。我个人更倾向于Ubuntu 20.04 LTS它在软件包版本和长期支持之间取得了很好的平衡。安装要点分区建议为/home目录分配充足的空间建议不少于100GB。SDK解压后本身可能就有10-20GB编译中间文件更是占用巨大。交换分区swap可以设置为物理内存的1-1.5倍。网络配置确保安装过程中能连接互联网以便在系统安装完成后立即更新软件源和安装基础工具。用户权限使用普通用户登录但需要通过sudo获取管理员权限。绝对避免全程使用root用户操作这会导致后续编译出现各种诡异的权限问题。注意如果你使用的是公司或实验室的服务器通常已经是Ubuntu环境。请务必确认系统没有安装过于陈旧的或与海思工具链冲突的库例如某些自定义的gcc版本。一个“干净”的系统能避免90%的依赖冲突。2.2 必备工具链与依赖库安装系统安装好后第一件事就是更新软件源并安装一系列开发工具和库。这些是编译SDK内内核、uboot以及应用程序的基础依赖。打开终端依次执行以下命令# 1. 更新软件源列表 sudo apt-get update # 2. 安装基础编译工具 sudo apt-get install -y build-essential cmake git # 3. 安装交叉编译工具链依赖通常是32位库即使主机是64位系统 sudo apt-get install -y lib32z1 lib32stdc6 # 4. 安装其他常用工具 sudo apt-get install -y u-boot-tools device-tree-compiler bc sudo apt-get install -y libssl-dev libncurses-dev sudo apt-get install -y python2 python2-dev 部分旧版SDK可能依赖python2 sudo apt-get install -y python3 python3-pip python3-dev 推荐同时安装python3 # 5. 安装文件系统制作工具 sudo apt-get install -y genext2fs # 6. 安装网络与调试工具 sudo apt-get install -y tftp-hpa tftpd-hpa nfs-kernel-server sudo apt-get install -y minicom关键点解析build-essential包含了gcc,g,make等核心编译工具这是必须的。lib32z1和lib32stdc6海思提供的交叉编译工具链如aarch64-himix100-linux很多是32位的可执行程序在64位Ubuntu上运行需要这些32位兼容库。这是最容易被忽略导致“找不到命令”或“执行格式错误”的坑。u-boot-tools和device-tree-compiler用于处理U-Boot镜像和设备树源文件。bc内核编译时可能需要的计算器工具。关于Python海思SDK的编译脚本和部分工具可能对Python版本有特定要求。如果SDK明确要求Python2请确保python命令指向的是python2可通过sudo update-alternatives --config python来配置。同时安装Python3以备不时之需。3. SDK获取与初步解压海思SDK通常是一个庞大的.tar.gz压缩包可能由FAE现场应用工程师提供或从公司内部服务器获取。假设你拿到的文件名为HiSS928V100_SDK_Vx.x.x.x.tgz。3.1 放置与解压的“黄金位置”不建议在/home目录下随便找个地方解压。一个良好的习惯是创建一个专用于嵌入式项目的目录结构。# 在你的家目录下创建项目空间 cd ~ mkdir -p projects/hisi_ss928 cd projects/hisi_ss928 # 将获取到的SDK包复制到此目录下 # cp /path/to/your/HiSS928V100_SDK_Vx.x.x.x.tgz . # 解压SDK包 tar -xzvf HiSS928V100_SDK_Vx.x.x.x.tgz解压后你会得到一个类似于HiSS928V100_SDK_Vx.x.x.x的目录。进入该目录通常会发现一个README或ReleaseNotes文件务必首先阅读。里面会包含该版本SDK的重要信息如已验证的Ubuntu版本、已知问题、工具链版本等。3.2 认识SDK目录结构解压后的SDK根目录结构大致如下理解它对你后续操作至关重要HiSS928V100_SDK_Vx.x.x.x/ ├── osdrv/ # 操作系统驱动层最核心的部分 │ ├── opensource/ # 开源软件包如busybox, kernel, uboot源码 │ ├── pub/ # 编译好的镜像、工具链等 │ └── tools/ # 板级配置、烧录等工具 ├── mpp/ # 媒体处理平台Media Process Platform │ ├── component/ # 组件如视频编码、解码、VO、VPSS │ ├── sample/ # 丰富的参考样例代码 │ └── Makefile # 编译MPP的主Makefile ├── middleware/ # 中间件可能包含安全、图形、AI推理库等 ├── component/ # 通用组件可能独立于mpp └── sdk.clean # 清理脚本 └── sdk.unpack # 展开脚本关键核心文件/sdk.unpack这是一个脚本它的作用是将SDK中打包好的开源软件源码包在osdrv/opensource/里解压到正确的位置并打上海思的补丁。直接编译前必须先执行它。4. 展开SDK与安装交叉编译工具链这是将“原料”变成“可下锅的食材”的关键一步。4.1 执行sdk.unpack脚本在SDK根目录下执行./sdk.unpack这个过程可能会持续几分钟它会将opensource/目录下的kernel、uboot、busybox等压缩包解压到各自目录。应用海思提供的补丁文件使这些开源软件适配SS928的特定硬件。实操心得在执行sdk.unpack前可以先用chmod x sdk.unpack给它加上执行权限。如果执行过程中报错通常是缺少某些工具如patch命令根据错误提示使用apt-get install安装即可。另一个常见错误是磁盘空间不足请用df -h命令确认。4.2 部署交叉编译工具链工具链是编译生成能在SS928ARM架构上运行的程序的关键。SDK通常会在osdrv/pub/或根目录的toolchain/下提供预编译好的工具链。假设工具链包是aarch64-himix100-linux.tgz。# 1. 创建工具链安装目录通常放在/opt下 sudo mkdir -p /opt/hisi-linux sudo chown $USER:$USER /opt/hisi-linux # 将所属权改为当前用户避免sudo操作 # 2. 解压工具链到该目录 tar -xzf osdrv/pub/bin/aarch64-himix100-linux.tgz -C /opt/hisi-linux/ # 3. 设置环境变量让系统能找到这个工具链 # 编辑当前用户的bash配置文件 vim ~/.bashrc在~/.bashrc文件的末尾添加以下内容export ARCHarm64 export CROSS_COMPILEaarch64-himix100-linux- export PATH/opt/hisi-linux/aarch64-himix100-linux/bin:$PATH export HISI_SDK_PATH~/projects/hisi_ss928/HiSS928V100_SDK_Vx.x.x.x # 替换为你的实际路径然后使配置生效source ~/.bashrc验证工具链是否安装成功aarch64-himix100-linux-gcc -v如果成功你会看到gcc的版本信息目标平台Target: aarch64-himix100-linux等。这证明你的交叉编译环境基本就绪。5. 编译OSDRV内核、U-Boot与根文件系统osdrv目录是整个系统的基础。编译它将生成最终要烧录到板子上的三大件u-boot.bin、kernel.img和根文件系统镜像。5.1 目录结构与编译选择进入osdrv目录你会看到针对不同产品的子目录如ss928v100。我们需要进入对应目录。cd osdrv/ss928v100/ ls -l你可能会看到多个Makefile例如Makefile总控Makefile可以一键编译所有。Makefile.param参数配置文件非常重要里面定义了芯片型号、DDR配置、PHY类型等。编译前的重要配置打开Makefile.param找到类似以下的行并进行检查export CHIP_TYPE ? ss928v100 export DDR_TYPE ? lpddr4 export DDR_STRIDE ? 0x2000 export BOARD_TYPE ? ss928v100_xxxx # 根据你的具体板型选择 export PHY_TYPE ? comphy_x这些参数必须与你的开发板硬件严格匹配否则编译出的镜像无法启动或运行不稳定。不确定时务必咨询硬件工程师或查阅板级文档。5.2 分步编译与一键编译对于新手建议先分步编译以便定位问题。分步编译# 1. 清理如果是首次可跳过 make clean # 2. 单独编译U-Boot make uboot # 3. 单独编译内核 make kernel # 4. 单独编译根文件系统基于busybox make rootfs # 5. 将所有组件打包成一个完整的镜像如osdrv_pkg_linux.tgz make pkg一键编译老手可用make allmake all会依次执行uboot、kernel、rootfs和pkg。编译输出物编译成功后关键文件位于osdrv/pub/目录下u-boot-ss928v100.bin: U-Boot引导程序。kernel.img或uImage: 压缩的内核镜像。rootfs_ss928v100_xxx.ext4或.jffs2: 根文件系统镜像。osdrv_pkg_linux.tgz: 包含上述所有文件的发布包。注意事项编译内核和根文件系统可能会消耗大量时间半小时到数小时取决于主机性能。编译过程中如果报错请首先检查工具链环境变量是否正确设置echo $CROSS_COMPILE。Makefile.param中的配置是否与板子匹配。是否缺少某些开发库错误信息通常会提示缺少什么.h文件或库。6. 编译MPP媒体处理平台样例MPP是海思芯片的灵魂包含了视频输入VI、视频处理VPSS、视频编码VENC、视频解码VDEC、视频输出VO等所有媒体相关功能的库和样例。6.1 配置与编译# 回到SDK根目录 cd ../../ # 进入mpp目录 cd mpp/ # 编译整个MPP包括库和所有样例 make allMPP的编译过程会根据Makefile和cfg.mak配置文件编译出libhi_*.so等一系列动态库。编译sample/目录下的所有样例程序如sample_venc、sample_vio等。关键配置文件cfg.mak在mpp/目录下这个文件决定了MPP的编译选项。# 例如你可以选择编译的组件 HI_SAMPLE_SUPPORT y HI_VO_SUPPORT y HI_HDMI_SUPPORT y HI_H265_ENCODER_SUPPORT y通常首次编译使用默认配置即可。如果你确定板子不支持某个功能如HDMI可以将其设为n以加快编译速度。6.2 部署MPP组件到根文件系统编译生成的库和样例程序在开发主机上需要放到目标板的根文件系统中才能运行。# 在mpp目录下执行安装目标路径指向你之前编译好的根文件系统的挂载点或目录 # 假设你将根文件系统解压到了 ~/rootfs_target sudo make install DESTDIR~/rootfs_target这个命令会将libhi_*.so库文件复制到~/rootfs_target/lib/。样例可执行程序复制到~/rootfs_target/bin/。必要的头文件和配置文件复制到相应位置。如果你使用NFS挂载根文件系统进行调试那么这个DESTDIR就可以设置为NFS服务器的导出目录。7. 开发环境高级配置与优化基础环境搭好之后一些优化配置能极大提升开发效率。7.1 配置TFTP和NFS服务器TFTP用于通过网络快速下载U-Boot、内核等小镜像到板载内存进行调试。NFS用于将开发主机的目录作为根文件系统挂载到开发板上实现应用程序的“即改即生效”无需反复烧录。配置TFTP# 安装已在前文完成这里配置 sudo vim /etc/default/tftpd-hpa修改为TFTP_USERNAMEtftp TFTP_DIRECTORY/var/lib/tftpboot # 这是TFTP服务器的根目录你可以自定义 TFTP_ADDRESS:69 TFTP_OPTIONS--secure --create创建目录并设置权限sudo mkdir -p /var/lib/tftpboot sudo chmod -R 777 /var/lib/tftpboot sudo chown -R nobody:nogroup /var/lib/tftpboot sudo systemctl restart tftpd-hpa将编译好的u-boot.bin和kernel.img复制到/var/lib/tftpboot开发板U-Boot就可以通过tftp命令加载了。配置NFSsudo vim /etc/exports添加一行假设你的根文件系统目录是/home/yourname/rootfs_target/home/yourname/rootfs_target *(rw,sync,no_root_squash,no_subtree_check)重启NFS服务sudo systemctl restart nfs-kernel-server sudo exportfs -a在开发板的U-Boot或Linux内核启动参数中设置root/dev/nfs nfsroothost_ip:/home/yourname/rootfs_target即可挂载。7.2 集成到IDE如VSCode在终端里敲代码效率低。将SDK导入VSCode可以获得代码提示、跳转、编译任务集成等功能。安装C/C插件在VSCode中安装微软官方的C/C插件。创建工作区打开SDK根目录作为工作区。配置c_cpp_properties.json按CtrlShiftP输入C/C: Edit Configurations (UI)进入配置界面。在编译器路径中填入交叉编译器的绝对路径/opt/hisi-linux/aarch64-himix100-linux/bin/aarch64-himix100-linux-gcc在包含路径中添加SDK的所有头文件路径例如${workspaceFolder}/**, ${workspaceFolder}/mpp/include/**, ${workspaceFolder}/osdrv/opensource/kernel/linux-4.19.y/include/**在定义中添加全局宏定义例如-DHI_SDK_VERSION\Vx.x.x.x\配置tasks.json可以创建一键编译MPP或内核的任务。例如编译MPP样例的任务{ label: Build MPP Sample, type: shell, command: make, args: [-C, ${workspaceFolder}/mpp, all], group: { kind: build, isDefault: true }, problemMatcher: [$gcc] }这样你就可以在VSCode中愉快地浏览和编写代码并使用快捷键进行交叉编译了。8. 安装验证与常见问题排坑指南环境装好了怎么验证它是“活”的以下是一套组合验证拳。8.1 验证步骤工具链验证已做aarch64-himix100-linux-gcc -v成功输出。编译Hello World// hello.c #include stdio.h int main() { printf(Hello, SS928!\n); return 0; }用交叉编译器编译aarch64-himix100-linux-gcc hello.c -o hello用file命令检查file hello输出应显示ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked...证明生成了ARM64的可执行文件。在开发板上运行将编译出的hello程序通过TFTP/NFS/U盘等方式放到开发板的根文件系统中执行./hello看到输出即成功。8.2 常见问题与解决方案速查表问题现象可能原因解决方案bash: aarch64-himix100-linux-gcc: command not found1. 工具链路径未加入PATH。2. 缺少32位兼容库。1. 检查~/.bashrc中的PATH设置并source ~/.bashrc。2. 执行sudo apt-get install lib32z1 lib32stdc6。make: aarch64-himix100-linux-gcc: Command not found(在make时)Makefile中可能使用了绝对路径或不同的环境变量名。在Makefile所在目录先手动在终端执行export CROSS_COMPILEaarch64-himix100-linux-再执行make。或检查Makefile中CROSS_COMPILE的定义。编译内核时报错“fatal error: openssl/xxx.h: No such file or directory”缺少OpenSSL开发库。执行sudo apt-get install libssl-dev。执行sdk.unpack时报错“cannot find -lpthread”或类似工具链自身的库链接问题或环境混乱。尝试在工具链的lib目录下查找是否存在libpthread.so可能是符号链接失效。可以尝试重新解压工具链或使用ln -s重新创建链接。最彻底的方法是换一个干净的系统环境。MPP样例编译通过但运行时提示“error while loading shared libraries: libhi_xxx.so: cannot open shared object file”动态库未正确部署到板子的库路径。1. 检查make install的DESTDIR是否正确。2. 在开发板上检查/lib或/usr/lib目录下是否存在该库。3. 在开发板上设置LD_LIBRARY_PATH环境变量export LD_LIBRARY_PATH/lib:$LD_LIBRARY_PATH。内核编译到最后阶段报错与genext2fs相关缺少制作文件系统镜像的工具。执行sudo apt-get install genext2fs。所有编译都正常但板子无法启动U-Boot阶段就卡住1.Makefile.param中DDR或PHY配置错误。2. 烧录的镜像地址不对。3. 硬件问题。1.仔细核对Makefile.param与板子硬件规格书。2. 检查U-Boot的烧录命令确保加载地址和文件正确。3. 使用示波器或调试器检查电源、时钟、复位信号。踩坑心得海思SDK环境搭建90%的问题出在“环境不纯净”和“配置不匹配”上。我的建议是使用一个全新的、版本合适的Ubuntu系统严格按照官方或可信教程的步骤操作并时刻关注每一步命令的反馈。遇到错误不要慌仔细阅读错误信息它通常已经给出了很明确的线索。将编译命令的输出重定向到文件make build.log 21有助于后期分析。最后善用搜索引擎和社区论坛你遇到的问题很可能别人已经踩过坑并给出了解决方案。