uboot常用命令

1.uboot简介

U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构包括PPC、ARM、AVR32、MIPS、X86、68K、Nios。这也是一套在GNU通用公共许可证之下发布的自由软件。

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段
bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,
NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了, bootloader 的实
际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核, bootloader 和 Linux 内核的关系
就跟 PC 上的 BIOS 和 Windows 的关系一样, bootloader 就相当于 BIOS。所以我们要先搞定
bootloader。很庆幸,有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛。

uboot 的全称是 Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot 是一
个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、 USB 等高级功能。

2.uboot版本使用

uboot 官方的 uboot 源码是给半导体厂商准备的,半导
体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂
商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。而像国内的正点原子或野火这种开发板厂商会根据自家开发板的设计对NXP维护的uboot进行进一步的修改,以适配自家的开发板。

对于我们学习者来说,我们直接使用开发板厂商维护的uboot就可以直接进行开发了。

提示:把uboot当作裸机例程的集合,知道它的作用主要就是启动Linux内核,具体ubbt里面是怎么实现的可以以后有时间再来进行详细了解,在工作中基本上会使用uboot命令就可以了。

3.uboot常用命令

3.1. 信息查询命令

  • bdinfo

作用:显示开发板相关信息,从上图中可以看到DRAM的起始地址和大小以及IP地址等等。

  • printenv

作用:显示uboot中存储的环境变量

  • version

作用:显示uboot版本信息

3.2. 环境变量操作命令

uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样 。

  • setenv

作用:用于设置或者修改环境变量的值

  • saveenv

作用: 用于保存修改后的环境变量

一般环境变量是存放在外部 flash 中的, uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM
中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话
uboot 下一次重启会继续使用以前的环境变量值。

保存环境变量的时候会有提示信息,如上图所示,author这个环境变量保存在mmc0中。

如果想要删除环境变量,在环境变量后面输入空格即可。

有时候我们修改的环境变量值可能会有空格, 比如 bootcmd、 bootargs 等, 这个时候环境变量值就得用单引号括起来,学过linux编程的这点都应该很清楚。

3.3. 内存操作命令

uboot 命令中的数字都是十六进制的!不是十进制的!

命令都有相应的格式,但是都比较难以看懂,所以直接给出例子会比较好一点。

  • md

作用:查看内存中特定位置的数据

格式:md[.b, .w, .l] address [# of objects]

命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节
来显示内存值。 address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度,这
个数据长度单位不是字节,而是跟你所选择的显示格式有关。

注意一下,10是16进制的,也就是十进制的16。

是不是一个图片就非常的简单,uboot的命令格式不是很好看。

  • nm

作用:用于修改指定地址的内存值 ,但每次修改后地址不变

格式:nm [.b, .w, .l] address

在问号后面写上要修改的内容,想要退出的话,按下q。

  • mm

作用:用于修改指定地址的内存值 ,但每次修改后地址会递增

格式:mm [.b, .w, .l] address

问号后面没有数值就说明我们没有对该地址处的内容进行修改

  • mw

作用:用于使用一个指定的数据填充一段内存

格式:mw [.b, .w, .l] address value [count]

  • cp

作用:用于内存中的数据从一段内存拷贝到另一段内存

格式:cp [.b, .w, .l] source target count

在内存管理当中,对内存中的数据进行操作,有三要素。源,目的,数据量。

  • cmp

作用:用于比较两段内存的数据是否相等

格式:cmp [.b, .w, .l] addr1 addr2 count

总结:内存操作相关的命令涉及到内存管理。从上述众多命令中可以看到很多相似之处,对数据的处理有字节,半字,字的形式。对数据的操作都是基于地址的形式。

3.4. 网络操作命令

建议:开发板和电脑连在同一个路由器上,在学习使用网络命令之前,先添加一些必要的环境变量。

注意,网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP
地址在同一个网段内,比如我现在的开发板和电脑都在 192.168.0.0 这个网段内。

ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个
开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!
设置好网络相关
的环境变量以后就可以使用网络相关命令了。

  • ping

作用:检查网络是否能用

如果出现上图所示,那么就证明开发板已经连上网了。

注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping
命令做处理,如果用其他的机器 ping uboot 的话会失败!

  • dhcp

作用:从路由器获取IP地址(前提得开发连接到路由器上的,如果开发板是和电脑直
连的,那么 dhcp 命令就会失效

红色箭头所指向的,一个就是开发板的IP地址。

有的时候会发现每隔一天,你的IP地址会变,这个时候记得手动修改ipaddr环境变量

还有一个就是加载地址,加载地址是什么,可以看下我之前写的博客。

因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来
启动 linux 内核

提示:查看某个指令的功能:help + 指令

  • nfs

简介:

nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源
比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中
的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试。

通过网络调试是 Linux 开发中最常用的调试方法。原因是嵌入式 linux
开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部
的 flash 中,嵌入式 Linux 通常是烧写到 EMMC、 NAND Flash、 SPI Flash 等外置 flash 中,但是
嵌入式 Linux 开发也没有 MDK, IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个
“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的
软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、 IAR
的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载
到 DRAM 中,然后就可以直接运行。

作用:用于通过网络下载文件到内存中

格式:nfs [loadAddress] [[hostIPaddr:]bootfilename]

#提示下载过程,T的数量越多就代表网络质量越差,如果下载失败,重新下载即可。

  • tftp

作用:用于通过网络下载文件到内存中

格式:tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

区别:与nfs相比,tftp命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可

3.5. MMC操作命令

提示:uboot的每一个命令你不需要全部都记住,记不起来时输入help即可

  • mmc info

作用:用于输出当前选中的mmc设备的信息

可以看出这是一个SD卡

  • mmc rescan

作用:用于扫描当前开发板上所有的 MMC 设备

  • mmc list

作用:用于来查看当前开发板一共有几个 MMC 设备

  • mmc dev [dev] [part]

作用:用于切换当前 MMC 设备

[dev]用来设置要切换的 MMC 设备号, [part]是分区号。如果不写分区号的话默认为分区 0

当前的MMC设备是SD卡,现在我们切换到emmc看看。

现在我们看到,当前的mmc设备是EMMC。

  • mmc part

作用:查看MMC设备分区

从图中可以看出,此时 EMMC 有两个分区。

扇区 20480~262144 为第一个分区,
扇区 282624~14987624为第二个分区。

如果 EMMC 里面烧写了 Linux 系统的话, EMMC 是有
3 个分区的。

第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统。但是在图中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。

一个新的 SD 卡默认只有一个分区,那就是分区 0,所
以前面讲解的 uboot 烧写到 SD 卡,其实就是将 u-boot.bin 烧写到了 SD 卡的分区 0 里面。

  • mmc read

作用:用于读取 mmc 设备的数据

格式:mmc read addr blk# cnt

addr 是数据读取到 DRAM 中的地址, blk 是要读取的块起始地址(十六进制),一个块是 512
字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区, cnt 是要读取的块数量(十
六进制)。

  • mmc write

作用:用于将数据写入mmc设备

格式:mmc write addr blk# cnt

addr 是要写入 MMC 中的数据在 DRAM 中的起始地址, blk 是要写入 MMC 的块起始地址
(十六进制), cnt 是要写入的块大小,一个块为 512 字节。

注意:千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表! 看过正点原子烧写软件源码的同学这个肯定是记忆犹新。

  • mmc erase

作用:用于擦除mmc设备数据信息

格式:mmc erase blk# cnt

提示:没事别发神经病擦除设备信息

3.6. FAT格式文件系统操作命令

  • fatinfo

作用:用于查询指定 MMC设置指定分区的文件系统信息

格式:fatinfo [<dev[:part]>]

  • fatls

作用:用于查询 FAT 格式设备的目录和文件信息

格式:fatls [<dev[:part]>] [directory]

interface 是要查询的接口,比如 mmc, dev 是要查询的设备号, part 是要查询的分区, directory
是要查询的目录。比如查询 EMMC 分区 1 中的所有的目录和文件

  • fstype

作用:用于查看 MMC 设备某个分区的文件系统格式

格式:fstype :

从上图可以看出,分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,
所以文件系统格式未知。

分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。

分区 2 的
格式为 ext4,用于存放 Linux 的根文件系统(rootfs) 。

  • fsload

作用:用于将指定的文件读取到内存中

格式: fatload [<dev[:part]> [ [ [bytes [pos]]]]]

interface 为接口,比如 mmc, dev 是设备号, part 是分区, addr 是加载到内存中的起始地址, filename 是要读取的文件名字。

bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。 pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的
话表示从文件首地址开始读取。

从上图可以看出,从emmc中导出数据的速度是非常快的,位宽为8位。

  • fatwrite

作用:用于将指定的文件写入到外存中

格式:fatwrite <dev[:part]>

interface 为接口,比如 mmc, dev 是设备号, part 是分区, addr 是要写入的数据在 DRAM
中的起始地址, filename 是写入的数据文件名字, bytes 表示要写入多少字节的数据。

注意:uboot 默认没有使能 fatwrite 命令,需要修改板子配置头文件

3.7. EXT格式文件系统操作命令

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令 。

常用的命令为:ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。这些命令的含义和使用与 fatload、 fatls 和 fatwrit
一样,只是 ext2 和 ext4 都是针对 ext 文件系统的。

tips:出现问题就输入help就可以了,不需要特别记忆。

3.8. BOOT操作命令

uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot。

  • bootz

    要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要
    将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文
    件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。 不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令
    来启动, bootz 命令用于启动 zImage 镜像文件。

    格式:bootz [addr [initrd[:size]] [fdt]]

    命令 bootz 有三个参数, addr 是 Linux 镜像文件在 DRAM 中的位置,

    initrd 是 initrd 文件在
    DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可

    fdt 就是设备树文件在 DRAM 中
    的地址。

  • bootm

bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件。

格式:bootm [addr [initrd[:size]] [fdt]]

其中 addr 是 uImage 在 DRAM 中的首地址, initrd 是 initrd 的地址, fdt 是设备树(.dtb)文件
在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代。

  • boot

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系

bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命
令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可
以修改的。

比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp
80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”,然后使
用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统。

我们也可以从emmc中加载linux内核,只需要修改bootcmd即可。

3.9. 其他常用命令

  • reset

作用:用于复位重启

  • go

作用:用于跳到指定的地址处执行应用

格式:go addr

通过 go 命令我们就可以在 uboot 中运行裸机例程

  • run

run 命令用于运行环境变量中定义的命令,比如可以通过“run bootcmd”来运行 bootcmd 中的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量

在后面调试 Linux 系统的时候常常要在网络启动和 EMMC/NAND 启动之间来回切换,而 bootcmd 只能保存一种启动方式,如果要换另外一种启动方式的话就得重写 bootcmd,会很麻烦。这里我们就可以通过自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,
定义 mybootnet 表示从网络启动,定义 mybootnand 表示从 NAND 启动。如果要切换启动方式
的话只需要运行“run mybootxxx(xxx 为 emmc、 net 或 nand)”即可。

  • mtest

作用:用于测试内存

格式:mtest [start [end [pattern [iterations]]]]

start是要测试的内存开始地址, end 是结束地址,比如我们测试 0X80000000~0X80001000
这段内存,输入“mtest 80000000 80001000”。

4.总结

以上讲述的是uboot常用的命令,如果需要使用到其他的命令,直接输入help即可,uboot会打印出它目前所支持的所有命令,如果没有你想要的命令,去设置一下开发板对应的头文件再重新编译即可。如果对某个命令的用法不了解,输入help + cmd 。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值