嗨喽,大家好,我是程序猿老王,程序猿老王就是我。
今天给大家详细的介绍一下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 命令的详细信息和可用选项。
今天的内容到这就结束了,感谢大家的收看,如果觉得文章写的还不错,可以点击“赞赏”,来鼓励一下老王哦,当然,也可以点赞,收藏加关注哦!我们下期再见!
关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。