ZYNQ的Linux Linaro系统镜像制作SD卡启动(仅使用mkfs部分,其他
0. 概述ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ZYNQ内部有一个机制,该机制不可修改,可以通过拨码开关控制启动方式,比如从SD卡启动还是从QSPI启动,SD卡中要包含uboot的镜像信息。最大的不同就是,uboot编译完还不可以直接使用,还需要使用Vivado设计PL,再用SDK将uboot和设计PL的文件进行合成,最终合成后的文件拷贝到SD卡,由其启动。 我不会FPGA,本文也只概述在Linux端,SD卡如何做,如何制作一个全新的Linux系统。
1. 环境和材料1.1 开发环境
1.2 准备材料
2. 制作uboot2.1 编译uboot
拿到uboot.elf后,留存备用,再合成最终的boot程序需要这个uboot.elf文件。 2.2 FSBL、bit文件的制作大体流程就是:用Vivado这个软件新建工程,然后添加ip设计,配置时钟、配置一些Linux需要的基本外设(SD卡卡、串口、以太网等),使用wrap HDL功能生成顶层设计.v文件,然后编译.v文件生成.bit文件,再生成硬件描述文件,launch SDK软件,会自动生成一个工程,编译后拿到fsbl文件。 具体过程很多博友都已经写的很清楚了,我这里贴出一个讲的比较好的,可以按照这个方法做:在未来的多核通信机制里面,PS和PL的通信,则PL文件就是这样设计好之后然后我们重新合成uboot文件。 https://blog.csdn.net/long_fly/article/details/78643258 我们通过这样的方式拿到vivado编译生成的bit文件,并且在SDK里面建立了工程,生成了一个硬件平台,接下来我们获取fsbl这个文件。fsbl文件需要在SDK里面建立一个FSBL工程,并且基于刚才我们生成的硬件平台。 建立完之后直接编译,就可以拿到fsbl文件。 到目前位置,拿到了:
可以开始合成BOOT.bin文件了 2.3 合成BOOT.bin这个操作还是在sdk软件里面进行。 使用create boot image功能: 到此完成BOOT.bin的合成。 2.4 文件权限(仅限Linux开发用户)还有一个非常重要的事情,我试了很多次,zynq平台就是不启动,uboot也不输出任何的信息。这个小小的问题卡了我很久,不过在今天早上洗漱的时候,突然想到,Xilinx Vivado和SDK都是在root情况下启动,生成BOOT.bin也是可能有权限问题。所以.... 我拿到板子,然后在SD卡里面,给定 3 Linux内核制作3.1 Linux内核编译出uImage文件
3.2 制作设备树文件在linux-xlnx/arch/arm/boot/dts目录内新建zynq-7010.dts文件,文件内容: /dts-v1/; /include/ "zynq-7000.dtsi" / { model = "HLF"; compatible = "ALINX,zynq","xlnx,zynq-7000"; aliases { ethernet0 = &gem0; serial0 = &uart1; spi0 = &qspi; mmc0 = &sdhci0; }; [email?protected] { device_type = "memory"; reg = <0x0 0x20000000>; }; chosen { bootargs = ""; stdout-path = "serial0:115200n8"; }; usb_phy0: phy0 { compatible = "usb-nop-xceiv"; #phy-cells = <0>; reset-gpios = <&gpio0 46 1>; }; }; &clkc { ps-clk-frequency = <50000000>; }; &gem0 { status = "okay"; phy-mode = "rgmii-id"; phy-handle = <ðernet_phy>; ethernet_phy: [email?protected] { reg = <0>; }; }; &qspi { u-boot,dm-pre-reloc; status = "okay"; }; 切换到内核的主目录里面: 然后在linux-xlnx/arch/arm/boot/目录下即可发现devicetree.dtb文件,同样留着备用。 3.3 启动配置文件制作uEnv.txt随便找个位置新建一个uEnv.txt 文件,文件内写入boot的配置信息: uenvcmd=run linaro_sdboot linaro_sdboot=echo Copying Linux from SD to RAM... && fatload mmc 0 0x3000000 ${kernel_image} && fatload mmc 0 0x2A00000 ${devicetree_image} && if fatload mmc 0 0x2000000 ${ramdisk_image}; then bootm 0x3000000 0x2000000 0x2A00000; else bootm 0x3000000 - 0x2A00000; fi bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait 保存,留着备用。 4 SD卡制作准备一张空白的超过8G的SD卡,读卡器读取该卡,我们使用Linux系统进行格式化,Windows用户可以通过diskgen等格式化分区的软件制作也好。
5 烧写SD启动卡
到此,一个完整的Linaro系统就写入了SD卡,将FPGA板子的boot拨码开关拨到SD卡启动位置,就可以看到Linaro系统启动了。 参考文献:[1] long_fly,ZYNQ跑系统 系列(一) 传统方式移植linux,2017年11月28日 [2] 雅可,Zedboard上运行Linaro系统(二):生成BOOT.BIN,2016年07月26日 [3] 带你高飞,03-ZYNQ学习(启动篇)之程序的固化,2018年05月22日 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |