You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DE1-SoC Cyclone V设备树Overlay加载致系统死机问题求助

排查DE1-SoC Cyclone V FPGA Overlay加载死机及MSEL配置问题

你在Terasic Ubuntu 16.0 Desktop SD卡环境下折腾DE1-SoC Cyclone V的FPGA Overlay设备树,想通过MSEL=00000(HPS 16x无压缩模式)编程FPGA,结果加载Overlay时系统直接死机;同时尝试切换MSEL=01010(压缩模式)时系统又无法开机。下面分两部分拆解问题和解决思路:


一、先解决Overlay加载死机的问题

先梳理你已经完成的正确操作:基础DTB的桥接节点启用、base_fpga_region节点配置、Overlay DTS的编译流程、固件文件放置都没问题,内核日志也显示FPGA管理器和桥接都正常注册了。那死机的可能原因及排查方向如下:

1. 优先排查RBF文件的兼容性

  • 转换.sof到.rbf时,建议添加适配HPS的参数:
    quartus_cpf -c --hps de1soc.sof de1soc.rbf
    
    标准转换可能没针对HPS接口做优化,导致加载时触发硬件异常。
  • 验证RBF文件有效性:用Quartus工具打开RBF,检查是否和你的FPGA设计匹配,同时对比SOF和RBF的文件大小,确保转换过程没有损坏。

2. 检查FPGA Region的地址配置冲突

你在基础DTB中配置的base_fpga_region的ranges是:

ranges = <0x00000000 0x00000000 0xc0000000 0x20000000>, <0x00000001 0x00000000 0xff200000 0x00200000>;

要确保你的DE1-SoC FPGA设计中外设的地址空间完全落在这个范围内,一旦有地址重叠,加载Overlay时会触发系统地址冲突直接死机。

3. 简化Overlay配置做最小验证

先把Overlay DTS简化到只保留核心配置,去掉config-complete-timeout-us:

/dts-v1/;
/plugin/;
/ {
 fragment@0 {
 target-path = "/soc/base-fpga-region";
 __overlay__ {
 firmware-name = "de1soc.rbf";
 };
 };
};

重新编译后再尝试加载,看是否还会死机,以此排查是超时配置导致的问题还是核心逻辑的问题。

4. 内核版本兼容性检查

Ubuntu 16.0默认的内核版本较旧,对FPGA Manager和Overlay的支持可能存在bug。建议升级内核到4.14+(Cyclone V HPS官方推荐的稳定内核版本),或者在加载Overlay前用dmesg -w实时监控内核日志,看死机前最后输出的报错信息,定位具体触发点。


二、MSEL=01010(压缩模式)下的Preloader和U-Boot修改

如果确认死机是因为无压缩模式的兼容性问题,需要切换到MSEL=01010的压缩模式,此时必须修改Preloader和U-Boot来适配:

1. Preloader修改(基于Altera SoC EDS工具)

  • 打开bsp-editor加载你的DE1-SoC BSP工程
  • 在HPS Configuration -> FPGA Configuration中,把FPGA Configuration Mode设为HPS to FPGA (Compressed 16x)(对应MSEL=01010)
  • 确保FPGA Configuration Data Source选择SD/MMC Card,如果需要开机自动加载FPGA固件,可指定RBF文件的路径
  • 重新生成Preloader镜像:preloader-mkpimage,替换SD卡启动分区中的preloader-mkpimage.bin

2. U-Boot修改

  • 进入U-Boot源码目录,修改对应DE1-SoC的配置头文件(比如include/configs/socfpga_cyclone5.h):
    • 确保开启FPGA相关宏:CONFIG_FPGA=y、CONFIG_FPGA_ALTERA=y
    • 添加压缩模式支持:CONFIG_FPGA_ALTERA_SOCFPGA_COMPRESSED=y
    • 如果需要在U-Boot阶段加载FPGA固件,修改bootcmd命令,例如:
      setenv bootcmd 'mmc read 0x0 0x2000000 0x1000; fpga load 0 0x2000000 ${filesize}; run mmcboot'
      
      (注意:地址和大小需要根据你的RBF文件在SD卡中的实际位置调整)
  • 重新编译U-Boot,生成u-boot.img替换SD卡启动分区的对应文件

3. 基础DTB适配

在基础DTS的fpga_mgr0节点中添加压缩模式指定:

fpga_mgr0: fpga-mgr@ff706000 {
 compatible = "altr,socfpga-fpga-mgr";
 reg = <0xff706000 0x1000>;
 altr,mode = "compressed"; // 添加此行指定压缩模式
 status = "okay";
};

重新编译基础DTB并替换SD卡启动分区的soc_system.dtb


额外验证步骤

  • 在MSEL=00000模式下,跳过Overlay,直接用FPGA Manager命令手动加载RBF:
    echo de1soc.rbf > /sys/class/fpga_manager/fpga0/firmware
    
    如果这样也死机,说明是RBF或硬件本身的问题,和Overlay无关;如果正常,再回到Overlay的配置排查。
  • 检查SD卡文件系统是否损坏:用fsck命令修复启动分区和根分区,避免文件读取错误导致的异常。

内容的提问来源于stack exchange,提问作者candido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:37:47