zynq怎么把文件系统烧写到sd中

zynq怎么把文件系统烧写到sd中,第1张

长话短说开始搞SD卡烧写UBOOT,从SD启动UBOOT。从s5pv210_irom_applicationnote_preliminary_20091126.pdf知道,s5pv210启动分BL0、BL1、BL2阶段。BL0是s5pv210内部IROM固化的代码,这段代码根据OM引脚配置状态来选择从哪个外部存储设备加载BL1段代码(实际上BL1代码就是我们编写的UBOOT的前8K代码,这段代码要包含完整的将后半部UBOOT代码复制和清bss段的功能,当然我们要从SD卡启动烧写在上面的UBOOT,OM引脚就必须配置为从SD卡启动配置)。图1从上图可知,逗慎毕从sd启动的时候BL0加载的代码是从第512个字节处开始加载代码,为什么要这样做呢?由于以后功能扩展的需要三星的软件工程师写的固化到IROM中的BL0代码是从SD卡的512字节处加载BL1的,他就是这样写的,我们对应UBOOT放置在SD卡中的位置就要往后移动512字节,后面有介绍怎么指定把uboot写到sd卡指定的位置的命令。还有一定要注意如下所示的地方:图2在BL1之前要加16个字节的头部信息。也就是在真正的UBOOT第一条指令之前孝段要加16个字节的头部信息,于是就山芹有我们所看到的uboot代码如下的用宏定义的一段:[cpp]viewplaincopy#ifdefined(CONFIG_EVT1)&&!defined(CONFIG_FUSED).word0x2000.word0x0.word0x0.word0x0#endif.globl_start_start:bresetldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abort其中的.word0x2000代表BL1size(8K长度),.word0x0为保留字节.word0x0为checksum(后续会通过一个mkbl1工具来计算bl1的checksum并填写这个位置),最后一个.word0x0也为保留字节。再来看看uboot的下面的部分,如果bl0正常读取了bl1,代码就会到如下段:[cpp]viewplaincopy/*Readbootinginformation*/ldrr0,=PRO_ID_BASEldrr1,[r0,#OMR_OFFSET]//读OM引脚的配置状态bicr2,r1,#0xffffffc1#ifdefCONFIG_VOGUES/*PS_HOLD(GPH0_0)settooutputhigh*/ldrr0,=ELFIN_GPIO_BASEldrr1,=0x00000001strr1,[r0,#GPH0CON_OFFSET]ldrr1,=0x5500strr1,[r0,#GPH0PUD_OFFSET]ldrr1,=0x01strr1,[r0,#GPH0DAT_OFFSET]#endif/*NANDBOOT*/cmpr2,#0x0@512B4-cyclemoveqr3,#BOOT_NAND//根据OM引脚配置状态来给R3寄存器赋予代表系统是从何冲外部存储器启动的配置值。cmpr2,#0x2@2KB5-cyclemoveqr3,#BOOT_NANDcmpr2,#0x4@4KB5-cycle8-bitECCmoveqr3,#BOOT_NANDcmpr2,#0x6@4KB5-cycle16-bitECCmoveqr3,#BOOT_NANDcmpr2,#0x8@OneNANDMuxmoveqr3,#BOOT_ONENAND/*SD/MMCBOOT*/cmpr2,#0xcldrsp,_TEXT_PHY_BASE/*setuptempstackpointer*/subsp,sp,#12movfp,#0/*nopreviousframe,sofp=0*//*whenwealreadyruninram,wedon'tneedtorelocateU-Boot.*andactually,memorycontrollermustbeconfiguredbeforeU-Boot*isrunninginram.*/ldrr0,=0xff000fffbicr1,pc,r0/*r0moveqr3,#BOOT_MMCSD/*NORBOOT*/cmpr2,#0x14moveqr3,#BOOT_NOR#if0/*AndroidC110BSPusesOneNANDbooting!*//*Forseconddevicebooting*//*OneNANDBOOTONGfailed*/cmpr2,#0x8moveqr3,#BOOT_SEC_DEV#endif/*UartBOOTONGfailed*/cmpr2,#(0x1//ldrsp,=0xd0036000/*endofsramdedicatedtou-boot*/ldrsp,=0xd0035400//BL1段的函数进行 *** 作的堆栈位置,这里我修改了堆栈到了0xd0035400是由于图2中所示BL0代码进行了它自己代码堆栈的初始化,而RW/ZIregionHeap的最低部就位于0xd0035400,为了不修改BL0堆栈和BL0代码已经写好的一些函数功能(会在下面用到),我将堆栈修改到了0xd0035400subsp,sp,#12/*setstack*/movfp,#0bllowlevel_init/*gosetuppll,mux,memory*///这里会进行始终,内存,串口初始化之后运行到ldrsp,_TEXT_PHY_BASE/*setuptempstackpointer*///由于上面一步已经初始化了DRAM,所以在这里将以后的堆栈设置到了DRAM中的位置(以后BL2代码中函数都是基于此堆栈)subsp,sp,#12movfp,#0/*nopreviousframe,sofp=0*//*whenwealreadyruninram,wedon'tneedtorelocateU-Boot.*andactually,memorycontrollermustbeconfiguredbeforeU-Boot*isrunninginram.*/ldrr0,=0xff000fffbicr1,pc,r0/*r0ldrr0,=INF_REG_BASEldrr1,[r0,#INF_REG3_OFFSET]cmpr1,#BOOT_NAND/*0x0=>bootdeviceisnand*/beqnand_bootcmpr1,#BOOT_ONENAND/*0x1=>bootdeviceisonenand*/beqonenand_bootcmpr1,#BOOT_MMCSDbeqmmcsd_bootcmpr1,#BOOT_NORbeqnor_bootcmpr1,#BOOT_SEC_DEVbeqmmcsd_boot//代码判断要拷贝后,读取之前存入到用户使用寄存器中的值来判断此次启动从何种外部存储设备启动,这里为sd卡启动~~~~~省略若干代码~~~~~~~~mmcsd_boot:#ifDELETEldrsp,_TEXT_PHY_BASEsubsp,sp,#12movfp,#0#endifblmovi_bl2_copy//最后BL1代码来到此处从sd卡拷贝剩余的代码bafter_copy

步骤:

1. 首先在vivado SDK中分别建立两个工程

注意:如上图所示,Core0 工程建立时选择ps7_cortexa9_0, Core1 工程建立时选择ps7_cortexa9_1

完成后如下图所示:

2.配置Core1即从核中的BSP文件

在下图中画圈处,配置:-DUSE_AMP=1

3 配置Core0和Core1的DDR空间分配

通过修改lscript.ld文件中的内容,可以改变在存储器中的执行位置,

因为ELF文件是加载到DDR中执行的,所以两个DDR地址不能碰野重合

Core0的配置 :画圈处 栈空间也要分配,防止溢出

Core1配置

4 建立FSBL文件,并配置亩族mian()文件

配置main() 跟第三步中的DDR空间配置有关

在FSBL的src中找到main.c文件打开,在里面添加下面一段代码,用于启动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/ Core1.elf,点击打开。然后选择Core1.elf, Core0.elf在Core1.elf上面。然后在Output pach后面把boot.bin修改为Boot.mcs。然后点击 Create Image

选择Core0

选择文件生成存储地址

选择MCS

画圈处是添加的文件

顺序为:FSBL.elf.bit文件 Core0.elf Core1.elf

点击Create Image 生成.mcs文件

6 完成 *** 作 将 .MCS 文件烧写进板子里

bin文件用来烧写到SD卡,mcs文件用来烧写到QSPI flash中 ,

选择Xilinx Tools –>Program Flash,在Image File后面选择刚才生成的Boot.mcs文件,Offset为0x0,Flash Type为qsip_single。勾选Blank check after erase和Verify after flash。检查开发板上电和连线状况,然后点击Program


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12377822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存