u-boot常用命令


uboot 的全称是Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot 是一个裸机代码,可以看作是一个裸机综合例程。

查看u-boot所支持的命令

进入uboot的命令行模式以后输入“ help”或者“?”,即可查看当前 uboot所支持的命令。

=> ?
?         - alias for 'help'
base      - print or set address offset
bdinfo    - print Board Info structure
blkcache  - block cache diagnostics and control
bootefi   - Boots an EFI payload from memory
bootelf   - Boot from an ELF image in memory
bootflow  - Boot flows
bootm     - boot application image from memory
bootp     - boot image via network using BOOTP/TFTP protocol
bootvx    - Boot vxWorks from an ELF image
bootz     - boot Linux zImage image from memory
cmp       - memory compare
cp        - memory copy
crc32     - checksum calculation
dhcp      - boot image via network using DHCP/TFTP protocol
echo      - echo args to console
env       - environment handling commands
erase     - erase FLASH memory
exit      - exit script
ext2load  - load binary file from a Ext2 filesystem
ext2ls    - list files in a directory (default /)
ext4load  - load binary file from a Ext4 filesystem
ext4ls    - list files in a directory (default /)
ext4size  - determine a file's size
false     - do nothing, unsuccessfully
fatinfo   - print information about filesystem
fatload   - load binary file from a dos filesystem
fatls     - list files in a directory (default /)
fatmkdir  - create a directory
fatrm     - delete a file
fatsize   - determine a file's size
fatwrite  - write file into a dos filesystem
fdt       - flattened device tree utility commands
flinfo    - print FLASH memory information
fstype    - Look up a filesystem type
fstypes   - List supported filesystem types
go        - start application at address 'addr'
help      - print command description/usage
iminfo    - print header information for application image
ln        - Create a symbolic link
load      - load binary file from a filesystem
loop      - infinite loop on address range
ls        - list files in a directory (default /)
md        - memory display
mii       - MII utility commands
mm        - memory modify (auto-incrementing address)
mmc       - MMC sub system
mmcinfo   - display MMC info
mw        - memory write (fill)
net       - NET sub-system
nm        - memory modify (constant address)
panic     - Panic with optional message
part      - disk partition related commands
ping      - send ICMP ECHO_REQUEST to network host
printenv  - print environment variables
protect   - enable or disable FLASH write protection
pxe       - commands to get and boot from pxe files
random    - fill memory with random pattern
reset     - Perform RESET of the CPU
run       - run commands in an environment variable
save      - save file to a filesystem
saveenv   - save environment variables to persistent storage
setenv    - set environment variables
showvar   - print local hushshell variables
size      - determine a file's size
source    - run script from memory
sysboot   - command to get and boot from syslinux files
test      - minimal test like /bin/sh
tftpboot  - load file via network using TFTP protocol
true      - do nothing, successfully
ubi       - ubi commands
ubifsload - load file from an UBIFS filesystem
ubifsls   - list files in a directory
ubifsmount- mount UBIFS volume
ubifsumount- unmount UBIFS volume
version   - print monitor, compiler and linker version

## 命令的具体使用方法
=> ? net
net - NET sub-system
Usage:
net list - list available devices

=> ? cp
cp - memory copy
Usage:
cp [.b, .w, .l, .q] source target count
=>

查询命令

u-boot版本

=> v
U-Boot 2022.10-rc5 (Nov 27 2022 - 21:35:46 +0800)

arm-linux-gnueabi-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
GNU ld (GNU Binutils for Ubuntu) 2.34

=> version
U-Boot 2022.10-rc5 (Nov 27 2022 - 21:35:46 +0800)

arm-linux-gnueabi-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
GNU ld (GNU Binutils for Ubuntu) 2.34
=>

环境变量

=> printenv
arch=arm
baudrate=38400
board=vexpress
board_name=vexpress
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootarm.efi; if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_efi_bootmgr=if fdt addr -q ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr;fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=mmc1 mmc0 pxe dhcp
bootargs=root=/dev/sda1 rw console=ttyAMA0,38400n8 mem=1024M mtdparts=armflash:1M@0x800000(uboot),7M@0x1000000(kernel),24M@0x2000000(initrd) mmci.fmax=190000 devtmpfs.mount=0 vmalloc=256M
bootcmd=run distro_bootcmd; run bootflash
bootcmd_dhcp=devtype=dhcp; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00010:UNDI:003000;setenv bootp_arch 0xa;if dhcp ${kernel_addr_r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_pxe=dhcp; if pxe get; then pxe boot; fi
bootdelay=2
bootfile=boot.scr.uimg
bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}
console=ttyAMA0,38400n8
cpu=armv7
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
dram=1024M
efi_dtb_prefixes=/ /dtb/ /dtb/current/
ethact=ethernet@3,02000000
ethaddr=52:54:00:12:34:56
fdt_addr_r=0x60000000
fdtcontroladdr=7ffdff80
fdtfile=vexpress-v2p-ca9.dtb
flashargs=setenv bootargs root=${root} console=${console} mem=${dram} mtdparts=${mtd} mmci.fmax=190000 devtmpfs.mount=0  vmalloc=256M
kernel_addr_r=0x60100000
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr=0x90000000
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
mtd=armflash:1M@0x800000(uboot),7M@0x1000000(kernel),24M@0x2000000(initrd)
root=/dev/sda1 rw
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;run boot_efi_bootmgr;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootarm.efi; then echo Found EFI removable media binary efi/boot/bootarm.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
stderr=serial
stdin=serial
stdout=serial
ubifs_boot=if ubi part ${bootubipart} ${bootubioff} && ubifsmount ubi0:${bootubivol}; then devtype=ubi; devnum=ubi0; bootfstype=ubifs; distro_bootpart=${bootubivol}; run scan_dev_for_boot; ubifsumount; fi
vendor=armltd

Environment size: 4419/262140 bytes
=>

板子相关信息

=> bdinfo
boot_params = 0x60002000
DRAM bank   = 0x00000000
-> start    = 0x60000000
-> size     = 0x20000000
DRAM bank   = 0x00000001
-> start    = 0x80000000
-> size     = 0x00000004
flashstart  = 0x40000000
flashsize   = 0x04000000
flashoffset = 0x00000000
baudrate    = 38400 bps
relocaddr   = 0x7ff67000
reloc off   = 0x1f767000
Build       = 32-bit
current eth = ethernet@3,02000000
ethaddr     = 52:54:00:12:34:56
IP addr     = <NULL>
fdt_blob    = 0x7ffdff80
new_fdt     = 0x00000000
fdt_size    = 0x00000000
lmb_dump_all:
 memory.cnt  = 0x1
 memory[0]      [0x60000000-0x80000003], 0x20000004 bytes flags: 0
 reserved.cnt  = 0x2
 reserved[0]    [0x4c000000-0x4c7fffff], 0x00800000 bytes flags: 4
 reserved[1]    [0x7fb22c78-0x7fffffff], 0x004dd388 bytes flags: 0
devicetree  = embed
arch_number = 0x000008e0
TLB addr    = 0x7fff0000
irq_sp      = 0x7fb26eb0
sp start    = 0x7fb26ea0
Early malloc usage: 370 / 400

环境变量操作

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

# setenv的格式,可用于修改环境变量,也可用于新建环境变量
setenv "命令" "值1 值2 值3"  或者
setenv name value               # 第1个参数是环境变量的名称。
								# 第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。
	# 修改bootdelay 
    setenv bootdelay 0    # 环境变量bootdelay设置为0
    saveenv               # 将DRAM中的变量保存到flash, Saving Environment to NAND

	## 新建abc
    setenv abc 'ttyAMA1,11520 root=/dev/mmcblk2p2 rootwait rw ’
    saveenv

	## 删除abc
    setenv abc
    saveenv

内存操作

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

  • 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,也就是 202=40 个字节;
    	## 如果显示格式为.l 的话就表示 20 个 long,也就是 204=80 个字节。另外要注意:
    # 注意uboot 命令中的数字都是十六进制的!不是十进制的!
    
    # 查看以 0X80000000 为起始地址的内存数据
    md.b 80000000 10 # 以.b 格式显示,长度为 0x10,也就是 16 个字节
    md.w 80000000 10 # 以.w 格式显示,长度为 0x10,也就是 16*2=32个字节
    md.l 80000000 10 # 以.l 格式显示,长度也是 0x10,也就是 16*4=64 个字节
    
    在这里插入图片描述
    在这里插入图片描述
  • nm
    nm 命令用于修改指定地址的内存值。
nm [.b, .w, .l] address

=> nm.b 60000000
60000000: 00 ? 12
60000000: 12 ?
60000000: 12 ? q

nm.l 60003000  // 再输入要修改后的数据 0x12345678
  • mm
    mm 命令用于修改指定地址的内存值 (修改内存值的时候地址会自增), 而使用命令 nm 的话地址不会自增。

    mm [.b, .w, .l] address
    
    mm.l 80000000  // 再连续输入要修改后的数据, 直到输入q退出
    
  • mv
    mw 使用一个指定的数据填充一段内存。

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

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

    cmp [.b, .w, .l] addr1 addr2 count
    
    => cmp.l 60000000 60003000 10
    word at 0x60000000 (0x12) != word at 0x60003000 (0x00)
    Total of 0 word(s) were the same
    =>
    

网络操作

开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,保证开发板和主机能够ping通(因为uboot ping中不会反馈信息,故只能使用开发板ping主机)。
uboot 网络环境变量设置如下:


setenv ipaddr 192.168.1.80       # 开发板IP,可以不设置,dhcp命令从路由器获取ip
setenv ethaddr 02:04:9f:04:d2:35 # 开发板的MAC
setenv gatewayip 192.168.1.1     # 网关地址
setenv netmask 255.255.240.0     # 子网掩码
setenv serverip 192.168.1.240    # 服务器IP,
saveenv
  • dhcp 命令
    dhcp 用于从路由器获取 IP 地址,前提得开发连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址。

    dhcp [loadAddress] [[hostIPaddr:] bootfilename]     # 或者直接 dhcp 获取该网络的IP
    
  • nfs 命令
    nfs 也就是网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。

    一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X60800000 地址处,命令如下:

    nfs 60800000 192.168.1.150:/home/abc/nfs/zImage
    
    nfs [loadAddress] [[hostIPaddr:]bootfilename]
    # 前提是电脑主机必须搭建 nfs 服务,并将需要 nfs 传输的文件放入指定目录 
    # 注意nfs传输文件的权限: chmod 777 /home/abc/nfs/*
    
  • tftp 命令
    tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa、xinetd,命令如下:

    sudo apt install tftp-hpa tftpd-hpa xinetd
    mkdir /home/tftpboot
    chmod 777 /home/tftpboot
    
    # 最后配置 tftp,打开文件安装完成以后新建文件/etc/xinetd.d/tftp
     server tftp
    {
    	 socket_type = dgram
    	 protocol = udp
    	 wait = yes
    	 user = root
    	 server = /usr/sbin/in.tftpd
    	 server_args = -s /home/tftpboot/
    	 disable = no
    	 per_source = 11
    	 cps = 100 2
    	 flags = IPv4
    }
    # 完了以后启动 tftp 服务
    sudo service tftpd-hpa start
    
    # 修改配置文件:/etc/default/tftpd-hpa
    TFTP_USENAME="tftp"
    TFTP_DIRECTORY="/home/tftpboot"
    TFTP_ADDRESS="0.0.0.0:69"
    TFTP_OPTIONS="-l -c -s"
    # TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,
    	# 后面所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
    
    #最后输入如下命令, 重启 tftp 服务器:
    sudo service tftpd-hpa restart
    
    tftp[loadAddress] [[hostIPaddr:]bootfilename]
    # 前提是电脑主机必须搭建 tftp服务,并将需要 tftp传输的文件放入指定目录
    # 注意 tftp 传输文件的权限: chmod 777 /home/tftp/*
    # loadAddress 是文件在DRAM中的存放地址
    # [[hostIPaddr:]bootfilename]是要从Ubuntu中下载的文件。
    # 和 nfs 命令的区别在于,tftp 命令不需要输入文件在Ubuntu中的完整路径,只需要输入文件名即可。
    
    tftp 60003000 zImage   # 可以不需要完整路径
    # tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处
    

EMMC和 SD卡操作

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

命令描述
mmc info命令输出当前选中的 mmc info 设备的信息
mmc rescan命令用于扫描当前开发板上所有的 MMC 设备
mmc list命令用于来查看当前开发板一共有几个 MMC 设备
mmc dev命令用于切换当前MMC 设备
mmc part命令查看EMMC或SD卡的分区情况
mmc read命令用于读取mmc设备的数据
mmc write命令将数据写到MMC设备里面
mmc erase命令用于擦除MMC设备的指定块
mmc setdsr设置DSR寄存器的值

加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC。默认会将 EMMC设置为当前MMC设备,这就是为什么输入“mmc info”查询到的是EMMC设备信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD卡设置为当前的MMC设备。mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]


mmc dev 0 //切换到 SD 卡, 0 为 SD 卡, 1 为 eMMC


# 有时候 SD 卡或者 EMMC 会有多个分区,
# 第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,
# 第 2 个分区存放根文件系统。
# 要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下
mmc write addr blk# cnt
# 可以先通过nfs或者tftp将主机文件拷入DRAM,在通过该命令将DRAM中的数据传入SD或eMMC设备
# addr 是要写入 MMC 中的数据在 DRAM 中的起始地址, blk 是要写入 MMC 的块起始地址(十六进制), cnt 是要写入的块大小,一个块为 512 字节。

# 通过nfs或tftp命令将新的u-boot.bin下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中。先查看一下SD卡中的 uboot 版本号,注意编译时间,输入命令:
mmc dev 0 //切换到 SD 卡
version //查看版本号

# 可以使用命令mmc write来升级uboot,也就是在uboot中更新 uboot,
# 如果要在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 需要这一步!

# 不要写SD卡或者EMMC的前两个块(扇区),里面保存着分区表!

FAT 格式文件系统操作

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

  • fatinfo-用于查询指定 MMC 设置指定分区的文件系统信息

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

    fatls <interface> [<dev[:part]>] [directory]
    # interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区, 
    	## directory是要查询的目录。
    fatls mmc 1:1			# 查询 EMMC分区1中的所有的目录和文件
    
  • fstype-用于查看 MMC 设备某个分区的文件系统格式

    fstype <interface> <dev>:<part>
    
    fstype mmc 1:1			# 查询EMMC分区1的文件格式
    
  • fatload-用于将指定的文件读取到DRAM中

    fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
    # interface 为接口,比如 mmc,dev 是设备号,part 是分区,
    # addr 是保存在 DRAM 中的起始地址,filename 是要读取的文件名字。
    # bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。
    # pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。
    fatload mmc 1:1 80800000 zImage# 将EMMC分区1中的zImage文件读取到DRAM中的0X80800000地址处
    
    fatwrite mmc 1:1 80800000 zImage 0x676908
    # Image大小为6777096(0X676908)个字节,fatwrite将其写入到EMMC的分区1中,文件名字为zImage
    # 完成以后使用“fatls”命令查看一下 EMMC 分区 1 里面的文件
    fatls mmc 1:1
    

EXT格式文件系统操作

uboot 有ext2和ext4这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。这些命令的含义和使用与 fatload、 fatls 和 fatwrit一样,只是 ext2和ext4 都是针对ext文件系统的。比如 ext4ls 命令, EMMC 的分区2就是 ext4格式的,使用 ext4ls 就可以查询 EMMC 的分区 2 中的文件和目录。

ext4ls <interface> [<dev[:part]>] [directory]
ext4ls mmc 1:2			# 查询 EMMC 分区2中的所有的目录和文件

ext4load <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
ext4load mmc 1:2 C2000000 uImage # 将eMMC分区2中的uImage文件读取到DRAM中的0XC2000000 地址处

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
  • ubi info l -当前分区详细信息, 注意其中的PEB代表可擦除的物理页个数,每个物理页大小128K
  • ubifsmoun t-命令用于挂载nand flash的分区,只有挂载对应的分区,才能操作该分区上的文件。
  • ubifsload -命令用于加载文件到内存
=> ubi
ubi - ubi commands

Usage:
ubi detach - detach ubi from a mtd partition
ubi part [part] [offset]
 - Show or set current partition (with optional VID header offset)
ubi info [l[ayout]] - Display volume and ubi layout information
ubi check volumename - check if volumename exists
ubi create[vol] volume [size] [type] [id] [--skipcheck]
 - create volume name with size ('-' for maximum available size)
ubi write[vol] address volume size - Write volume from address with size
ubi write.part address volume size [fullsize]
 - Write part of a volume from address
ubi read[vol] address volume [size] - Read volume to address with size
ubi remove[vol] volume - Remove volume
ubi skipcheck volume on/off - Set or clear skip_check flag in volume header
[Legends]
 volume: character name
 size: specified in bytes
 type: s[tatic] or d[ynamic] (default=dynamic)

boot 操作

uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot。

命令描述
bootz用于启动 zImage 镜像文件
bootm用于启动 uImage 镜像文件
boot用来启动 Linux 系统的

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 镜像文件,和bootz功能类似。

# 如果不使用设备树的话启动Linux内核的命令如下:
bootm addr
# addr是uImage镜像在DRAM中的首地址。

#如果要使用设备树,那么 bootm 命令和 bootz 一样,命令格式如下:
bootm [addr [initrd[:size]] [fdt]]
#其中addr是uImage在DRAM中的首地址
# initrd是initrd在DRAM中的地址的地址
# fdt是设备树(.dtb)文件在 DRAM 中的首地址,如果initrd为空的话,同样是用“-”来替代

# 例
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

boot

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统, bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。
比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统。

例如:
在这里插入图片描述
uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令。

参考:U-Boot命令之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格式

常用其他

  • reset 输入“reset”即可复位重启

  • go 用于跳到指定的地址处执行应用,

    # 命令格式如下:
    go addr [arg ...]
    # addr 是应用在 DRAM 中的首地址,通过 go 命令我们就可以在 uboot 中运行裸机实验
    
  • run 运行环境变量中定义的命令,run命令最大的作用在于运行我们自定义的环境变量
    可以通过“run bootcmd”来运行 bootcmd 中的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。在后面调试Linux 系统的时候常常要在网络启动和 EMMC/NAND 启动之间来回切换,而 bootcmd只能保存一种启动方式,如果要换另外一种启动方式的话就得重写bootcmd,会很麻烦。这里我们就可以通过自定义环境变量来实现不同的启动方式,比如定义环境变量mybootemmc表示从emmc 启动,定义mybootnet表示从网络启动,定义mybootnand 表示从 NAND 启动。如果要切换启动方式的话只需要运行“run mybootxxx(xxx 为 emmc、 net 或 nand)”即可。

    setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;;bootz 80800000 - 83000000'
    
    setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000100000;bootz 80800000 - 83000000'
    
    setenv mybootnet 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
    
    saveenv
    
    run mybootemmc
    run mytoobnand
    run mybootnet
    
  • mtest 内存读写测试命令

    mtest [start [end [pattern [iterations]]]]
    # start是要测试的DRAM 开始地址, 
    # end 是结束地址,
    # 比如我们测试 0X80000000~0X80001000这段内存,输入mtest 80000000 80001000
    

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的话就需要设置此选项,指定根文件系统的类型。

protect :对Flash 写保护的操作,可以使能和解除写保护

由于Nor Flash的烧写时序和SDRAM的写入不同,烧写Nor Flash 不能使用mm等命令,只能使用cp命令从内存拷贝到Nor Flash,而且烧写之前必须解除保护并擦除。

其他:

命令:
loadb   - load binary file over serial line (kermit mode)
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)

功能:以不同的协议从串口获取文件.。
格式基本都为:
load? [ off ] [ baud ]
第1个参数是下载到SDRAM的地址,如果不填,就是用默认配置:CONFIG_SYS_LOAD_ADDR
第2个参数是波特率,一般不填,用默认的115200.

参考

《Uboot常用命令总结》
史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值