u-boot命令详解

u-boot简介

  u-boot 属于bootloader的一种,它是一款功能强大的开源引导加载程序,它是用C和汇编语言编写的,因此可以在多个平台和架构上使用。它是嵌入式系统开发中的一个强大工具,可用于将固件加载到设备中,以及进行各种常规任务。本篇博客将对U-Boot命令进行详解,以便读者更好地了解和使用该工具。

uboot命令类似于linux行缓冲命令行,当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我换没有输入完),当我们按下回车键(换行)后,系统就认为我没问你输入完了,然后将缓冲区中所有刚才输入的命令拿去处理。

思路拓展
linux终端设计有3种缓冲机制:

  • 无缓冲(输入一个执行一个);
  • 行缓冲(看回车);
  • 全缓冲(按什么都没用,全部缓存下来,当缓冲区满的时候才处理)

u-boot常用命令

1. 帮助【help / ?】

直接使用help或“?”可以查看当前uboot支持的命令
在这里插入图片描述
使用 help +其他命令可以查看命令的使用说明,示例:help + mmc
在这里插入图片描述

2. 查看开发板信息【bdinfo】

Exynos5422 # bdinfo
arch_number = 0x00001F42      # 架构的编号
boot_params = 0x40000100      # boot参数的地址
DRAM bank   = 0x00000000      
-> start    = 0x40000000      # DDR起始地址
-> size     = 0x10000000      # DDR大小==>256M
DRAM bank   = 0x00000001
-> start    = 0x50000000
-> size     = 0x10000000
...
eth0name    = FEC1			  # 网卡名字
ethaddr     = (not set)		  # 网卡地址(目前未设置)
current eth = FEC1			  # 当前使用的网卡名称        
ip_addr     = <NULL>          # ip地址
baudrate    = 115200 bps      # 波特率
TLB addr    = 0xBE9F0000
relocaddr   = 0xBE91F000
reloc off   = 0x7AB1F000
irq_sp      = 0xB99131C0
sp start    = 0xB99131B0
Board Type  = 4
Early malloc usage: 1f8 / 400

3. 环境变量操作:printenv、setenv、saveenv命令

printenv和setenv命令用于打印和设置U-Boot环境变量。环境变量是U-Boot管理的一组全局变量,它们可以存储启动和运行设备所需的信息,如根文件系统位置、内核命令行参数等。以下是使用这些命令的示例:
printenv - print environment variables
setenv - set environment variables

例如,如果需要设置U-Boot中的IP地址和TFTP服务器地址变量,可以使用以下命令行:

setenv ipaddr 192.168.1.10
setenv serverip 192.168.1.20

设置完环境变量记得保存!!这里使用保存环境变量【saveenv】命令:

Exynos5422 # setenv ipaddr 192.168.1.10
Exynos5422 #
Exynos5422 # saveenv
Saving Environment to MMC...
Writing to MMC(0)... done
Exynos5422 #

4. mmc命令

uboot 支持 EMMC 和 SD 卡,常用于操作 MMC 设备的命令为“mmc”;
mmc 是一系列的命令,其后可以跟不同的参数,输入“help mmc”即可查看 mmc 有关的命令,如下图所示:
在这里插入图片描述
从上图可以看出, mmc 后面跟不同的参数可以实现不同的功能,如下表所示:

命令描述
mmc info输出 MMC 设备信息
mmc read addr blk# cnt读取 MMC 中的数据
mmc write addr blk# cnt向 MMC 设备写入数据
mmc erase blk# cnt对MMC设备擦除操作
mmc rescan重新搜索mmc设备
mmc part列出 MMC 设备的分区
mmc dev [dev] [part]查看当前的设备号,或者切换设备号及分区,跳至该设备号及分区
mmc list列出当前有效的所有 MMC 设备
mmc rst复位 MMC 设备
mmc setdsr设置 DSR 寄存器的值

4.1 mmc info

mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可,如下所示:

Exynos5422 # mmc info
Device: EXYNOS DWMMC    # 当前选中设备
Manufacturer ID: 15     # 制造商ID
OEM: 100                # 原始制造商
Name: 8GTF4             # 名称
Tran Speed: 52000000    # 传输速度,即52MHz
Rd Block Len: 512       # 最大读取数据块长
MMC version 5.1         # MMC版本
High Capacity: Yes      # 是否高容量
Capacity: 115.3 GiB     # 容量大小
Bus Width: 8-bit DDR    # 总线宽度(8位)
Erase Group Size: 512 KiB    # 擦除块大小
HC WP Group Size: 16 MiB
User Capacity: 115.3 GiB WRREL
Boot Capacity: 4 MiB
RPMB Capacity: 4 MiB

4.2 mmc list

mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”,如下所示:

Exynos5422 # mmc list
EXYNOS DWMMC: 0 (SD)
EXYNOS DWMMC: 1 (eMMC)

4.3 mmc dev

mmc dev 命令用于切换当前 MMC 设备,命令如下所示:

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

4.4 mmc part

有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:

=> mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     1957888         13276486        e7563509-01     83
  2     196608          1761280         e7563509-02     83

4.5 mmc read/write

读取分区中第600个块开始的 10个块的数据到DDR的 80800000 地址
=> mmc read 80800000 600 10
MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK

然后读取DDR的数据
=> md.l 80800000 10
80800000: 6c5bac96 64756162 65746172 3531313d    ..[lbaudrate=115
80800010: 00303032 72616f62 616e5f64 453d656d    200.board_name=E
80800020: 62004b56 6472616f 7665725f 5834313d    VK.board_rev=14X
80800030: 62003431 5f746f6f 3d746466 00797274    14.boot_fdt=try.

mmc erase blk# cnt
参数:
blk: 擦除的mmc中block位置,这个位置是mmc的0地址的偏移量,是16进制,block单位是512字节
cnt: 擦除的mmc中block个数,是16进制,block单位是512字节

4.6 在线更新u-boot

1、切换到emmc 的第0分区
=> mmc dev 1 0
switch to partitions #0, OK
mmc1(part 0) is current device
=>

2、从tftp下载 u-boot.imx 到内存 80800000
=> tftp 80800000 u-boot.imx
Using FEC1 device
TFTP from server 192.168.3.25; our IP address is 192.168.3.22
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #########################
         1.7 MiB/s
done
Bytes transferred = 363520 (58c00 hex)
=> 

3、将内存的数据写到emmc的第0分区第2个块
//为什么是 2C6 ?上一步骤我们下载的u-boot.imx为 363520 个字节,353520/512=710块,十六进制为2C6 (如果有小数需要+1)
=> mmc write 80800000 2 2C6
MMC write: dev # 1, block # 2, count 710... 710blocks written: OK
=>

4、分区设置
=> mmc partconf 1 1 0 0
=>

5、重启
=> reset
resetting ...

5. u-boot内存操作命令

内存操作命令就是用于直接对内存操作命令,常用内存命令有md、nm、 mm、mw、cp和 cmp

5.1 显示内存值【md】

命令格式:
md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、word 和long,也就是分别以 1 个字节、2 个字节、4 个字节

示例如下:

如查看以0X80000000开始的20个字节的内存值,显示格式为.b(20的16进制是0x14)
=> md.b 80000000 14
80000000: 1a 01 2c 00 26 00 07 00 0e 01 22 02 76 74 31 30    ..,.&.....".vt10
80000010: 30 7c 76 74                                        0|vt
=>

md.w操作:
=> md.w 80000000 25
80000000: 011a 002c 0026 0007 010e 0222 7476 3031    ..,.&.....".vt10
80000010: 7c30 7476 3031 2d30 6d61 647c 6365 7620    0|vt100-am|dec v
80000020: 3174 3030 2820 2f77 6461 6176 636e 6465    t100 (w/advanced
80000030: 7620 6469 6f65 0029 0100 0000 0001 0000     video).........
80000040: 0000 0000 0000 0001 0000                   ..........
=>

5.2 修改内存值【nm】

命令格式:
nm [.b, .w, .l] address
如修改地址 80000000 的内容为 11111112,
它会先读取地址里面原来的内容,在?后面修改新值,输入q退出修改
=> nm.l 80000000
80000000: 002c011a ? 11111112
80000000: 11111112 ? q
=> 
验证:
=> md.l 80000000 1
80000000: 11111112           
=> 

5.3修改内存值(自增)【mm】

=> mm.l 80000000
80000000: 11111111 ? 11111111	# 修改为11111111
80000004: 00070026 ? 22222222	# 修改为22222222
80000008: 0222010e ? 33333333	# 修改为33333333
8000000c: 30317476 ? q			# 退出
=>

验证:
=> md.l 80000000 3
80000000: 11111111 22222222 33333333             ....""""3333
=>

5.4 快速填充内存【nw】

命令格式:
mw [.b, .w, .l] address value [count]
如将 80000000  地址后面的10个l长度都修改为ffffffff
=> mw.l 80000000 ffffffff 10

验证:
=> md.l 80000000 10
80000000: ffffffff ffffffff ffffffff ffffffff    ................
80000010: ffffffff ffffffff ffffffff ffffffff    ................
80000020: ffffffff ffffffff ffffffff ffffffff    ................
80000030: ffffffff ffffffff ffffffff ffffffff    ................
=> 

5.5 数据拷贝【cp】

将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把NorFlash 中的数据拷贝到DRAM 中

命令格式:
cp [.b, .w, .l] source target count           #从哪里到哪里,多长
现在 80000000 ~ 8000003f 都是 ffffffff,将其拷贝到80000040 ~ 8000007f
=> md.l 80000000 20
80000000: ffffffff ffffffff ffffffff ffffffff    ................
80000010: ffffffff ffffffff ffffffff ffffffff    ................
80000020: ffffffff ffffffff ffffffff ffffffff    ................
80000030: ffffffff ffffffff ffffffff ffffffff    ................
80000040: 00000000 00010000 00000000 00010001    ................
80000050: 00000000 00000000 00000000 00500100    ..............P.
80000060: 00180008 ffffffff 0003ffff 0000ffff    ................
80000070: 00040002 001a0015 002e0026 ffffffff    ........&.......
=>
=> cp.l 80000000 80000040 10
=>

验证:80000000 ~ 8000007f都是 ffffffff
=> md.l 80000000 20
80000000: ffffffff ffffffff ffffffff ffffffff    ................
80000010: ffffffff ffffffff ffffffff ffffffff    ................
80000020: ffffffff ffffffff ffffffff ffffffff    ................
80000030: ffffffff ffffffff ffffffff ffffffff    ................
80000040: ffffffff ffffffff ffffffff ffffffff    ................
80000050: ffffffff ffffffff ffffffff ffffffff    ................
80000060: ffffffff ffffffff ffffffff ffffffff    ................
80000070: ffffffff ffffffff ffffffff ffffffff    ................
=>

5.6 数据比较【cmp】

cmp 是比较命令,用于比较两段内存的数据是否相等

命令格式
cmp [.b, .w, .l] addr1 addr2 count 
=> md.l 80000000 2
80000000: ffffffff ffffffff                      ........
=> cmp.l 80000000 80000004 1
Total of 1 word(s) were the same

6. u-boot网络操作命令

uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 的时候需要使用到uboot 的网络功能做调试.

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

在测试前一定需要设置ethaddr(网卡地址)

=> setenv ethaddr 00:11:22:33:44:55
=> saveenv
Saving Environment to MMC...
Writing to MMC(1)... done
=> 

自动获取ip【dhcp】

=> dhcp
BOOTP broadcast 1
*** Unhandled DHCP Option in OFFER/ACK: 213
DHCP client bound to address 192.168.3.22 (48 ms)
*** Warning: no boot file name; using 'C0A80316.img'
Using FEC1 device
TFTP from server 0.0.0.0; our IP address is 192.168.3.22; sending through gateway 192.168.3.1
Filename 'C0A80316.img'.
Load address: 0x80800000
Loading: T T T T T T T T T T
Retry count exceeded; starting again
=>

测试网络【ping】

测试存在的IP地址
=> ping 192.168.3.1
Using FEC1 device
host 192.168.3.1 is alive
=> 

网络文件系统【nfs】
前提是先配置nfs服务器

命令格式:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。

7. 文件传输【tftp】

(1)一般是ubuntu从主机上下载东西的,uboot本身主要的目标是启动内核,为了完成启动内核必须要能够部署内核,uboot要部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中,uboot如何从我们的主机(ubuntu后者windows)?有很多种方式,主流方式是:fastboot和tftpfastboot是通过USB线进行数据传输;tftp是通过有线网络进行数据传输。典型的方式就是通过tftp;fastboot是近些年才推出来的。

(2)tftp方式下载时,实际上uboot扮演的是tftp客户端程序角色,主机windows或虚拟机ubuntu中必须有一个tftp服务器,然后将要下载的镜像文件放在服务器的下载目录中,然后开发板使用ubuntu的tftp命令下载即可。

(3)虚拟机搭建的时候,我们设置tftp下载目录是/tftpboot,将被下载的镜像(zImage-qt)复制到这个目录下。

(4)然后再开发板的uboot下,先ping通我们的ubuntu,然后尝试下载:tftp 0x30000000 zImage-qt(将服务器上名为zImage-qt的文件下载到开发板的0x30000000开始的地址处)我们uboot开发板上IP下载地址从0x30000000到0x50000000,之间的地址都行。

(5)检查开发板的uboot环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(serverip这个环境变量的意义就是主机tftp服务器的ip地址)

(6)然后在开发板的uboot环境下先Ping通虚拟机Ubuntu,然后尝试下载:tftp 0x30000000 zImage-qt。

(7)镜像下载到开发板内存DDR中后,uboot就可以用movi指令进行镜像的烧写了。

注意:
1)如果你是用的windows下的tftp服务器,那uboot的serverip就要设置为和windwos下tftp服务器的ip地址一样(windows下的tftp服务器软件设置的时候就有个步骤是让你设置服务器的ip地址,这个ip地址和主机windows必须在一个网段)。
2)整个过程中间环节比较多,实际做的时候可能最后会下载不下来。这时候可能的问题非常多,不要问我,自己对照视频课程讲的思路来排查。(譬如:第一步应该先保证uboot和ubuntu可以ping通;第二步再保证ubuntu中tftp服务器搭建没错;第三步再实现tftp下载。如果第一步有问题参考网络设置部分,第二步有问题(tftp本地测试下载ok,但是开发板就是不行),有一个解决方案就是使用windows下的tftp服务器)

uboot命令格式:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是文件在 DRAM 中的存放地址,[[hostIPaddr:]bootfilename]是要从Ubuntu 中下载的文件。
但tftp 命令不需要输入文件在Ubuntu 中的完整路径,只需要输入文件名即可。
如获取服务器上的zImage:

=> tftp 80800000 zImage
Using FEC1 device
TFTP from server 192.168.3.25; our IP address is 192.168.3.22
Filename 'zImage'.
Load address: 0x80800000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #########################################################
         1.4 MiB/s
done
Bytes transferred = 5600408 (557498 hex)
=>

8. 其他命令

复位【reset】
就是重启的意思

跳转执行【go】
go 命令用于跳到指定的地址处执行应用。

命令格式如下: 
go addr [arg ...] 
如使用go 命令启动 printf.bin 这个应用
=> tftp 87800000 printf.bin 
=> go 87800000 

运行环境变量中定义的命令【run】
将命令挡在一个集合,设置环境变量,然后通过run执行
示例:

run copy_uboot_sd2emmc      # 将SD卡中的u-boot镜像拷贝到eMMC当中
Exynos5422 # run copy_uboot_sd2emmc
** First descriptor is NOT a primary desc on 0:1 **
switch to partitions #0, OK
mmc0 is current device

MMC read: dev # 0, block # 1, count 2014 ... 2014 blocks read: OK
switch to partitions #0, OK
mmc1(part 0) is current device
eMMC OPEN Success.!!
                        !!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!

MMC write: dev # 1, block # 0, count 2014 ... 2014 blocks written: OK
eMMC CLOSE Success.!!
** First descriptor is NOT a primary desc on 0:1 **
switch to partitions #0, OK
mmc0 is current device
switch to partitions #0, OK
mmc1(part 0) is current device

MMC write: dev # 1, block # 2015, count 32 ... 32 blocks written: OK
** First descriptor is NOT a primary desc on 0:1 **
switch to partitions #0, OK
mmc0 is current device
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逆鳞_Kevin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值