(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

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

  1. 利用jQuery的deferred异步按顺序加载JS文件

    前段时间看了阮一峰的jQuery的deferred对象详解一文,对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码), ...

  2. c语言文件 加载内存吗,把文件中的数据加载到内存进行查找C语言实现.docx

    把文件中的数据加载到内存进行查找C语言实现 #define _CRT_SECURE_NO_WARNINGS#include#include#includechar **pp=NULL;void ini ...

  3. python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战

    python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战 笔者遇到的问题是这样的, 在做机器学习模型的时候,有的时候会使用相关性分析的方法来进行特征的筛选,去除冗余特征,降 ...

  4. 一步步手动实现热修复(一)-dex文件的生成与加载

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 热修复技术自从QQ空间团队搞出来之后便渐渐趋于成熟. 我们这个系列主要介绍如何一步步手动实现基本的热修复功能,无需使用第三方框架. ...

  5. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  6. FPGA加载bit文件可以工作,加载mcs不能工作的原因

    FPGA加载bit文件可以工作,加载mcs不能工作的原因 1: 使用ISE的MPACT用bit文件生成mcs的时候设置错了应该,检查一下FLASH型号,容量,位宽都有没有选对. 2: mcs文件的大小 ...

  7. nginx配置解决vue单页面打包文件大,首次加载慢的问题

    nginx配置解决vue单页面打包文件大,首次加载慢的问题 参考文章: (1)nginx配置解决vue单页面打包文件大,首次加载慢的问题 (2)https://www.cnblogs.com/golo ...

  8. asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度

    介绍 使用许多小得JS.CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维护性,这是一个很好的实践.但这样做反过来却损失了网站的性能.虽然你应该将你的Javascript代码写在小文件中并 ...

  9. ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用<link type="text/css" rel="Stylesheet" ...

  10. Resx 文件无效。未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List`1请确保已在项目中添加了必需的引用。

    在C#程序编写过程中,会遇到:Resx 文件无效.未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List1`请确保已在项目中添加了必需的引用. 主要原因 ...

最新文章

  1. 移动磁盘由于IO设备错误,要怎样寻回文件
  2. EXCEL文件单独打开和单独关闭
  3. 文件下载--服务器端编程操作
  4. y460安装的ubuntu开机时笔记本键盘失效的问题
  5. javacv 写mp4_JavaCV实现获取视频每帧并保存
  6. 自动特征工程、NAS、超参调优和模型压缩,微软开源的NNI一库搞定!
  7. php 下载后文件打不开,解决php下载excel无法打开的问题
  8. C++-实现matlab的meshgird(OpenCV)
  9. L2与L1正则化理解
  10. 《暗时间》经典(一)
  11. UI设计中图标类型指南
  12. HDS存储管理工具命令行汇总
  13. 实验吧-因缺思汀的绕过WriteUp
  14. matlab的peer啥意思,科学网—Matlab读取PEER地震动记录数据库加速度数据函数 - 王德才的博文...
  15. 滴滴自动驾驶服务上线,程维:道阻且长,行则将至
  16. Unirech:为什么不能访问阿里云国际版云服务器ecs实例上的网站
  17. 【软件测试面试】测试开发一面面试题+回答,大伙感受下强度咋样......
  18. kaggle比赛【Riiid! Answer Correctness Prediction】
  19. vue引入51la流量监控
  20. English-人事部翻译资格认证

热门文章

  1. 2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest
  2. 计算机桌面死机的原因是,电脑屏幕死机了怎么办
  3. LiveData更新数据报错java.lang.IllegalStateException: Cannot invoke setValue on a background thread
  4. 合唱队形(最大上升子序列)
  5. 「Python条件结构」嵌套if:根据星期英文字母输出相应的星期
  6. 儿子:特训营归来,许三多算个屁!(转)
  7. IIS短文件名漏洞修复
  8. 《可复制的领导力》——樊登书摘
  9. [35期] 没有硝烟的战争
  10. 英语句子摘抄——书虫系列