U-Boot指令

本文详细介绍了U-Boot中的各种命令,包括信息查询、环境变量操作、内存操作(如md、nm、mm、mw、cp和cmp)、网络操作(如ping、dhcp、nfs和tftp)、EMMC操作、FAT和EXT文件系统操作以及BOOT命令。内容涵盖了设置和修改环境变量、内存读写、网络通信测试、EMMC设备的读写以及启动Linux的方法。此外,还提及了其他常用命令如reset、go和run。
摘要由CSDN通过智能技术生成

目录

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   而不是指令md.b 80000000 20

②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.1

setenv 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 设备

 当前开发板有两个 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 中的起始地址

 blk 是要写入 MMC 的起始地址(十六进制),
 

如果要在 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:1

 EMMC 分区 1 的文件系统为 FAT32 格式的

②fatls

fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下:

fatls <interface> [<dev[:part]>] [directory]
interface 是要查询的接口,比如 mmc, dev 是要查询的设备号

part 是要查询的分区

directory是要查询的目录

查询 EMMC 分区 1 中的所有的目录和文件

fatls mmc 1:1

 emmc 的分区 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”
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值