uboot命令使用- EMMC、文件操作、NAND、boot命令

run mybootemmc
run mytoobnand
run mybootnet
正点原子个人学习笔记

EMMC 和 SD 卡操作命令

mmc命令

mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命令

mmc info 命令 

mmc info 命令用于输出当前选中的 mmc info 设备的信息

还有一个与 mmc info 命令相同功能的 命令:mmcinfo

mmc rescan 命令

mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入 “mmc rescan”即可

mmc list 命令

mmc list 命令用于来查看当前开发板一共有几个 MMC 设备

mmc dev 命令

mmc dev 命令用于切换当前 MMC 设备

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

mmc dev [dev] [part]

 切换到 SD 卡

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

有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区

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

一个分区,从8192开始,长度60432384

如果 EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统

第 0 个分区没有格式化,所以识别不出来

如果要将 EMMC 的分区 2 设置为当前 MMC 设备

mmc dev 1 2

mmc read 命令

mmc read 命令用于读取 mmc 设备的数据

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

mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据

通过 md.b 命令查看 0x80800000 处的数据就行了,查 看 16*512=8192(0x2000)个字节的数据

md.b 80800000 2000

 mmc write 命令

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

mmc write addr blk# cnt

我们可以使用命令“mmc write”来升 级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令 将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC 设备中。

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 2E6

烧写成功,重启开发板(从 SD 卡启动),重启以后再输入 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 的前两个块(扇区),里面保存着分区表!

mmc erase 命令

擦除 MMC 设备的指定块就是用命令“mmc erase”

blk 为要擦除的起始块,cnt 是要擦除的数量,没事儿别擦

mmc erase blk# cnt

 FAT 格式文件系统操作命令

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

fatinfo 命令

fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息

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

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

fatinfo mmc 1:1

fatls 命令

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

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

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

fatls mmc 1:1

 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)

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

 从上图可以看出在 225ms 内读取了 6785272 个字节的数据,速度为 28.8MiB/s,速度是非 常快的,因为这是从 EMMC 里面读取的,而 EMMC 是 8 位的,速度肯定会很快的。

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 为例,首先将正点原子 I.MX6U-ALPHA 开发板提供的 zImage 镜像文件拷贝到 Ubuntu 中的 tftpboot 目录下

拷贝完成以后使用命令 tftp 将 zImage 下载到 DRAM 的 0X80800000 地址处

tftp 80800000 zImage

接下来使用命令 fatwrite 将其写入到 EMMC 的 分区 1 中,文件名字为 zImage

zImage 大小为 6785272(0X6788f8)个字节

fatwrite mmc 1:1 80800000 zImage 6788f8

完成以后使用“fatls”命令查看一下 EMMC 分区 1 里面的文件

EXT 格式文件系统操作命令

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

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

ext4ls mmc 1:2

NAND 和 boot 操作命令

NAND操作命令

uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版 本的核心板

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]]

addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在 DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中 的地址。现在我们使用网络和 EMMC 两种方法来启动 Linux 系统,首先将 I.MX6U-ALPHA 开 发板的 Linux 镜像和设备树发送到 Ubuntu 主机中的 tftpboot 文件夹下。Linux 镜像文件前面已 经放到了 tftpboot 文件夹中,现在把设备树文件放到 tftpboot 文件夹里面

给予 imx6ull-14x14-emmc-7-1024x600-c.dtb 可执行权限

chmod 777 imx6ull-14x14-emmc-7-1024x600-c.dtb

使用 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

从 EMMC 中启 动 Linux 系统

fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

bootm 命令

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 为空的话,同样是用“-”来替代

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 系统

从 网络 启动

使用 tftp 命令 从网络下载 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后启动 Linux

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; 
bootz 80800000 - 83000000'
saveenv
boot

uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动 命令

从 EMMC 启动

setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-
emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
savenev
boot

其他常用命令

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

reset 命令

输入“reset”即可复位重启

go 命令

go 命令用于跳到指定的地址处执行应用

go addr [arg ...]

 将 printf.bin 下载到开发板 DRAM 的 0X87800000 地址处,因为裸机例程的链接首地址就是 0X87800000

tftp 87800000 printf.bin
go 87800000

run 命令

run 命令用于运行环境变量中定义的命令,比如可以通过“run bootcmd”来运行 bootcmd 中 的启动命令

在后面调试 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-800x480-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-800x480-c.dtb; 
bootz 80800000 - 83000000'
saveenv

创建环境变量成功以后就可以使用 run 命令来运行 mybootemmc、mybootnet 或 mybootnand 来实现不同的启动

run mybootemmc
run mytoobnand
run mytoobnet

mtest 命令

mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR

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

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

测试范围为 0X80000000~0X80001000,已经测试了 486 次,如果 要结束测试就按下键盘上的“Ctrl+C”键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值