u-boot常用命令

2023-11-06


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常用命令汇总(超全面!超详细!)收藏这一篇就够了;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

u-boot常用命令 的相关文章

  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 尝试映射大页面 (1GB) 时 mmap 失败

    我做了什么 使用 root 启用大页 我的系统支持 1MB 大页 echo 20 gt proc sys vm nr hugepages 将大页文件系统挂载到 mnt hugepages mount t hugetlbfs nodev mn
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 如何在维护数据的同时升级 docker 容器中的 postgres? 10.3 到最新的 10.x 或 12.x

    我的生产和本地主机中有一个 10 3 postgres docker 容器 在之前的一个question https stackoverflow com a 62789347 80353 我必须恢复在 10 5 中存档的转储 感谢您的回答
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 箭头键变成 Telnet 中的控制字符

    我在 Ubuntu 终端中 并通过 telnet 连接到服务器 现在每当我输入 up 时 它就会变成 A 其他箭头键也变成控制字符 有没有办法可以运行 telnet 以便它理解我的箭头键 这将是一个巨大的帮助 因为我想在我的命令历史记录中向
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 当我尝试在 ubuntu:18.04 中移动 /etc/resolv.conf 时,出现“设备或资源繁忙”。怎么解决呢?

    我的 Docker 容器中有一个 VPN 客户端 ubuntu 18 04 客户必须执行以下操作 mv etc resolv conf etc resolv conf orig 然后客户端应该创建新的 etc resolv conf与他们的
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理

随机推荐

  • pdf文件太大如何处理?教你pdf压缩简单方法

    PDF文件过大 是很多人在使用PDF文件时都遇到过的一个常见问题 过大的PDF文件不仅会占用大量的存储空间 还会影响文件传输和处理效率 下面给大家总结了几个方法 帮助大家解决PDF文件过大的问题 方法一 嗨格式压缩大师 这是一款专业的文件压
  • PSM:协议状态机(Protocol State Machine),一款用于流式传输的数据协议解析组件

    PSM 协议状态机 Protocol State Machine 一款用于流式传输的数据协议解析组件 介绍 PSM Protocol State Machine 协议状态机 一款用于流式传输的数据协议解析组件 可有效解决沾包 断帧问题 PS
  • 文字识别:Tesseract OCR

    一 安装并配置Tesseract 1 下载Tesseract OCR 网上直接下载即可 2 双击安装 选择所有人均可使用 避免权限问题 勾选最后一项添加语言包 但是全部勾选需要1 3G 可以点开加号 选择自己所需的语言包即可 注意 这里最好
  • 面试经典(4)--链表逆序

    题目 输入单链表的头结点 反转链表并输出反转之后的头结点 pNode代表当前节点 修改pNode的时候 要知道他的前面节点 并保存后面节点 因为一旦pNode gt next被修改 就和后边断开 ListNode reverse ListN
  • MySQL报错:this is incompatible with sql_mode=only_full_group_by

    错误场景 今天在自己电脑运行一个刚clone下来的项目 在登录完成进入主页的时候 报了一串this is incompatible with sql mode only full group by 错误 我很确定之前在公司电脑上是不会有这个
  • 如何命令杀死yarn的作业

    yarn application kill 命令即可kill掉
  • php安装swoole扩展(linux)

    在Linux中php安装swoole扩展 相关环境 LAMP或LNMP开发环境 L 指linux A 指Apache M 指MySQL P 指PHP N 指Nginx 下载swoole wget c https github com swo
  • 33 KVM管理设备-配置虚拟机PCIe控制器

    文章目录 33 KVM管理设备 配置虚拟机PCIe控制器 33 1 概述 33 2 配置PCIe Root PCIe Root Port和PCIe PCI Bridge 33 2 1 简化配置方法 33 2 1完整配制方法 33 KVM管理
  • 提供许可证到期新通知!标签管理软件BarTender v2019 R5上线!

    BarTender在150多个国家 地区拥有成千上百的用户 在标签 条形码 证卡和 RFID 标记的设计和打印领域是全球首屈一指的软件 BarTender既可以单独运行 也可以与任何其他程序集成 几乎是所有按需打印或打标应用的完美解决方案
  • 【网络编程】---C++实现原始套接字捕获数据包

    C 实现原始套接字捕获数据包 引言 原始套接字与TCP套接字和UDP套接字的区别 原始套接字编程使用的场合 原始套接字的通信过程 1 基于原始套接字的数据发送过程 2 基于原始套接字的数据接收过程 创建原始套接字 常用协议定义列表 使用原始
  • 显著性检测的四种经典方法

    最近闲来蛋痛 看了一些显著性检测的文章 只是简单的看看 并没有深入的研究 以下将研究的一些收获和经验共享 先从最简单的最容易实现的算法说起吧 1 LC算法 参考论文 Visual Attention Detection in Video S
  • angualr学习笔记3-angular模型(model)

    AngularJS ng model 指令 ng model 指令用于绑定应用程序数据到 HTML 控制器 input select textarea 的值 ng model 指令 ng model 指令可以将输入域的值与 AngularJ
  • 执行yum软件包索引步骤报错

    解决 进入目录 cd etc yum repos d 执行rm rf删除所有 rm rf 然后 yum update 重新设置yum源 curl o etc yum repos d CentOS Base repo http mirrors
  • 生活总是不经意给你开个玩笑_你在开玩笑的故事吗

    生活总是不经意给你开个玩笑 In 1994 Vincent Connare who had previously designed type at Apple and Agfa Compugraphic was working at Mic
  • js 异步执行_webpack模块化原理-异步加载模块

    在上篇文章中 我们介绍了 webpack 同步加载模块的原理 这篇文章 我们来介绍一下 webpack 异步加载模块 异步加载模块 还是先做一些准备工作 首先定义一个依赖模块 math js math js 采用 ES6 module 导出
  • 人工智能交互革命:探索ChatGPT的无限可能 第4章 ChatGPT-智能客服

    第4章ChatGPT 智能客服 4 1智能客服的定义与发展 智能客服是一种利用人工智能技术 为客户提供在线服务和支持的解决方案 它能够通过自然语言处理 机器学习等技术 识别和理解客户的问题 并提供针对性的解决方案 智能客服可以通过多种渠道提
  • Ajax、fetch、axios的区别与优缺点;axios跨域问题

    背景 前端的技术发展速度非常的快 异步请求也是其重要的体现之一 从最早的原生XHR 再到JqueryAjax的统治时代 再到近来 fetch axios等技术也开始出现并大量投入使用 原生Ajax Ajax是指一种创建交互式网页应用的网页开
  • 【软件工程】概要设计说明书

    概要设计说明书 1引言 1 1编写目的 这篇文章的编写目的主要是为了开发此系统为系统做一个总体的结构设计 经评审后进一步细化 分别对每一模块进行详细细化的解决方案 接口和数据库等方面的设计 明确描述所有输入输出参数 类型逻辑算法以及调用关系
  • DS二叉排序树之查找

    题目描述 给出一个数据序列 建立二叉排序树 并实现查找功能 对二叉排序树进行中序遍历 可以得到有序的数据序列 输入 第一行输入t 表示有t个数据序列 第二行输入n 表示首个序列包含n个数据 第三行输入n个数据 都是自然数且互不相同 数据之间
  • u-boot常用命令

    u boot常用命令 查看u boot所支持的命令 查询命令 u boot版本 环境变量 板子相关信息 环境变量操作 内存操作 网络操作 EMMC和 SD卡操作 FAT 格式文件系统操作 EXT格式文件系统操作 ubi格式文件系统操作 bo