1.进入uboot的命令行模式以后输入helo或者?,然后按下回车即可查看当前uboot所支持的命令
2.查看命令的详细用法:? bootz 或 help bootz
3.信息查询命令:bdinfo、printenv、version
bdinfo:用于查看板子信息
printenc:用于输出环境变量的信息,uboot中的环境变量都是字符串
bootdelay:表示bbuoot启动延时时间
version:用于查看uboot的版本号
4.环境变量操作命令
(1)修改环境变量
setenv:用于设置或者修改环境变量的值。
saveenc用于保存修改后的环境变量
比如:
setenv bootdelay 5
saveenv
如果修改的环境变量值可能会有空格,比如bootcmd、bootargs等,这个时候环境变量用单引号括起来,比如修改bootargs的值:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
saveenv
(2)新建环境变量
setenv author CKY:表示新建环境变量author,值CKY
saveenv
printenv:查看当前环境变量
(4)删除环境变量(给这个变量赋空值即可)
setenc author
saveenv
5.内存操作命令
内存操作命令用于直接对DRAM进行读写操作,常用的内存操作命令有md、nm、mm、mw、cp、cmp
(1)md命令用于显示内存值,格式如下:
md[.b, .w, .l] address [# of objects]:address查看的内存起始地址,[# of objects]表示要查看的数据长度,单位不是字节,跟选择的显示格式有关
uboot 命令中的数字都是十六进制的!不是十进制的!
比如你想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用
如下所示命令:
md.b 80000000 14
(2)nm命令用于修改指定地址的内存值,格式如下
nm [.b, .w, .l] address
nm 命令同样可以以.b、.w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址
的数据为 0x12345678。输入命令:
nm.l 80000000
输入命令后如下图所示:
然后输入命令后按下回车,再输入q即可退出
(3)mm命令修改指定内存值,但是使用mm修改内存值的时候地址会自增。
(4)mw命令用于使用一个指定的数据填充一段内存,格式如下
mw [.b, .w, .l] address value [count]
(5)cp命令用于数据拷贝,用于将DRAM中的数据从一段内存拷贝到另一段内存中,或者把NorFlash中的数据拷贝到DRAM中。格式如下:
cp [.b, .w, .l] source target count
使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个
内存块(0x10 * 4=64 个字节),命令如下所示:
cp.l 80000000 80000100 10
(6)cmp命令,是比较命令,用于比较两端内存的数据是否相等,格式如下:
cmp [.b, .w, .l] addr1 addr2 count
6.网络操作命令
环境变量 描述
ipaddr 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。
ethaddr 开发板的 MAC 地址,一定要设置。
gatewayip 网关地址。
netmask 子网掩码。
serverip 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。
设置环境变量命令如图所示:
setenv ipaddr 192.168.1.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.253
saveenv
(1)ping命令,开发板是否可以和服务器(Ubuntu主机)进行通信
注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping
命令做处理,如果用其他的机器 ping uboot 的话会失败!
(2)dhcp命令,dhcp命令用于从路由器获取IP地址,前提得开发板连接到路由器上的,如果开发板是和电脑
直连的,那么 dhcp 命令就会失效。
直接输入dhcp命令即可通过路由器获取到IP地址
(3)nfs命令(Network File System)网络文件系统,通过nfs可以在计算机之间通过网络来分享资源
我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用
之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过
NFS 访问的文件都需要放到这个 NFS 目录中。
Ubuntu下开启NFS和SSH服务:
安装NFS服务:
sudo apt-get install nfs-kernel-server rpcbind
等待完成后,开启nfs服务器使用,以后可以在开发板上通过网络文件系统来访问nfs文件夹,配置nfs配置文件/etc/export:
sudo vi /etc/exports
打开/etc/exports 以后在后面添加如下所示内容:
/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)
上述命令安装 ssh 服务,ssh 的配置文件为/etc/ssh/sshd_config,使用默认配置即可。
SSH服务开启:
sudo apt-get install openssh-server
linux内核镜像文件zImage
uboot中的nfs命令格式如下:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,
命令如下:
nfs 80800000 192.168.1.253:/home/book/linux/nfs/zImage
80800000表示zImage保存地址,192.168.1.253:/home/book/linux/nfs/zImage表示zImage在192.168.1.253主机中,路径为/home/book/linux/nfs/zImage
(4)tftp命令,tftp使用TFTP协议,Ubuntu主机作为TFTP服务器。因此需要在Ubuntu上搭建TFTP服务器。需要安装tftp-hpa和tftpd-hpa
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
和 NFS 一样,TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,命令如
下:
mkdir /home/zuozhongkai/linux/tftpboot
chmod 777 /home/zuozhongkai/linux/tftpboot
配置tftp,安装完成后新建文件/etc/xinetd.d/ftp,如果没有/etc/xinetd.d 目录的话自行
创建,然后在里面输入如下内容:
1 server tftp
2 { 3 socket_type = dgram
4 protocol = udp
5 wait = yes
6 user = root
7 server = /usr/sbin/in.tftpd
8 server_args = -s /home/zuozhongkai/linux/tftpboot/ 9 disable = no
10 per_source = 11
11 cps = 100 2
12 flags = IPv4
13 }
然后开启tftp服务
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容
1 # /etc/default/tftpd-hpa
23 TFTP_USERNAME=“tftp”
4 TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"
5 TFTP_ADDRESS=":69"
6 TFTP_OPTIONS="-l -c -s"
最后重启tftp服务器:
sudo service tftpd-hpa restart
tftp 服务器已经搭建好了,接下来就是使用了。将 zImage 镜像文件拷贝到 tftpboot 文件夹
中,并且给予 zImage 相应的权限,命令如下:
cp zImage /home/zuozhongkai/linux/tftpboot/
cd /home/zuozhongkai/linux/tftpboot/
chmod 777 zImage
uboot 中的 tftp 命令格式如下:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp和nfs命令的区别在于,tftp不需要输入文件在Ubuntu中的完整路径,只需输入文件名即可。
tftp 80800000 zImage
7.EMMC和SD卡操作命令
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC
和 SD 卡是同一个东西。
uboot 中常用于操作 MMC 设备的命令为“mmc”
mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命
令,如图 30.4.5.1 所示,mmc后面跟不同的参数可以实现不同的功能:
命令 描述
mmc info 输出 MMC 设备信息
mmc read 读取 MMC 中的数据。
mmc wirte 向 MMC 设备写入数据。
mmc rescan 扫描 MMC 设备。
mmc part 列出 MMC 设备的分区。
mmc dev 切换 MMC 设备。
mmc list 列出当前有效的所有 MMC 设备。
mmc hwpartition 设置 MMC 设备的分区。
mmc bootbus…… 设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。
mmc bootpart…… 设置指定 MMC 设备的 boot 和 RPMB 分区的大小。
mmc partconf…… 设置指定 MMC 设备的 PARTITION_CONFG 域的值。
mmc rst 复位 MMC 设备
mmc setdsr 设置 DSR 寄存器的值
(1)mmc dev命令,用于切换当前MMC设备,格式如下:
mmc dev [dev] [part]:[dev]设置要切换的MMC设备号,[part]是分区号。不写分区号默认分区0
使用如下命令切换到 SD 卡:
mmc dev 0 //切换到 SD 卡,0 为 SD 卡,1 为 eMMC
(2)mmc part命令,查看其分区
查看EMMC的分区情况:
mmc dev 1
mmc part
如果要将 EMMC 的分区 2 设置为当前 MMC 设备,可以使用如下命令:
mmc dev 1 2
(3)mmc read 命令,用于读取mmc设备的数据,格式如下:
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512
字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十
六进制)。
比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的 0X80800000 地址处,命令如下:
mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
(4)mmc write命令gin,将数据写入到MMC设备里面,格式如下:
addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址
(十六进制),cnt 是要写入的块大小,一个块为 512 字节。
我们可以使用命令“mmc write”来升 级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令
将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC
设备中。我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时
间,输入命令:
mmc dev 0 //切换到 SD 卡
version //查看版本号
我们现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的
tftpboot 目录下。最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:
tftp 80800000 u-boot.imx
可以看出,u-boot.imx 大小为 379904 字节,379904/512=742,所以我们要向 SD 卡中写入
742 个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇 区)开始烧写,一共烧写 742(0x2E6)个块,命令如下:
mmc dev 0 0
mmc write 80800000 2 32E
烧写成功后,重启开发板,输入version查看版本号
同理,如果要在 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 的前两个块(扇区),里面保存着分区表!
(5)mmc erase命令,擦除MMC设备的指定块,格式
mmc erase blk# cnt
blk 为要擦除的起始块,cnt 是要擦除的数量
8.NAND操作命令
uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版
本的核心板,并且编译 NAND 核心板对应的 uboot,然后使用 imxdownload 软件将 u-boot.bin 烧
写到 SD 卡中,最后通过 SD 卡启动。一般情况下 NAND 版本的核心板已经烧写好了 uboot、
linux kernel 和 rootfs 这些文件,所以可以将 BOOT 拨到 NAND,然后直接从 NAND Flash 启动
即可。
输入?nand即可查看NAND相关命令
(1)nand info命令,用户打印NAND Flash信息
(2)namd device命令,用于切换NAND Flash,
(3)nand erase命令,用于擦除NAND Flash,NAND Flash 的特性决定了在向 NAND Flash 写数据
之前一定要先对要写入的区域进行擦除。“nand erase”命令有三种形式:
nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition //擦除指定的分区
nand erase.chip [clean] //全篇擦除
(4)nand write,用于向NAND指定地址写入指定的数据,,一般和“nand erase”命令配置使用来更新
NAND 中的 uboot、linux kernel 或设备树等文件,命令格式如下:
nand write addr off size
addr 是要写入的数据首地址,off 是 NAND 中的目的地址,size 是要写入的数据大小。
可以看出 kernel 是从地址 0x620000 开始存放的,将 NAND 版本 kernel 对应的 zImage 文件
放到 Ubuntu 中的 tftpboot 目录中,然后使用 tftp 命令将其下载到开发板的 0X87800000 地址处,
最终使用“nand write”将其烧写到 NAND 中,命令如下:
tftp 0x87800000 zImage //下载 zImage 到 DRAM 中
nand erase 0x620000 0x800000 //从地址 0x620000 开始擦除 8MB 的空间
nand write 0x87800000 0x620000 0x800000 //将接收到的 zImage 写到 NAND 中
同理,最后烧写设备树(dtb)文件文件,命令如下:
tftp 0x87800000 imx6ull-14x14-emmc-7-1024x600-c.dtb //下载 dtb 到 DRAM 中
nand erase 0x520000 0x100000 //从地址 0x520000 开始擦除 1MB 的空间
nand write 0x87800000 0x520000 0x100000 //将接收到的 dtb 写到 NAND 中
(5)nand read命令,用于从 NAND 中的指定地址读取指定大小的数据到 DRAM 中,命令格式如下:
nand read addr off size
addr 是目的地址,off 是要读取的 NAND 中的数据源地址,size 是要读取的数据大小。
比如我们读取设备树(dtb)文件到 0x83000000 地址处,命令如下:
nand read 0x83000000 0x520000 0x19000
9.BOOT操作命令
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常
用的跟 boot 有关的命令有:bootz、bootm 和 boot。
(1)bootz命令
要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要
将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文
件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。
不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令
来启动,bootz 命令用于启动 zImage 镜像文件,bootz 命令格式如下:
bootz [addr [initrd[:size]] [fdt]]
命令 bootz 有三个参数,addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在
DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中
的地址。
Linux 镜像文件和设备树都准备好了,我们先学习如何通过网络启动 Linux,使用 tftp 命令
将zImage下载到DRAM的0X80800000地址处,然后将设备树imx6ull-14x14-emmc-7-1024x600-
c.dtb 下载到 DRAM 中的 0X83000000 地址处,最后之后命令 bootz 启动,命令如下:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000 //使用bootz命令启动linux系统
(2)bootm命令,用于启动uImage镜像文件。如果不使用设备树的话启动linux内核的命令如下:
bootm addr
addr 是 uImage 镜像在 DRAM 中的首地址
如果要使用设备树,那么 bootm 命令和 bootz 一样,命令格式如下:
bootm [addr [initrd[:size]] [fdt]]
其中 addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是设备树(.dtb)文件
在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代。
(3)boot命令
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系
统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命
令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可
以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp
80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 -
83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动
Linux 系统,命令如下:
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv
boot
在启动 Linux 内核的时候可能会遇到如下错误:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的
bootargs 环境变量,此处我们重点是验证 boot 命令,linux内核已经成功启动了,说明 boot 命令工作正常。
10.其他常用命令
(1).reset命令
复位重启uboot
(2)go命令
go 命令用于跳到指定的地址处执行应用,命令格式如下:
go addr [arg ...]
addr 是应用在 DRAM 中的首地址
使用 go 命令启动 printf.bin 这个应用,命令如下:
tftp 87800000 printf.bin
go 87800000 //运行printf.bin
(3)run命令
run 命令用于运行环境变量中定义的命令,比如可以通过“run bootcmd”来运行 bootcmd 中
的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。在后面调试 Linux 系
统的时候常常要在网络启动和 EMMC/NAND 启动之间来回切换,而 bootcmd 只能保存一种启
动方式,如果要换另外一种启动方式的话就得重写 bootcmd,会很麻烦。这里我们就可以通过
自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,
定义 mybootnet 表示从网络启动,定义 mybootnand 表示从 NAND 启动。如果要切换启动方式
的话只需要运行“run mybootxxx(xxx 为 emmc、net 或 nand)”即可。
说干就干,创建环境变量 mybootemmc、mybootnet 和 mybootnand,命令如下:
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 6000000
100000;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv
创建环境变量成功以后就可以使用 run 命令来运行 mybootemmc、mybootnet 或 mybootnand
来实现不同的启动:
run mybootemmc
run mytoobnand
run mybootnet
(4)mtest命令
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR,命令格
式如下:
mtest [start [end [pattern [iterations]]]]
start是要测试的DRAM 开始地址,end 是结束地址,比如我们测试 0X80000000~0X80001000
这段内存,输入“mtest 80000000 80001000”,结果如图 30.4.10.3 所示:
,测试范围为 0X80000000~0X80001000,已经测试了 486 次,如果
要结束测试就按下键盘上的“Ctrl+C”键。