Quartus工程经过全编译后会产生Handoff文件夹、SOPCINFO文件、SVD文件
二、生成Preloader镜像文件
通过信息交换文件Handoff文件生成Preloader,需要用到SOC EDS
Preloader也被称为spl(Second Program Loader)或u-boot-spl
在SOC EDS安装目录下双击Embedded_Command_Shell.bat文件启动嵌入式命令Shell窗口,输入bsp-editor启动BSP编辑器
选择File->New BSP,选择工程目录下的\hps_isw_handoff\soc_system_hps_0子目录,该目录包含Qsys产生的xml文件(描述了定制SOC的外设和DDR设置) ,点击OK创建BSP设置文件setting.bsp以及子目录\software\spl_bsp,该目录为Preloader工程目录
点击Generate产生Preloader源代码及makefile文件,然后退出BSP编译器,可以查看沈城的.h文件
在Shell窗口进入到software\spl_bsp文件夹,输入make指令进行编译,编译完成后在spl_bsp\uboot-socfpga\spl文件夹下会生成Preloader的ELF文件u-bbot-spl和二进制文件u-bbot-spl.bin
这里出了点问题,会提示find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
解决方法有两个:
win10下解决编译环境find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer_find_fast_cwd couldn't compute_清浅灬的博客-CSDN博客 因为我装了多个版本的Quartus和SOC DES,因此用了第一个,亲测有效
之后又出现了一个问题,在生成preloader报错Failed to open gdrive/....../uboot-socfpga.tar.gz
在windows下make 生成 preloader 时报错 (18.1 版本的SOCEDS) - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
然后又又出现了问题,提示什么make: *** No rule to make target ` ', needed by xxx. Stop
这里首先要到Qsys中的HPS组件中**取消勾选Use default MPU clock frequency,**重新生成Qsys系统
然后**在bsp-editor中boot------FAT_SUPPORT------勾选spl.boot、将Advanced------spl 取消勾选**
解决完报错之后再输入make就直接生成.bin文件了
在spl文件中就可以看到生成的spl文件夹下的u-boot-sol.bin
将spl下的u-boot-spl.bin文件复制到spl_bsp下,在Shell中进入spl_bsp,输入mkpimage -hv 0 -o preloader_with_header.img u-boot-spl.bin指令(必须要-hv 0),即可在spl_bsp下产生preloader_with_header.img镜像文件,镜像文件可在linux环境下通过输入相应命令更新到电脑boot SD卡中
三、生成设备树(Device Tree)
设备树是一种有关硬件系统描述的数据结构,可以描述整个系统上挂载了多少种类的硬件。设备书系统上的硬件信息可以传递给linux操作系统,就不需要在内核Kenel中进行大量的编码。
Qsys产生出FPGA的系统(.sopcinfo)后,通过SOC EDS中的Device Tree产生器生成设备树的源文档(dts),该文档描述了有关HPS的外设以及使用到的FPGA软核IP和用户自定义的外设等信息。
生成设备树源文件.dts需要.sopcinfo、hps_clock_info.xml、xxx_board_info.xml文件
Shell窗口进入Quartus工程目录,输入以下命令产生.dts文件
cpp
sopc2dts --input xxx.sopcinfo --output xxx.dts <--board xxx_board_info.xml -board hps_clock_info.xml -bridge-removal all> //<>为可选项
.dtb文件是.dts文件经Device Tree编译后生成的二进制格式的Device Tree描述,可被Linux内核解析。通常在为目标板制作NAND、SD卡启动镜像时,会为.dtb文件预留一个很小的存放区域(FAT分区),之后bootloader在引导Kernel过程中会先读取该.dtb到内存中(如DDR3存储器)。
在Shell窗口输入以下命令产生.dtb文件
cpp
dtc -I dts -o dtb -o xxx.dtb xxx.dts
此外,由于工程文件夹下有 Makefile,因此可以直接采用 make 命令产生两个文件
cpp
make dts
make dtb