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 有關的指令,如圖 所示:
從圖可以看出, 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”即可,如
圖所示:
從圖可以看出,目前選中的 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 指令
可以看出目前開發闆有兩個 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 卡:
從圖可以看出,切換到 SD 卡成功, mmc0 為目前的 MMC 裝置,輸入指令“mmcinfo”即可檢視 SD 卡的資訊,結果如圖所示:
從圖可以看出目前 SD 卡為 3.0 版本的,容量為 14.8GiB(16GB 的 SD 卡), 4 位寬的總線。
5、 mmc part 指令
有時候 SD 卡或者 EMMC 會有多個分區,可以使用指令“mmc part”來檢視其分區,比如
檢視 EMMC 的分區情況,輸入如下指令:
mmc dev 1 //切換到 EMMC
mmc part //檢視 EMMC 分區
結果如下:
從圖中可以看出,此時 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 //讀取資料
結果如圖所示:
這裡我們還看不出來讀取是否正确,通過 md.b 指令檢視 0x80800000 處的資料就行了,檢視 16*512=8192(0x2000)個位元組的資料,指令如下:
從圖可以看到“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 //檢視版本号
可以看出目前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.imx 大小為 379904 位元組, 379904/512=742,是以我們要向 SD 卡中寫入742 個塊,如果有小數的話就要加 1 個塊。使用指令“mmc write”從 SD 卡分區 0 第 2 個塊(扇區)開始燒寫,一共燒寫 742(0x2E6)個塊,指令如下:
mmc dev 0 0
mmc write 80800000 2 32E
同理,如果要在 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 裝置!!!