目录
1.信息查询命令
2.环境变量操作命令
3.内存操作命令
①md 命令
②nm命令
④mw命令
⑤cp命令
⑥cmp命令
4.网络操作命令
①ping
②dhcp
③nfs
④tftp
5.EMMC操作命令
①mmc info
②mmc rescan
③mmc list
④mmc dev
⑤mmc part
⑥mmc read
⑦mmc write
⑧mmc erase擦除 MMC 设备的指定块
6.FAT 格式文件系统操作命令
①fatinfo
②fatls
③fstype
④fatload
⑤fatwrite
7.EXT 格式文件系统操作命令
8.BOOT 操作命令
①bootz
②bootm 命令
③boot
9.其他常用命令
①reset
②go
③run
进入 uboot 的命令行模式后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令,
输入“help(或?) 命令名” 可以查看命令的详细用法:
? bootz 或 help bootz
1.信息查询命令
常用的和信息查询有关的命令有 3 个: bdinfo、 printenv 和 version
bdinfo : 查看板子信息
printenv :输出环境变量信息
version :查看 uboot 的版本号
uboot 中的环境变量都是字符串,环境变量它的作用就和变量一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了。 uboot 中的环境变量是可以修改的
2.环境变量操作命令
修改环境变量:
setenv :设置或者修改环境变量的值,也可以用于新建变量和删除变量
saveenv :保存修改后的环境变量
一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值
删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可
1.环境变量 bootdelay 改为 10:
setenv bootdelay 10
saveenv使用命令 saveenv 保存修改后的环境变量的话会有保存过程提示信息,根据提示可以看出环境变量保存到了 MMC(1)中,MMC设备中。保存到SD卡,MMC(0)
2.新建变量和删除变量
setenv anthor mingfei
saveenv
setenv anthor
saveenv
删除命令给环境变量赋空值即可
3.内存操作命令
内存操作命令用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、 nm、mm、 mw、 cp 和 cmp
md:md[.b, .w, .l] address [# of objects] 显示内存值
nm:nm [.b, .w, .l] address 修改指定地址的内存值,地址不会自增
mm:mm [.b, .w, .l] address 修改指定地址内存值的,地址会自增
mw:mw [.b, .w, .l] address value [count] 使用一个指定的数据填充一段内存
cmp:cmp [.b, .w, .l] addr1 addr2 count 比较两段内存的数据是否相等
①md 命令
md 命令用于显示内存值,格式如下
md[.b, .w, .l] address [# of objects]
[.b .w .l]对应 byte,word 和 long,分别以 1 个字节、 2 个字节、 4 个字节来显示内存值
address 查看的内存起始地址 [# of objects]查看的数据长度
注:这个数据长度单位不是字节,而是跟你所选择的显示格式有关
设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 20*2=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是20*4=80 个字节
uboot 命令中的数字都是十六进制的!不是十进制的!
查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b
指令:md.b 80000000 14
②nm
nm 命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .l] address
修改80000000的地址:
nm.l 80000000
输入上述命令,会出现如图,80000000 表示现在要修改的内存地址, 12345678表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x0500e031,输入完成以后按下回车,然后再输入‘q’即可退出若不退出,一直修改则修改的是通一个地址,地址不会自增
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增
使用格式:
mm [.b, .w, .l] address 修改指定地址内存值的,地址会自增使用命令 md 查看修改后的值
④mw命令
命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:
mw [.b, .w, .l] address value [count]
[.b, .w, .l]:指定操作格式
address 表示要填充的内存起始地址value为要填充的数据
count 是填充的长度
将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A mw.l 80000000 0A0A0A0A 10
⑤cp命令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中
cp [.b, .w, .l] source target count
source 为源地址 target 为目的地址
count为拷贝的长度
将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)
cp.l 80000000 80000100 10
先使用 md.l 命令打印出地址 0x80000000 和 0x80000100 处的数据,然后使用命令cp.l将0x80000100处的数据拷贝到0x80000100处。最后使用命令md.l查看0x80000100处的数据有没有变化,检查拷贝是否成功
⑥cmp命令
cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, .l] addr1 addr2 count
addr1 为第一段内存首地址addr2 为第二段内存首地址
count 为要比较的长度
比较 0x80000000 和 0X80000100 两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)
cmp.l 80000000 80000100 10
4.网络操作命令
uboot 是支持网络的,在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcp、ping、 nfs 和 tftpboot
在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑连接起来。设置网络环境变量:
setenv ipaddr 192.168.10.50
setenv ethaddr 88:2f:ac:7b:cc:b0
setenv gatewayip 192.168.10.1setenv netmask 255.255.255.0
setenv serverip 192.168.10.100
saveenv
确保Ubuntu主机和开发板的IP地址在同一个网段内。mac的地址设置要与ip地址相对应
①ping
开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可
②dhcp
dhcp 用于从路由器获取 IP 地址,前提是开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效
③nfs
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。作用:为了方便调试 linux 镜像和设备树,也称网络调试
一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。uboot 中的 nfs 命令格式如下所示:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址, [[hostIPaddr:]bootfilename]是要下载的文件地址
④tftp
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器
uboot 中的 tftp 命令格式如下:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,[[hostIPaddr:]bootfilename]是要从Ubuntu 中下载的文件
区别:tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可
将内核、设备树文件下载到开发板内存中
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
5.EMMC操作命令
uboot 支持 EMMC 和 SD 卡,一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”
mmc 后面跟不同的参数可以实现不同的功能
①mmc info
mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可
②mmc rescan
mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡
③mmc list
mmc list 命令用于来查看当前开发板一共有几个 MMC 设备
: FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),这是因为我现在用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡,FSL_SDHC:1(eMMC)是 EMMC。默认会将 EMMC 设置为当前 MMC 设备
④mmc dev
mmc dev 命令用于切换当前 MMC 设备,命令格式如下:
mmc dev [dev] [part]
[dev]用来设置要切换的 MMC 设备号, [part]是分区号。如果不写分区号的话默认为分区 0
切换到 SD 卡
mmc dev 0 //切换到 SD 卡, 0 为 SD 卡, 1 为 eMMC
⑤mmc part
SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令
mmc dev 1
mmc part
EMMC 有两个分区, 第一个分区起始扇区为 20480,长度为 262144 个扇区; 第二个分区起始扇区为 282624,长度为 14594048 个扇区
将 EMMC 的分区 2 设置为当前 MMC 设备
mmc dev 1 2
如果 EMMC 里面烧写了 Linux 系统的话, EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放Linux 镜像文件和设备树,第 2 个分区存放根文件系统
上图中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的
⑥mmc read
mmc read 命令用于读取 mmc 设备的数据,命令格式如下:
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,
cnt 是要读取的块数量(十六进制)
从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:
mmc dev 1 0 //切换到mmc分区0
mmc read 80800000 10
通过 md.b 命令查看 0x80800000 处的数据,查看6*512=8192(0x2000)个字节的数据,EMMC 核心板 uboot 环境变量的存储起始地址就是1536*512=786432。 所以,打印出环境变量
⑦mmc write
要将数据写到 MMC 设备里面,可以用于在uboot中更新 uboot
mmc write addr blk# cnt
addr 是要写入 MMC 中的数据在 DRAM 中的起始地址块起始地址(十六进制),
如果要在 uboot 中更新 EMMC 对应的 uboot
mmc dev 1 0
tftp 80800000 u-boot.imx
mmc write 80800000 2 32E
mmc partconf 1 1 0 0//切换到 EMMC 分区 0
//下载 u-boot.imx 到 DRAM
//烧写 u-boot.imx 到 EMMC 中
//分区配置, EMMC 需要这一步!
⑧mmc erase
擦除 MMC 设备的指定块
mmc erase blk# cnt
blk 为要擦除的起始块, cnt 是要擦除的数量 ,一般不推荐使用
6.FAT 格式文件系统操作命令
在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,需要用到跟文件操作相关的命令有:fatinfo、 fatls、 fstype、 fatload 和 fatwrite,但是这些文件操作命令只支持 FAT 格式的文件系统
①fatinfo
fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息,格式如下:
fatinfo <interface> [<dev[:part]>]
interface 表示接口,比如 mmc, dev 是查询的设备号part 是要查询的分区
查询 EMMC 分区 1 的文件系统信息
fatinfo mmc 1:1EMMC 分区 1 的文件系统为 FAT32 格式的
②fatls
fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下:
fatls <interface> [<dev[:part]>] [directory]
interface 是要查询的接口,比如 mmc, dev 是要查询的设备号part 是要查询的分区
directory是要查询的目录
查询 EMMC 分区 1 中的所有的目录和文件
fatls mmc 1:1emmc 的分区 1 中存放着 8 个文件
③fstype
fstype 用于查看 MMC 设备某个分区的文件系统格式
fstype <interface> <dev>:<part>
EMMC 核心板上的 EMMC 默认有 3 个分区
从上图可以看出,分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所
以文件系统格式未知。分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。分区 2 的格式为 ext4,用于存放 Linux 的根文件系统(rootfs)
④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 地址处
⑤fatwrite
uboot 默认没有使能 fatwrite 命令,需要修改板子配置头文件,找到自己开发板对应的配置头
文件然后添加如下一行宏定义来使能 fatwrite 命令:
#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */
fatwirte 命令用于将 DRAM 中的数据写入到 MMC 设备中,命令格式如下:
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
filename 是写入的数据文件名字, bytes 表示要写入多少字节的数据
通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树
7.EXT 格式文件系统操作命令
uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:
ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。这些命令的含义和使用与 fatload、 fatls 和 fatwrite一样,只是 ext2 和 ext4 都是针对 ext 文件系统的
8.BOOT 操作命令
uboot 的本质工作是引导 Linux,所以 uboot 有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot
①bootz
要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中
只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令来启动, bootz 命令用于启动 zImage 镜像文件, bootz 命令格式如下:
bootz [addr [initrd[:size]] [fdt]]
addr 是 Linux 镜像文件在 DRAM 中的位置initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可
fdt 是设备树文件在 DRAM 中的地址
②bootm 命令
bootm 用于启动 uImage 镜像文件,上面是启动zImage镜像文件
bootm [addr [initrd[:size]] [fdt]]
addr 是 uImage 在 DRAM 中的首地址, initrd 是 initrd 的地址, fdt 是设备树(.dtb)文件在 DRAM 中的首地址
③boot
boot 命令用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统, bootcmd 是一个环境变量
使用 tftp 命令从网络启动 Linux
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
saveenv
boot
设置 bootcmd 为“tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 -83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动Linux 系统
9.其他常用命令
①reset
输入“reset”即可复位重启uboot
②go
go 命令用于跳到指定的地址处执行应用,命令格式如下:
go addr [arg ...]
addr 是应用在 DRAM 中的首地址
③run
run 命令用于运行环境变量中定义的命令, 但是 run 命令最大的作用在于运行自定义的环境变量
定义环境变量 mybootemmc 表示从 emmc 启动,定义 mybootnet 表示从网络启动
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'saveenv
需要运行“run mybootxxx(xxx 为 emmc、 net 或 nand)”即可④mtest
内存读写测试命令,可以用来测试自己开发板上的 DDR mtest [start [end [pattern [iterations]]]]
start是要测试的DRAM 开始地址, end 是结束地址
测试 0X80000000~0X80001000这段内存,输入“mtest 80000000 80001000”