当前位置: 首页 > Linux

ZYNQ的LinuxLinaro系统镜像让SD卡启动

时间:2023-04-07 01:10:52 Linux

ZYNQ的LinuxLinaro系统镜像让SD卡启动0。ZYNQ属于二级辅助引导uboot然后uboot来启动内核,大致意思是ZYNQ内部有一个机制,不能修改。可以通过拨码开关控制启动方式,比如从SD卡启动或者QSPI启动,SD卡必须包含uboot镜像信息。最大的区别是uboot编译后不能直接使用。需要用Vivado设计PL,然后用SDK综合uboot,设计PL文件。最后将合成后的文件复制到SD卡中,并由SD卡启动。本人不懂FPGA,本文只是简单介绍了如何在Linux端制作SD卡,以及如何制作一个全新的Linux系统。镜像文件BOOT.BIN一般包括三个文件:FSBL、Bitstream和SSBL,其中Bitstream是配置PL终端程序,在制作Linaro系统时是可选的,不需要。FSBL为第一阶段bootloader,文件制作需要Vivado环境;SSBL即SecondStageBootLoader,这里使用Xilinx提供的u-boot。参考资料11.环境与资料1.1开发环境软件环境:Vivado2017.02Linux版系统环境:Ubuntu16.04amd64交叉编译器:gcc-linaro-7.3-2018.05.tar.xz我的交叉编译环境放在/opt/toolschain/下linaro/bin/arm-linux-gnueabihf-,我喜欢在编译的时候指定绝对编译路径1.2准备材料ARM端的Linux内核源码:https://github.com/Xilinx/lin...uboot上的源码ARM端代码:https://github.com/Xilinx/u-b...ARM端的Linaro文件系统:https://releases.linaro.org/a...(我用的是ubuntu12.07)2.Makeuboot2.1编译uboot获取xilinx的uboot源码:gitclonehttps://github.com/Xilinx/u-boot-xlnx.git清除编译:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armcleanconfiguration板级信息:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armzynq_zc702_defconfig板级信息在如图位置,我的是zc701的板子,但是没有,我就选离这个最近的那个。menuconfig写入配置信息:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armmenuconfig编译uboot:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=arm-j8编译成功后会产生uboot,所以需要将uboot重命名为:mvubootuboot.elf得到uboot.elf后留着备用,然后合成最终的boot程序需要这个uboot.elf文件。2.2制作FSBL和bit文件的大致过程是:使用Vivado软件新建工程,然后添加ip设计,配置时钟,配置Linux需要的一些基本外设(SD卡,串口,以太网等)。),并使用wrapHDL函数生成顶层设计.v文件,然后编译.v文件生成.bit文件,再生成硬件描述文件,启动SDK软件,自动生成工程,编译后得到fsbl文件。具体过程很多博主都写的很清楚了。我这里贴了一个比较好的,可以这样实现:以后的多核通信机制,PS和PL的通信,PL文件是这样设计的之后,我们再重新组合uboot文件。https://blog.csdn.net/long_fl...我们通过这种方式得到vivado编译的bit文件,在SDK中建一个工程生成硬件平台。接下来,我们得到fsbl文件。fsbl文件需要在SDK中创建一个FSBL工程,它是基于我们刚刚生成的硬件平台的。建立后直接编译,即可得到fsbl文件。到现在位置,得到:vivado编译:sdk生成的bit文件:uboot刚刚编译的fsbl文件:uboot.elf文件可以开始合成BOOT.bin文件2.3合成BOOT.bin的操作还在sdk软件行为。使用createbootimage功能:BOOT.bin的合成到这里就完成了。2.4文件权限(仅限Linux开发用户)还有一点很重要。试了很多次,zynq平台就是不启动,uboot也没有输出任何信息。这个小问题困扰了我很久,今天早上洗漱的时候突然想到XilinxVivado和SDK都是在root下启动的,生成BOOT.bin的时候可能存在权限问题。所以....我得到了电路板,在SD卡中,给出sudochmod777BOOT.bin然后弹出SD卡,将SD放在ZYNQ上,它成功启动。如果你在Linux系统下,不要忘记给BOOT.bin权限。3Linux内核制作3.1Linux内核编译uImage文件获取Linux内核:gitclonehttps://github.com/Xilinx/linux-xlnx.git切换到Linux内核源码目录,开始清理内核:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armclean配置板级信息:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armxilinx_zynq_defconfig使用menuconfig写入到.config文件:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armmenuconfig,进退出即可。编译内核:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=arm-j8制作uImage文件:makeCROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-ARCH=armuImageLOADADDR=0x00008000编译完成后将uImage文件保存在linux-xlnx/arch/arm/boot中备用。3.2创建设备树文件在linux-xlnx/arch/arm/boot/dts目录下新建zynq-7010.dts文件,文件内容:/dts-v1/;/include/"zynq-7000.dtsi"/{模型="HLF";compatible="ALINX,zynq","xlnx,zynq-7000";别名{ethernet0=&gem0;serial0=&uart1;spi0=&qspi;mmc0=&sdhci0;};内存@0{设备类型=“内存”;reg=<0x00x20000000>;};选择{bootargs=“”;stdout-path="serial0:115200n8";};usb_phy0:phy0{compatible="usb-nop-xceiv";#phy-cells=<0>;重置-gpios=<&gpio0461>;};};&clkc{ps-clk-frequency=<50000000>;};&gem0{status="okay";phy-mode="rgmii-id";phy-handle=<ðernet_phy>;ethernet_phy:ethernet-phy@0{reg=<0>;};};&qspi{u-boot,dm-pre-reloc;状态=“好的”;};切换到内核主目录:./scripts/dtc/dtc-Idts-Odtb-o./arch/arm/boot/devicetree.dtb./arch/arm/boot/dts/zynq-7010.dts然后在linux-xlnx/arch/arm/boot/目录下可以找到devicetree.dtb文件,同时也保留一个备用的3.3启动配置文件到制作uEnv。txt,找个位置新建uEnv.txt文件,在文件中写入启动配置信息:uenvcmd=runlinaro_sdbootlinaro_sdboot=echoCopyingLinuxfromSDtoRAM...&&\fatloadmmc00x3000000${kernel_image}&&\fatloadmmc00x2A00000${devicetree_image}&&\iffatloadmmc00x2000000${ramdisk_image};\然后启动0x30000000x20000000x2A00000;\elsebootm0x3000000-0x2A00000;fibootargs=console=ttyPS0,115200root=/dev/mmcblk0p2rwearlyprintkrootfstype=ext4Rootwait被保存并保留以备将来使用。4SD卡制作准备一张8G以上的空白SD卡,用读卡器读卡,我们使用Linux系统进行格式化,Windows用户可以使用diskgen等软件进行分区格式化。查看SD卡格式化后的分区:sudofdisk-l如果查看到的SD卡是/dev/sde分区,(不要格式化错了,我小时候曾经格式化过整个硬盘,很危险操作,看清楚/dev/sd*后面是c还是d还是e还是f)。进入分区管理:sudofdisk/dev/sde以下步骤按照这个OMAPL138制作SD卡启动盘,重新安装Linux系统。这是我的博客。注意不同的是我们创建的boot分区大小是100M,boot分区的类型也是linux。然后格式化boot分区:sudomkfs.vfat-F32-n"boot"/dev/sde1格式化rootfs分区:sudomkfs.ext4-L"rootfs"/dev/sde2至此我们就完成了SD卡的创建。5烧录SD卡的boot分区:使用命令将BOOT.bin/devicetree.dtb/uImage/uEnv.txt四个文件复制到boot分区。解压Linaro文件系统:第一章写的ARM端Linaro文件系统:linaro-precise-ubuntu-desktop-20120723-305.tar.gz解压到SD卡根分区sudotar--strip-components=3-C/media/delvis/rootfs-xzpflinaro-precise-ubuntu-desktop-20120723-305.tar.gzbinary/boot/filesystem.dir最好找一个有知识灯的读卡器。解压命令执行后,并不代表SD卡写入完成后,如果有指示灯,待指示灯不闪烁后弹出SD卡。至此,一个完整的Linaro系统已经写入到SD卡中。将FPGA板的开机拨码拨到SD卡开机位置,可以看到Linaro系统已经启动。参考文献:[1]long_fly,ZYNQ运行系统系列(一)传统方式移植linux,2017年11月28日[2]Yake,在Zedboard上运行Linaro系统(二):生成BOOT.BIN,2016年7月26日[3]带你高飞,03-ZYNQ学习(创业)方案固化,2018-05-22