在开发Linux相关工作、uboot开发中,EMMC和SD卡驱动,常要操作 MMC 设备,使用命令为“mmc xxx”,本文介绍一下mmc设备的命令和使用方法。 一、常用的MMC命令和参数 mmc命令中,比较常用的8个命令如下所示: mmc info 命令 mmc rescan 命令 mmc list 命令 mmc dev 命令 mmc part 命令 mmc read 命令 mmc write 命令 mmc erase 命令 具体的详细的命令,在u-boot的命令行,直接在串口端输入mmc 命令,其后可以跟不同的参数,就可以打印出MMC相关的命令介绍。或者输入“? mmc”即可查看 mmc 有关的命令,如下: 从上面打印列出的参数详情可以看出, mmc 后面跟不同的参数可以实现不同的功能,如下所示: 二、常见的命令具体解析 根据上面列举的命令和参数,下面详细介绍一下 1、mmc info 命令 mmc info命令,用于打印出当前硬件板上的MMC设备的相关信息,包括设备编号、制造商 ID、OEM、卡名称、总容量、总扇区数、块大小、传输速度、版本信息、是否支持高容量(High Capacity)等,如下所示: => mmc info Device: FSL_SDHC Manufacturer ID: 3 OEM: 5344 Name: SC16G Bus Speed: 49500000 Mode: SD High Speed (50MHz) Rd Block Len: 512 SD version 3.0 High Capacity: Yes Capacity: 14.8 GiB Bus Width: 4-bit Erase Group Size: 512 Bytes 以上2个示例,对每个字段、命令的解释如下。在输出信息中可能会有所差异,具体取决于系统中存在的 MMC 设备和 U-Boot 版本。但大部分主流的命令和解析应该是统一的。 Device: FSL_SDHC:设备类型,这里是 FSL_SDHC,指示是由飞思卡尔(Freescale)提供的 SD 控制器 Manufacturer ID: 3:制造商 ID,表示制造商的标识号 OEM: 5344:OEM 信息,指示原始设备制造商的标识号 Name: SC16G:MMC 卡名称,这里是 SC16G Bus Speed: 49500000:总线速度,表示数据传输的速率 Mode: SD High Speed (50MHz):模式,指示 MMC 卡所处的传输模式,这里是 SD 高速模式,传输速率为 50MHz Rd Block Len: 512:读取块长度,表示 MMC 卡的块大小 SD version 3.0:SD 卡版本,这里是版本 3.0 High Capacity: Yes:是否支持高容量,指示 MMC 卡是否支持高容量存储 Capacity: 14.8 GiB:容量,表示 MMC 卡的总容量 Bus Width: 4-bit:总线宽度,表示 MMC 卡的数据传输总线宽度 Erase Group Size: 512 Bytes:擦除组大小,表示 MMC 卡的擦除操作的最小单位大小 2、 mmc list 命令mmc list命令用于列出检测到的设备节点,显示DTB上面相关MMC设备。也会显示当前SDK在使用的的 MMC 设备,如下所示: => mmc list FSL_SDHC: 0 (SD) FSL_SDHC: 1 从上面可以看出,当前开发板有两个 MMC 设备: FSL_SDHC:0 是 SD卡 FSL_SDHC:1(eMMC)是 EMMC。 3、mmc erase 命令mmc erase命令用于在 MMC 设备上执行擦除操作。通过执行 mmc erase 命令,您可以擦除 MMC 设备上的指定扇区或分区。命令如下: mmc erase blk# cnt 每个参数的含义如下: blk 为要擦除的起始块 cnt 是要擦除的数量 注:没事不要用 mmc erase 来擦除 MMC 设备!!! 注:切记不要用 mmc erase 来随便擦除 MMC 设备!!! 4、mmc read 命令mmc read命令用于从 MMC设备读取数据,并将其加载到指定的内存地址上。执行 mmc read 命令,也可以从 MMC 设备的指定扇区开始读取指定长度的数据,并将其加载到内存中供后续使用。命令如下所示: mmc read addr blk# cnt 每个参数的含义如下: addr 是数据读取到 DRAM 中的地址 blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区 cnt 是要读取的块数量(十六进制) 示例如下: => mmc read 0x80800000 0x600 0x10 MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK 从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处。 5、mmc write 命令mmc write命令用于将数据从内存写入到 MMC 设备的指定扇区中。通过执行 mmc write 命令,也可以将指定内存地址处的数据写入到 MMC 设备的指定扇区中。命令如下所示: mmc write addr blk# cnt 每个参数的含义如下: addr 是要写入 MMC 中的数据在 DRAM 中的起始地址 blk 是要写入 MMC 的块起始地址(十六进制) cnt 是要写入的块大小,一个块为 512 字节 示例如下: => mmc write 0x80800000 0x2 0x32E MMC write: dev # 1, block # 2, count 814 ... 814 blocks written: OK 向 eMMC 中写入742 个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 eMMC 分区 0 第 2 个块(扇区)开始烧写,一共烧写 742(0x2E6)个块。 扩展一下,u-boot可以利用 mmc write更新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 的前两个块(扇区),里面保存着分区表! 6、mmc part 命令mmc part命令,用于查看当前 MMC 设备的分区信息,可以看到每个分区的起始扇区、大小和类型,如下所示: => mmc part Partition Map for MMC device 1 -- Partition Type: DOS Part Start Sector Num Sectors UUID Type 1 20480 262144 e94b5ec8-01 0c 2 282624 14987264 e94b5ec8-02 83 输出中的每一行表示一个分区的信息,包括以下字段: Part: 分区编号 Start Sector: 分区的起始扇区 Num Sectors: 分区的扇区数量 UUID: 分区的唯一标识符 Type: 分区的类型 从上面可以看出,此时 EMMC 有两个分区: 扇区 20480~ 262144 为第一个分区 扇区 282644~14987264 为第二个分区。 如果 EMMC 里面烧写了 Linux 系统的话, EMMC 是有3 个分区: 第 0 个分区存放 uboot, 第 1 个分区存放 Linux 镜像文件和设备树, 第 2 个分区存放根文件系统。 但是在上图中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。一个新的 SD 卡默认只有一个分区,那就是分区 0。 7、mmc rescan 命令 mmc rescan命令用于重新扫描系统中的 MMC 设备,并更新设备的编号、容量、速度等信息。这对于在 U-Boot 中添加或移除 MMC 设备后进行设备状态更新很有用。 mmc rescan 对比可以拔插的MMC设备,拔插前后都可以执行,进行对比查看。 8、mmc dev 命令mmc dev命令用于把所选择的 MMC 设备设置为当前使用设备,并在后续的操作中使用该设备。这对于在多个 MMC 设备存在的系统中选择要操作的设备非常有用。命令用法如下: 命令格式: mmc dev [dev] [part] 参数含义如下: [dev]用来设置要切换的MMC设备号 [part]是分区号 [part]分区号也可以不写,不写的话默认为0分区,如下所示: => mmc dev 1 /*切换到EMMC,0为SD卡, 1为eMMC*/ switch to partitions #0, OK mmc1(part 0) is current device 如果切换到 eMMC 成功, mmc0 为当前的 MMC 设备,输入命令“mmc info”可查看 当前eMMC设备 的信息,如下所示: => mmc dev 1 switch to partitions #0, OK mmc1(part 0) is current device => mmc info Device: FSL_SDHC Manufacturer ID: 15 OEM: 0 Name: 8GTF4R Bus Speed: 49500000 Mode: MMC High Speed (52MHz) Rd Block Len: 512 MMC version 5.1 High Capacity: Yes Capacity: 7.3 GiB Bus Width: 4-bit Erase Group Size: 512 KiB HC WP Group Size: 8 MiB User Capacity: 7.3 GiB WRREL Boot Capacity: 4 MiB ENH RPMB Capacity: 512 KiB ENH Boot area 0 is not write protected Boot area 1 is not write protected 对上述设备信息,每个字段、意义的解释如下: Device: FSL_SDHC: 设备类型,这里指示为飞思卡尔(Freescale)提供的 SD 控制器 Manufacturer ID: 15: 制造商 ID,表示制造商的标识号 OEM: 0: OEM 信息,指示原始设备制造商的标识号 Name: 8GTF4R: MMC 卡名称,这里是 "8GTF4R" Bus Speed: 49500000: 总线速度,表示数据传输的速率 Mode: MMC High Speed (52MHz): 模式,指示 MMC 卡所处的传输模式,这里是 MMC 高速模式,传输速率为 52MHz Rd Block Len: 512: 读取块长度,表示 MMC 卡的块大小 MMC version 5.1: MMC 卡版本,这里是版本 5.1 High Capacity: Yes: 是否支持高容量,指示 MMC 卡是否支持高容量存储 Capacity: 7.3 GiB: 容量,表示 MMC 卡的总容量 Bus Width: 4-bit: 总线宽度,表示 MMC 卡的数据传输总线宽度 Erase Group Size: 512 KiB: 擦除组大小,表示 MMC 卡的擦除操作的最小单位大小 HC WP Group Size: 8 MiB: 高容量写保护组大小,表示高容量 MMC 卡的写保护操作的最小单位大小 User Capacity: 7.3 GiB WRREL: 用户可用容量,表示用户可用的存储容量,考虑了保留区域和写保护 Boot Capacity: 4 MiB ENH: 引导区容量,表示 MMC 卡用于引导目的的存储容量 RPMB Capacity: 512 KiB ENH: RPMB(Replay Protected Memory Block)容量,表示 MMC 卡用于安全存储和认证的特定存储容量 Boot area 0 is not write protected: 引导区域 0 未写保护 Boot area 1 is not write protected: 引导区域 1 未写保护 备注: 请注意,具体可用的命令,选项可能会根据所使用的 U-Boot 版本和硬件平台的不同,存在差异,但是大部分主流的SDK和平台是保持一致的。 某些平台和版本可能不支持某一个或几个命令。在使用这些命令之前,请确保您的 U-Boot 版本和硬件平台支持它,如果不支持某一个命令,可以修改SDK代码进行支持。可以使用 U-Boot 的 help mmc 命令来获取更多关于 mmc 命令的详细信息和可用选项。可以上网查询相关技术或博客。 |
|
来自: charlie_linux > 《emmc》