Hi3798MV100 SDK编译环境搭建全攻略:从Ubuntu配置到固件生成

发布时间:2026/8/7 1:32:06
Hi3798MV100 SDK编译环境搭建全攻略:从Ubuntu配置到固件生成 1. 项目概述从零开始构建Hi3798MV100开发环境最近在折腾一个老盒子创维E900V10C芯片是海思的Hi3798MV100。这玩意儿现在网上资源不少很多玩家拿来刷机当个电视盒子或者轻量级服务器用。我手头这台是“非高安”版本的理论上可玩性更高。折腾的第一步也是最基础、最关键的一步就是搞定它的SDK编译环境。这就像你要盖房子总得先有砖头、水泥和图纸SDK就是这一整套“建筑材料”和“施工手册”。对于Hi3798MV100这类嵌入式芯片官方SDK里包含了交叉编译工具链、内核源码、驱动、库文件以及构建系统只有成功编译出完整的固件后续的定制、调试和应用开发才有根基。很多新手拿到SDK包照着网上零散的教程操作经常会卡在环境依赖、版本冲突或者莫名其妙的编译错误上一折腾就是好几天。这篇笔记我就结合自己最近在Ubuntu 20.04 LTS系统上从零搭建Hi3798MV100 SDK编译环境的全过程把每一步的细节、踩过的坑和解决方案都捋清楚。目标很明确让你能在一台干净的Linux系统上成功跑通make all生成可以烧录的固件镜像。这不仅适用于E900V10C对于其他采用同款芯片的盒子比如文中提到的E900, E900S, E910, E950等也有参考价值毕竟底层芯片和SDK框架是相通的。2. 开发环境准备与SDK解压编译嵌入式Linux系统一个稳定、纯净的Linux宿主环境是首要条件。Windows下的WSL或者虚拟机方案也可以但为了减少路径、权限和性能上的潜在问题我强烈建议使用物理机安装的Ubuntu系统。我这里用的是Ubuntu 20.04.6 LTS这是一个长期支持版本软件源稳定社区支持好。不建议用太新的发行版以免遇到一些老版本构建工具比如make 3.8x的兼容性问题。2.1 安装必要的编译工具和依赖库在开始之前我们需要安装一整套基础编译工具和针对海思平台可能需要的依赖库。打开终端一次性安装以下软件包sudo apt-get update sudo apt-get install -y build-essential git-core libncurses5-dev u-boot-tools \ bison flex texinfo zip unzip zlib1g-dev libc6-i386 lib32z1 lib32stdc6 \ gcc-multilib g-multilib cmake pkg-config wget cpio python2.7 python3 \ python3-pip device-tree-compiler lzop这里有几个关键点需要注意libc6-i386,lib32z1,lib32stdc6海思的交叉编译工具链通常是32位的在64位系统上运行需要这些32位兼容库。缺少它们会导致运行工具链时报“No such file or directory”或“wrong ELF class”的错误这个坑我踩过。python2.7很多老的SDK构建脚本仍然依赖Python 2。尽管Python 2已经停止维护但为了兼容性必须安装。系统中可以同时存在Python 2和Python 3通常python命令默认链接到python3而python2命令需要显式指定。有些SDK脚本头一行可能是#!/usr/bin/python如果它指向了Python 3可能会出错必要时需要修改脚本或建立软链接。u-boot-tools,device-tree-compiler用于处理U-Boot镜像和设备树Device Tree编译是生成启动镜像的关键。make版本运行make -v确认版本。海思SDK通常对make版本不敏感但保持3.8x或4.x的稳定版本即可。注意安装完成后建议重启系统或重新登录以确保所有新安装的库文件路径被正确加载到当前会话中。2.2 获取并解压Hi3798MV100 SDK海思的SDK通常不是开源发布的需要从芯片供应商或特定的开发者社区获取。对于Hi3798MV100这类消费级芯片的SDK往往可以在一些智能电视盒子、IPTV机顶盒的开发者论坛或开源项目如Armbian、CoreELEC针对特定盒子的移植项目中找到。文件名可能类似于Hi3798MV100_SDK_V1.0.0.tgz或hi3798mv100-xxx.tar.bz2。假设你已经下载了SDK压缩包hi3798mv100_sdk.tar.gz。我们将其解压到用户目录下的一个工作空间cd ~ mkdir -p projects/hi3798mv100 cd projects/hi3798mv100 tar -xzvf /path/to/your/hi3798mv100_sdk.tar.gz解压后你会看到一个包含多个目录的SDK根目录结构通常如下hi3798mv100_sdk/ ├── build/ # 构建脚本和配置 ├── kernel/ # Linux内核源码可能是打补丁的版本 ├── boot/ # U-Boot引导程序源码 ├── tools/ # 交叉编译工具链、打包工具等 ├── app/ # 示例应用程序 ├── mpp/ # 媒体处理平台Media Process Platform组件 ├── osdrv/ # 操作系统驱动相关可能包含更广泛的开源组件 └── release/ # 编译输出目录初始可能是空的重要步骤设置环境变量SDK的编译严重依赖环境变量尤其是交叉编译工具链的路径。在SDK根目录下通常存在一个名为env_setup.sh或setenv.sh的脚本。在开始编译前必须先source这个脚本cd hi3798mv100_sdk source ./env_setup.sh执行这个命令后它会做几件关键事情将SDK自带的交叉编译工具链路径如tools/linux/toolchain/arm-hisiv500-linux/bin添加到系统的PATH环境变量最前面。这样当你运行arm-hisiv500-linux-gcc时系统会优先使用SDK提供的版本。设置CROSS_COMPILE环境变量例如CROSS_COMPILEarm-hisiv500-linux-。内核和U-Boot的Makefile会读取这个变量来调用正确的交叉编译器。可能还会设置ARCHarm等架构相关变量。你可以通过以下命令验证工具链是否生效echo $CROSS_COMPILE which arm-hisiv500-linux-gcc arm-hisiv500-linux-gcc -v如果都能正确输出工具链前缀、路径和版本信息说明环境变量设置成功。实操心得我习惯把source /path/to/sdk/env_setup.sh这一行添加到我的~/.bashrc文件末尾。这样每次打开新的终端窗口都会自动设置好编译环境非常方便。但要注意如果你同时开发多个不同架构的平台这种方式可能会造成冲突此时更推荐在需要时手动source。3. SDK编译流程深度解析环境准备好后就可以开始核心的编译工作了。海思SDK的编译通常不是简单的一个make命令而是一个有顺序的构建流程一般遵循 “U-Boot - Kernel - Rootfs - 打包” 的顺序。SDK根目录下通常有一个顶层的Makefile或build.sh脚本来管理整个流程。3.1 编译配置与菜单选择在开始编译前通常需要进行一些配置。对于Hi3798MV100关键的配置项包括芯片型号确认是Hi3798MV100。安全类型区分“高安”与“非高安”。我们的盒子是“非高安”Non-Secure Boot这个选项至关重要它决定了内核和驱动的编译配置以及最终固件的签名校验方式。选错会导致编译出的系统无法启动。板级配置虽然芯片相同但不同盒子如创维E900V10C、华为EC6108V9的外设如Wi-Fi/蓝牙芯片、内存型号、闪存类型、网口PHY可能不同。SDK中可能提供了多个板级配置boardconfig或设备树.dts文件。进入SDK的build或osdrv目录查找配置脚本。常见的配置命令是make menuconfig针对内核或./cfg.shSDK顶层配置。# 假设在osdrv目录下进行整体配置 cd osdrv make menuconfig或者使用SDK提供的配置脚本cd .. ./cfg.sh hi3798mv100 nonsecure # 参数解释hi3798mv100 是芯片型号nonsecure 表示非高安配置界面如果是menuconfig会以字符图形菜单形式呈现。你需要导航到相关选项确保CPU选择为Hi3798MV100。Security或Secure Boot选项设置为Disable或Non-Secure。找到Board或Product选择如果有类似E900V10C或hi3798mv100-demo的选项就选择它。如果没有可能需要后续手动替换设备树文件。配置完成后选择保存并退出。配置信息通常会保存在一个.config文件中。3.2 分步编译U-Boot、内核与根文件系统配置保存后就可以开始分步编译了。我推荐先分步编译验证每一部分是否正常最后再尝试一键编译。3.2.1 编译U-BootU-Boot是系统的引导程序负责初始化硬件、加载内核和根文件系统。# 通常U-Boot源码在 boot 或 u-boot 目录下 cd boot # 清理旧编译结果如果是第一次可跳过 make distclean # 应用板级配置例如 hi3798mv100_defconfig make hi3798mv100_defconfig # 或者如果之前menuconfig已配置好可以直接加载 # make ARCHarm CROSS_COMPILEarm-hisiv500-linux- hi3798mv100_defconfig # 开始编译 make ARCHarm CROSS_COMPILEarm-hisiv500-linux- -j$(nproc)-j$(nproc)表示使用与CPU核心数相同的线程数进行并行编译可以显著加快速度。编译成功后会在当前目录生成u-boot.bin原始的U-Boot镜像和u-boot-merged.bin可能合并了某些头部信息的镜像。海思平台通常需要一个经过特殊工具处理的u-boot.bin我们稍后在打包环节会用到。3.2.2 编译Linux内核内核是操作系统的核心。cd ../kernel # 清理 make ARCHarm distclean # 应用配置。如果之前运行过顶层menuconfig这里可能已经有.config文件了。 # 如果没有可以拷贝SDK提供的默认配置例如 cp arch/arm/configs/hi3798mv100_defconfig .config # 或者再次使用menuconfig进行微调可选 make ARCHarm CROSS_COMPILEarm-hisiv500-linux- menuconfig # 编译内核镜像和模块 make ARCHarm CROSS_COMPILEarm-hisiv500-linux- uImage -j$(nproc) make ARCHarm CROSS_COMPILEarm-hisiv500-linux- modules -j$(nproc)编译成功后关键产出在arch/arm/boot/uImage可引导的内核镜像。各种内核模块.ko文件散落在各模块目录中。3.2.3 构建根文件系统根文件系统包含了系统运行所需的所有库、工具、配置文件和应用程序。SDK可能提供几种方式使用预制的BusyBox根文件系统SDK的osdrv/rootfs目录下可能有基于BusyBox的构建脚本。使用Buildroot更现代和灵活的方式可以定制软件包。使用现成的文件系统例如直接使用为Hi3798MV100适配的Armbian或Debian根文件系统镜像。这里以SDK自带的BusyBox构建为例cd ../osdrv/rootfs # 可能有一个 build_rootfs.sh 脚本 ./build_rootfs.sh hi3798mv100 nonsecure这个脚本会解压BusyBox编译生成基本的根文件系统目录树并安装到类似rootfs_hi3798mv100的目录中。3.2.4 编译媒体处理平台MPP和其他组件如果你需要视频编解码、图形显示等多媒体功能还需要编译MPP组件。cd ../mpp # 通常也有一个顶层的Makefile make ARCHarm CROSS_COMPILEarm-hisiv500-linux- -j$(nproc)MPP的编译可能会依赖内核头文件确保你已经编译过内核。3.3 整体编译与固件打包在分步编译验证无误后可以使用SDK提供的一键编译脚本进行整体构建。这通常在SDK根目录或osdrv目录下。# 回到SDK根目录或osdrv目录 cd ../.. # 执行一键编译脚本例如 make all # 或者 ./build.sh all这个脚本会按照正确的顺序调用上述各个部分的编译并在最后进行打包。打包是生成可烧录固件通常是.img文件的关键步骤它会将U-Boot、内核、设备树和根文件系统按照芯片要求的格式组合在一起有时还会加入引导头、签名高安情况下等信息。对于Hi3798MV100非高安版本最终生成的固件可能是一个名为Hi3798MV100-xxx.img或update.zip的文件位于release/或image/目录下。这个文件就可以通过USB烧录工具如Hitool或者卡刷的方式刷入机顶盒。4. 编译过程中的常见问题与解决方案编译过程很少一帆风顺尤其是第一次搭建环境。下面是我遇到的一些典型问题及解决方法。4.1 工具链相关错误问题1arm-hisiv500-linux-gcc: command not found原因环境变量未正确设置或者工具链路径未加入PATH。解决确认已执行source env_setup.sh。检查该脚本内容看它是否正确地导出了工具链路径。你可以手动添加export PATH/path/to/your/sdk/tools/linux/toolchain/arm-hisiv500-linux/bin:$PATH export CROSS_COMPILEarm-hisiv500-linux- export ARCHarm使用which arm-hisiv500-linux-gcc确认命令是否可找到。问题2/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory原因在64位系统上运行32位的工具链缺少32位运行库。解决安装我们之前在环境准备环节提到的32位兼容库libc6-i386,lib32z1,lib32stdc6。安装后即可解决。问题3工具链版本过旧导致的语法错误现象编译较新版本的内核或软件时工具链报错提示某些C语言特性不支持。解决海思官方工具链可能比较老。可以尝试使用更新的第三方工具链如Linaro或Arm官方提供的GCC工具链。但需要测试与海思内核、驱动的兼容性。如果错误不多可以尝试修改源码规避工具链不支持的语法。4.2 内核编译错误问题4error: unknown type name ‘xxx’或头文件缺失原因内核配置不完整或者依赖的路径不对。解决确保执行了make menuconfig并保存了配置。在编译内核前先编译生成必要的头文件make ARCHarm CROSS_COMPILEarm-hisiv500-linux- prepare。检查错误信息中缺失的头文件看它属于哪个内核模块在menuconfig中确保该模块被启用y或m。问题5驱动编译错误提示海思特定函数未定义原因驱动代码依赖海思提供的内部头文件或符号这些可能不在标准内核源码树中而是SDK以补丁或独立模块形式提供。解决确认你是否完整地应用了SDK提供的内核补丁。有些SDK需要手动打补丁cd kernel patch -p1 ../patches/kernel/*.patch检查驱动代码的Makefile看它是否正确地引用了海思SDK的include路径如-I$(SDK_PATH)/mpp/include。4.3 根文件系统与打包错误问题6根文件系统过大导致打包失败原因生成的根文件系统体积超过了Flash分区规划的大小。解决裁剪根文件系统移除不必要的调试工具、文档和库。使用mksquashfs等工具将根文件系统制作成压缩的squashfs镜像可以极大减少体积。修改分区表配置如果有权限调整rootfs分区的大小。这通常需要修改U-Boot或内核中的分区定义。问题7打包工具执行失败现象在最后执行mkimage或海思专用的pack_tool时失败。解决确认打包工具是否有可执行权限chmod x tools/pack_tool。打包工具可能也是32位程序同样需要安装32位库。检查打包工具的配置文件如config.ini或partition.xml确认其中指定的U-Boot、内核、根文件系统等输入文件的路径是否正确。4.4 环境与路径问题问题8编译中途失败重新开始编译时出现奇怪错误原因中间文件.o,.d状态不一致。解决彻底清理后再重新编译。# 在内核或U-Boot目录下 make distclean # 或 make mrproper (内核清理更彻底) # 然后重新执行配置和编译步骤。对于SDK整体查看顶层Makefile是否有clean或distclean目标。问题9Python脚本语法错误IndentationError, print语法错误原因SDK中的老旧Python脚本与当前系统的Python 3不兼容。解决尝试使用Python 2运行python2 script.py。修改脚本首行将#!/usr/bin/python改为#!/usr/bin/python2。对于简单的语法不兼容如print语句可以手动修改脚本将print “xxx”改为print(“xxx”)。但需谨慎可能引入其他问题。为了便于查阅我将上述常见问题及解决方法汇总成下表问题类别典型错误信息可能原因解决方案工具链command not foundPATH环境变量未设置source env_setup.sh或手动导出PATH工具链bad ELF interpreter缺少32位运行库安装libc6-i386等32位兼容库内核unknown type name头文件缺失/配置不全执行make prepare检查menuconfig配置内核/驱动海思API未定义内核补丁未打或路径错误检查并应用SDK内核补丁核对Makefile包含路径根文件系统打包失败空间不足rootfs体积超出分区限制裁剪文件系统制作squashfs镜像调整分区表打包工具打包工具执行失败权限不足或缺少库chmod x安装32位库检查配置文件路径环境二次编译失败中间文件状态不一致执行make distclean后重试脚本SyntaxError(Python)Python 2/3语法不兼容使用python2运行或修改脚本适配Python 35. 编译后的验证与后续步骤成功编译出*.img文件只是第一步。如何验证它的有效性呢文件检查使用file命令检查生成的镜像文件类型。使用ls -lh查看文件大小是否合理通常从几十MB到几百MB。模拟测试可选使用QEMU等模拟器运行编译出的内核和根文件系统进行基础功能测试。但对于海思这种包含大量专用外设的芯片模拟器通常只能测试到内核启动阶段。实机烧录这是最直接的验证方式。将生成的*.img文件通过Hitool工具海思专用烧录工具的USB烧写功能或者制作成SD卡启动盘如果盒子支持烧录到机顶盒中。观察串口调试输出需要连接TTL转USB线到盒子的UART引脚这是诊断启动问题的“眼睛”。正常的启动日志会依次显示U-Boot、内核加载、文件系统挂载、系统初始化的信息。如果系统成功启动并出现了登录提示符如rootHi3798MV100:~#那么恭喜你SDK编译环境搭建和基础固件构建就成功了接下来你可以基于此进行更多探索定制根文件系统用Buildroot或Yocto构建一个包含更多软件如Python、Node.js、Docker等的根文件系统打造一个功能更强的迷你服务器。驱动开发与调试如果你有外设需要驱动或者发现某些硬件如Wi-Fi、蓝牙工作不正常就需要深入研究内核驱动进行修改和调试。应用开发利用海思的MPP库开发视频播放、图形界面如Qt等应用程序。系统优化调整内核参数、裁剪不需要的模块、优化启动速度等。整个Hi3798MV100的SDK编译过程就像是在组装一台精密的仪器。环境准备是备齐零件和工具配置是阅读图纸分步编译是组装各个子系统打包是总装而问题排查则是解决组装过程中遇到的卡顿和异响。这个过程需要耐心和细心尤其是面对那些晦涩的错误日志时。但每一次成功的编译和启动都是对系统底层理解的一次深化。我自己的经验是一定要善用串口调试输出它是最忠实的问题报告者另外做好每一步的笔记记录下成功的配置和命令这会在你下次搭建环境或者帮助他人时节省大量时间。