二、 U-Boot 命令使用

 

进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令,如图所示:

 图中只是 uboot 的一部分命令,并不是 uboot 所支持的所有命令,uboot 是可配置的,需要什么命令就使能什么命令。而且也可以在 uboot 中自定义命令。这些命令后面都跟有命令说明,用于描述此命令的作用,但是命令具体怎么用呢?我们输入“help(或?) 命令名”既可以查看命令的详细用法,以“bootz”这个命令为例,我们输入如下命令即可查看“bootz”这个命令的用法:

? bootz 或 help bootz

结果如图所示:

图中详细的列出了“bootz”这个命令的使用方法,其它的命令也可以使用此方法查询具体的使用方法。接下来我们学习一下一些常用的 uboot 命令。

1.信息查询命令

(1).bdinfo 命令

此命令用于查看板子信息,直接输入“bdinfo”即可,结果如图所示:

 从图中可以得出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。

(2).printenv 命令

用于输出环境变量信息,uboot 支持 TAB 键自动补全功能,输入“print”然后按下 TAB 键就会自动补全命令,直接输入“print”也可以。输入“print”,结果如图所示:

在图中有很多的环境变量,比如 baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd等等。 uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。 uboot 中的环境变量是可以修改的,有专门的命令来修改环境变量的值。

(3).version 命令 

用于查看 uboot 的版本号,输入“version”, 结果如图所示:

从图中可以看出,当前 uboot 版本号为 2016.03, 2019 年 4 月 12 日编译的,编译器为 arm-linux-gnueabihf-gcc 等信息。

2 环境变量操作命令
 (1)修改环境变量

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

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

setenv bootdelay 5
saveenv

有时候我们修改的环境变量值可能会有空格, 比如 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。

(2)新建环境变量
命令 setenv 也可以用于新建命令,用法就是修改环境变量一样,比如我们新建一个环境变量 author, author 的值为12345678,那么就可以使用如下命令:

setenv author zuozhongkai
saveenv

完成以后重启 uboot,然后使用命令 printenv 查看当前环境变量, 会有环境变量: author,其值为: 12345678

(3)删除环境变量
既然可以新建环境变量,那么就可以删除环境变量,删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个环境变量,命令如下:

setenv author
saveenv

上面命令中通过 setenv 给 author 赋空值,也就是什么都不写来删除环境变量 author。重启uboot 就会发现环境变量 author 没有了

3 内存操作命令
内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、 nm、mm、 mw、 cp 和 cmp。
(1)md 命令
md 命令用于显示内存值,格式如下:

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

命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节来显示内存值。 address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 20*2=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是20*4=80 个字节。注意:uboot 命令中的数字都是十六进制的!不是十进制的!比如你想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:

md.b 80000000 14

(2)nm 命令
nm 命令用于修改指定地址的内存值,命令格式如下:

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

nm 命令同样可以以.b、 .w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:

nm.l 80000000

输入上述命令以后如图所示:

 80000000 表示现在要修改的内存地址, ffffff00 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如图所示:

 修改完成以后在使用命令 md 来查看一下有没有修改成功,如图所示:

 从图中可以看出,此时地址 0X80000000 的值变为了 0x12345678。 

(3) mm 命令
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505,操作如图所示:

 

从图中可以看出,修改了地址 0X80000000、 0X80000004 和 0X8000000C 的内容为0x05050505。使用命令 md 查看修改后的值,结果如图所示: 

 从图中可以看出内存数据修改成功。

(4)mw 命令
命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:

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

mw 命令同样可以以.b、 .w 和.l 来指定操作格式, address 表示要填充的内存起始地址, value为要填充的数据, count 是填充的长度。比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A,命令如下: 

mw.l 80000000 0A0A0A0A 10

然后使用命令 md 来查看,如图所示:

 从图中可以看出内存数据修改成功。

(5)cp 命令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到 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

结果如图所示: 

 在图中,先使用 md.l 命令打印出地址 0x80000000 和 0x80000100 处的数据,然后使用命令cp.l将0x80000100处的数据拷贝到0x80000100处。最后使用命令md.l查看0x80000100处的数据有没有变化,检查拷贝是否成功。

(6)cmp 命令
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

结果如图所示:

 从图中可以看出两段内存的数据相等。 我们再随便挑两段内存比较一下,比如地址0x80002000 和 0x800003000,长度为 0X10,比较结果如图所示:

从图中可以看出, 0x80002000 处的数据和 0x80003000 处的数据就不一样。

4.网络操作命令

将开发板和主机 PC 都连接到同一个路由器上,然后最后设置表中所示的几个环境变量:

 设置命令如下所示:

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

(1)ping 命令
开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可,比如服务器 IP 地址为 192.168.1.250,命令如下:

ping 192.168.1.250

结果如图所示:

 从图中可以看出, 192.168.1.250 这个主机存在,说明 ping 成功, uboot 的网络工作正常

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

 (2)dhcp 命令

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

 

从图可以看出,开发板通过 dhcp 获取到的 IP 地址为 192.168.1.50,和我们手动设置的一样,这很正常。同时在图中可以看到“warning: no boot file name;”、“TFTP from server 192.168.1.1”这样的字样。这是因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核。
输入“? dhcp”可查看 dhcp 命令详细的信息,如图所示:

 

(3)nfs 命令
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 Linux 开发中最常用的调试方法。使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。 uboot 中的 nfs 命令格式如下所示:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是要保存的 DRAM 地址, [[hostIPaddr:]bootfilename]是要下载的文件地址。比如要保存的 DRAM 地址是0x80800000,要下载的文件路径是/home/zuozhongkai/linux/nfs/zImage,则命令如下 

nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage

命 令 中 的 “ 80800000 ” 表 示 zImage 保 存 地 址 ,“192.168.1.250:/home/zuozhongkai/linux/nfs/zImage”表示 zImage 在 192.168.1.250 这个主机中,路径为/home/zuozhongkai/linux/nfs/zImage。下载过程如图所示:

 在图中会以“#”提示下载过程,下载完成以后会提示下载的数据大小,这里下载的 6071136 字节,而 zImage 的大小就是 6071136 字节,如图所示:

 下载完成以后查看 0x80800000 地址处的数据,使用命令 md.b 来查看前 0x100 个字节的数据,如图所示:

 再使用 winhex 软件来查看 zImage,检查一下前面的数据是否和上图中的一致,结果如下图所示:

 可以看出两个图中的前 100 个字节的数据一致,说明 nfs 命令下载到的zImage 是正确的。

(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/zuozhongkai/linux/tftpboot
chmod 777 /home/zuozhongkai/linux/tftpboot

这 样 我 就 在 我 的 电 脑 上 创 建 了 一 个 名 为 tftpboot 的 目 录 ( 文 件 夹 ) , 路 径 为/home/zuozhongkai/linux/tftpboot。注意!我们要给 tftpboot 文件夹权限,否则的话 uboot 不能从tftpboot 文件夹里面下载文件。最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp, 如果没有/etc/xinetd.d 目录的话自行创建, 然后在里面输入如下内容:

 完了以后启动 tftp 服务,命令如下:

sudo service tftpd-hpa start

打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:

TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
最后输入如下命令, 重启 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]

看 起 来 和 nfs 命 令 格式 一 样 的 , loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是和 nfs 命令的区别在于, tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下: 

tftp 80800000 zImage

下载过程如图所示:

 上图是下载成功的过程,若出现下载失败,如下图:

提示没有权限,出现这个错误一般有两个原因:
①、在 Ubuntu 中创建 tftpboot 目录的时候没有给予 tftboot 相应的权限。
②、 tftpboot 目录中要下载的文件没有给予相应的权限。
针对上述两个问题,使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹。

5. EMMC 和 SD 卡操作命令
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西。uboot 中常用于操作 MMC 设备的命令为“mmc”。mmc 是一系列的命令,其后可以跟不同的参数,输入“? mmc”即可查看 mmc 有关的命令,如图所示:

 

 

 从图中可以看出, mmc 后面跟不同的参数可以实现不同的功能,如表所示:

 

假设芯片有两个EMMC控制器,分别是EMMC0接SD卡, EMMC1接EMMC存储芯片。

(1)mmc info 命令
mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可,如图所示:

从图中可以看出,当前选中的 MMC设备是 EMMC,版本为 4.5,容量为 3.7GiB(EMMC为 4GB),速度为 52000000Hz=52MHz, 8 位宽的总线。还有一个与 mmc info 命令相同功能的命令: mmcinfo,“mmc”和“info”之间没有空格。
(2)mmc rescan 命令
mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入“mmc rescan”即可。
(3)mmc list 命令
mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”,结果如图所示:

可以看出当前开发板有两个 MMC 设备: FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),这是因为我现在用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。默认会将 EMMC 设置为当前 MMC 设备,这就是为什么输入“mmc info”查询到的是 EMMC 设备信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD 卡设置为当前的 MMC 设备。
(4)mmc dev 命令

mmc dev [dev] [part]

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

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

结果如图所示:

 

从图中可以看出,切换到 SD 卡成功, mmc0 为当前的 MMC 设备,输入命令“mmc info”即可查看 SD 卡的信息,结果如图所示:

 

 

 

 

 从图中可以看出当前 SD 卡为 3.0 版本的,容量为 14.8GiB(16GB SD )4 位宽总线

(5) mmc part 命令
有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:

mmc dev 1 //切换到 EMMC
mmc part //查看 EMMC 分区

结果如图所示:

 

 

从图中可以看出,此时 EMMC 有两个分区,扇区 20480~1024000 为第一个分区,扇区 1228800~6504448 为第二个分区。如果 EMMC 里面烧写了 Linux 系统的话, EMMC 是有3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统。但是在图中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。一个新的 SD 卡默认只有一个分区,那就是分区 0。如果要将 EMMC 的分区 2 设置为当前 MMC 设置,可以使用如下命令:

mmc dev 1 2

结果如图所示:

(6)mmc read 命令
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 //读取数据

结果如图所示:

 

 

 (7)mmc write 命令

要将数据写到 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.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中。我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时间,输入命令:

mmc dev 0 //切换到 SD 卡
version //查看版本号

结果如图所示:

 

 

可以看出当前 SD 卡中的 uboot 是 2019 年 4 月 15 日 12:52:04 编译的。我们现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftp 80800000 u-boot.imx

下载过程如图所示:

 

 

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

mmc dev 0 0
mmc write 80800000 2 32E 

烧写过程如图 所示:

 

 

 烧写成功,重启开发板(从 SD 卡启动),重启以后再输入 version 来查看版本号,结果如图所示:

 

 

从图中可以看出,此时的 uboot 是 2019 年 4 月 21 号 18:05:59 编译的,这个时间就是我刚刚编译 uboot 的时间,说明 uboot 更新成功。这里我们就学会了如何在 uboot 中更新 uboot了,如果要更新 EMMC 中的 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 的前两个块(扇区),里面保存着分区表! 

(8) mmc erase 命令

如果要擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:

mmc erase blk# cnt

blk 为要擦除的起始块, cnt 是要擦除的数量。

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

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

(1)fatinfo 命令

fatinfo 命令用于查询指定 MMC 设置指定分区的文件系统信息,格式如下:

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

interface 表示接口,比如 mmc, dev 是查询的设备号, part 是要查询的分区。比如我们要查询 EMMC 分区 1 的文件系统信息,命令如下:

fatinfo mmc 1:1

结果如图所示:  

 

 

 从上图可以看出, EMMC 分区 1 的文件系统为 FAT16 格式的。

(2)fatls 命令

fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下:

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

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

fatls mmc 1:1 

结果如图所示:

 

从上图可以看出, emmc 的分区 1 中存放着两个文件: zimage 和 imx6ull-14x14-evk.dtb,这两个文件分别是 linux 镜像文件和设备树。并且在 emmc 的分区 1 中有两个文件,没有目录

(3)fstype 命令

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 命令

fatload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:

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

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 命令

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

#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */ 

fatwirte 命令用于将 DRAM 中的数据写入到 MMC 设备中,命令格式如下: 

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

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

使用命令 tftp zImage 下载到 DRAM 0X80800000 地址处,命令如下: 

tftp 80800000 zImage

 

 zImage 大小为 6039328(0X5C2720)个字节,接下来使用命令 fatwrite 将其写入到 EMMC 的分区 1 中,文件名字为 zImage,命令如下:

fatwrite mmc 1:1 80800000 zImage 0x5c2720

完成以后使用“fatls”命令查看一下 EMMC 分区 1 里面的文件,结果如图所示:  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

注:原文出自 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3

 

addr 是数据读取到 DRAM 中的地址, blk 是要读取的块起始地址(十六进制),一个块是 512
字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区, cnt 是要读取的块数量(
六进制
)。比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM
0X80800000 地址处,命令如下:

posted @ 2020-04-04 23:08  on_the_go  阅读(1391)  评论(0编辑  收藏  举报