u-boot使用实验(烧录和命令)

 

一、U-Boot 简介

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到u-boot的全部更新版本
在这里插入图片描述
在这里插入图片描述
但是我们一般不会直接用 uboot 官方的 U-Boot 源码的。uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。

NXP 就 维 护 的 2016.03 这 个 版 本 的 uboot,我们已经放到了开发板光盘中,路径为:开发板光盘->1、程序源码->4、NXP官方原版Uboot和Linux->uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。

二、u-boot使用选择

首先 uboot 官方的基本是不会用的,因为支持太弱了。
最常用的就是半导体厂商或者开发板厂商的 uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的 uboot,如果你是购买的第三方开发板,比如正点原子的 I.MX6ULL 开发板,那么就使用正点原子提供的 uboot 源码(也是在半导体厂商的 uboot 上修改的)。当然了,你也可以在购买了第三方开发板以后使用半导体厂商提供的 uboot,只不过有些外设驱动可能不支持,需要自己移植,这个就是我们常说的 uboot 移植。

三、U-Boot初次编译

1.获取uboot的源码

首先在 Ubuntu 中安装 ncurses 库,否则编译会报错,安装命令如下

sudo apt-get install libncurses5-dev

新建一个名为“aef_uboot”的文件夹用于存放正点原子提供的 uboot 源码
在这里插入图片描述
然后将正点原子提供的uboot源码拷贝到此目录下

在这里插入图片描述
解压之后的文件夹
在这里插入图片描述

2.使用命令编译uboot

ARCH ?= arm
   CROSS_COMPILE ?= arm-linux-gnueabihf-

添加到顶层Makefile中
在这里插入图片描述

执行make distclean 清除工程
执行make mx6ull_14x14_ddr512_emmc_defconfig 配置uboot
执行make V=1 -j4 编译uboot

或者不配置顶层Makefile直接执行下面命令

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

编译之后的文件
在这里插入图片描述
编译完成以后 uboot 源码多了一些文件,其中 u-boot.bin 就是编译出来的 uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,u-boot.imx 文件就是添加头部以后的 u-boot.bin,u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件

四、U-Boot烧写与启动

uboot 编译好以后就可以烧写到板子上使用了

这里我们跟前面裸机例程一样,将 uboot烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot。使用 imxdownload 软件烧写。

先拷贝 imxdownload 文件 再执行chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
在这里插入图片描述
之后烧写

./imxdownload u-boot.bin /dev/sdb  //烧写到 SD 卡,

在这里插入图片描述
将开发板设置为SD卡启动,然后连接串口到电脑
在这里插入图片描述

五、U-Boot命令使用

帮助命令

help 或者是 ?
查看当前uboot所有支持的命令
在这里插入图片描述

1.信息查询命令

常用的和信息查询有关的命令有 3 个:bdinfo、printenv 和 version。

1. bdinfo 查看板子信息

在这里插入图片描述

2.printenv输出环境变量信息

在这里插入图片描述
uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。
比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了

3. version 用于查看 uboot 的版本号

在这里插入图片描述

2.环境变量操作命令

环境变量的操作涉及到两个命令:setenv 和 saveenv
命令 setenv 用于设置或者修改环境变量的值。
命令 saveenv 用于保存修改后的环境变量,

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

1.修改bootdelay的值

比如我们要将环境变量 bootdelay 改为 5,就可以使用如下所示命令

setenv bootdelay 5
Saveenv

在这里插入图片描述
再重启uboot
在这里插入图片描述
重新查看可以看到值已经被修改。

2.修改变量值有空格的变量

有时候我们修改的环境变量值可能会有空格,比如 bootcmd、bootargs 等,这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,
其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 bootargs。

3.setenv新建命令

命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量author,author 的值为我的名字拼音:luatao,那么就可以使用如下命令:

setenv author luatao
Saveenv

在这里插入图片描述

4.setenv删除命令

要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个环境变量,命令如下:

setenv author
Saveenv

3.内存操作命令

内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 **md、nm、mm、mw、cp 和 cmp。**我们依次来看一下这些命令都是做什么的。

1.md用于显示内存值

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

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

比如你想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:

md.b 80000000 14
md.w 80000000 14
md.l 80000000 14

在这里插入图片描述

2.nm修改指定地址的内存值

nm [.b, .w, .l] address

nm.l 80000000
在这里插入图片描述

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

使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。
在这里插入图片描述

4.mw使用一个指定的数据填充一段内存

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

mw 命令同样可以以.b、.w 和.l 来指定操作格式,address 表示要填充的内存起始地址,value为要填充的数据,count 是填充的长度。

比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个
内存块(0x10 * 4=64 字节)填充为 0X11111111,命令如下:

mw.l 80000000 11111111 10

在这里插入图片描述

5.cp数据拷贝命令

cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。命令格式如下:

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

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

cmp 命令同样可以以.b、.w 和.l 来指定操作格式,addr1 为第一段内存首地址,addr2 为第二段内存首地址,count 为要比较的长度。

我们使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:

cmp.l 80000000 80000100 10

在这里插入图片描述

4.网络操作命令

uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel的时候需要使用到 uboot的网络功能做调试。uboot支持大量的网络相关命令,比如 **dhcp、ping、nfs 和 tftpboot,**我们接下来依次学习一下这几个和网络有关的命令。

1.配置网络

建议开发板和主机 PC 都连接到同一个路由器上!最后设置表中所示的几个环境变量。
在这里插入图片描述
先查一下ubuntu的IP地址

在这里插入图片描述
然后用开发板ping一下ubuntu的IP地址
在这里插入图片描述
Ping不通 我们需要设置环境变量命令

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.7
Saveenv

在这里插入图片描述
ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题

再次ping ubuntu的IP地址
在这里插入图片描述
主机存在,ping成功,uboot网络工作正常

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

2.dhcp 用于从路由器获取 IP 地址

dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址

3.nfs(Network File System)网络文件系统

通过 nfs 可以在计算机之间通过网络来分享资源

比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 Linux 开发中最常用的调试方法。

nfs [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。

这里我们将正点原子官方编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的 0x80800000这个地址处。

正点原子编译出来的 zImage 文件已经放到了开发板光盘中,路径为:8、系统镜像->1、出厂系统镜像->2、kernel 镜像\linux-imx-4.1.15-2.1.0-gbfed875-v1.6 ->zImage。将文件zImage 发 送 到 Ubuntu 中 的 NFS 目 录 下 , 比 如 我 的 就 是 放 到/home/luatao/linux/nfs 这个目录下,完成以后的 NFS 目录如图所示:
在这里插入图片描述
准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下

nfs 80800000 192.168.1.7:/home/luatao/linux/nfs/zImage

执行之后失败
在这里插入图片描述
导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件。

解决办法为:让ubuntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。
操作方法如下:
打开文件

sudo vim /etc/default/nfs-kernel-server

在这里插入图片描述
保存退出
重启NFS服务器。

sudo service nfs-kernel-server restart

在这里插入图片描述

4.tftp命令

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 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/luatao/linux/tftpboot
chmod 777 /home/luatao/linux/tftpboot

最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:
在这里插入图片描述
完了以后启动 tftp 服务,命令如下:

sudo service tftpd-hpa start

打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
在这里插入图片描述
最后输入如下命令, 重启 tftp 服务器:

sudo service tftpd-hpa restart

tftp 服务器已经搭建好了,接下来就是使用了。将 zImage 镜像文件拷贝到 tftpboot 文件夹中,
在这里插入图片描述
uboot 中的 tftp 命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

看起来和 nfs 命令格式一样的,loadAddress 是文件在 DRAM 中的存放地址,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。
但是和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。

比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:

tftp 80800000 zImage

在这里插入图片描述

5.EMMC和SD卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”。

1.? mmc

mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命令,如图 所示:
在这里插入图片描述
mmc 后面跟不同的参数可以实现不同的功能,
在这里插入图片描述

2.mmc info 输出当前选中的设备的信息

在这里插入图片描述

3.mmc rescan 扫描当前开发板上所有的 MMC 设备

在这里插入图片描述

4.mmc list查看当前开发板一共有几个 MMC 设备

在这里插入图片描述
可以看出当前开发板有两个 MMC 设备:FSL_SDHC:0 和 FSL_SDHC:1 (eMMC)FSL_SDHC:0 是 SD卡,FSL_SDHC:1(eMMC)是 EMMC,。

5.mmc dev 切换当前 MMC 设备

mmc dev [dev] [part]

[dev]用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0。使用如下命令切换到 emmc卡:

mmc dev 1  //切换到 emmc 卡,0 为 SD 卡,1 为 eMMC

在这里插入图片描述

6.mmc part查看分区

有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区mmc part //查看 EMMC 分区
在这里插入图片描述
可以看出,此时 EMMC 有两个分区
如果 EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放Linux 镜像文件和设备树,第 2 个分区存放根文件系统。但是在图 中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。

7.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 //读取数据

在这里插入图片描述

8.mmc write将数据写到 MMC 设备里面

mmc write addr blk# cnt

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 //查看版本号

在这里插入图片描述
当前 SD 卡中的 uboot 是 2021 年 7 月 27 日 21:55:24 编译的
我们现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。
在这里插入图片描述
最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftp 80800000 u-boot.imx

在这里插入图片描述
可以看出,u-boot.imx 大小为 384000 字节,379904/512=750,所以我们要向 SD 卡中写入750 个块,如果有小数的话就要加 1 个块。
使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 750(0x2EE)个块,命令如下:

mmc dev 0 0
mmc write 80800000 2 32E

在这里插入图片描述
烧写成功,重启开发板(从 SD 卡启动),重启以后再输入 version 来查看版本号
在这里插入图片描述
再次查看version
此时ubuntu是重新编译的,说明uboot更新成功。
同理,如果要在 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 的前两个块(扇区),里面保存着分区表!

9.mmc erase擦除 MMC 设备的指定块

mmc erase blk# cnt

blk 为要擦除的起始块,cnt 是要擦除的数量。没事不要用 mmc erase 来擦除 MMC 设备!!!

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

有时候需要在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,这时候就要用到文件操作命令,跟文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite, 但是这些文件操作命令只支持 FAT 格式的文件系统!!

1.fatinfo查询指定 MMC 设备分区的文件系统信息

fatinfo <interface> [<dev[:part]>]

interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区。

如我们要查询 EMMC 分区 1 的文件系统信息,

fatinfo mmc 1:1

在这里插入图片描述

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

fatls <interface> [<dev[:part]>] [directory]

interface 是要查询的接口,比如 mmc,dev 是要查询的设备号,part 是要查询的分区,directory是要查询的目录。

比如查询 EMMC 分区 1 中的所有的目录和文件,输入命令:

fatls mmc 1:1

在这里插入图片描述

3.fstype查看 MMC 设备某个分区的文件系统格式

fstype <interface> <dev>:<part>

正点原子 EMMC 核心板上的 EMMC 默认有 3 个分区,我们来查看一下这三个分区的文件系统格式,输入命令:

fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2

在这里插入图片描述
分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所
以文件系统格式未知。分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。分区 2 的格式为 ext4,用于存放 Linux 的根文件系(rootfs)。

4.fatload将指定的文件读取到 DRAM 中

fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
  • 1

interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是保存在 DRAM 中的起始地址,filename 是要读取的文件名字。bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。

我们将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的
0X80800000 地址处,命令如下:

fatload mmc 1:1 80800000 zImage

在这里插入图片描述

5.fatwrite将 DRAM 中的数据写入到 MMC 设备

注意!uboot 默认没有使能 fatwrite 命令,需要修改板子配置头文件,比如 mx6ullevk.h、mx6ull_alientek_emmc.h 等等,板子不同,其配置头文件也不同。找到自己开发板对应的配置头文件然后添加如下一行宏定义来使能 fatwrite 命令:

#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是要写入的数据在 DRAM中的起始地址,filename 是写入的数据文件名字,bytes 表示要写入多少字节的数据。我们可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树。

我们以更新 linux 镜像文件 zImage为例,首先将正点原子 I.MX6U-ALPHA 开发板提供的 zImage 镜像文件拷贝到 Ubuntu 中的tftpboot 目录下,zImage 镜像文件放到了开发板光盘中,路径为:**开发板光盘->8、系统镜像->1、出厂系统镜像->2、kernel 镜像->linux-imx-4.1.15-2.1.0-gbfed875-v1.6->zImage。**拷贝完成以后使用命令 tftp 将 zImage 下载到 DRAM 的 0X80800000 地址处,命令如下:

tftp 80800000 zImage

在这里插入图片描述
zImage 大小为 6785488(0X6789D0)个字节下来使用命令 fatwrite 将其写入到 EMMC 的分区 1 中,文件名字为 zImage,命令如下:

fatwrite mmc 1:1 80800000 zImage 6789D0

在这里插入图片描述
fatls”命令查看一下 EMMC 分区 1 里面的文件,结果如图 所示:
在这里插入图片描述

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

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite一样,只是 ext2 和 ext4 都是针对 ext 文件系统的。

使用 ext4ls 就可以查询 EMMC 的分区 2 中的文件和目录

ext4ls mmc 1:2

在这里插入图片描述

8.BOOT操作命令

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

1.bootz启动 zImage 镜像文件

要启动 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 中的地址。

2.bootm启动 uImage 镜像文件

bootm 和 bootz 功能类似,但是 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启动 Linux 系统

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

9.其他常用命令

uboot 中还有其他一些常用的命令,比如 reset、go、run 和 mtest 等

1.reset复位重启

2.go跳到指定的地址处执行应用

go addr [arg ...]

addr 是应用在 DRAM 中的首地址,

3.run 运行环境变量中定义的命令

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

4.mtest简单的内存读写测试命令

可以用来测试自己开发板上的 DDR

mtest [start [end [pattern [iterations]]]]

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

mtest 80000000 80001000

在这里插入图片描述
测试范围为 0X80000000~0X80001000,已经测试了3303 次,如果
要结束测试就按下键盘上的“Ctrl+Cshiy 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值