DE1-SoC Cyclone V设备树Overlay加载致系统死机问题求助
你在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的参数:
标准转换可能没针对HPS接口做优化,导致加载时触发硬件异常。quartus_cpf -c --hps de1soc.sof de1soc.rbf - 验证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命令,例如:
(注意:地址和大小需要根据你的RBF文件在SD卡中的实际位置调整)setenv bootcmd 'mmc read 0x0 0x2000000 0x1000; fpga load 0 0x2000000 ${filesize}; run mmcboot'
- 确保开启FPGA相关宏:
- 重新编译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:
如果这样也死机,说明是RBF或硬件本身的问题,和Overlay无关;如果正常,再回到Overlay的配置排查。echo de1soc.rbf > /sys/class/fpga_manager/fpga0/firmware - 检查SD卡文件系统是否损坏:用
fsck命令修复启动分区和根分区,避免文件读取错误导致的异常。
内容的提问来源于stack exchange,提问作者candido

