天天看點

u-boot使用指令之EMMC 和 SD 卡操作指令

u-boot使用指令之EMMC 和 SD 卡操作指令

    • 1、 mmc info 指令
    • 2、 mmc rescan 指令
    • 3、 mmc list 指令
    • 4、 mmc dev 指令
    • 5、 mmc part 指令
    • 6、 mmc read 指令
    • 7、 mmc write 指令
    • 8、 mmc erase 指令

uboot 支援 EMMC 和 SD 卡,是以也要提供 EMMC 和 SD 卡的操作指令。一般認為 EMMC和 SD 卡是同一個東西,是以沒有特殊說明,本教程統一使用 MMC 來代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 裝置的指令為“mmc”。mmc 是一系列的指令,其後可以跟不同的參數,輸入“? mmc”即可檢視 mmc 有關的指令,如圖 所示:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖可以看出, mmc 後面跟不同的參數可以實作不同的功能,如表所示:

指令 描述
mmc info 輸出 MMC 裝置資訊
mmc read 讀取 MMC 中的資料。
mmc wirte 向 MMC 裝置寫入資料。
mmc rescan 掃描 MMC 裝置。
mmc part 列出 MMC 裝置的分區。
mmc dev 切換 MMC 裝置。
mmc list 列出目前有效的所有 MMC 裝置。
mmc hwpartition 設定 MMC 裝置的分區。
mmc bootbus…… 設定指定 MMC 裝置的 BOOT_BUS_WIDTH 域的值。
mmc bootpart…… 設定指定 MMC 裝置的 boot 和 RPMB 分區的大小。
mmc partconf…… 設定指定 MMC 裝置的 PARTITION_CONFG 域的值。
mmc rst 複位 MMC 裝置
mmc setdsr 設定 DSR 寄存器的值

1、 mmc info 指令

mmc info 指令用于輸出目前選中的 mmc info 裝置的資訊,輸入指令“mmc info”即可,如

圖所示:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖可以看出,目前選中的 MMC裝置是 EMMC,版本為 4.0,容量為 7.3GiB(EMMC為 8GB),速度為 52000000Hz=52MHz, 8 位寬的總線。還有一個與 mmc info 指令相同功能的指令: mmcinfo,“mmc”和“info”之間沒有空格。

2、 mmc rescan 指令

mmc rescan 指令用于掃描目前開發闆上所有的 MMC 裝置,包括 EMMC 和 SD 卡,輸入“mmc rescan”即可。

3、 mmc list 指令

u-boot使用指令之EMMC 和 SD 卡操作指令

可以看出目前開發闆有兩個 MMC 裝置: FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),這是因為我現在用的是 EMMC 版本的核心闆,加上 SD 卡一共有兩個 MMC 裝置, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。預設會将 EMMC 設定為目前 MMC 裝置,這就是為什麼輸入“mmc info”查詢到的是 EMMC 裝置資訊,而不是 SD 卡。要想檢視 SD 卡資訊,就要使用指令“mmc dev”來将 SD 卡設定為目前的 MMC 裝置。

4、 mmc dev 指令

mmc dev 指令用于切換目前 MMC 裝置,指令格式如下:

[dev]用來設定要切換的 MMC 裝置号, [part]是分區号。如果不寫分區号的話預設為分區 0。

使用如下指令切換到 SD 卡:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖可以看出,切換到 SD 卡成功, mmc0 為目前的 MMC 裝置,輸入指令“mmcinfo”即可檢視 SD 卡的資訊,結果如圖所示:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖可以看出目前 SD 卡為 3.0 版本的,容量為 14.8GiB(16GB 的 SD 卡), 4 位寬的總線。

5、 mmc part 指令

有時候 SD 卡或者 EMMC 會有多個分區,可以使用指令“mmc part”來檢視其分區,比如

檢視 EMMC 的分區情況,輸入如下指令:

mmc dev 1 //切換到 EMMC
mmc part //檢視 EMMC 分區
           

結果如下:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖中可以看出,此時 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 addr blk# cnt
           

addr 是資料讀取到 DRAM 中的位址, blk 是要讀取的塊起始位址(十六進制),一個塊是 512位元組,這裡的塊和扇區是一個意思,在 MMC 裝置中我們通常說扇區, cnt 是要讀取的塊數量(十六進制)。比如從 EMMC 的第 1536(0x600)個塊開始,讀取 16(0x10)個塊的資料到 DRAM 的0X80800000 位址處,指令如下:

mmc dev 1 0 //切換到 MMC 分區 0
mmc read 80800000 600 10 //讀取資料
           

結果如圖所示:

u-boot使用指令之EMMC 和 SD 卡操作指令

這裡我們還看不出來讀取是否正确,通過 md.b 指令檢視 0x80800000 處的資料就行了,檢視 16*512=8192(0x2000)個位元組的資料,指令如下:

u-boot使用指令之EMMC 和 SD 卡操作指令

從圖可以看到“D$…baudrate=115200.board_name=EVK.board_rev=14X14.”等字樣,這個就是 uboot 中的環境變量。 EMMC 核心闆 uboot 環境變量的存儲起始位址就是1536*512=786432。

7、 mmc write 指令

要将資料寫到 MMC 裝置裡面,可以使用指令“mmc write”,格式如下:

mmc write addr blk# cnt
           

addr 是要寫入 MMC 中的資料在 DRAM 中的起始位址, blk 是要寫入 MMC 的塊起始位址(十六進制), cnt 是要寫入的塊大小,一個塊為 512 位元組。我們可以使用指令“mmc write”來更新 uboot,也就是在 uboot 中更新 uboot。這裡要用到 nfs 或者 tftp 指令,通過 nfs 或者 tftp 指令将新的 u-boot.bin 下載下傳到開發闆的 DRAM 中,然後再使用指令“mmc write”将其寫入到 MMC裝置中。我們就來更新一下 SD 中的 uboot,先檢視一下 SD 卡中的 uboot 版本号,注意編譯時間,輸入指令:

mmc dev 0 //切換到 SD 卡
version //檢視版本号
           
u-boot使用指令之EMMC 和 SD 卡操作指令

可以看出目前SD卡中uboot 是 2020 年 10月29日01:43:24編譯的。我們現在重新編譯

一下 uboot,然後将編譯出來的 u-boot.imx(u-boot.bin 前面加了一些頭檔案)拷貝到 Ubuntu 中的

tftpboot 目錄下。最後使用 tftp 指令将其下載下傳到 0x80800000 位址處,指令如下:

tftp 80800000 u-boot.imx
           
u-boot使用指令之EMMC 和 SD 卡操作指令

可以看出, u-boot.imx 大小為 379904 位元組, 379904/512=742,是以我們要向 SD 卡中寫入742 個塊,如果有小數的話就要加 1 個塊。使用指令“mmc write”從 SD 卡分區 0 第 2 個塊(扇區)開始燒寫,一共燒寫 742(0x2E6)個塊,指令如下:

mmc dev 0 0
mmc write 80800000 2 32E
           
u-boot使用指令之EMMC 和 SD 卡操作指令

同理,如果要在 uboot 中更新 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 裝置的指定塊就是用指令“mmc erase”,指令格式如下:

mmc erase blk# cnt
           

blk 為要擦除的起始塊, cnt 是要擦除的數量。沒事不要用 mmc erase 來擦除 MMC 裝置!!!