用于引导U-Boot
用于引导Linux Kernel
petalinux工具可以构建2和3还有内核
BOOT.BIN包括fsbl,bitstream,用户程序(uboot)
image.ub包括了kernel(devicetree DTB和rootfs通过设置可选包不包含在ub内)
主要是分析下FSBL工程的main函数
调用ps7_init函数
主要是对PS端配置信息进行初始化 *** 作,包括MIO,PLL,CLK and DDR
我们在vivado软件中可以通过图形化的方式对ZYNQ PS端外设进行相关配置,那么这些配置信息会写入到hdf文件,SDK(或petalinux)会对hdf文件进行解析并生成对应的寄存器配置表,然后FSBL工程中会通过ps7_init函数将拿李寄存器配置表写入到对应的寄存器中,完成对MIO/PLL/CLK/DDR等外设的硬件配置。
先调用Xil_DCacheFlush函数完成刷DCache缓存的 *** 作,然后再调用Xil_DCacheDisable禁用DCache缓存。
调用RegisterHandlers函数
调用DDRInitCheck函数
调用InitPcap函数
处理器配置访问端口
这个寄存器记录ZYNQ的银贺启动方式(QSPI、SD、NAND、Nor、JTAG)
可以通过MIO3 MIO4 MIO5这三个引脚去配置ZYNQ的启动方式
ZYNQ上电复位的时候,会将这三个引脚的电平状态保存在BOOT_MODE寄存器当中。
每一种启动方式会有不同的处理方式。
第一、先初始化对应的flash设备
第二、再将MoveImage函数指针指向Flash设备的读写函数实体
调用LoadBootImage函数
FSBL的主要工作是启动U-Boot(终极目标),也要将bitstream文件加载到PL端。
找到U-Boot、bitstream
在读取U-Boot拷贝DDR中对应的加载地址,读取bitstream加载到PL端
调用FsblHandoff(HandoffAddress)
启动完U-Boot之后,FSBL的使命的就完成了。
在Zynq-7000上编程PL大致有3种方法: 1. 用FSBL,将bitstream集成到boot.bin中 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 BOOT.BIN"-split”参数可以生成以下文件: <pl_bitstream_name>.bit.bin 2. 在U-BOOT下烧写PL Image 命令”fpga load”和”fpga loadb”都可以。区别是前一个命令接受去掉了文件头的bitstream文件,后一个命令接受含有文件头的bitstream文件。在OSL 2014.2上,缺省编译就可以完整支持写入PL Image的功能。但是在Petalinux 2013.10下,尽管可以在U-BOOT下看到命令”fpga”,还需要在文件 <PROJ>/subsystems/linux/configs/u-boot/platform-top.h 中增加以下内容后重新编译才可以支持具体的功能。/* 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 2014.2 U-BOOT中,具体的功能是在zynqpl.c的zynq_load()中实现的。3. 在Linux下烧写PL Image OSL Linux 2014.2.01中已经含有xdevcfg驱动了(之前就有,不过本文是在这个版本上验证的),直接用以下命令就可以完成PL Image写入。 cat <path_to_storage_media>/<pl_bitstream_name>.bit.bin >/dev/xdevcfg Linux驱动的源代码在xilinx_devcfg.c中。因为驱动的编号是通过alloc_chrdev_region()动态分配的,所以不需要手工用mknod命令手动建立设备节点。在Linux驱动中,每次往DevCfg中写入4096字节,直到全部写完。4. 在用户程序中烧写PL Image目前没有现成的源码来完成这个功能,不过可以用mmap()把DevCfg的寄存器映射到用户程序的虚地址中,然后参考一些现成的软件代码来完成这个迅慎搜功能: * FSBL中的pcap.c * U-BOOT中的zynqpl.c * Linux中的xilinx_devcfg.c * Xilinx SDK中的例子。例子位于以下位置,随SDK的版本会有变化。 C:\Xilinx\SDK\2014.1\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html小结: DevCfg外设内部有自己的DMA,只需要简单的配置PL Image的基地址和长度到DevCfg寄存器,就可以完成Zynq-7000 PL Image的加载。Xilinx已经提供了灵活的解决方案,如果开发者要把这个功能集成在自己的应用程序中,也有很多的代码可以参考,并不是很困难的任务。说到学习ZYNQ+SOC+Linux开发,我认为主要应该细分为lian两大点:zynq,soc合为一个点,linux为一个点。下面我就给大家介绍学习的流程和路线。
一,学习zynq+soc的FPGA开发部分和片上ARM核的寄存器,裸奔应用开发,我推荐大家收阅读文档《ZYNQ+SOC修炼秘籍-最全面的pdf》,下面我给大家贴上下载地址。
CSDN下载链接:https://pan.baidu.com/s/1wjUXx5_l6EPE58UZwcnRZw
二,如果各位能按部就班的阅读并自己动手编写测试《ZYNQ+SOC修炼秘籍-最全面的pdf》里面的内容,我相信大家对于zynq的硬件部分已经足够了解,并且能够写出基于FPGA+ARM构架的裸奔程序应用了。
那么接下来,我们就应该学习管如何在zynq平台上搭建Linux *** 作系统了。
(1)u-boot的编译
我相信大家已经肯定在网上搜索理解了很多关于u-boot编译的资料,所以在此睁稿我给大家提供的shi是如何解决编译过程中遇到的一些问题,将自己在银兆项目实践中的记录分享给大家,具体请参考《zynq-u-boot编译说明书》这个资料,下面为下载链接地址。
CSDN下载链接:https://pan.baidu.com/s/1Gqs3V3U6N6kW2AeJkMn-dA
(2)kernel的编译
众所周知,kernel为Linux的内核,这个是最最核心的部分,在此不做过多的赘述,给大家分享项目中的记录吧。具体参考《zynq-kernel编译说明书》这个资料。
CSDN下载链接:https://pan.baidu.com/s/1p1o_3dLZMxWubc-rXGLelw
(3)设备树的编译
不知道大家是否知道,Linux上的驱动是怎么和硬件挂钩的吗?没错,就是使用的设备树,话不多说,请参照《zynq设备树配置说明》这个资料,下面为下载链接地址。
CSDN下载链接:https://pan.baidu.com/s/102qqfR0OAhJvGW8h2PO1eg
(4)文件系统的搭载
在完成上述三步的 *** 作之后,需要一个完整的Linux系统我们就还需要搭载上文件系统,国外很多人喜欢利用buildroot自己及定制文件系统,但是对于初学者我的建议是先使用已经完善的文件系统,具体的做法请参照《zynq文件系统挂载》这个资料,下面为下载链接地址。
CSDN下载链接:https://pan.baidu.com/s/1O10BNKid73fguDs4ZZDrXg
三,在完成了u-boot的编译,kernel的编译,设备树的编译,文件系统的编译挂载后,一个完整的Linux系统就搭建成功了。不过我相信在过程中肯定会遇到或多或少的各种各样的问题,在此本人为大家分享一些在过程中遇到的问题以及解决方法,水平有限望大神勿喷。
(1)在运行挂载文件系统的时候本人就曾经遇到,系统默认挂载的是ramdisk,所以无法挂载我搭建在SD卡上的ext4的文件系统,请参考《zynq不加载悉搏孝ramdisk的方法》资料里的解决方法,下面为资料xixi下载链接。
CSDN下载链接:https://pan.baidu.com/s/1ESMO4FtbykTzN-7nqZqvTg
(2)如何解决板子每次上电都动态分配ip,导致用户无法准确知道板子的ip呢?那就请参考《zynq_linux配置静态和动态ip的方法》这个资料里的内容,下面为下载链接。
CSDN下载链接:https://pan.baidu.com/s/1s4RduCWI2cVCrZqfxvJ9oA
(3)配置好静态ip后,那么肯定是kai'开始用用SSH连接板子,现在就让我们来解决SSH连接的问题,请参考《zynq上的SSH无法链接问题》这个资料里的内容,下面为下载链接。
CSDN下载链接:https://pan.baidu.com/s/1bzMbyBzbIG74ot9EymaAHw
(4)以上问题都解决了后,自然是想自己动手编写Linux下的驱动咯。只有有了驱动才能使得FPGA为Linux所用,那么接下来给大家分享几个编写Linux下的axi dma驱动的资料供大家参考。
《zynq字符设备驱动代码》
CSDN下载链接:https://pan.baidu.com/s/11kTG3LMHKdVyAOY_WzRBhA
《zynq_linux字符驱动之自动创建设备节点》
CSDN下载链接:https://pan.baidu.com/s/1TVDDxkk1KdDxcunXbfTdmg
《zynq上axi-dma作为字符设备的驱动代码》
CSDN下载链接:https://pan.baidu.com/s/1ZViLZ1EHWGcshYiaIcHTgw
《zynq_dma_device_tree说明文件》
CSDN下载链接:https://pan.baidu.com/s/14ulkwrGJjqk6IrU010qEsw
四,以上介绍大部分均为本人在学习,做项目时的总结,在此分享给大家,希望对广大的学习群体有所帮助,本人水平有限,在此希望各路大神们勿喷。接下来就靠大家自己努力加油了!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)