《Uboot常用命令总结》


参考文档:

uboot支持的命令

  进入uboot的命令行模式以后输入“ help”或者“?”,然后按下回车即可查看当前 uboot所支持的命令(uboot中部分命令未使能,可找到开发板对应的配置头文件,然后添加如下一行宏定义来使能),下图为uboot支持的部分命令预览图:

在这里插入图片描述



查看命令的具体使用方法:

  [ ? adc 或者 help adc ] , 且 uboot 支持 TAB 自动补全功能。


在这里插入图片描述



查询命令:

  常用的信息查询命令有3个:bdinfo、printenv 和 version (查看uboot版本号)其中“prinenv”用于输出环境变量信息如下:

在这里插入图片描述



环境变量操作命令:

  1. 修改环境变量 :
        setenv bootdelay 0
        saveenv      // 将 DRAM 中的 变量保存到 flash

  2. 新建环境变量 :
        setenv zsj 'ttySTM0,11520 root=/dev/mmcblk2p2 rootwait rw ’
        saveenv

  3. 删除环境变量 :
        setenv zsj
        saveenv



内存操作命令:

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

  1. md 命令 :
# 命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。
# address 就是要查看的内存起始地址
# [# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关
md[.b, .w, .l] address [# of objects]

md.w 80000000 10  # 从地址 0x80000000 起,显示连续的64(16 * 4)个地址的值
  1. nm 命令 :
# nm 命令用于修改指定地址的内存值
nm [.b, .w, .l] address

nm.l 80000000  // 再输入要修改后的数据 0x12345678
  1. mm 命令 :
# mm 命令用于修改指定地址的内存值 (修改内存值的时候地址会自增)
mm [.b, .w, .l] address

mm.l 80000000  // 再连续输入要修改后的数据, 直到输入q退出
  1. mw 命令 :
# mw 使用一个指定的数据填充一段内存
# value为要填充的数据,count 是填充的长度
mw [.b, .w, .l] address value [count]

mw.l 80000000 0A0A0A0A 10  // 以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
  1. cp 命令 :
# cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中
cp [.b, .w, .l] source target count

cp.w 80000000 80000100 10  // 将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 2=32 个字节)
  1. cmp 命令 :
# cmp 比较两段内存的数据是否相等
cmp [.b, .w, .l] addr1 addr2 count

cmp.l 80000000 80000100 10  // 串口输出相应的提示


网络操作命令:

uboot 在使用网络命令时,需要先调通网络,保证开发板和主机能够ping通(因为uboot ping中不会反馈信息,故只能使用开发板ping主机) uboot 网络环境变量设置如下:

setenv ipaddr 192.168.1.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250
saveenv
  1. dhcp 命令 :
# dhcp 用于从路由器获取 IP 地址,前提得开发连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。
dhcp [loadAddress] [[hostIPaddr:] bootfilename]     # 或者直接 dhcp 获取该网络的IP
  1. nfs 命令 :
# 前提是电脑主机必须搭建 nfs 服务,并将需要 nfs 传输的文件放入指定目录 
# 注意 nfs 传输文件的权限: chmod 777 /home/zsj/nfs/*
nfs [loadAddress] [[hostIPaddr:]bootfilename]

nfs 80800000 192.168.1.250:/home/zsj/nfs/zImage
  1. tftp 命令 :
# 前提是电脑主机必须搭建 tftp服务,并将需要 tftp传输的文件放入指定目录
# 注意 tftp 传输文件的权限: chmod 777 /home/zsj/tftp/*
tftp[loadAddress] [[hostIPaddr:]bootfilename]

tftp 80800000 zImage   # 可以不需要完整路径
# tftp80800000 192.168.1.250:/home/zsj/tftp/zImage


EMMC 和 和 SD 卡操作命令:

uboot 中,一般认为 EMMC和 SD 卡是同一个东西,使用 MMC 来代指 EMMC 和 SD 卡。(通过 ? mmc 查询对应的操作命令)

  1. 【mmc info】命令输出当前选中的 mmc info 设备的信息
  2. 【mmc rescan】命令用于扫描当前开发板上所有的 MMC 设备
  3. 【mmc list】命令用于来查看当前开发板一共有几个 MMC 设备
  4. 【mmc dev】命令用于切换当前 MMC 设备
# dev 用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0
mmc dev [dev] [part]

mmc dev 0 //切换到 SD 卡,0 为 SD 卡,1 为 eMMC
  1. 【mmc part】命令查看EMMC 或 SD 卡的分区情况
  2. 【mmc read】命令用于读取 mmc 设备的数据
# addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,cnt 是要读取的块数量(十六进制)。
mmc read addr blk# cnt

mmc dev 1 0 				# 切换到 eMMC 分区 0
mmc read 80800000 600 10    # 从 eMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处
md.b 80800000 2000          # 查看读取的数据
  1. 【mmc write】命令将数据写到 MMC 设备里面
    千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!
# 可以先通过 nfs 或者 tftp 将主机文件拷入DRAM,在通过该命令将DRAM中的数据传入 SD 或 eMMC 设备
mmc write addr blk# cnt

# 如果要在 uboot 中更新 EMMC 对应的 uboot,可以使用如下所示命令:
mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!
  1. 【mmc erase】命令用于擦除 MMC 设备的指定块
mmc erase blk# cnt


FAT 格式文件系统操作命令:

有时候需要在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,跟该文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,但是这些文件操作命令只支持 FAT 格式的文件系统!

  1. 【fatinfo】命令用于查询指定 MMC 设置指定分区的文件系统信息
# interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区。
fatinfo <interface> [<dev[:part]>]

fatinfo mmc 1:1			# 查询 EMMC 分区 1 的文件系统信息
  1. 【fatls】命令用于查询 FAT 格式设备的目录和文件信息
# interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区, directory
是要查询的目录。
fatls <interface> [<dev[:part]>] [directory]

fatls mmc 1:1			# 查询 EMMC 分区 1 中的所有的目录和文件
  1. 【fstype】命令用于查看 MMC 设备某个分区的文件系统格式
fstype <interface> <dev>:<part>

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

fatload mmc 1:1 80800000 zImage			# 将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的0X80800000 地址处


EXT格式文件系统操作命令:

uboot有 ext2和 ext4这两种格式的文件系统的操作命令,STM32MP1的系统镜像都是 ext4格式的,所以我们重点讲解一下 和 ext4有关的三个命令: ext4ls、 ext4ls和 ext4write。

  1. 【ext4ls】命令用于查询 EXT4格式设备的目录和文件信息
# interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区, directory是要查询的目录。
ext4ls <interface> [<dev[:part]>] [directory]

ext4ls mmc 1:2			# 查询 EMMC 分区2中的所有的目录和文件
  1. 【ext4load】命令用于将指定的文件读取到 DRAM
# addr是保存在 DRAM中的起始地址,filename是要读取的文件名字。
ext4load <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]

ext4load mmc 1:2 C2000000 uImage			# 将 eMMC 分区2中的 uImage 文件读取到 DRAM 中的 0XC2000000 地址处
  1. 【ext4write】命令用于将 DRAM中的数据写入到 MMC
ext4write <interface> <dev[:part]> <addr> <absolute filename path> [sizebytes] [file offset]

tftp C0000000 uImage 	# 使用命令 tftp 将 uImage 下载到 DRAM 的 0XC0000000 地址处 (uImage大小为 7313888(0X6F99E0)个字节)
ext4write mmc 1:2 c0000000 /test_uImage 0x6f99e0		# 使用命令 ext4write 将其写入到 EMMC 的分区2中 。为了和原有的 uImage 文件区分,我们将要写入的文件命名为 test_uImage


ubi格式文件系统操作命令:

ubifs文件系统是嵌入式系统nand flash常用的文件系统,而nand flash(低成本)又是嵌入式系统中必不可少的存储器件。使用该文件系统前,uboot需通过make menuconfig使能以下宏:

#define CONFIG_MTD_DEVICE
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_PARTITIONS
  1. 【ubi info l】当前分区详细信息, 注意其中的PEB代表可擦除的物理页个数,每个物理页大小128K

  2. 【ubifsmount】命令用于挂载nand flash的分区,只有挂载对应的分区,才能操作该分区上的文件。

# 查看卷标 rootfs 的分区
ubi part rootfs

# 挂载ubi0:rootfs
ubifsmount  ubi0:rootfs

# 列出根文件系统的文件
ubifsls
  1. 【ubifsload】命令用于加载文件到内存
# 将根文件系统下的 fstab 文件中的 1024 个字节加载到内存 0x80600000
ubifsload 0x80600000 etc/fstab 1024


boot 操作命令:

常用的跟 boot有关的命令有: bootm、 bootz和 boot。

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

tftp c2000000 uImage 
tftp c4000000 stm32mp157d-atk.dtb 
bootm c2000000 - c4000000

# 使用命令ext4load将 uImage 和 stm32mp157d-atk.dtb 文件拷贝到 DRAM
ext4load mmc 1:2 c2000000 uImage 
ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb 
bootm c2000000 - c4000000
  1. 【bootz】命令用于启动 zImage 镜像文件
bootz [addr [initrd[:size]] [fdt]]
  1. 【boot】命令用于启动 Linux 系统,只是 boot会读取环境变量 bootcmd来启动 Linux系统,bootcmd 是一个很重要的环境变量!这个环境变量保存着引导命令,其实就是多条启动命令的集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftp 命令从网络启动Linux那么就可以设置bootcmd。
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 -c4000000' 
saveenv 
boot


# sd卡和emmc共存启动时,需先通过 mmv dev 1 切换成相应的启动设备
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000' 
saveenv
boot


UMS 命令:

在 uboot 下我们可以将开发板(SD卡或者eMMC)虚拟成一个U盘,我们可以选择使用哪个 Flash 作为这个U盘的存储器。当我们将 eMMC 虚拟成U盘以后就可以直接在电脑上向开发板拷贝文件了,比如我们在产品开发阶段,就可以直接在 uboot下将某个文件拷贝到开发板的根文件系统中,这样就不需要进入系统或者通过网络来替换文件。

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

ums 0 mmc 1   # 既然 Windows 不支持 ext4 格式


其他常用命令:

  1. 【reset】复位重启
  2. 【go】跳到指定的地址处执行应用
  3. 【run】运行环境变量中定义的命令,run命令最大的作用在于运行我们自定义的环境变量
setenv mybootnet 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 -(有空格) c4000000' 
saveenv
run mybootnet
  1. 【mtest】内存读写测试命令
mtest [start [end [pattern [iterations]]]]

mtest C0000000 C0001000


uboot中最重要的两个环境变量:bootcmd和bootargs

  uboot中默认环境变量存放于 include/env_default.h

bootcmd

  保存着uboot默认命令,uboot倒计时结束以后就会执行bootcmd中的命令,如果bootcmd 值为空,uboot则会使用默认的值来设置bootcmd环境变量。

bootargs

  保存着uboot传递给Linux内核的参数,比如指定Linux内核所使用的console、指定根文件系统所在的分区等,如下面bootargs环境变量值:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'  

# rootwait 表示等待设备初始化完成后再挂载
# rw表示根文件系统是可以读写的,不加rw的话可能无法在根文件系统中进行写操作,只能进行读操作。
# rootfstype 配合root一起使用,用于指定根文件系统类型,如果根文件系统为ext格式的话此选项无所谓。如果根文件系统是yaffs、jffs或ubifs的话就需要设置此选项,指定根文件系统的类型。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值