描述
部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。
专栏目录:记录自己的嵌入式学习之路-CSDN博客
目录
[0 引导流程示例](#0 引导流程示例)
[1 进入U-Boot](#1 进入U-Boot)
[2 常用U-Boot操作命令](#2 常用U-Boot操作命令)
[2.1 查看命令帮助](#2.1 查看命令帮助)
[2.2 查看板子信息](#2.2 查看板子信息)
[2.3 查看环境变量](#2.3 查看环境变量)
[2.4 网络相关命令](#2.4 网络相关命令)
[2.5 mmc操作命令](#2.5 mmc操作命令)
[2.6 文件系统操作命令](#2.6 文件系统操作命令)
[2.7 系统引导命令](#2.7 系统引导命令)
[2.8 其他常用命令](#2.8 其他常用命令)
[3 常用环境变量](#3 常用环境变量)
[3.1 修改环境变量的方式](#3.1 修改环境变量的方式)
[3.2 bootdelay](#3.2 bootdelay)
[3.3 bootargs](#3.3 bootargs)
[3.4 网络相关环境变量](#3.4 网络相关环境变量)
[4 U-Boot的默认引导过程](#4 U-Boot的默认引导过程)
[4.1 执行bootcmd](#4.1 执行bootcmd)
[4.2 distro_bootcmd内容](#4.2 distro_bootcmd内容)
[4.3 boot_targets内容](#4.3 boot_targets内容)
[4.4 bootcmd_{target}内容](#4.4 bootcmd_{target}内容)
0 引导流程示例

1 进入U-Boot
在启动带有U-Boot的Zynq板子时,在倒计时前键入任意键就能阻止autoboot从而进入U-Boot部分。

进入后可以发现U-Boot操作方式与Linux命令类似。
2 常用U-Boot操作命令
2.1 查看命令帮助
(1) help
查看U-Boot支持的所有命令。
(2) ? <命令> 或 help <命令>
查看命令的具体用法。
2.2 查看板子信息
bdinfo
查看DRAM的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。
2.3 查看环境变量
printenv/print
U-Boot中的环境变量都是字符串
2.4 网络相关命令
(1) dhcp
使用DHCP服务为板子获取IP地址,前提是板子连接到路由器而不是直连到主机上。
(2) ping <ip地址>
测试网络能否ping通。
(3) nfs命令
nfs [loadAddress] [[hostIPaddr:]bootfilename]
表示将hostIPaddr这个IP对应主机的bootfilename文件下载到DRAM的loadAddress位置上,示例:

前提是主机需要安装并开启nfs-kernel-server,并已在/etc/exports文件中对NFS服务进行文件夹和权限的配置。
(4) tftpboot命令
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
与nfs命令相似,都是用于通过网络下载文件到DRAM中,只是协议不同。该命令的前提也是已经在主机配置好了tftp服务器及共享路径。除此以外,其主机文件路径可以省略,可以只写文件名:

2.5 mmc操作命令
uboot支持EMMC和SD卡,因此提供了这类mmc的操作命令。

其中,mmc info看到的是当前MMC设备的信息,使用mmc dev [dev] [part]可以进行选择。
2.6 文件系统操作命令
(1) FAT文件系统命令:
fatinfo:查询指定MMC指定分区的文件系统信息;
fatls:查询FAT格式设备的目录和文件信息;
fstype:查看MMC设备某个分区的文件系统格式;
fatload:命令用于将指定的文件读取到DRAM中;
fatwirte:将DRAM中的数据写入到MMC设备中;
(2) EXT文件系统命令:
ext2load、ext2ls、ext4load、ext4ls、ext4write,其用法与FAT文件系统的类似,分别针对ext2和ext4文件系统。
2.7 系统引导命令
要启动Linux,需要先将Linux镜像文件拷贝到DRAM中,如果使用到设备树的话也需要将设备树拷贝到DRAM中。当镜像文件和设备树文件加载到DRAM后,就可以使用bootm、bootz、boot等命令执行系统引导。
(1) bootm <addr> [initrd[:size]] <fdt>
**addr:**uImage文件所在的内存地址;
**initrd:**initrd文件在内存中的地址和大小,可以不指定,不指定时用"-"代替。其实就是根文件系统的地址,一般用RAMDISK文件(ramdisk.cpio.gz.u-boot)做根文件系统才需要指定,用EXT4根文件系统时无需指定;
**size:**initrd文件的大小;
**fdt:**dtb文件在内存中的地址,由petalinux-config -c u-boot中的Default DTB pickup address设定;
**其他信息:**由于image.ub包含了uImage规定的头部信息,因此bootm也可以用来引导image.ub镜像。引导image.ub时只需要image.ub的偏移即可,无需其他参数。
(2) booti <addr> [initrd[:size]] [fdt]
与bootm类似,不过addr是Image文件所在的内存地址,不是uImage。
(3) bootz <addr> [initrd[:size]] [fdt]
与bootm类似,不过addr是zImage文件所在的内存地址,不是uImage。
(4) boot
使用u-boot环境变量中的bootcmd引导系统。其实就是执行bootcmd的内容。
2.8 其他常用命令
(1) reset
系统复位重启
(2) run <cmd>
运行环境变量中定义的命令,如run bootcmd。
3 常用环境变量
3.1 修改环境变量的方式
**setenv <环境变量名> '<值>':**临时修改环境变量,因为环境变量是被加载到DRAM中的,掉电就会丢失。如环境变量包含多个值,就用空格隔开。若环境变量仅有单个值且值中不含空格,可以省略引号。
**saveenv:**将当前DRAM中的环境变量写入到非易失性存储器中,使得U-Boot重启后它还在。具体使用哪个非易失性存储器,可由Petalinux配置。
**删除环境变量的方法:**给环境变量赋空值,即直接setenv <环境变量名>。
3.2 bootdelay
开机时倒计时进行autoboot的时间。
3.3 bootargs
用于传递给内核的信息,主要用来告诉内核分区信息和根文件系统所在的分区。Zynq使用EXT4根文件系统时,bootargs需要包含以下内容,否则系统的启动有可能会报错无法找到根文件系统:
root=/dev/mmcblk0p2 rw rootwait
该参数说明了根文件系统位于第一张SD卡/eMMC存储器的第2个分区中。
3.4 网络相关环境变量

其中,需要确保板子的IP和Ubuntu的IP在同一网段内;serverip为Ubuntu的IP地址。
4 U-Boot的默认引导过程
4.1 执行bootcmd
bootcmd=run distro_bootcmd
实际就是执行distro_bootcmd。
4.2 distro_bootcmd内容
distro_bootcmd=for target in {boot_targets}; do run bootcmd_{target}; done
其实就是循环每一个boot_targets,并尝试执行其对应的引导命令,直到成功引导进入系统为止。不行就会一直循环。
4.3 boot_targets内容
boot_targets=qspi jtag mmc0 mmc1 qspi nand nor usb0 usb1 pxe dhcp
这里表示引导方式,最开始多出来一个qspi,可能是因为在petalinux或者什么地方设置过qspi优先引导,所以添加了一个在前面。
这里的顺序就代表着引导的顺序。
4.4 bootcmd_${target}内容
其实就是各模式实际的引导命令内容,根据模式的不同,其实际的内容也不同。
下面以bootcmd_qspi内容为例子:
bootcmd_qspi=sf probe 0 0 0 && sf read {scriptaddr} {script_offset_f} {script_size_f} \&\& echo QSPI: Trying to boot script at {scriptaddr} && source ${scriptaddr}; echo QSPI: SCRIPT FAILED: continuing...;
bootcmd_qspi在这里其实就是通过QSPI FLASH加载boot.scr文件并依据脚本文件内容进行引导。