uboot 支持 EMMC 和 SD 卡, 因此也要提供 EMMC 和 SD 卡的操作命令。
一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。
uboot 中常用于操作 MMC 设备的命令为“mmc” 。
1、mmc info 命令
mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“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 命令用于切换当前 MMC 设备,命令格式如下:
mmc dev [dev] [part]
- [dev]用来设置要切换的 MMC 设备号
- [part]是分区号。
如果不写分区号的话默认为分区 0。
使用如下命令切换到 SD 卡:
mmc dev 0
//切换到 SD 卡,0 为 SD 卡,1 为 eMMC
从图可以看出,切换到 SD 卡成功,mmc0 为当前的 MMC 设备,输入命令“mmc info”即可查看 SD 卡的信息,结果如图所示:
5、mmc part 命令
有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:
6、mmc read 命令
mmc read 命令用于读取 mmc 设备的数据,命令格式如下:
mmc read addr blk# cnt
- addr 是数据读取到 DRAM 中的地址
- blk 是要读取的块起始地址(十六进制) 一个块是 512字节
- cnt 是要读取的块数量(十六进制)
这里的块和扇区是一个意思, 在 MMC 设备中我们通常说扇区。
比如从EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:
7、mmc write 命令
要将数据写到 MMC 设备里面,可以使用命令“mmc write” ,格式如下:
mmc write addr blk# cnt
- addr 是要写入 MMC 中的数据在 DRAM 中的起始地址
- blk 是要写入 MMC 的块起始地址
- cnt 是要写入的块大小
演示烧录uboot: 1、需要具备nfs或tftcp功能。 2、准备 u-boot.imx
将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。
cp u-boot.imx …/…/tftpboot/
最后在uboot环境中使用 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
重启uboot:reset
查看版本: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 的前两个块(扇区),里面保存着分区表!
8、mmc erase 命令
如果要擦除 MMC 设备的指定块就是用命令“mmc erase” ,命令格式如下:
mmc erase blk# cnt
- blk 为要擦除的起始块
- cnt 是要擦除的数量
没事不要用 mmc erase 来擦除 MMC 设备! ! !