cyclone v fpga可以由preloader从QSPI读取,并通过FPGAMANAGER进行配置。FPGA文件需要使用rbf fppX16格式,可以使用压缩格式。这种配置方式可以使preloader提前将FPGA配置好,在启动vxworks系统前,使自己开发FPGA部分提前进入配置,方便软件调试自己开发的FPGA模块。我的QSPI大小为32M,主要用于存放preloader,param,vxboot,vxworks。布局如下所示:
我们打开bsp-editor应该有如下配置:
我指定vxboot,或者说使用的uboot在QSPI偏移的0x100000位置处。
打开uboot-socfpga/include/configs/socfpga_common.h文件,找到CONFIG_SPL_FPGA_LOAD,去掉注释,打开该选项,preloader将会执行从QSPI中读取rbf文件进行FPGA配置。FPGA配置的RBF文件位置,由CONFIG_SPL_FPGA_QSPI_ADDR定义。如最上面那张的图的布局,我们的FPGA RBF文件在QSPI偏移的2M处,所以
#define CONFIG_SPL_FPGA_QSPI_ADDR (0x200000)到这PRELOADER配置结束,可以编译PRELAODER生成镜像,烧写到QSPI的0偏移处。
下面我对quartus的生成的fpga sof文件进行转换:
打开转换器:
按上面的设置进行转换。
生成的rbf文件是原生块文件,烧写在QSPI中,preloader是无法知道编译文件大小的。uboot preloader采用mkimgage工具将rbf文件加一个可以指示文件大小的img头部。这样才能让preloader知道配置文件长度。
mkimage.exe" -A arm -T firmware -C none -O vxworks -a 0x08000040 -e 0 -n "FPGA" -d fpga.rbf fpga.bin
上面命令只关心红色字体部分就可以了。其它部分prelaoder在这个过程中并不关心。
https://blog.csdn.net/a412841321/article/details/91989683 处理器:CycloneV_HPS(Cortex-A9)
BootRom:25Q128A(micron 128M QSPI Flash) 软件:altera_SOC_EDS_13.1 1、生成preloader-mkpimage.bin: 在bsp-editor中将BootRom选为QSPI Flash,关闭看门狗。 通过quartus_hps将preloader-mkpimage.bin烧写到Flash的0地址,将应用程序烧写到0x60000,启动后串口打印出如下错误信息: 观察后发现,CRC Result calculated值每次开机自检都有不同。 2、CRC错误分析: 错误发生在preloader将应用程序从flash搬运到DDR3后的校验,具体代码详见 uboot-socfpga\common\spl\spl.c 可能的原因:应用程序带有64bytes的信息头域,如果校验的地址范围有误,校验到了未定义的地址空间会发生上述错误。 测试:自己随便制作了一个大小为1byte的bin文件,加上64bytes头后下载到0x60000,启动未出现校验错误。 尝试将字节数扩大,发现当字节数为1040时,校验时对时错,由此现象推断出是硬件错误,很有可能发生在读QSPI的时序上。 在board_init代码中查找到设置QSPI时钟的段落,pll_config.h中将QSPI时钟对于系统时钟分频系数从3改为7。 CRC校验问题解决。 3、裸机程序二进制文件: 将EDS中example代码生成的bin文件烧写QSPI的0x60000地址,程序不能正常启动。 根据骏龙FAE Blues邮件指导,example代码没有start.s所以只能在调试状态下执行,无法实现preloader启动。 根据骏龙FAE harvey提供的裸机程序,实现了start.s、Makefile、u-boot-spl.lds文件,并实现了上电程序从QSPI启动串口。 遗留问题:若c代码中对于HPS2FPGA bridge进操作,脱机上电会出现错误,按下cold rst程序才会正常执行。