分享

Linux系统u-boot阶段命令EMMC和SD卡命令解析

 charlie_linux 2024-03-28 发布于广东

在开发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 命令的详细信息和可用选项。可以上网查询相关技术或博客。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多