uboot 支持 EMMC 和 SD 卡, 因此也要提供 EMMC 和 SD 卡的操作命令。
一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。
uboot 中常用于操作 MMC 设备的命令为“mmc” 。
mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可,如图所示:
mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入“mmc rescan”即可。
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 设备。
mmc dev 命令用于切换当前 MMC 设备,命令格式如下:
mmc dev [dev] [part]
使用如下命令切换到 SD 卡:
mmc dev 0
//切换到 SD 卡,0 为 SD 卡,1 为 eMMC
从图可以看出,切换到 SD 卡成功,mmc0 为当前的 MMC 设备,输入命令“mmc info”即可查看 SD 卡的信息,结果如图所示:
有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:
mmc dev 1 // 切换到 EMMC
mmc part // 查看 EMMC 分区
mmc read 命令用于读取 mmc 设备的数据,命令格式如下:
mmc read addr blk# cnt
这里的块和扇区是一个意思, 在 MMC 设备中我们通常说扇区。
比如从EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:
mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
要将数据写到 MMC 设备里面,可以使用命令“mmc write” ,格式如下:
mmc write addr blk# cnt
演示烧录uboot:
1、需要具备nfs或tftcp功能。https://blog.csdn.net/qq_29246181/article/details/106272766
2、准备 u-boot.imx:https://blog.csdn.net/qq_29246181/article/details/106240055
将编译出来的 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 中更新 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 需要这一步!
如果要擦除 MMC 设备的指定块就是用命令“mmc erase” ,命令格式如下:
mmc erase blk# cnt