fsbl是zynq开发中fsnq-7000
ap
soc启动中用户自定义的一些初始化代码,用来选择初始化sd卡读写、以太网接口这样的外设。在sdk
for
vivado的2013版本中,在已经生成了bsp的情况下,可以直接新建fsbl工程并自动选择生成启动映像!
1、创建硬件工程 启动XPS,创建Lab3工程。因为PS系统和FPGA连接是采用AXI接口,因而选择内部互联类型(Interconnect Type) 为AXI。 选择设计平台为Zynq ZC702 到外设配置界面,系统会默认有GPIO_SW 和 LEDs_4bits 这两个外设,我们不需要,remove
在Zynq-7000上编程PL大致有3种方法:
1 用FSBL,将bitstream集成到bootbin中
2 用U-BOOT命令
3 在Linux下用xdevcfg驱动。
步骤:
1 去掉bitstream的文件头
用FSBL烧写PL Images没有什么好说的,用Xilinx SDK的Create Boot Image工具即可完成,不再赘述。用后两种方法需要把bitstream文件的文件头用bootgen工具去掉。
一个典型的bif文件如下所示:
the_ROM_image:
{
[bootloader]<fsbl_name>elf
<pl_bitstream_name>bit
<u-boot_name>elf
}
bif文件可以用文本编辑器写,也可以用Xilinx SDK的Create Boot Image工具生成。然后在命令行下用以下命令即可去掉bitstream文件的文件头。
bootgen -image <bootimage>bif -split bin -o i BOOTBIN
"-split”参数可以生成以下文件:
<pl_bitstream_name>bitbin
2 在U-BOOT下烧写PL Image
命令”fpga load”和”fpga loadb”都可以。区别是前一个命令接受去掉了文件头的bitstream文件,后一个命令接受含有文件头的bitstream文件。
在OSL 20142上,缺省编译就可以完整支持写入PL Image的功能。但是在Petalinux 201310下,尽管可以在U-BOOT下看到命令”fpga”,还需要在文件
<PROJ>/subsystems/linux/configs/u-boot/platform-toph 中增加以下内容后重新编译才可以支持具体的功能。
/ Enable the PL to be downloaded /
#define CONFIG_FPGA
#define CONFIG_FPGA_XILINX
#define CONFIG_FPGA_ZYNQPL
#define CONFIG_CMD_FPGA
#define CONFIG_FPGA_LOADFS
在OSL 20142 U-BOOT中,具体的功能是在zynqplc的zynq_load()中实现的。
3 在Linux下烧写PL Image
OSL Linux 2014201中已经含有xdevcfg驱动了(之前就有,不过本文是在这个版本上验证的),直接用以下命令就可以完成PL Image写入。
cat <path_to_storage_media>/<pl_bitstream_name>bitbin > /dev/xdevcfg
Linux驱动的源代码在xilinx_devcfgc中。因为驱动的编号是通过alloc_chrdev_region()动态分配的,所以不需要手工用mknod命令手动建立设备节点。
在Linux驱动中,每次往DevCfg中写入4096字节,直到全部写完。
4 在用户程序中烧写PL Image
目前没有现成的源码来完成这个功能,不过可以用mmap()把DevCfg的寄存器映射到用户程序的虚地址中,然后参考一些现成的软件代码来完成这个功能:
FSBL中的pcapc
U-BOOT中的zynqplc
Linux中的xilinx_devcfgc
Xilinx SDK中的例子。例子位于以下位置,随SDK的版本会有变化。
C:\Xilinx\SDK\20141\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\indexhtml
小结:
DevCfg外设内部有自己的DMA,只需要简单的配置PL Image的基地址和长度到DevCfg寄存器,就可以完成Zynq-7000 PL Image的加载。Xilinx已经提供了灵活的解决方案,如果开发者要把这个功能集成在自己的应用程序中,也有很多的代码可以参考,并不是很困难的任务。
1、用于创建BOOTbin需要的文件
(1)u-bootelf:在Linux下编译后生成u-boot文件,再强制改名为u-bootelf文件,得到之。
(2)zynq_fsbl_0elf:在EDk下创建得到之。
(3)systembit::在PlanAhead中生成的bit文件;该文件不是必须的,没有该文件时,相当于把Zynq只当ARM来用。
2、创建BOOTbin文件
(1)只含有PS部分的设计
在SDk下,Xilinx Tools -> Craete Boot
Image得到如下图所示:
(2)同时包含有PS和PL设计
在(1)中所述生成的BOOTbin文件不含有给PL部分配置的bit文件,即只是ARM部分的运行代码。要使PL部分也能运行,需要在创建BOOTbin文件时,加入PL部分的设计生成systembit文件
相比而言,由于(1)中生成的BOOTbin文件没有PL部分的设计,也就无需对PL进行配置,所以启动时会快一些,而(2)中的BOOTbin文件启动要慢一些,大概有30s~40s不等(依赖于systembit文件的大小)。
步骤:
1 首先在vivado SDK中分别建立两个工程
注意:如上图所示,Core0 工程建立时选择ps7_cortexa9_0, Core1 工程建立时选择ps7_cortexa9_1
完成后如下图所示:
2配置Core1即从核中的BSP文件
在下图中画圈处,配置:-DUSE_AMP=1
3 配置Core0和Core1的DDR空间分配
通过修改lscriptld文件中的内容,可以改变在存储器中的执行位置,
因为ELF文件是加载到DDR中执行的,所以两个DDR地址不能重合
Core0的配置 :画圈处 栈空间也要分配,防止溢出
Core1配置
4 建立FSBL文件,并配置mian()文件
配置main() 跟第三步中的DDR空间配置有关
在FSBL的src中找到mainc文件打开,在里面添加下面一段代码,用于启动CPU1:
#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0 //Core1 DDR配置中的SIZE大小
#define CPU1STARTMEM 0x10000000 //Core1 DDR配置中的起始地址
void StartCpu1(void)
{
#if 1
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
sev();
#endif
}
将上面的代码在main()中添加到:
Load boot image的位置,将CPU1的启动函数,放置于此位置,改动后的代码段如下:
5 生成mcs文件和烧写mcs文件到QSPI Flash
单击‘Core1’,选择Xilinx Tools –> Create zynq boot image,选择Add,选择文件…/ Core1/Debug/ Core1elf,点击打开。然后选择Core1elf, Core0elf在Core1elf上面。然后在Output pach后面把bootbin修改为Bootmcs。然后点击 Create Image
选择Core0
选择文件生成存储地址
选择MCS
画圈处是添加的文件
顺序为:FSBLelf bit文件 Core0elf Core1elf
点击Create Image 生成mcs文件
6 完成 *** 作 将 MCS 文件烧写进板子里
bin文件用来烧写到SD卡,mcs文件用来烧写到QSPI flash中 ,
选择Xilinx Tools –> Program Flash,在Image File后面选择刚才生成的Bootmcs文件,Offset为0x0,Flash Type为qsip_single。勾选Blank check after erase和Verify after flash。检查开发板上电和连线状况,然后点击Program
以上就是关于如何深入理解和应用zynq的fsbl文件全部的内容,包括:如何深入理解和应用zynq的fsbl文件、mtk路由器sdk怎样控制gpio、有人用过zynq7000 的axi dma实现PS与PL的高速通信吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)