U-Boot命令之MMC(EMMC和SD卡)操作命令

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U-Boot命令之MMC(EMMC和SD卡)操作命令相关的知识,希望对你有一定的参考价值。

参考:U-Boot命令之EMMC和SD卡操作命令
作者:一只青木呀
发布时间: 2020-10-20 15:02:16
网址:https://blog.csdn.net/weixin_45309916/article/details/109178989

EMMC和SD卡操作命令

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

uboot 中常用于操作 MMC 设备的命令为“mmc”

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

从上图可以看出, 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 info 命令

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

从上图可以看出,当前选中的 MMC设备是 SD卡,版本为 3.0,容量为 14.8GiB(EMMC为 4GB),速度为 50000000Hz=50MHz, 4 位宽的总线。还有一个与 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 (SD)和 FSL_SDHC:1 (eMMC),这是因为我现在用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。默认会将 EMMC 设置为当前 MMC 设备,要想查看 EMMC信息,就要使用命令“mmc dev”来将 EMMC卡设置为当前的 MMC 设备

4、 mmc dev 命令

mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]

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

使用如下命令切换到 EMMC:

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

结果如下图所示:

从上图可以看出,切换到 EMMC 卡成功, mmc1 为当前的 MMC 设备,输入命令“mmcinfo”即可查看 EMMC 卡的信息,结果如图下所示:

从上图可以看出,EMMC版本为4.0, 容量为 7.3GiB,速度为 52000000Hz=52MHz, 8 位宽的总线。

5、 mmc part 命令

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

mmc part //查看 EMMC 分区

结果如下图所示:

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

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 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 是 2020 年 10 月 12 日 14:04:37 编译的。我们现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftpboot 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


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

从上图可以看出,此时的 uboot 是 2020 年 10 月 20 号 14:47:38 编译的,这个时间就是我刚刚编译 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 是要擦除的数量。没事不要用 mmc erase 来擦除 MMC 设备!!!

以上是关于U-Boot命令之MMC(EMMC和SD卡)操作命令的主要内容,如果未能解决你的问题,请参考以下文章

Tiny4412 烧写uboot到emmc步骤

u-boot硬件驱动——以SD卡为例

u-boot常用命令

u-boot常用命令

eMMC SD/eMMC寄存器介绍

SD介绍