海思SS928评估板开发全流程:从环境搭建到外设测试

海思SS928评估板开发全流程:从环境搭建到外设测试 1. 项目概述从零上手SS928评估板最近在折腾一块海思SS928也叫SD3403的评估板型号是易百纳社区的EB-SS928-DC-393。这块板子性能挺强的集成了四核A55和双核RISC-V还有不错的视频编解码和AI算力在边缘计算、智能NVR这些场景里很常见。但说实话刚拿到手的时候有点懵资料虽然多但比较散官方SDK的编译环境搭建也挺繁琐。好在社区提供了一个已经配置好的Ubuntu虚拟机镜像大大降低了入门门槛。这篇文章我就结合自己的实操经验带你走一遍从环境搭建、固件编译烧录到所有外围接口功能测试的完整流程。目标很明确让你拿到板子后能最快速度跑起来看到效果为后续的深度开发打好基础。2. 开发环境搭建虚拟机方案的优劣与细节对于嵌入式Linux开发一个稳定、高效的开发环境是基石。官方和社区资料通常推荐在物理机上安装Ubuntu但对于很多习惯Windows日常办公或者电脑资源有限的开发者来说虚拟机方案是一个更灵活的选择。2.1 为什么选择“Windows VMware Ubuntu”方案这个组合是目前最主流的跨平台嵌入式开发环境之一。它的核心优势在于隔离性与便利性的平衡。开发编译、文件传输、网络调试等重度任务在Ubuntu虚拟机中进行保证了环境的纯净和工具链的一致性而文档编写、即时通讯、网页查询等轻度任务则在宿主Windows系统完成互不干扰。特别是对于SS928这种需要特定版本工具链和大量源码编译的项目虚拟机环境可以打包成镜像分享避免了“在我机器上能跑在你那就报错”的经典问题。社区提供的预配置Ubuntu 18.04镜像就是这个思路的完美体现直接跳过了最耗时的环境配置环节。注意虚拟机性能损耗是客观存在的。编译大型内核或SDK时速度会比同等配置的物理机慢。因此为虚拟机分配足够的资源至关重要。我建议至少分配4核CPU、8GB内存和80GB的硬盘空间。如果你的宿主机是SSD务必把虚拟机磁盘文件放在SSD上这能极大提升编译和系统响应速度。2.2 虚拟机软件与Linux版本选择虚拟机软件方面VMware Workstation Pro是功能最全的选择支持快照、克隆等高级功能非常适合做开发——你可以在一个稳定的基础状态打快照然后大胆尝试各种配置搞乱了随时回滚。VMware Workstation Player是免费版功能有所限制但对于单纯运行这个开发镜像也足够了。版本建议用15以上对硬件虚拟化和USB设备支持更好。Linux发行版选择Ubuntu 18.04 LTS桌面版是一个经过验证的稳定选择。LTS意味着长期支持软件源稳定社区资料丰富。很多芯片原厂的SDK和工具链都是基于这个版本进行测试的兼容性最有保障。更高版本的Ubuntu如20.04, 22.04也可能可以但可能会遇到库版本依赖、内核头文件不匹配等需要额外解决的问题对于新手不推荐在入门阶段增加不确定性。2.3 使用预配置镜像的实操要点社区提供的镜像用户名为ebaina密码是1。登录系统后你会发现桌面和家目录下已经准备好了所有开发资源这节省了数小时的搭建时间。不过有几点需要你第一时间操作虚拟机工具安装启动Ubuntu后VMware会提示“安装VMware Tools”。务必点击安装这能实现宿主机和虚拟机之间无缝的鼠标切换、文件拖拽或共享文件夹设置和屏幕自适应分辨率体验提升巨大。网络配置建议将虚拟机网络适配器设置为“桥接模式”。这样虚拟机会从你的路由器获取一个独立的局域网IP和你的开发板处于同一网段后续通过ssh登录板子、tftp传输文件会非常方便。更新软件源可选但推荐虽然镜像环境已配置好但为了后续安装其他软件方便可以更新一下软件源列表。打开终端执行sudo apt update。除非必要先不要执行sudo apt upgrade以免升级关键系统组件导致与SDK环境不兼容。3. 开发资料全解析与SDK目录结构解读进入开发阶段第一件事就是摸清“弹药库”在哪。预装镜像里的资料摆放得很有条理主要集中在两个目录理解它们的关系能让你后续操作更有章法。3.1/home/ebaina/ebaina_resource_pack板级资源包这个目录可以理解为针对“EB-SS928-DC-393”这块特定开发板的出厂配套资料包。它里面的内容是直接可用的或者经过少量配置就能用于这块板子的。A393_ss928_u-boot-2020.01.zip: U-Boot引导程序的源代码压缩包。U-Boot相当于板子的“BIOS”负责最基础的硬件初始化、引导内核。这个版本是海思在原版U-Boot 2020.01基础上适配了自家芯片的版本。A393_ss928_linux-4.19.y.zip: Linux内核的源代码压缩包。内核版本是4.19这是一个长期支持的内核分支在嵌入式领域非常流行。里面包含了海思芯片所有外设的驱动、视频编解码等核心模块。A393_ss928_ubi_rootfs.zip: 根文件系统制作脚本和内容。根文件系统就是板子上Linux系统启动后的“C盘”包含了所有系统命令、库文件、配置文件和你自己的应用程序。ubi格式是针对NAND Flash的特性设计的。pcf8563 tca9535: 这两个是板载外设芯片的测试工具源码或说明。PCF8563是实时时钟RTC芯片TCA9535是I/O扩展芯片用于控制继电器、按键检测等。sample.zip: 海思媒体处理平台MPP的示例程序源码。这是学习海思芯片视频输入VI、视频处理VPSS、视频编码VENC、视频解码VDEC等核心功能的最佳起点。A393_SS928V100_SPINAND_IMAGE: 出厂镜像文件夹。里面应该包含了可以直接烧写到板载SPI NAND Flash中的完整镜像文件如boot.bin,kernel.img,rootfs.ubi以及一个非常重要的环境变量.txt文件。这个文件里定义了U-Boot启动时需要的关键参数如内核加载地址、启动命令等烧写成功后需要对照设置。3.2/home/ebaina/ss928v100_sdk官方SDK与编译环境这个目录是海思官方SS928V100 SDK V2.0.2.1的展开目录是更底层、更全面的开发环境。社区已经帮你完成了SDK解压和补丁安装。SS928V100_SDK_V2.0.2.1: SDK主目录。结构庞大包含open_source/: 开源组件如U-Boot、Linux内核的源码与资源包里的可能一致但这里是原始位置。osdrv/: 操作系统驱动相关包括根文件系统构建脚本、内核配置等。smp/(单核/多核程序): 这里存放着MPP示例程序sample是我们重点要编译和学习的。各种工具链、配置脚本。SS928V100_REF_V2.0.2.1 ref_patch.sh: 参考设计补丁包和安装脚本。官方SDK是通用基础版补丁包包含了针对特定参考设计比如某种板型的配置、设备树文件等。脚本已经运行过所以当前SDK已经是打过补丁的状态。交叉编译工具链:aarch64-mix210-linux: 这是编译A55核心上运行的Linux应用程序、内核、U-Boot的主要工具链。aarch64指64位ARM架构mix210是海思的代号。cc-riscv32-cfg5-musl-20211008-elf: 这是编译RISC-V核心SS928内部还有双核RISC-V上运行的裸机或RTOS程序的工具链。如果你需要开发RISC-V协处理器的功能就会用到它。3.3 MindStudio与CANN简介目录里还提到了MindStudio和CANN这是华为昇腾AI计算相关的开发工具和软件栈。SS928集成了神经网络处理单元NPU如果你想开发AI推理应用就需要安装MindStudio这个集成开发环境以及CANNCompute Architecture for Neural Networks这个AI软件栈。对于单纯的Linux系统移植和视频功能开发可以暂不安装。如果你后续需要/home/ebaina/Downloads目录下已经准备好了安装包。4. 固件编译三部曲U-Boot、内核与根文件系统有了清晰的资料目录认识我们就可以开始动手编译自己的固件了。编译顺序通常是U-Boot - Linux内核 - 根文件系统。社区提供了便捷的编译脚本但理解脚本在做什么更重要。4.1 U-Boot编译详解U-Boot的编译是第一步它生成最基础的引导程序。进入U-Boot源码目录并执行编译脚本cd /home/ebaina/ss928v100_sdk/SS928V100_SDK_V2.0.2.1/open_source/u-boot/u-boot-2020.01 ./build_uboot.sh这个build_uboot.sh脚本背后主要做了以下几件事设置交叉编译环境它会自动调用SDK中的setenv.sh脚本将我们之前提到的aarch64-mix210-linux工具链路径加入到系统环境变量中。这样后续的make命令才知道用什么编译器。执行make命令根据预置的配置文件通常是make xxx_defconfig比如hi_s928_defconfig来配置U-Boot然后编译所有源码。生成最终镜像海思平台的U-Boot编译后通常不会直接生成一个单一的u-boot.bin。脚本会调用海思专用的打包工具mkimage将U-Boot代码、必要的硬件初始化代码可能来自reg_info.bin等打包成一个可供芯片BootROM直接读取的boot_image.bin。这个文件就是我们最终需要烧写的。编译成功后脚本会将boot_image.bin拷贝到Ubuntu桌面方便查找。实操心得第一次编译时如果报错找不到编译器可以手动执行一下SDK根目录下的setenv.sh脚本source /home/ebaina/ss928v100_sdk/SS928V100_SDK_V2.0.2.1/setenv.sh。然后进入U-Boot目录尝试手动执行make hi_s928_defconfig make -j8来编译-j8表示用8个线程并行编译速度更快。这能帮你理解脚本的实质。4.2 Linux内核编译详解内核编译是耗时最长的步骤。进入内核目录执行脚本cd /home/ebaina/ss928v100_sdk/SS928V100_SDK_V2.0.2.1/open_source/linux/linux-4.19.y ./build_kernel.sh这个脚本的核心工作流程配置内核使用默认的配置文件.config。这个配置文件已经由SDK和补丁包设置好包含了SS928芯片的所有必要驱动、海思媒体处理模块、文件系统支持等。如果你需要增加或删除某些内核模块比如特定的USB设备驱动可以使用make menuconfig进行图形化配置但这需要一定的内核知识。编译内核与设备树执行make编译内核镜像Image或zImage以及非常重要的设备树二进制文件Device Tree Blob, dtb。设备树文件.dts描述了板子的硬件资源如内存地址、外设连接等是内核启动时识别硬件的关键。打包生成fip.bin和U-Boot类似海思平台的内核镜像也需要经过打包。脚本会调用工具将内核镜像、设备树等打包成最终的fip.bin文件并同样输出到桌面。4.3 根文件系统构建详解根文件系统决定了系统启动后有什么功能。我们使用ubi格式因为它适合NAND Flash支持坏块管理和磨损均衡。cd /home/ebaina/ss928v100_sdk/SS928V100_SDK_V2.0.2.1/osdrv/rootfs_scripts/A393_ss928_ubi_rootfs ./build_rootfs.sh这个脚本做的事情准备根文件系统内容它可能基于一个基础的根文件系统比如BusyBox或Buildroot制作的最小系统然后将海思的媒体库、示例程序、配置文件等拷贝进去。使用mkfs.ubifs制作镜像根据Flash的物理参数页大小2K块大小128K总大小128M将整理好的根文件系统目录树制作成一个rootfs_ss928v100_2k_128k_128M.ubifs镜像文件。这些参数2k, 128k, 128M必须和你的板载Flash型号以及内核中的Flash驱动配置完全一致否则系统无法挂载。至此三个核心镜像文件都已生成在桌面boot_image.bin,fip.bin,rootfs_ss928v100_2k_128k_128M.ubifs。它们是烧写的基础。5. 固件烧写与环境变量设置编译出镜像后下一步就是烧写到板子的Flash中。SS928评估板通常通过USB或者网口配合海思专用的烧写工具进行烧写。这里假设你使用的是常见的HiTool或类似工具。5.1 烧写工具与分区表启动烧写工具在Windows宿主机上运行海思的烧写工具如HiTool。连接板子将板子通过USB烧录口通常是USB转串口芯片的USB口连接到电脑。板子需要设置为烧写模式这通常通过拨动板上的启动模式开关Boot Mode Switch来实现具体位置需要查看板子的原理图或用户手册。常见操作是按住某个按键或短接某个测试点再上电。选择分区表在烧写工具中选择“烧写eMMC/SPI NAND”等对应选项。最关键的一步是加载或创建正确的分区表。分区表定义了Flash上各个区域分区的起始地址、大小和用途例如boot分区存放boot_image.binkernel分区存放fip.binrootfs分区存放rootfs.ubifs分区表信息通常包含在SDK或板级资料包中。一个典型的分区表文本内容可能如下所示它定义了每个分区的名称、大小、起始地址和属性mtdpartshi_sfc:1M(boot),4M(kernel),32M(rootfs),-(user)在烧写工具中你需要根据这个分区表为每个分区选择对应的镜像文件。5.2 烧写步骤与确认烧写固件按照工具提示依次选择boot_image.bin烧写到boot分区fip.bin烧写到kernel分区rootfs.ubifs烧写到rootfs分区。然后点击“烧写”按钮。工具会通过USB将镜像传输到板载Flash中这个过程需要几分钟。重启与进入U-Boot烧写完成后将板子的启动模式开关拨回正常启动模式然后重启板子。在串口终端使用MobaXterm、SecureCRT等工具波特率通常为115200上你应该能看到U-Boot的启动日志并在出现Hit any key to stop autoboot提示时快速按下回车键进入U-Boot命令行。5.3 设置U-Boot环境变量进入U-Boot后最关键的一步是设置环境变量。这些变量告诉U-Boot去哪里找内核、如何加载、传递给内核什么参数。之前提到的/home/ebaina/ebaina_resource_pack/A393_SS928V100_SPINAND_IMAGE/环境变量.txt文件就是参考。 你需要使用setenv命令来设置。例如setenv bootargs mem512M consolettyAMA0,115200 root/dev/mtdblock2 rootfstypeubifs rw mtdpartshi_sfc:1M(boot),4M(kernel),32M(rootfs),-(user) setenv bootcmd sf probe 0; sf read 0x42000000 0x100000 0x400000; bootm 0x42000000 saveenvbootargs: 传递给Linux内核的命令行参数。这里设置了内存大小、控制台串口、根文件系统在哪个MTD块设备上/dev/mtdblock2对应rootfs分区、文件系统类型为ubifs以及之前提到的分区表。bootcmd: U-Boot自动执行的启动命令。意思是初始化SPI Flashsf probe 0从Flash偏移0x100000即1Mboot分区之后地址读取0x4000004M大小的数据到内存地址0x42000000这通常是kernel分区的内容然后从内存地址0x42000000启动bootm。saveenv: 将设置的环境变量保存到Flash中下次启动依然有效。设置完成后输入reset重启或者直接执行run bootcmd系统就应该能成功引导进入Linux了。看到内核解压和系统启动的日志最后出现登录提示如ebaina login:就大功告成了。6. 外围接口功能测试与验证系统成功启动后登录用户名可能是root无密码或根据镜像而定你就可以开始验证板子的各项功能了。板子的/app目录下已经集成了丰富的测试程序这是验证硬件和驱动是否正常工作的最快方式。6.1 音视频输出测试HDMI与音频环出HDMI输出测试SS928的强大之处在于视频编解码。测试程序sample_vdec会调用海思的VDEC模块解码一段预置的视频并直接输出到HDMI接口。cd /app ./sample_vdec 0 # 测试4K60fps视频解码输出 ./sample_vdec 1 # 测试1080P60fps视频解码输出执行后如果连接了HDMI显示器你应该能看到相应的测试视频画面。这个测试验证了视频解码硬件、HDMI显示驱动以及整个显示通路都是正常的。音频测试音频测试前需要注意一个硬件控制细节。该板子通过一个GPIOGPIO10_0对应系统gpio80来控制音频功放的静音。需要先取消静音echo 1 /sys/class/gpio/gpio80/value # 取消静音 ./sample_audio 0 # 开始音频环出测试sample_audio 0会将音频输入如板载麦克风或线路输入直接环回到音频输出如耳机孔或HDMI音频。对着麦克风说话应该能从耳机或音箱听到自己的声音可能有延迟。测试完成后可以echo 0 /sys/class/gpio/gpio80/value重新静音。6.2 通信接口测试串口、USB与网络RS232/485串口测试RS232节点是/dev/ttyAMA4可以用杜邦线短接板子的TX和RX引脚然后运行测试程序。程序会自发自收如果串口工作正常终端会不断打印接收到的消息。/app/serial_test -d /dev/ttyAMA4 -s 115200 -l “HiSerial:HelloWorld”485接口测试类似节点是/dev/ttyAMA3。但485是半双工需要配合USB转485模块连接到电脑用串口调试助手进行收发测试更为直观。USB接口测速这个测试验证USB主机控制器的性能和驱动。fdisk -l # 查看U盘是否被识别为 /dev/sda1 等 mount /dev/sda1 /mnt/ # 挂载U盘 # 测试写入速度生成一个约1.5GB的文件 dd if/dev/zero of/mnt/testfile bs64k count24000 # 测试读取速度 dd if/mnt/testfile of/dev/null bs4k umount /dev/sda1 # 测试完成后卸载观察命令输出的速度如 MB/s。速度受U盘本身性能影响但通常能达到几十MB/s说明USB接口工作正常。4G/5G模块测试板子提供了Mini PCIe和M.2接口分别用于连接4G如EC20和5G如FM650模块。测试步骤本质都是通过TCA9535芯片控制模块供电和USB通路切换 - 启动模块 - 进行PPP拨号或获取IP - 测试网络连通性。 以4G模块为例关键命令是/app/quectel-CM 这是一个针对移远EC20模块的拨号脚本。拨号成功后会创建一个wwan0网络接口用ping -I wwan0 180.76.76.76测试。如果无法拨号需要检查SIM卡状态使用ATQCCID命令查询。常见问题排查4G/5G模块测试失败十有八九是供电或USB通路没配置对。务必严格按照测试程序的顺序操作先tca9535_tool设置电压和USB通路选择再使能模块最后进行网络操作。可以用ls /dev/ttyUSB*命令查看模块是否正确枚举出了USB串口设备这是模块已被系统识别的基础标志。6.3 其他外设测试RTC、继电器、按键与扩展电源RTC测试实时时钟芯片PCF8563在掉电后依靠纽扣电池维持计时。测试步骤是先用系统命令设置一个时间然后通过测试程序将这个时间写入RTC芯片断电重启后再读取RTC时间看是否保持。date -s “2022-09-01 00:00:00” # 设置系统时间 hwclock -w # 将系统时间写入硬件时钟RTC这是更标准的命令 # 或者使用板载测试程序 /app/rtc_test -w poweroff # 断电 # 重新上电后 /app/rtc_test -r # 读取RTC时间 date # 查看系统时间可以将RTC时间同步回来hwclock -s继电器、按键与扩展电源测试这三者都通过TCA9535这款I/O扩展芯片控制。测试工具是/app/tca9535_tool其基本用法是tca9535_tool 读/写 通道 值。继电器控制一个GPIO输出高低电平驱动继电器吸合/断开能听到“咔哒”声。/app/tca9535_tool 1 3 1导通/app/tca9535_tool 1 3 0断开。按键读取GPIO输入电平。按住按键时读取为0松开为1具体取决于硬件上拉/下拉。/app/tca9535_tool 0 2读取Key1状态。扩展电源口控制风扇电源。/app/tca9535_tool 1 0 1通电/app/tca9535_tool 1 0 0断电。这些测试虽然简单但验证了I2C总线TCA9535通过I2C控制、GPIO扩展功能以及基本的外设驱动都是正常的为后续的扩展应用如控制外部设备、读取传感器奠定了基础。7. Sample例程编译与自定义开发入门当基础功能测试通过后就可以开始进行应用开发了。海思SDK提供的MPP Sample例程是最好的学习材料。7.1 编译所有Sample例程进入Sample目录一个make命令即可编译所有例程cd /home/ebaina/ss928v100_sdk/SS928V100_SDK_V2.0.2.1/smp/a55_linux/mpp/sample make clean # 首次编译可省略如果修改后重新编译建议先清理 make编译过程会针对海思平台进行交叉编译。完成后在各个子目录如sample_vio,sample_venc,sample_vdec下会生成对应的可执行文件。你可以将这些文件拷贝到开发板的/app目录下运行测试。7.2 Sample例程结构解析与学习路径Sample目录通常按功能模块组织sample_vio: 视频输入Video Input例程。学习如何从摄像头MIPI, USB等捕获原始视频数据。sample_venc: 视频编码Video Encode例程。学习如何将原始视频数据编码成H.264/H.265码流。sample_vdec: 视频解码Video Decode例程。学习如何解码H.264/H.265码流并输出显示。sample_vo: 视频输出Video Output例程。学习如何配置显示设备如HDMI进行图层叠加、缩放等。sample_ai/sample_ao: 音频输入/输出例程。sample_region: 区域覆盖如OSD例程。sample_isp: 图像信号处理例程如果芯片包含ISP。每个例程的main.c文件都清晰地展示了使用海思MPP API的流程系统初始化HI_MPI_SYS_Init - 各个模块初始化与参数配置 - 启动数据流 - 处理数据如保存文件、发送显示 - 停止数据流 - 资源释放。这是你编写自己视频处理程序的模板。7.3 开启你的第一个自定义程序建议从修改一个简单的Sample开始。例如复制sample_vio目录到你的工作区重命名为my_test_vio。先尝试修改一些简单的参数比如改变捕获视频的分辨率、帧率或者将捕获的图像保存为不同格式的图片Sample里通常保存为YUV原始格式你可以尝试用OpenCV或libjpeg转换成JPG。在Ubuntu虚拟机上修改代码后重新执行make编译然后将新的可执行文件传到板子上运行。关键点在于理解MPP的数据流模型VI捕获 - VPSS处理 - VENC编码或VDEC解码 - VPSS处理 - VO显示。你的程序就是通过API控制这些模块之间的数据绑定Bind与流通。踩过几次坑之后我最大的体会是嵌入式开发就像搭积木但必须先看懂图纸。对于SS928这类复杂芯片社区提供的预配置环境和完整测试套件就是最好的“图纸”。不要一上来就想着魔改老老实实跟着本文的流程把环境搭好、固件烧通、所有外围测试跑一遍建立起对整个系统软硬件状态的“正确认知”这个时间投资是绝对值得的。当所有基础测试都绿灯通过时意味着你的开发板处于一个已知的、健康的状态后续无论做视频分析、AI推理还是网络应用你都能快速定位问题是出在硬件、驱动还是自己的应用代码上。