uboot使用命令整理(2016.03)

Posted Mculover666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uboot使用命令整理(2016.03)相关的知识,希望对你有一定的参考价值。

文章目录

一、uboot启动信息

系统启动时,按下任意键进入uboot命令行:

  • 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

2. 信息查询类命令

(1)查看板子信息

bdinfo


(3)查看uboot版本号

version


当前uboot版本号是2016.03,编译时间为20200115,编译器为arm-poky-linux-gnueabi-gcc 5.3.0。

3. 环境变量操作命令

(1)打印环境变量

print
printenv


(2)打印指定环境变量的值

printenv <环境变量名称>

(3)修改环境变量(修改DRAM中的加载值)

setenv <环境变量名称> <>

如果值中有空格,则需要用单引号引起来:

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

saveenv


(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个内存值

(2)修改指定地址的内存值(地址不会自增)

nm[.b .w .l] address

eg. 修改0x80000000地址处的数据为0x12345678:

(3)修改指定地址的内存值(地址自增)

mm[.b .w .l] address

eg. 修改0x80000000开始的三个连续long数据(3*4=12B):

(4)使用指定数据填充一段内存

mw[.b .w .l] address value [count]

eg. 同样修改0x80000000开始的三个连续long数据(3*4=12B)为一样的值:

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

  • 将DRAM中的数据从一段内存拷贝到另一段内存中
  • 将Nor Flash中的数据拷贝到DRAM中
cp [.b .w .l] source target count

eg. 将0x80000000处的数据拷贝到0x80000100处,长度为0x10个内存块(16 * 4 = 64B):

(6)比较两段内存的数据是否相等

cmp[.b .w .l] addr addr2 count

eg. 比较刚刚拷贝的两段数据是否相等:

4. 网络相关命令

(1)网络环境设置

在使用网络之前需要先搭建网络环境,设置以下环境变量:

这里设置如下:

修改ubuntu主机地址:

(2)ping命令

ping <ip>

开发板中ping windows主机:

开发板中ping ubuntu主机:

uboot中协议实现的原因,开发板不能被ping。

(3)dhcp命令

开发板连接到路由器时,可以使用dhcp命令获取ip,dhcp命令在获取到ip后,还会通过tftp来加载linux内核:

dhcp


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

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

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

eg. 通过nfs方式从nfs服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:

NFS root 测试正常,不知道一直为啥拉不到文件,后续再分析

(5)tftp方式获取网络文件

确保tftp环境搭建完成:

tftp [address] [[serverip]:filename]

eg. 通过tftp方式从tftp服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:

因为之前已经设置了serverip环境变量,所以直接用文件名拉取就ok,真方便。

5. eMMC/SD card相关操作命令

一般情况下,eMMC和SD Card可以当作同一类东西操作,统称为mmc。

uboot中的mmc命令参数汇总如下:


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

mmc info


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

(2)扫描当前所有的MMC设备

mmc rescan


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

mmc list


可以看到当前开发板上有两个MMC设备,正在使用的是SD卡。

(4)切换当前MMC设备

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

eg. 切换当前使用eMMC设备:

同时,切换后查看eMMC设备的信息:
可以看出,当前选中使用的MMC设备是eMMC,版本为4.0,容量为7.3GB(8GB eMMC),速度为52MHz,总线8位宽。

(5)查看当前MMC设备分区

mmc part

① 查看eMMC的分区:

可以看出,此时eMMC有两个分区,扇区 2048-65536为第一个分区,扇区67584-15202304为第二个分区。

如果eMMC中烧写了Linux系统,eMMC应该有3个分区,分区1存放uboot、分区2存放Linux镜像和设备树、分区3存放rootfs。

但是图中所示只查到了两个分区,这是因为分区0并没有格式化,所以无法识别出来,但是分区0是存在的

② 查看SD卡的分区

可以看出,此时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地址处:

读取之后查看DRAM 0x80800000处是否有数据:

这个结果有点离谱,应该是环境变量在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的文件系统信息:

可以看到,eMMC分布1的文件系统为FAT32格式,分区名称boot。

(2)查询FAT格式设备的目录和文件信息

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

eg. 查询eMMC分区1的所有目录和文件:

(3)查询指定mmc设备中指定分区的文件系统格式

fstype <interface> <dev>:<part>

eg. 当前eMMC有三个分区(分区0无法识别),查看三个分区的文件系统格式:

可以看到,分区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从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的所有目录和文件:

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:

(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中加载!


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

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这段内存:

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

以上是关于uboot使用命令整理(2016.03)的主要内容,如果未能解决你的问题,请参考以下文章

uboot研读笔记 | 12 - uboot目录结构分析(2016.03版本)

uboot研读笔记 | 13 - uboot编译构建Makefile分析研读(2016.03版本)

u-boot-2016.03 支持yaffs2文件系统烧写之添加nand write.yaffs2命令

uboot研读笔记 | 14 - uboot启动流程分析(2016.03版本)

uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)

uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)