昉·星光2 RISC-V开发板U-Boot环境搭建与开发指南

发布时间:2026/7/17 5:29:11
昉·星光2 RISC-V开发板U-Boot环境搭建与开发指南 1. 昉·星光2单板计算机与U-Boot开发环境搭建作为一名长期从事嵌入式开发的工程师最近拿到昉·星光2VisionFive 2这块RISC-V架构的开发板时内心还是有点小激动的。这款基于赛昉科技JH7110 SoC的单板计算机可以说是目前RISC-V生态中性能最接近实用级别的开发平台之一。今天我要分享的是在这块板子上进行U-Boot开发的完整过程特别是那些官方文档没有明确说明的细节问题。首先明确几个关键点JH7110是一颗四核64位RISC-V处理器主频1.5GHz支持DDR4/LPDDR4内存而VisionFive 2板载了8GB内存和多种外设接口。U-Boot作为嵌入式系统的第二段引导程序负责初始化关键硬件、加载操作系统内核其开发过程与传统的ARM平台有诸多不同。下面就从环境搭建开始一步步解析RISC-V架构下的U-Boot开发要点。1.1 开发工具链的选择与验证在x86主机上为RISC-V架构交叉编译U-Boot首要问题是选择正确的工具链。根据我的实测经验目前有两种可行的方案预编译工具链可以直接从SiFive官网获取预构建的交叉编译器例如riscv64-unknown-elf-gcc。但需要注意版本兼容性问题我推荐使用gcc版本10.x系列太新的版本可能会遇到链接错误。# 验证工具链是否可用 riscv64-unknown-elf-gcc --version # 预期输出应包含类似如下信息 # riscv64-unknown-elf-gcc (SiFive GCC-Metal 10.2.0-2020.12.8) 10.2.0Buildroot自定义构建通过Buildroot系统构建完整的交叉编译环境这种方法虽然耗时较长首次构建可能需要1-2小时但能确保所有工具链组件版本完全匹配。赛昉科技提供的SDK中就包含了Buildroot配置git clone https://github.com/starfive-tech/Tools.git cd Tools/buildroot make visionfive2_defconfig make重要提示无论采用哪种方式务必确认工具链支持的ABI版本。JH7110需要rv64gc架构即同时支持压缩指令(C)和原子指令(A)。可以通过以下命令验证riscv64-unknown-elf-gcc -marchrv64gc -mabilp64d -dM -E - /dev/null | grep -i rv1.2 获取官方U-Boot源码赛昉科技维护了一个定制的U-Boot仓库其中包含JH7110所需的特定驱动和配置。与主线U-Boot相比这个版本增加了对StarFive系列芯片的完善支持git clone https://github.com/starfive-tech/u-boot.git -b JH7110_VisionFive2_devel cd u-boot代码仓库的结构值得关注arch/riscv/cpu/jh7110处理器特定的启动代码board/starfive/visionfive2板级支持包(BSP)configs/starfive_visionfive2_defconfig默认配置文件1.3 开发主机环境配置除了交叉编译器外还需要准备以下工具device-tree-compiler用于编译设备树文件opensbiRISC-V架构所需的监督二进制接口实现swig和python3-dev某些构建脚本的依赖项在Ubuntu系统上可以通过apt一键安装sudo apt update sudo apt install device-tree-compiler swig python3-dev对于OpenSBI建议使用赛昉提供的预编译版本或者从以下仓库构建git clone https://github.com/starfive-tech/opensbi.git -b JH7110_VisionFive2_devel cd opensbi make CROSS_COMPILEriscv64-unknown-elf- PLATFORMgeneric2. U-Boot编译配置详解2.1 默认配置解析进入U-Boot源码目录后首先加载默认配置make starfive_visionfive2_defconfig这个配置文件中几个关键选项值得关注CONFIG_ARCH_RV64Iy指定64位RISC-V架构CONFIG_TARGET_STARFIVE_VISIONFIVE2y板级目标标识CONFIG_SYS_MALLOC_LEN0x800000调整内存分配池大小CONFIG_ENV_SIZE0x20000环境变量存储空间2.2 内存布局与启动流程JH7110的启动过程分为多个阶段ROM Code芯片内置的固化代码从SPI Flash或eMMC加载TPL(初级程序加载器)TPL初始化DDR控制器加载SPL(二级程序加载器)SPL进一步初始化外设加载完整U-BootU-Boot Proper完整的引导加载程序对应的内存映射如下0x40000000 - 0x4001FFFF: TPL运行区域(128KB) 0x40020000 - 0x4005FFFF: SPL运行区域(256KB) 0x40200000 - 0x402FFFFF: U-Boot运行区域(1MB)2.3 定制化编译选项根据实际需求可能需要调整以下配置make menuconfig几个常用修改项Boot延迟CONFIG_BOOTDELAY默认为2秒网络配置CONFIG_IPADDR、CONFIG_SERVERIP文件系统支持CONFIG_FS_EXT4、CONFIG_FS_FATUSB设备支持CONFIG_USB_EHCI_HCD修改后保存配置make savedefconfig cp defconfig configs/starfive_visionfive2_defconfig3. 编译与烧写实战3.1 完整编译流程执行编译命令make CROSS_COMPILEriscv64-unknown-elf- -j$(nproc)关键输出文件u-boot.bin原始二进制镜像u-boot.img带有头部信息的镜像spl/u-boot-spl.binSPL阶段二进制tpl/u-boot-tpl.binTPL阶段二进制3.2 生成可烧写镜像赛昉提供了打包工具fiptool用于生成完整的启动镜像tools/fiptool.py create --tos FW_tee.bin \ --ntfw FW_bl31.bin \ --tpl build/tpl/u-boot-tpl.bin \ --spl build/spl/u-boot-spl.bin \ visionfive2_fw_payload.img注意FW_tee.bin和FW_bl31.bin需要从官方SDK中获取它们是TrustZone相关的固件3.3 烧写到SD卡将镜像写入SD卡假设SD卡设备为/dev/sdcsudo dd ifvisionfive2_fw_payload.img of/dev/sdc bs1M convfsync sudo sync分区布局应如下所示/dev/sdc1: FAT32分区(存放设备树和内核) /dev/sdc2: ext4分区(根文件系统)4. 调试与问题排查4.1 串口调试配置VisionFive 2板载了调试串口通过USB Type-C接口引出。在Linux主机上sudo picocom -b 115200 /dev/ttyUSB0常见启动日志分析TPL阶段成功标志DRAM: 8 GiBSPL阶段成功标志Loading Environment from MMC... OKU-Boot阶段成功标志Hit any key to stop autoboot4.2 常见问题解决方案问题1DDR初始化失败现象卡在Initialize DDR...阶段 解决方法检查board/starvfive/visionfive2/spl.c中的DDR参数确认供电稳定必要时外接电源问题2SPL加载失败现象重复输出Trying to boot from MMC1解决方法检查SD卡镜像是否正确写入尝试更换SD卡某些品牌兼容性较差问题3环境变量丢失现象Bad CRC, using default environment解决方法在U-Boot命令行执行env save检查CONFIG_ENV_OFFSET和CONFIG_ENV_SIZE设置5. 进阶开发技巧5.1 自定义启动命令通过修改include/configs/starvfive_visionfive2.h可以添加自定义命令#define CONFIG_EXTRA_ENV_SETTINGS \ mycmdecho Hello RISC-V\0 \ bootargsconsolettyS0,115200 root/dev/mmcblk0p2 ro\05.2 设备树修改与调试提取当前设备树make CROSS_COMPILEriscv64-unknown-elf- starfive_visionfive2.dtb调试技巧# 在U-Boot命令行中 fdt list /cpus # 查看CPU节点 fdt resize 8192 # 调整设备树大小5.3 性能优化建议缩短启动时间禁用不必要的驱动如USB、网络调整CONFIG_BOOTDELAY为0使用CONFIG_SPL_FIT_IMAGE_TINY减小镜像尺寸内存优化#define CONFIG_SYS_MALLOC_LEN (1024 * 1024) // 调整为实际需求 #define CONFIG_SYS_BOOTMAPSZ (64 * 1024 * 1024) // 引导内存区域安全增强启用CONFIG_FIT_SIGNATURE进行镜像验证设置CONFIG_ENV_IS_NOWHERE防止环境变量被篡改在实际项目中我遇到过一个典型问题当尝试从网络启动时U-Boot会随机卡死。经过分析发现是DDR时序参数不够优化导致的通过调整drivers/ram/starvfive/ddr_init.c中的ddr_cfg_phy结构体最终解决了稳定性问题。这也提醒我们在RISC-V这种新兴架构上开发有时需要深入硬件层面对参数进行微调。