EMMC和SD卡操作命令
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 设备!!!