eMMC和SD卡(TF卡)是同一类设备,以下命令二者是通用,本章节主要以eMMC举例说明命令的使用。
使用help mmc可以看到mmc相关命令列表以及其对应命令用法:
=> help mmc |
一、mmc dev
使用mmc list可以看到当前系统挂载的所有mmc设备:
=> mmc list FSL_SDHC: 0 FSL_SDHC: 1 (eMMC) |
本系统的mmc设备有设备0和设备1,设备1是eMMC设备,设备0就是TF卡设备。
使用mmc dev命令可以查看当前选中正在使用的mmc设备,mmc dev使用方法为:
mmc dev [dev] [part]
[dev]是指要选择的设备;
[part]是指所选设备的分区;
如果不加[dev]和[part]两个参数,则显示当前选中设备,如果不加[part]参数,则默认使用所选设备的0分区。
=> mmc dev switch to partitions #0, OK mmc1(part 0) is current device |
当前选中正在使用的是mmc1设备的0分区,即eMMC Flash的0分区,此处的0分区其实是指eMMC Flash的用户分区(用户分区的概念在以下mmc write章节会有说明)。
使用mmc dev切换到使用TF卡设备:mmc dev 0:
=> mmc dev 0 switch to partitions #0, OK mmc0 is current device |
切换成功之后,现在使用的就是TF卡设备,此时使用的mmc命令都是对TF卡进行的操作。为了使用eMMC进行命令使用举例演示,我们再将mmc设备更换为eMMC:
mmc dev 1:
=> mmc dev 1 switch to partitions #0, OK mmc1(part 0) is current device |
二、mmc info
该命令是查看当前mmc设备相关信息:mmc info或者mmcinfo:
=> mmc info Device: FSL_SDHC Manufacturer ID: 45 OEM: 100 Name: DG400 Tran Speed: 52000000 Rd Block Len: 512 MMC version 4.0 High Capacity: Yes Capacity: 7.3 GiB Bus Width: 8-bit Erase Group Size: 512 KiB |
三、mmc read
mmc read命令是读mmc中的数据到内存地址。
使用方法为mmc read addr blk# cnt:
addr是将要存放数据的内存地址;
blk#是要读的mmc的起始块号;
cnt是块数目;
举例,从mmc第5块开始读取2块的数据到内存0x80800000:mmc read 80800000 5 2:
=> mmc read 80800000 5 2 MMC read: dev # 1, block # 5, count 2 ... 2 blocks read: OK |
每一块是512个字节,读取2块,就是读取2*512=1024个字节。
四、mmc write
顾名思义,mmc write是向mmc中写入数据,mmc write addr blk# cnt:
addr是存放数据的内存地址;
blk#是要写的mmc的起始块号;
cnt是块数目;
举例,我们现在使用mmc write将最新编译的u-boot.imx更新到mmc中。
第一步,我们需要先将新的u-boot.imx存放到内存中,前面章节我们讲过使用tftp将Ubuntu的tftp共享文件夹中的文件下载到内存中,我们现在就使用tftp将u-boot.imx文件下载到内存0x80800000地址。然后第二步,就是用mmc write命令将u-boot.imx写入到mmc的指定uboot分区中。
我们通过操作eMMC设备演示mmc write命令的使用,在进行操作之前,我们先简单了解一下eMMC分区的相关知识,eMMC设备一般是由BOOT Area Patrtition1、BOOT Area Patrtition2、RPMB Partition、General Purpose Partitions(可分4个) 、User Data Area这几个物理分区组成,对于RPMB Partition、General Purpose Partitions这两种分区我们没有涉及到这里不作介绍,我们涉及到的是BOOT Area Patrtition1、BOOT Area Patrtition2、User Data Area,其中BOOT Area Patrtition1、BOOT Area Patrtition2是存放uboot镜像的分区,两者选其一作为实际存放uboot的分区,ElfBoard使用的是BOOT Area Patrtition1;User Data Area (UDA)用户分区通常是eMMC中最大的一个分区,是实际产品中最主要的存储区域,ElfBoard在烧写时,会对此用户分区进行软件分区,分成RAW、fat和ext3格式的三个逻辑分区。
了解了eMMC分区的相关概念之后,我们就可以进行如下操作,验证测试mmc write命令。按照前面tftp命令章节,配置好tftp网络环境之后,我们重新编译一个uboot.imx镜像,并且放入到Ubuntu的tftp共享文件夹中,并保证网络连接状态良好,在开发板使用tftp将新的uboot镜像下载到内存0x80800000处:
=> tftp 80800000 u-boot.imx |
下载完成,之后使用mmc write写入到eMMC分区BOOT Area Patrtition1中,根据mmc write addr blk# cnt使用方法,addr=80800000,blk#是要烧写的起始地址, uboot在eMMC boot分区的偏移为1K=2*512字节,即 blk#=2,cnt是烧写的数据长度,根据tftp传输完成之后的打印信息,知道uboot.imx镜像大小为429056字节=838*512字节,所以cnt应该等于838,十六进制为0x346。
选择mmc设备及BOOT Area Patrtition1分区(最后一个参数为“1”,表示BOOT Area Patrtition1分区,为“2”时,表示选择的是BOOT Area Patrtition2分区,为“0”时,表示选择的是UDA用户分区):
=> mmc dev 1 1 switch to partitions #1, OK mmc1(part 1) is current device |
=> mmc write 80800000 2 346 MMC write: dev # 1, block # 2, count 838 ... 838 blocks written: OK |
烧写完成之后,使用reset开发板,根据uboot编译时间可以看出,uboot已经替换为刚刚编译的:
五、mmc erase
mmc erase是擦除mmc中数据。使用方法:
mmc erase blk# cnt,其中blk#是要擦除的mmc起始地址,cnt要擦除的块数量。一般情况很少使用mmc erase命令进行mmc擦除操作。