u-boot命令之EMMC和SD卡操作命令详解

嵌入式技术

1368人已加入

描述

嗨喽,大家好,我是程序猿老王,程序猿老王就是我。

今天给大家详细的介绍一下u-boot命令之EMMC和SD卡操作的mmc命令使用。希望这篇文章对大家有所帮助。

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,统一使用 MMC 来代指 EMMC 和 SD 卡。

uboot 中常用于操作 MMC 设备的命令为“mmc”。

mmc 是一系列的命令,其后可以跟不同的参数,在u-boot的命令行输入“?mmc”即可查看 mmc 有关的命令,如下:

= > ? mmc
mmc - MMC sub system

Usage:
mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan [mode]
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode
  - the required speed mode is passed as the index from the following list
    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,
    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]
mmc list - lists available devices
mmc wp [PART] - power on write protect boot partitions
  arguments:
   PART - [0|1]
       : 0 - first boot partition, 1 - second boot partition
         if not assigned, write protect all boot partitions
mmc hwpartition < USER > < GP > < MODE > - does hardware partitioning
  arguments (sizes in 512-byte blocks):
   USER - < user > < enh > < start > < cnt > < wrrel > <  {on|off} >
        : sets user data area attributes
   GP - < {gp1|gp2|gp3|gp4} > < cnt > < enh > < wrrel > < {on|off} >
        : general purpose partition
   MODE - < {check|set|complete} >
        : mode, complete set partitioning completed
  WARNING: Partitioning is a write-once setting once it is set to complete.
  Power cycling is required to initialize partitions after set to complete.
mmc setdsr < value > - set DSR register value

从上面列出的参数详情可以看出, mmc 后面跟不同的参数可以实现不同的功能,如下所示:

命令功能
mmc info显示MMC/SD卡设备的详细信息,包括容量、速度等
mmc read从MMC/SD卡读取数据到指定的加载地址
mmc wirte将指定加载地址的数据写入MMC/SD卡的指定扇区
mmc erase擦除MMC/SD卡上指定扇区的数据
mmc rescan重新扫描MMC/SD卡设备,以便在U-Boot中重新识别它们mmc part显示当前选择的MMC/SD卡设备的分区表信息
mmc dev选择并初始化指定编号的MMC/SD卡设备
mmc list列出系统中检测到的所有MMC设备的信息
mmc wp设置 MMC/SD卡的写保护状态
mmc hwpartitionMMC/SD卡上进行分区操作
mmc setdsr设置MMC/SD卡的数据寄存器(DSR)的值

mmc命令中最常用的8个命令如下:

  1. mmc info 命令
  2. mmc rescan 命令
  3. mmc list 命令
  4. mmc dev 命令
  5. mmc part 命令
  6. mmc read 命令
  7. mmc write 命令
  8. mmc erase 命令

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

每个字段的解释如下:

  • 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 卡的擦除操作的最小单位大小

输出中的信息可能会有所不同,具体取决于系统中存在的 MMC 设备和 U-Boot 版本。

2、mmc rescan 命令

mmc rescan命令用于重新扫描系统中的 MMC 设备,并更新设备的编号、容量、速度等信息。这对于在 U-Boot 中添加或移除 MMC 设备后进行设备状态更新很有用。

mmc rescan

3、mmc list 命令

mmc list命令用于列出检测到的 MMC 设备,如下所示:

= > mmc list
FSL_SDHC: 0 (SD)
FSL_SDHC: 1

从上面可以看出,当前开发板有两个 MMC 设备:

  • FSL_SDHC:0 是 SD卡
  • FSL_SDHC:1(eMMC)是 EMMC。

4、 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 未写保护

5、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。

6、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 地址处。

7、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 的前两个块(扇区),里面保存着分区表!

8、mmc erase 命令

mmc erase命令用于在 MMC 设备上执行擦除操作。通过执行 mmc erase 命令,您可以擦除 MMC 设备上的指定扇区或分区。命令如下:

mmc erase blk# cnt

每个参数的含义如下:

  • blk 为要擦除的起始块
  • cnt 是要擦除的数量

注:没事不要用 mmc erase 来擦除 MMC 设备!!!

请注意,具体可用的命令和选项可能会根据所使用的 U-Boot 版本和硬件平台而有所不同。某些平台和版本可能不支持此命令。在使用此命令之前,请确保您的 U-Boot 版本和硬件平台支持它。您可以使用 U-Boot 的 help mmc 命令来获取更多关于 mmc 命令的详细信息和可用选项。

今天的内容到这就结束了,感谢大家的收看,如果觉得文章写的还不错,可以点击“赞赏”,来鼓励一下老王哦,当然,也可以点赞,收藏加关注哦!我们下期再见!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分