uboot使用命令整理(2016.03)

学向勤中得,萤窗万卷书。这篇文章主要讲述uboot使用命令整理(2016.03)相关的知识,希望能为你提供帮助。




文章目录


  • ??一、uboot启动信息??
  • ??二、uboot使用命令??


??1. 帮助命令????2. 信息查询类命令????3. 环境变量操作命令????4. 内存类操作命令(DRAM)????4. 网络相关命令????5. eMMC/SD card相关操作命令????6. FAT格式文件系统操作命令????7. EXT格式文件系统操作命令????8. Nand设备操作命令????9. 启动常用操作命令????10. 其它常用命令??




一、uboot启动信息系统启动时,按下任意键进入uboot命令行:
uboot使用命令整理(2016.03)

文章图片


  • uboot版本和编译时间:2016.03
  • CPU型号和主频
  • CPU类型:工业级
  • 复位原因:POR
  • 板子名称:MX6ULL 14x14 EVK
  • I2C:就绪
  • DRAM大小:512MB
  • MMC:有两个控制器,就绪
  • LCD型号:ATK 7寸LCD,1024*600分辨率,24位色彩深度(RGB888)
  • 标准输入:串口
  • 标准输出:串口
  • 标准错误:串口
  • 切换到eMMC的第0个分区上,并使用eMMC
  • 网口:使用FEC1
  • 用户提示:正常启动,uboot将从eMMC中读取环境变量和参数信息,准备启动linux内核
  • 倒计时:3s,等待用户按下任意键,若按下则进入命令行,否则正常启动

二、uboot使用命令 1. 帮助命令


uboot中可用的命令在移植时是?用户可配置?的。


(1)查看当前可用命令:
help

(2)查看某条命令使用帮助:
help bootz

uboot使用命令整理(2016.03)

文章图片

2. 信息查询类命令(1)查看板子信息
bdinfo

uboot使用命令整理(2016.03)

文章图片

(3)查看uboot版本号
version

uboot使用命令整理(2016.03)

文章图片

当前uboot版本号是2016.03,编译时间为20200115,编译器为arm-poky-linux-gnueabi-gcc 5.3.0。
3. 环境变量操作命令(1)打印环境变量
print
printenv

uboot使用命令整理(2016.03)

文章图片

(2)打印指定环境变量的值
printenv < 环境变量名称>

(3)修改环境变量(修改DRAM中的加载值)
setenv < 环境变量名称> < 值>

如果值中有空格,则需要用单引号引起来:
uboot使用命令整理(2016.03)

文章图片

(4)保存环境变量(修改Flash中保存的值)
saveenv

uboot使用命令整理(2016.03)

文章图片

(5)新建环境变量
setenv < 新的环境变量名称> < 环境变量值>
saveenv

(6)删除环境变量
setenv < 要删除的环境变量名称>
saveenv

4. 内存类操作命令(DRAM)

  • uboot中的数值都是?十六进制?的,可以不用加0x
  • uboot中的数据长度是?以个为单位,而不是字节?

(1)显示内存值
md[.b .w .l] address [#of objects]


  • ??.b .w .l??:按byte查看(1B)、按word查看(2B)、按long查看(4B)
  • ??address??:要查看的内存地址
  • ??# of objects??:数据长度

eg. 查看以0x80000000开始的?20个内存值?:
uboot使用命令整理(2016.03)

文章图片

(2)修改指定地址的内存值(地址不会自增)
nm[.b .w .l] address

eg. 修改0x80000000地址处的数据为0x12345678:
uboot使用命令整理(2016.03)

文章图片

(3)修改指定地址的内存值(地址自增)
mm[.b .w .l] address

【uboot使用命令整理(2016.03)】eg. 修改0x80000000开始的三个连续long数据(3*4=12B):
uboot使用命令整理(2016.03)

文章图片

(4)使用指定数据填充一段内存
mw[.b .w .l] address value [count]

eg. 同样修改0x80000000开始的三个连续long数据(3*4=12B)为一样的值:
uboot使用命令整理(2016.03)

文章图片

(5)拷贝数据
该命令有两个作用:

  • 将DRAM中的数据从一段内存拷贝到另一段内存中
  • 将Nor Flash中的数据拷贝到DRAM中

cp [.b .w .l] source target count

eg. 将0x80000000处的数据拷贝到0x80000100处,长度为0x10个内存块(16 * 4 = 64B):
uboot使用命令整理(2016.03)

文章图片

(6)比较两段内存的数据是否相等
cmp[.b .w .l] addr addr2 count

eg. 比较刚刚拷贝的两段数据是否相等:
uboot使用命令整理(2016.03)

文章图片

4. 网络相关命令(1)网络环境设置
在使用网络之前需要先搭建网络环境,设置以下环境变量:
uboot使用命令整理(2016.03)

文章图片

这里设置如下:
uboot使用命令整理(2016.03)

文章图片

修改ubuntu主机地址:
uboot使用命令整理(2016.03)

文章图片

(2)ping命令
ping < ip>

开发板中ping windows主机:
uboot使用命令整理(2016.03)

文章图片

开发板中ping ubuntu主机:
uboot使用命令整理(2016.03)

文章图片

uboot中协议实现的原因,开发板不能被ping。
(3)dhcp命令
开发板连接到路由器时,可以使用dhcp命令获取ip,dhcp命令在获取到ip后,还会通过tftp来加载linux内核:
dhcp

uboot使用命令整理(2016.03)

文章图片

(4)nfs方式获取网络文件


确保nfs环境已搭建完成:??Ubuntu上搭建NFS??。


nfs [load address] [[hostip:]boot filename]

eg. 通过nfs方式从nfs服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:
uboot使用命令整理(2016.03)

文章图片

?NFS root 测试正常,不知道一直为啥拉不到文件,后续再分析?!
(5)?tftp方式获取网络文件?


确保tftp环境搭建完成:。


tftp [address] [[serverip]:filename]

eg. 通过tftp方式从tftp服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:
uboot使用命令整理(2016.03)

文章图片

因为之前已经设置了serverip环境变量,所以直接用文件名拉取就ok,真方便。
5. eMMC/SD card相关操作命令一般情况下,eMMC和SD Card可以当作同一类东西操作,统称为mmc。
uboot中的mmc命令参数汇总如下:
uboot使用命令整理(2016.03)

文章图片

uboot使用命令整理(2016.03)

文章图片

(1)输出当前选中的MMC设备信息
mmc info

uboot使用命令整理(2016.03)

文章图片

可以看出,当前选中使用的MMC设备是sd卡,版本为3.0,容量为14.6GB(16G卡),速度为50MHz,总线4位宽。
(2)扫描当前所有的MMC设备
mmc rescan

uboot使用命令整理(2016.03)

文章图片

(3)查看当前所有的MMC设备
mmc list

uboot使用命令整理(2016.03)

文章图片

可以看到当前开发板上有两个MMC设备,正在使用的是SD卡。
(4)切换当前MMC设备
mmc dev [dev][part]


  • dev:要切换的MMC设备号
  • part:分区号,不指定则默认0

eg. 切换当前使用eMMC设备:
uboot使用命令整理(2016.03)

文章图片

同时,切换后查看eMMC设备的信息:
uboot使用命令整理(2016.03)

文章图片

可以看出,当前选中使用的MMC设备是eMMC,版本为4.0,容量为7.3GB(8GB eMMC),速度为52MHz,总线8位宽。
(5)查看当前MMC设备分区
mmc part

① 查看eMMC的分区:
uboot使用命令整理(2016.03)

文章图片

可以看出,此时eMMC有两个分区,扇区 2048-65536为第一个分区,扇区67584-15202304为第二个分区。
如果eMMC中烧写了Linux系统,?eMMC应该有3个分区?,分区1存放uboot、分区2存放Linux镜像和设备树、分区3存放rootfs。
但是图中所示只查到了两个分区,这是因为?分区0并没有格式化,所以无法识别出来,但是分区0是存在的?。
② 查看SD卡的分区
uboot使用命令整理(2016.03)

文章图片

可以看出,此时SD卡只有一个分区,扇区8192-30552064。?一般SD卡默认只有一个分区,也就是分区0,但可以手动创建新的分区?。
(6)读取mmc设备的数据
mmc read addr blk# cnt


  • addr:数据读取到DRAM的地址
  • blk:要读取的块起始地址(十六进制),块和扇区是一个意思,一个块512字节
  • cnt:要读取的?块数量?(十六进制)

eg. 从eMMC中第1536(0x600)个块开始,读取16个块(0x10)到DRAM的0x80800000地址处:
uboot使用命令整理(2016.03)

文章图片

读取之后查看DRAM 0x80800000处是否有数据:
uboot使用命令整理(2016.03)

文章图片

这个结果有点离谱,应该是环境变量在eMMC中的存储位置有变化,还不熟,没法定位问题。
(7)向mmc写入数据
mmc write addr blk# cnt

同样,cnt是指?要写入的块的数量?。
?利用此命令,可以在uboot中通过网络下载文件到DRAM中,然后向SD卡或者eMMC中烧录镜像?。


提示:千万不能写SD卡或者eMMC的前两个块/扇区,里面保存有分区表。


(8)擦除mmc数据
mmc erase blk# cnt



提示:没事不要轻易擦除mmc设备。


6. FAT格式文件系统操作命令在uboot中还可以对SD卡或者eMMC中存储的文件进行操作,?前提是FAT类型文件系统?。
(1)查询指定mmc设备中指定分区的?文件系统信息?
fatinfo < interface> [< dev[:part]> ]


  • interface:接口类型,比如mmc
  • dev:查询的设备号
  • part:查询的分区

eg. 查询eMMC分区1的文件系统信息:
uboot使用命令整理(2016.03)

文章图片

可以看到,eMMC分布1的文件系统为FAT32格式,分区名称boot。
(2)查询FAT格式设备的目录和文件信息
fatls < interface> [< dev[:part]> ] [dir]


  • interface:接口类型,比如mmc
  • dev:查询的设备号
  • part:查询的分区
  • dir:查询的目录

eg. 查询eMMC分区1的所有目录和文件:
uboot使用命令整理(2016.03)

文章图片

(3)查询指定mmc设备中指定分区的?文件系统格式?
fstype < interface> < dev> :< part>

eg. 当前eMMC有三个分区(分区0无法识别),查看三个分区的文件系统格式:
uboot使用命令整理(2016.03)

文章图片

可以看到,分区0存放的uboot,没有格式化文件系统,所以无法识别;分区1的格式是fat,用于存放linux镜像和设备树;分区2的格式是ext4,用于存放linux的根文件系统。
(4)将指定的文件读取到DRAM中
fatload < interface> [< dev> :< part> < addr> [< filename> [bytes[pos]]]]


  • interface:接口
  • dev:设备号
  • part:分区号
  • addr:要加载的DRAM地址
  • filename:文件名称
  • bytes:读取?多少个字节?的数据,为0或省略则读取整个文件(十六进制)
  • pos:要读的文件偏移,为0或省略则从文件首地址开始读取

eg. 将eMMC分区1中的zImage文件读取到DRAM中0x80800000处:
uboot使用命令整理(2016.03)

文章图片

可以看出,uboot从emmc中读取了6785480字节的数据,速度为28.6MB/s。
(5)将数据写入文件系统
fatwrite < interface> [< dev> :< part> < addr> < filename> < bytes>



uboot默认不使能fatwrite命令,需要在板子配置文件中通过定义宏??CONFIG_FAT_WRITE??开启。


7. EXT格式文件系统操作命令uboot有ext2和ext4这两种格式的文件系统操作命令,常用的命令就4个,分别为:

  • ext2

  • ext2ls
  • ext2load

  • ext4

  • ext4ls
  • ext4load
  • ext4write


这些命令使用方法与fat类命令基本相同。
eg. 查询eMMC分区2的所有目录和文件:
uboot使用命令整理(2016.03)

文章图片

8. Nand设备操作命令暂时没有nand的板子,后续补充。
9. 启动常用操作命令uboot的核心功能是启动linux系统,和启动相关的命令有3个:bootz、bootm、boot。
(1)启动?zImage?镜像文件
bootz [addr [initrd[:size][fdt]]]


  • addr:zImage镜像文件在DRAM中的位置
  • initrd:initrd文件在镜像文件在DRAM中的地址,不使用initrd的话用??-??代替即可
  • fdt:设备树文件在DRAM中的地址

eg. 通过网络启动linux:
uboot使用命令整理(2016.03)

文章图片

(2)启动?uImage?镜像文件
不使用设备树:
bootm

使用设备树(和bootz一样):
bootm [addr [initrd[:size][fdt]]]

(3)boot一键启动
boot通过读取?环境变量bootcmd?来启动linux系统。
eg. 从网络加载启动linux系统:
setenv bootcmd tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000
saveenv
boot



需要注意:uboot倒计时结束后,也是通过bootcmd参数来启动的,这样修改后,系统每次启动都会从tftp拉取文件!记得恢复为从eMMC中加载!


uboot使用命令整理(2016.03)

文章图片

eg. 从eMMC加载启动linux系统:
setenv bootcmd fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000
saveenv
boot

uboot使用命令整理(2016.03)

文章图片

10. 其它常用命令(1)复位
reset

(2)跳转到DRAM指定地址处执行程序
go addr [arg ...]

(3)运行环境变量中定义的命令
run < cmd>

run命令最大的作用是运行我们自定义的命令,比如切换从emmc和网络启动过于麻烦,我们可以创建一个新的环境变量,不影响bootcmd环境变量的情况下,一条命令从emmc启动:
setenv bootemmc fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000
saveenv
run bootemmc

或者,一条命令从网络启动:
setenv boottftp tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000
saveenv
run boottftp

(4)内存读写测试命令
mteset [start [end [pattern [iterations]]]]


  • start:起始地址
  • end:结束地址

该命令可以用来简单的测试一些内存设备读写,比如DDR。
eg. 测试0x80000000 - 0x80001000这段内存:
uboot使用命令整理(2016.03)

文章图片

可以看到,已经读写测试了487次,需要按Ctrl+C结束。



    推荐阅读