今天给大家详细的介绍一下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 hwpartition | MMC/SD卡上进行分区操作 |
mmc setdsr | 设置MMC/SD卡的数据寄存器(DSR)的值 |
mmc命令中最常用的8个命令如下:
- mmc info 命令
- mmc rescan 命令
- mmc list 命令
- mmc dev 命令
- mmc part 命令
- mmc read 命令
- mmc write 命令
- 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 命令的详细信息和可用选项。
今天的内容到这就结束了,感谢大家的收看,如果觉得文章写的还不错,可以点击“赞赏”。