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

(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

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值