何为 U-BOOT?
在嵌入式操作系统中,Boot Loader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。我们都知道在PC中,电脑开机后首先会进入BIOS,它可以引导win操作系统的启动,接着会进入C盘读取文件,启动APP。在嵌入式系统中,U-BOOT就是起到类似BIOS作用的,它可以引导Linux内核启动,从而挂载根文件系统,启动APP。u-boot 的本质是一个裸机程序,其主要目的是帮助启动内核。
uboot 常用命令
1. 查询帮助信息
- help/?
查看帮助信息,若果要查看具体某一命令帮助信息: ? 【命令名】
2. 信息查询命令
-
bdinfo
查询板子信息 -
printenv
查询板子的环境变量 -
saveenv
保存环境变量 -
setenv
修改环境变量、新建环境变量、删除环境变量修改/新增环境变量 如果修改字符串(有空格)需要使用‘’setenv bootdelay 5 saveenvsetenv bootcmd 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv
删除环境变量,设置空值即为删除 setenv author saveenv
3. 内存操作命令
-
md 用于显示内存值
md[.b, .w, .l] address [# of objects]
[.b .w .l] 对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节来显示内存值
address 就是要查看的内存起始地址
[# of objects]表示要查看的数据长度tips:uboot 命令中的数字都是十六进制的!不是十进制的! 例如查看以0x80000000开始的20个字节的内存值: md.b 80000000 14
-
nm 用于修改指定地址的内存值
nm [.b, .w, .l] address
使用q退出=> nm.l 80000000 80000000: fbc6f7cf ? 12345678 80000000: 12345678 ? q
-
mm 命令
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。 -
mw 命令
命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:
mw [ .b, .w, .l ] address value [ count ]=> mw.l 80000000 0a0a0a0a 10 => md.l 80000000 10 80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
-
cp 命令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。
cp [.b, .w, .l] source target count=> md.l 80000000 10 80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a => md.l 80000100 10 80000100: 7fd75e7f ff5fab8f feffddf9 b3eeebdc 80000110: 7dd55556 f2eaeafe 657dd677 bffafaea 80000120: 79ffb9fd fafeffbf 5d9f75fd feeeeb6b 80000130: 9dfdd5f5 bfeeeebe ddffff7f ebffcbfb => cp.l 80000000 80000100 10 => md.l 80000100 10 80000100: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000110: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000120: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a 80000130: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
-
cmp 命令
cmp 是比较命令,用于比较两段内存的数据是否相等。
cmp [.b, .w, .l] addr1 addr2 count
4. 网络操作命令
-
ping 命令
开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可 -
dhcp 命令
dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑
直连的,那么 dhcp 命令就会失效。 -
nfs 命令
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。
nfs [loadAddress] [ [hostIPaddr : ] bootfilename ]nfs 80800000 222.199.220.122:/home/jimmy/linux/nfs/zImage
-
tftp 命令
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议。和 nfs 命令的区别在于, tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。tftp 80800000 zImage
5. EMMC 和 SD 卡操作命令
-
mmc命令
-
mmc read
mmc read addr blk# cnt
从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处mmc dev 1 0 //切换到 MMC 分区 0 mmc read 80800000 600 10 //读取数据
-
mmc write
mmc write addr blk# cnt
从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 742(0x2E6)个块mmc dev 0 0 mmc write 80800000 2 32E
6.FAT 格式文件系统操作命令
-
fatinfo 命令
fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息,格式如下:fatinfo < interface > [ < dev [ : part ] > ]
interface 表示接口,比如 mmc, dev 是查询的EMMC 分区 1 的文件系统信息,命令如下:fatinfo mmc 1:1
-
fatls 命令
fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下:fatls < interface> [< dev[ : part] >] [directory]
interface 是要查询的接口,比如 mmc, dev 是要查询的设备号, part 是要查询的分区, directory是要查询的目录。比如查询 EMMC 分区 1 中的所有的目录和文件,输入命令:fatls mmc 1:1
-
fstype 命令
fstype 用于查看 MMC 设备某个分区的文件系统格式,命令格式如下:fstype < interface > < dev > : < part >fstype mmc 0:1
-
fatload 命令
fatload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:
fatload < interface > [< dev[ : part] > [< addr> [< filename > [bytes [ pos ] ] ] ] ]
interface 为接口,比如 mmc, dev 是设备号, part 是分区, addr 是保存在 DRAM 中的起始地址, filename 是要读取的文件名字。 bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。 pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。
我们将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的0x80800000 地址处,命令如下:fatload mmc 1:1 80800000 zImage
7.BOOT指令
-
bootz 命令
bootz 命令用于启动 zImage 镜像文件, bootz 命令格式如下:bootz [ addr [ initrd [ : size]] [ fdt ] ]
addr 是 Linux 镜像文件在 DRAM 中的位置
initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用 - 代替即可
fdt 就是设备树文件在 DRAM 中的地址bootz 80800000 - 83000000
-
bootm 命令
bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件。如果不使用设备树的话启动 Linux 内核的命令如下:
bootm addr
addr 是 uImage 镜像在 DRAM 中的首地址。
如果要使用设备树,那么 bootm 命令和 bootz 一样,命令格式如下:bootm [addr [initrd[:size]] [fdt]]
其中 addr 是 uImage 在 DRAM 中的首地址, initrd 是 initrd 的地址, fdt 是设备树(.dtb)文件.在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代 -
boot 命令
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统, bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动Linux 系统,命令如下:setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000' saveenv boot
8.其他指令
-
go 命令
用于跳到指定的地址处执行应用,命令格式如下:go addr [arg …]
使用 tftp 命令将 printf.bin下载到开发板 DRAM 的 0X87800000 地址处,因为裸机例程的链接首地址就是 0X87800000,
最后使用 go 命令启动 printf.bin 这个应用。tftp 87800000 printf.bin go 87800000
-
run 命令
run 命令用于运行环境变量中定义的命令,比如可以通过“run bootcmd”来运行 bootcmd 中的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。 -
mtest 命令
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR,命令格式如下:
mtest [start [ end [ pattern [ iterations ] ] ] ]
start是要测试的DRAM 开始地址, end 是结束地址,比如我们测试 0X80000000~0X80001000这段内存mtest 80000000 80001000