信息查询命令
bdinfo
,查看板子信息。
可以得到DRAM的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址信息。
printenv
输出环境变量信息,uboot 也支持 TAB 键自动补全功能,输入“print”
然后按下 TAB 键就会自动补全命令,直接输入“print”也可以。输入“print”,然后按下回车键。
uboot中的环境变量都是字符串。
比如bootdelay表示uboot启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了。uboot 中的环境变量是可以修改的,有专门的命令来修改环境变量的值。
内存操作命令
内存操作命令就是用于直接对DRAM进行读写操作的。
md [.b,.w,.l] adress [# of objects]
md命令用于显示内存值,格式如下:
命令中的.b .w .l对应byte word long,也就是分别以1个字节、2个字节、4个字节来显示内存值。
adress就是要查看的内存起始地址。
[# of objects]表示要查看的数据长度,此单位跟选择的显示格式有关。
比如要查看的内存长度为20(十六进制为0x14),如果显示格式为.b就表示20个字节,如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。
uboot命令中的数字都是十六进制的,不是十进制的。
查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b
md.b 80000000 14
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。
cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, .l] addr1 addr2 count
网络操作命令
uboot是支持网络的,在移植uboot的时候一般都要调通网络功能,因为在移植linux kernel的时候需要使用到uboot的网络功能做测试。uboot支持大量的网络命令。
开发板的网络能否使用,能否和服务器(Ubuntu主机)进行正常通信,通过ping命令就可以验证,直接ping服务器的IP地址即可。
dhcp命令用于从路由器获取IP地址,前提得开发板连接到路由器上,如果开发板和电脑直连,那么dhcp命令就会失效。直接输入dhcp命令即可通过路由器获取IP地址。
nfs命令
nfs(Network File System)网络文件系统,通过nfs可以在计算机之间通过网络来分享资源。
比如我们将linux镜像和设备树文件放到Ubuntu中,然后在uboot中使用nfs命令将Ubuntu中的Linux镜像和设备树下载到开发板的DRAM中。
这样做的目的是为了方便调试linux镜像和设备树,也就是网络调试,网络调试是linux开发中最常用的调试方法。
原因是嵌入式linux开发不像单片机开发,可以直接通过JLINK或STLink等仿真器将代码直接烧写到单片机内部的flash中,但是嵌入式Linux开发没有MDK,IAD这样的IDE,更没有烧写算法,无法通过点击一个download按钮就将固件烧写到外部flash中。
在uboot中的nfs命令将Ubuntu中的文件下载到开发板的DRAM中,在使用之前需要开启Ubuntu主机的NFS服务,并且要新建一个NFS使用的目录,以后所有通过NFS访问的文件都需要放到这个NFS目录中。
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。
tftp
tftp命令的作用和nfs命令一样,都是用于通过网络下载东西到DRAM中,只是tftp命令使用的TFTP协议,Ubuntu主机作为TFTP服务器,因此需要在 Ubuntu 上搭建 TFTP 服务器。
EMMC和SD卡操作命令
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,uboot 中常用于操作 MMC 设备的命令为“mmc”。
- mmc info输出当前选中的mmc info设备的信息,输入命令“mmc info”即可。
- mmc rescan扫描当前开发板上所有的MMC设备,包括EMMC和SD卡。
- mmc list查看当前开发板一共有几个MMC设备。
要想查看SD卡信息,就要使用命令mmc dev,将SD卡设置为当前的MMC设备。
mmc dev [dev] [part]
[dev]用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0。
- 有时候SD卡或EMMC会有多个分区,可以使用命令mmc part来查看分区。
此时EMMC有两个分区,第一个分区起始扇区为20480,长度为262144个扇区。
如果EMMC里面烧写了Linux系统的话,EMMC是有三个分区的,第0个分区存放uboot,第1个分区存放Linux镜像文件和设备树,第2个分区存放根文件系统。
但是在图中只有两个分区,那是因为第0个分区没有格式化,所以识别不出来,实际上第0个分区是存在的。
一个新的SD卡默认只有一个分区,那就是分区0,前面讲解的uboot烧写到SD卡,其实就是将u-boot.bin烧写到SD卡的分区0里面。
后面学习Linux内核移植的时候会知道如何在SD卡中创建并格式化第二个分区,并将 Linux 镜像文件和设备树文件存放到第二个分区中。
如果要将 EMMC 的分区 2 设置为当前 MMC 设备,可以使用如下命令:
mmc dev 1 2
- mmc read命令:用于读取mmc设备的数据,命令格式如下:
mmc read addr blk# cnt
- 将数据写到mmc设备里面,使用mmc write。
mmc write addr blk# cnt
addr是要写入MMC中的数据在DRAM中的起始地址,blk是要写入到MMC的块的起始地址,cnt是要写入的块大小,一个块512字节。
我们可以使用命令“mmc write”来升级uboot,也就是在uboot中更新uboot。这里要用到nfs或tftp命令,通过nfs或者tftp命令将新编译出来的u-boot.imx(uboot.bin前面加了一些头文件)下载到开发板的DRAM中,然后再使用命令“mmc write”将其写入到MMC设备中。