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

u-boot命令之EMMC和SD卡操作命令详解 张显显 2023-08-19 14:25:08 451

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命令中最常用的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 命令的详细信息和可用选项。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
张显显
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区