uboot 支持 EMMC 和 SD 卡, 因此也要提供 EMMC 和 SD 卡的操作命令。

一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。

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

emmc代码架构分析 emmc操作流程_开发板

1、mmc info 命令

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

emmc代码架构分析 emmc操作流程_数据_02

2、mmc rescan 命令

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

3、mmc list 命令

mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list” ,结果如图所示:

emmc代码架构分析 emmc操作流程_十六进制_03


可以看出当前开发板有两个 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 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]

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

使用如下命令切换到 SD 卡:

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

emmc代码架构分析 emmc操作流程_emmc代码架构分析_04


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

emmc代码架构分析 emmc操作流程_数据_05

5、mmc part 命令

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

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

emmc代码架构分析 emmc操作流程_数据_06

6、mmc read 命令

mmc read 命令用于读取 mmc 设备的数据,命令格式如下:

mmc read addr blk# cnt

  1. addr 是数据读取到 DRAM 中的地址
  2. blk 是要读取的块起始地址(十六进制) 一个块是 512字节
  3. cnt 是要读取的块数量(十六进制)

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

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

emmc代码架构分析 emmc操作流程_数据_07

7、mmc write 命令

要将数据写到 MMC 设备里面,可以使用命令“mmc write” ,格式如下:

mmc write addr blk# cnt

  1. addr 是要写入 MMC 中的数据在 DRAM 中的起始地址
  2. blk 是要写入 MMC 的块起始地址
  3. cnt 是要写入的块大小

演示烧录uboot:
1、需要具备nfs或tftcp功能。
2、准备 u-boot.imx:

将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。

cp u-boot.imx …/…/tftpboot/

emmc代码架构分析 emmc操作流程_开发板_08

最后在uboot环境中使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftp 80800000 u-boot.imx

emmc代码架构分析 emmc操作流程_数据_09


可以看出,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

emmc代码架构分析 emmc操作流程_开发板_10


重启uboot:reset

查看版本:version

emmc代码架构分析 emmc操作流程_开发板_11

同理,如果要在 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

  1. blk 为要擦除的起始块
  2. cnt 是要擦除的数量

没事不要用 mmc erase 来擦除 MMC 设备! ! !