u-boot常用命令

news2024/12/23 23:28:04

u-boot常用命令

  • 查看u-boot所支持的命令
  • 查询命令
    • u-boot版本
    • 环境变量
    • 板子相关信息
  • 环境变量操作
  • 内存操作
  • 网络操作
  • EMMC和 SD卡操作
  • FAT 格式文件系统操作
  • EXT格式文件系统操作
  • ubi格式文件系统操作
  • boot 操作
    • bootz
    • bootm
    • boot
  • UMS 命令
  • 常用其他
    • uboot环境变量:bootcmd和bootargs
    • protect :对Flash 写保护的操作,可以使能和解除写保护
  • 参考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础语法15-网络编程理论

网络编程是指在程序中实现两台计算机之间的通信。 Python提供了大量的内置模块和第三方模块用于支持各种网络访问&#xff0c;而且Python语言在网络通信方面的优点特别突出&#xff0c;远远领先其他语言。 一、IP: 1.概念&#xff1a; IP:互联网协议地址(Internet Protocol Add…

CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。

CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。 拓扑 – SRWE 最终 PT 技能评估 &#xff08;PTSA&#xff09; 拓扑图这样连 题目 SRWE Final PT Skills Assessment (PTSA) A few things to keep in mind while co…

大淘营淘宝复制的“添加、删除、替换属性”功能如何使用?

一、添加属性添加属性填写的格式为“属性名称:属性值”&#xff0c;“”是添加的意思。举个例子&#xff0c;比如我要添加的属性为“AA”&#xff0c;属性值为“aa”&#xff0c;那么&#xff0c;在软件上需要填“AA:aa”。注&#xff1a;“:”是半角字符&#xff0c;中间不要有…

嵌入式 程序调试之gdb和gdbserver的交叉编译及使用

嵌入式 程序调试之gdb和gdbserver的交叉编译及使用 一、简述 记--交叉编译gdb、gdbserver并调试嵌入式程序。 gdb是功能非常强大的常用调试工具&#xff0c;可以直接下断点进行单步调试&#xff0c;是差错排错的利器。 常见三种不同使用场景的gdb: x86 pc端gdb&#xff08;以下…

MyBatis ---- 自定义映射resultMap

MyBatis ---- 自定义映射resultMap1. resultMap处理字段和属性的映射关系2. 多对一映射处理a>级联方式处理映射关系b>使用association处理映射关系c>分布查询3. 一对多映射处理a>collectionb>分步查询1. resultMap处理字段和属性的映射关系 当实体类中的属性名…

一文详解数据链路相关技术

一文详解数据链路相关技术1.MAC地址2.共享介质型网络争用方式令牌传递3.非共享介质网络4.环路检测技术生成树方式源路由法5.VLAN1.MAC地址 MAC地址直译为媒体存取控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太…

云服务器使用及Linux基本命令

文章目录前言一、Linux1.Linux发现版本2.Linux环境搭建方式云服务器使用终端软件连接Linux3.Linux基础命令&#xff08;1&#xff09;ls:列出该目录下的所有子目录与文件。&#xff08;2&#xff09;pwd&#xff1a;显示当前所在用户&#xff08;3&#xff09;cd &#xff1a;改…

终于来了

程序员求职简历&#xff0c;项目经验怎么写&#xff1f;免费修改简历、提供模板并内部推荐昨天我还在说"三年了&#xff0c;乌云还未散尽&#xff0c;仿佛若有光"。今天一大早&#xff0c;光就照进来了。深圳卫健委宣布公交、地铁、药店、公园、旅游景点等场所都不需…

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…

Session和Cookie

回顾 1.Servlet API 2.HttpServlet DoXXX处理哪种Http方法会调用到对应的方法 init/destroy/service—>servlet的生命周期 3.HttpServletRequest Http请求 get系列方法 协议名&#xff08;版本号&#xff09; url query string header query String/body HttpServletRespon…

【配准和融合相互作用,交互】

RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion &#xff08;RFNet&#xff1a;一种互增强的多模态图像配准与融合的无监督网络&#xff09; 本文提出了一种在相互增强的框架RFNet中实现多模态图像配准与融合的新方法。我们…

第八章 集成学习

8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类系统、基于委员会的学习等。 下图显示出集成学习的一般结构&#xff1a;先产生一组个体学习器&#xff0c;再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训…

Redis实战——分布式锁

目录 1 一人一单并发安全问题 2 分布式锁的原理和实现 2.1 什么是分布式锁&#xff1f; 2.2 分布式锁的实现 1 一人一单并发安全问题 之前一人一单的业务使用的悲观锁&#xff0c;在分布式系统下&#xff0c;是无法生效的。 理想的情况下是这样的&#xff1a;一个线程成功…

计算机中数的表示和运算

定点数 编程时需要确定小数点位置难以表示两个大小相差较大的数存储空间利用率低 这种用二进制来表示十进制的编码方式&#xff0c;叫作BCD 编码&#xff08;Binary-Coded Decimal&#xff09;。 浮点数 小数点的位置可以左右移动的数 规格化浮点数: IEEE 754规格化的尾数…

基于Java+Swing+Mysql实现《黄金矿工》游戏

基于JavaSwingMysq实现《黄金矿工》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 《黄金矿工》游戏是一个经典的抓金子小游戏&#xff0c;它可以锻炼人的反应能力。。该游戏中&#xff0c;可以通过“挖矿”获得积分&#xff0c;游戏道具&#xff1a;有3瓶药水&#…

cubeIDE开发, 如何结合FreeRTOS开发STM32程序

一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统&#xff0c;STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中&#xff0c;所以移植及使用…

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的&#xff0c;通过锁升级的过程来完成加锁。&#xff08;https://blog.csdn.net/zhangting19921121/article/details/106002751&#xff09; 但是synchronized锁升级的过程犹如一个黑盒&#xff0c;我们无法掌控。因此&…

常见的损失函数

1. 损失函数、代价函数与目标函数 损失函数&#xff08;Loss Function&#xff09;&#xff1a;是定义在单个样本上的&#xff0c;是指一个样本的误差。   代价函数&#xff08;Cost Function&#xff09;&#xff1a;是定义在整个训练集上的&#xff0c;是所有样本误差的平均…

07_openstack之安全组与浮动IP

目录 一、环境准备 二、浮动IP 1、浮动IP介绍 2、创建和分配浮动IP 三、安全组 1、安全组介绍 2、创建安全组 3、给云主机绑定安全组 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xf…