U-Boot常用命令

U-Boot常用命令

一、信息查询命令

1. 查看开发板信息 [ bdinfo ]

在这里插入图片描述

2. 查看环境变量信息 [ printenv ]

在这里插入图片描述
STM32MP1 系列的环境变量有很多,比如baudrate、board、board_name、boot_device、bootcmd、bootdelay 等等。uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=1,也就默认延时 1 秒。前面说的 1 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s 了。

3. 查看U-Boot版本号 [ version ]

在这里插入图片描述

二、环境变量操作命令

环境变量的操作涉及到两个命令:setenv 和 saveenv,setenv 命令用于设置或者修改环境变量的值。命令 saveenv 用于保存修改后的环境变量,一般环境变量存放在外部 flash 中,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则uboot 下一次重启会继续使用以前的环境变量值。

1. 修改环境变量 [ setenv ]

  1. 设置环境变量
    将环境变量 bootdelay 改为 5
    setenv bootdelay 5

  2. 修改环境变量
    新建一个环境变量author,并赋值
    setenv author 'console=ttySTM0,11520 root=/dev/mmcblk2p2 rootwait rw '

  3. 删除环境变量
    给这个环境变量赋空值即可(下例删除上面新建的环境变量author)
    setenv author

2. 保存环境变量 [ saveenv ]

直接调用 saveenv即可将修改后的环境变量保存到 flash 中

三、内存操作命令

内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、mm、mw、cp 和 cmp。

注意:uboot 命令中的数字都是十六进制的!不是十进制的!

1. 显示内存值命令 [ md ]

用于显示对应地址的内存值
格式:md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、word 和 long
address就是要查看的内存起始地址
[# of objects]表示要查看的数据长度。
(数据长度单位不是字节,与所选择的显示格式有关。)

例如:
查看0XC0100000 开始的 20 个字节的内存值,显示格式为.b
md.b C0100000 14
20(十进制) = 0x14(十六进制)

2. 修改指定地址的内存值命令 [ nm ]

用于修改指定地址的内存值
格式:nm [.b, .w, .l] address
命令参数含义同上

例如:
以.l 格式修改 0XC0100000 地址的数据为 0x12345678
先输入 nm.l C0100000 命令得到如下响应
在这里插入图片描述
ea0000b8 表示地址 0xc0100000 现在的数据
‘?’ 后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然
后再输入‘q’即可退出
在这里插入图片描述

3. 自增-修改指定地址的内存值命令 [ mm ]

用法同nm命令,但修改完成后地址会自增,从而对下一个地址进行修改,直到输入q退出命令。
在这里插入图片描述

4. 使用一个指定的数据填充一段内存命令 [ mw ]

使用一个指定的数据填充一段内存
格式:mw [.b, .w, .l] address value [count]
address 表示要填充的内存起始地址,value 为要填充的数据,count 是填充的长度。

例如:
使用.l 格式将以 0XC0100000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
mw.l C0100000 0A0A0A0A 10

5. 数据拷贝命令 [ cp ]

用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把
NorFlash 中的数据拷贝到 DRAM 中。
格式:cp [.b, .w, .l] source target count
source 为源地址,target 为目的地址,count 为拷贝的长度。

例如:
使用.l 格式将 0xC0100000 处的地址拷贝到 0xC0100100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)
cp.l c0100000 c0100100 10

5. 比较命令 [ cmp ]

用于比较两段内存的数据是否相等
格式:cmp [.b, .w, .l] addr1 addr2 count
addr1 为第一段内存首地址,addr2 为第二段内存首地址,count 为要比较的长度。

例如:
使用.l 格式来比较 0xC0100000 和 0xC0100100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)
cmp.l c0100000 c0100100 10

四、网络操作命令

移植 uboot 的时候一般都要调通网络功能进行调试
注意:建议开发板和主机 PC 都连接到同一个路由器上!

1. 环境变量配置

环境变量					描述
ipaddr				开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。
ethaddr				开发板的 MAC 地址,一定要设置。
gatewayip			网关地址。
netmask				子网掩码。
serverip			服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。

设置环境变量:

setenv ipaddr 192.168.1.250
setenv ethaddr b8:ae:1d:01:01:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.249
saveenv

2. 网络连接测试命令 [ ping ]

用法:ping 服务器IP地址
例如:
服务器 IP 地址为 192.168.1.249
ping 192.168.1.249
注意:只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping
命令做处理,如果用其他的机器 ping uboot 的话会失败!

3. IP地址获取命令 [ dhcp ]

直接输入 dhcp 命令即可通过路由器获取到 IP 地址
所获取到的IP地址与路由器分配机制有关

4. 网络文件系统命令 [ nfs ]

可以使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。

格式:nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。
例如:
使用 nfs 命令来将 uImage 下载到开发板 DRAM 的 0XC2000000 地址处
nfs C2000000 192.168.1.249:/home/fallencity/linux/nfs/uImage

5.网络文件系统命令 [ tftp ]

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的是 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。

  1. 使用前需要在Ubuntu上搭建tftp服务器
    sudo apt-get install tftp-hpa tftpd-hpa
    sudo apt-get install xinetd

  2. 和 NFS 一样,TFTP 也需要一个文件夹来存放文件,新建一个目录,并修改执行权限
    mkdir /home/fallencity/linux/tftpboot
    chmod 777 /home/fallencity/linux/tftpboot

  3. 还需要配置tftp
    新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:

server tftp
{
	socket_type = dgram
	protocol = udp
	wait = yes
	user = root
	server = /usr/sbin/in.tftpd
	server_args = -s /home/fallencity/linux/tftpboot
	disable = no
	per_source = 11
	cps = 100 2
	flags = IPv4
}
  1. 启动 tftp 服务
    sudo service tftpd-hpa start

  2. 打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/fallencity/linux/tftpboot"
TFTP_ADDRESS=":69" 
TFTP_OPTIONS="-l -c -s"

TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。

  1. 重启tftp服务器
    sudo service tftpd-hpa restart

  2. 使用tftp下载调试文件

例如:将 uImage 镜像文件拷贝到 tftpboot 文件夹中,并且给予 uImage 相应的权限,命令如下:

cp uImage /home/fallencity/linux/tftpboot
cd /home/fallencity/linux/tftpboot
chmod 777 uImage

调用格式:tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是文件在 DRAM 中 的存 放 地 址 ,
[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件

将 uImage 文件下载到开发板 DRAM 的 0XC2000000 地址处
tftp C2000000 uImage

注意:tftp和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。

五、EMMC 和 SD 卡操作命令 [ mmc ]

mmc 是一系列的命令,其后可以跟不同的参数

1.输出当前选中的设备的信息 [ mmc info ]

直接输入命令 mmc info 即可
在这里插入图片描述

2. 复扫描当前开发板上所有的 MMC 设备 [ mmc rescan ]

直接输入命令 mmc rescan 即可

3. 查看当前开发板MMC 设备数量 [ mmc list ]

直接输入命令 mmc list 即可
在这里插入图片描述

4.切换当前 MMC 设备 [ mmc dev ]

格式:mmc dev [dev] [part]
[dev]用来设置要切换的 MMC 设备号,[part]是分区号,如果不写分区号的话默认为分区 0。

例如:
切换至SD卡命令:mmc dev 0
注:切换到 SD 卡,0 为 SD 卡,1 为 eMMC

5. 分区查看 [ mmc part ]

有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区

例如:
查看EMMC分区情况
1. 先切换到EMMC,输入命令 mmc dev 1
2. 查看 EMMC 分区,输入命令 mmc part

在这里插入图片描述
3. 如果要将 EMMC 的分区 2 设置为当前 MMC 设置分区,可输入命令 mmc dev 1 2

6. 读取 mmc 设备的数据 [ mmc read ]

格式:mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。

例如:
从 EMMC 的第 1024(0x400)个块开始,读取 16(0x10)个块的数据到 DRAM 的0XC0000000 地址处
1. 切换到EMMC,输入命令 mmc dev 1
2. 读取数据,输入命令 mmc read c0000000 400 10

六、EXT 格式文件系统操作命令 [ ext4 ]

1. 查询 EXT4 格式设备的目录和文件信息 [ ext4ls ]

格式:ext4ls <interface> [<dev[:part]>] [directory]
interface 是要查询的接口,比如 mmc,dev 是要查询的设备号,part 是要查询的分区,directory是要查询的目录。

例如:
查询 EMMC 分区 2 中的所有的目录和文件
输入命令:ext4ls mmc 1:2

2. 将指定的文件读取到 DRAM 中 [ ext4load ]

格式:fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是保存在 DRAM 中的起始地址,filename 是要读取的文件名字。bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。

例如:
EMMC 分区 2 中的 uImage 文件读取到DRAM 中的 0XC2000000 地址处
输入命令:ext4load mmc 1:2 C2000000 uImage

3. 将 DRAM 中的数据写入到 MMC 设备中 [ ext4write ]

格式:ext4write <interface> <dev[:part]> <addr> <absolute filename path> [sizebytes] [file offset]
interface 为接口,比如 mmc;dev 是设备号;part 是分区;addr 是要写入的数据在 DRAM中的起始地址;absolute filename path 是写入的数据文件名字,注意是要带有绝对路径,以‘/’开始;sizebytes 表示要写入多少字节的数据;file offset 为文件偏移。
我们可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树。

例如:
uImage 大小为 7313888(0X6F99E0)个字节,接下来使用命令 ext4write 将其写入到 EMMC的分区 2 中。为了和原有的 uImage 文件区分,我们将要写入的文件命名为 test_uImage。
输入命令:ext4write mmc 1:2 c0000000 /test_uImage 0x6f99e0

七、BOOT 操作命令

BOOT命令用来引导启动Linux,常用的跟 boot 有关的命令有:bootm、bootz 和 boot。

1. 启动 uImage 镜像文件 [ bootm ]

格式:bootm [addr [arg ...]]
bootm 主要有三个参数,addr 是 Linux 镜像文件在 DRAM 中的位置,后面的“arg…”表示其他可选的参数,比如要指定 initrd 的话,第二个参数就是 initrd 在 DRAM 中的地址。如果 Linux 内核使用设备树的话还需要第三个参数,用来指定设备树在 DRAM 中的地址,如果不需要 initrd 的话第二个参数就用‘-’来代替。

例如:

  1. tftp下载镜像启动Linux
    在这里插入图片描述
  2. 从EMMC中读取镜像,启动Linux
    在这里插入图片描述

2. 启动 uImage 镜像文件 [ bootz ]

bootz 和 bootm 功能类似,使用方法也和 bootm 一模一样,但是所引导的 Linux 镜像格式不同, bootz 用于启动 zImage 镜像文件。例如NXP 的 I.MX6ULL就是使用 bootz 命令来引导 Linux 内核的。

3. 命令集引导启动Linux [ boot / bootd ]

boot 和 bootd 其实是一个命令,它们最终执行的是同一个函数。为了方便起见,后面就统一使用 boot 命令,此命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是多条启动命令的集合,具体的引导命令内容是可以修改的。

  1. 设置环境变量bootcmd
    例如:
    使用 tftp 命令从网络启动 Linux ,可以设置bootcmd 为“tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 -
c4000000' 
saveenv
boot

八、UMS 命令 [ ums ]

可以将 EMMC 虚拟成 U 盘以后就可以直接在电脑上向开发板拷贝文件了,比如我们在产品开发阶段,就可以直接在 uboot 下将某个文件拷贝到开发板的根文件系统中,这样就不需要进入系统或者通过网络来替换文件。

格式:ums <USB_controller> [<devtype>] <dev[:part]>
其中 USB_controller 是 usb 接口索引,有的开发板有多个 USB SLAVE 接口,具体要使用哪个就可以通过 USB_controller 参数指定。正点原子 STM32MP157 开发板的只有一个 USB_OTG口可以作为 USB SLAVE,对应的索引为 0。Devtype 是要挂载的设备,默认为 mmc,dev[:part] 是要挂载的 Flash 设备,part 是要挂载的分区。

例如:
将开发板的EMMC 挂载到电脑上,首先使用USB Type-C线将开发板的USB_OTG口与电脑连接起来,然后用以下命令启动:ums 0 mmc 1
挂载成功以后就会在电脑上有多个 U 盘,U 盘数量取决于你当前开发板 EMMC 分区数量

九、其他常用命令

1. 复位重启命令 [ reset ]

在这里插入图片描述

2. 跳到指定的地址处执行应用 [ go ]

格式:go addr [arg ...]
addr 是应用在 DRAM 中的首地址。

3. 运行环境变量中定义的命令 [ run ]

可通过“run bootcmd”来运行 bootcmd 中的启动命令,run 命令最大的作用在于运行我们自定义的环境变量。

例如:
就可以通过自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,定义mybootnet 表示从网络启动。如果要切换启动方式的话只需要运行"run mybootemmc" 或 “run mybootnet”

# 创建环境变量
setenv mybootemmc 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
setenv mybootnet 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv

4. 内存读写测试命令 [ mtest ]

mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR。

格式:mtest [start [end [pattern [iterations]]]]
start 是 要 测 试 的 DRAM 开始地址, end 是 结 束 地 址

例如:
我 们 测 试0XC0000000~0XC0001000 这段内存,输入命令:mtest C0000000 C0001000
在这里插入图片描述上图可以看出,测试范围为 0XC0000000~0XC0001000,已经测试了 527 次,如果要结束测试就按下键盘上的“Ctrl+C”键。

至此,uboot 常用的命令就讲完了,原文可参考正点原子提供的Linux驱动开发文档

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦星越

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

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

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

打赏作者

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

抵扣说明:

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

余额充值