uboot利用uEnv.txt文件实现灵活功能(加载PL侧bit,修改uenvcmd,配置bootargs,配置bootm,配置bootz) 您所在的位置:网站首页 修改sd卡内容危险吗 uboot利用uEnv.txt文件实现灵活功能(加载PL侧bit,修改uenvcmd,配置bootargs,配置bootm,配置bootz)

uboot利用uEnv.txt文件实现灵活功能(加载PL侧bit,修改uenvcmd,配置bootargs,配置bootm,配置bootz)

2023-12-25 18:26| 来源: 网络整理| 查看: 265

(1)添加uboot从SD卡加载PL功能

基于uboot-xlnx-2013.4 通过修改zynq_common.h和zynq_zed.h,添加所需要的功能代码。 使ZED添加uboot从SD卡加载PL功能。

直接修改zynq_common.h /* Default environment */ #define CONFIG_IPADDR 192.168.1.10 #define CONFIG_SERVERIP 192.168.1.11 定义板子默认IP和TFTP服务器默认IP

/* Miscellaneous configurable options */ #define CONFIG_SYS_PROMPT "zynq-huskar> " 定义提示符PROMPT,用自己的名字显示。

定义环境变量。 “bitstream_image=system.bit\0” 取一个自己想用的名字,这里取为system.bit即可。

"mmc_loadbit_fat=echo Loading bitstream from SD/MMC/eMMC to RAM… && " "mmcinfo && " "fatload mmc 0 ${loadbit_addr} ${bitstream_image} && " “fpga loadb 0 ${loadbit_addr} ${filesize}\0” 修改mmc_loadbit_fat的命令行,之前是fpga load,现在改为fpga loadb。

"sdboot=if mmcinfo; then " “run mmc_loadbit_fat;” "run uenvboot; " "echo Copying Linux from SD to RAM… && " "fatload mmc 0 0x3000000 ${kernel_image} && " "fatload mmc 0 0x2A00000 ${devicetree_image} && " "fatload mmc 0 0x2000000 ${ramdisk_image} && " "bootm 0x3000000 0x2000000 0x2A00000; " “fi\0” 定义sdboot的命令行,在最开始添加“run mmc_loadbit_fat;” 注意,先检查uenvcmd环境变量, 如果uenvcmd已经包含了“run mmc_loadbit_fat;” 那么就不需要加了。

保存退出。

% export ARCH=arm % export CROSS_COMPILE=arm-xilinx-linux-gnueabi- % env % make zynq_zed_config % make

生成的u-boot拷贝到外面,改名为u-boot.elf

新建一个文件夹,取名makebootbin。 从Xilinx\SDK\2017.4\bin\unwrapped\win64.o下,复制bootgen.exe过来。 生成bif文件,取名createbootbin.bif: the_ROM_image: { [bootloader]./zynq_fsbl.elf ./u-boot.elf }

生成bat文件,取名makebootbin.bat: bootgen -image createbootbin.bif -o i boot.mcs -w on bootgen -image createbootbin.bif -o i BOOT.BIN -w on

将所需要的zynq_fsbl.elf和u-boot.elf放到makebootbin文件夹中。 点击makebootbin.bat脚本,自动生成boot.bin和boot.mcs。

将生成的boot.bin拷贝到SD卡中。 将生成的*.bit文件拷贝到SD卡中,然后修改名字为systemm.bit。

把SD卡插入Zed,上电,看puTTY中的打印信息。

(2)添加uenvcmd

之前分析提到,如果ENV中定义了uenvcmd环境变量,那么将执行其中定义的cmdline。 我们已经配置了UBOOT从uEnv.txt中读取额外定义的环境变量列表。 这是一个极其有利的工具。我们可以在uEnv.txt中定义任何我们需要的环境变量。 例如,添加uenvcmd. “uenvboot=” \ "if run loadbootenv; then " \ "echo Loaded environment from ${bootenv}; " \ "run importbootenv; " \ "fi; " \ "if test -n $uenvcmd; then " \ "echo Running uenvcmd …; " \ "run uenvcmd; " \ “fi\0” \

“loadbootenv=fatload mmc 0 ${loadbootenv_addr} ${bootenv}\0” \ "importbootenv=echo Importing environment from SD …; " \ “env import -t ${loadbootenv_addr} ${filesize}\0” \ 从中可以看到,uenvboot环境变量,定义了一个命令行。 首先从uEnv.txt中获取环境变量,拷贝到内存中,然后从内存中将环境变量导入到ENV数据区。 然后,检查uenvcmd变量,如果不为空,那么执行uenvcmd定义的命令行。

uenvcmd=run mmc_loadbit_fat && \ echo Copying Linux from SD to RAM… && \ run load_image && \ bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}

我们在uEnv.txt中定义的uenvcmd, 首先,会运行mmc_loadbit_fat定义的cmdline。 "mmc_loadbit_fat=echo Loading bitstream from SD/MMC/eMMC to RAM… && " \ "mmcinfo && " \ "fatload mmc 0 ${loadbit_addr} ${bitstream_image} && " \ “fpga loadb 0 ${loadbit_addr} ${filesize}\0” \ 这个命令行中, 我们用到的fatload命令,使用了loadbit_addr和bitstream_image两个环境变量。他们在uboot中被定义赋值,具有默认值。 然而,我们也可以在uEnv.txt中重新为他们赋值,从而获得灵活的配置。 例如我们可以在uEnv.txt中重新定义bitstream_image环境变量,重新指定一个bit文件的文件名。 我们用到的fpga loadb命令,使用了loadbit_addr环境变量和filesize环境变量。 filesize变量是fatload返回的值,不用自己定义。

然后,会ECHO。 然后,会运行load_image环境变量定义的命令行。 load_image=fatload mmc 0 ${kernel_load_address} ${kernel_image} && fatload mmc 0 ${ramdisk_load_address} ${ramdisk_image} && fatload mmc 0 ${devicetree_load_address} ${devicetree_image} 这个命令行中,我们用到的fatload命令,将kernel,ramdisk,devicetree加载到内存中。 使用了kernel_load_address变量,kernel_image变量。 使用了ramdisk_load_address变量,ramdisk_image变量。 使用了devicetree_load_address变量,devicetree_image变量。 然而,我们也可以在uEnv.txt中重新为他们赋值,从而获得灵活的配置。 例如,我们可以在uEnv.txt中定义: kernel_load_address=0x2080000 ramdisk_load_address=0x4000000 devicetree_load_address=0x2000000

这几个变量可以用来加载不同的内核。每个内核编译时,指定的内存布局是不一样的,通过改变这几个变量的值,可以轻松修改加载linux时的内存布局。

然后,会运行bootm,开始加载uImage,启动kernel。至此,uboot工作完成,将控制权移交给kernel。

(3)添加bootargs。

在uEnv.txt中添加bootargs环境变量,可以配置kernel的启动参数。 如果dtb中的chosen定义了bootargs,那么dtb优先级将会最高。 bootargs=console=ttyPS0,115200 root=/dev/ram rw earlyprintk

(4)配置bootz.

默认配置下,zynq_common.h里面已经开启了bootz功能。如下: #define CONFIG_CMD_BOOTZ #undef CONFIG_BOOTM_NETBSD 所以我们只需要使用bootz命令,启动zImage即可。 为了方便,我们定义了两个环境变量。 kernel_bootm=bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}

kernel_bootz=bootz ${kernel_load_address} - ${devicetree_load_address} (注意,我们不用bootz加载RAMDISK镜像, 如果连DTB都不需要加载并搬移到RAM的高地址段,那么可以写成 kernel_bootz=bootz ${kernel_load_address} 这个语句取代了传统的go方式启动,因为go方式可能出现跑飞的情况。)

另外,为了区分加载的是uImage还是zImage,我们定义了如下两个环境变量。 load_uimage=fatload mmc 0 ${kernel_load_address} ${kernel_image} && fatload mmc 0 ${devicetree_load_address} ${devicetree_image} && fatload mmc 0 ${ramdisk_load_address} ${ramdisk_image}

load_zimage=fatload mmc 0 ${kernel_load_address} ${kernel_zimage} && fatload mmc 0 ${devicetree_load_address} ${devicetree_image} && fatload mmc 0 ${ramdisk_load_address} ${ramdisk_zimage}

其中,load_zimage用到了新的环境变量 kernel_zimageh和ramdisk_zimage 这个用来指定zImage的文件名和RAMDISK镜像名。定义如下: kernel_zimage=zImage ramdisk_zimage=zramdisk.image.gz

1)如果是要加载zImage,那么uenvcmd就被改写成如下形式: uenvcmd=run mmc_loadbit_fat && echo Copying Linux from SD to RAM… && run load_zimage && run kernel_bootz

2)如果是要加载uImage,那么写成如下形式: uenvcmd=run mmc_loadbit_fat && echo Copying Linux from SD to RAM… && run load_uimage && run kernel_bootm



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有