二、 U-Boot 命令使用


 

進入 uboot 的命令行模式以后輸入“help”或者“?”,然后按下回車即可查看當前 uboot 所支持的命令,如圖所示:

 圖中只是 uboot 的一部分命令,並不是 uboot 所支持的所有命令,uboot 是可配置的,需要什么命令就使能什么命令。而且也可以在 uboot 中自定義命令。這些命令后面都跟有命令說明,用於描述此命令的作用,但是命令具體怎么用呢?我們輸入“help(或?) 命令名”既可以查看命令的詳細用法,以“bootz”這個命令為例,我們輸入如下命令即可查看“bootz”這個命令的用法:

? bootz 或 help bootz

結果如圖所示:

圖中詳細的列出了“bootz”這個命令的使用方法,其它的命令也可以使用此方法查詢具體的使用方法。接下來我們學習一下一些常用的 uboot 命令。

1.信息查詢命令

(1).bdinfo 命令

此命令用於查看板子信息,直接輸入“bdinfo”即可,結果如圖所示:

 從圖中可以得出 DRAM 的起始地址和大小、啟動參數保存起始地址、波特率、sp(堆棧指針)起始地址等信息。

(2).printenv 命令

用於輸出環境變量信息,uboot 支持 TAB 鍵自動補全功能,輸入“print”然后按下 TAB 鍵就會自動補全命令,直接輸入“print”也可以。輸入“print”,結果如圖所示:

在圖中有很多的環境變量,比如 baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd等等。 uboot 中的環境變量都是字符串,既然叫做環境變量,那么它的作用就和“變量”一樣。比如 bootdelay 這個環境變量就表示 uboot 啟動延時時間,默認 bootdelay=3,也就默認延時 3秒。 uboot 中的環境變量是可以修改的,有專門的命令來修改環境變量的值。

(3).version 命令 

用於查看 uboot 的版本號,輸入“version”, 結果如圖所示:

從圖中可以看出,當前 uboot 版本號為 2016.03, 2019 年 4 月 12 日編譯的,編譯器為 arm-linux-gnueabihf-gcc 等信息。

2 環境變量操作命令
 (1)修改環境變量

環境變量的操作涉及到兩個命令: setenv 和 saveenv
setenv 命令,用於設置或者修改環境變量的值。
saveenv命令,用於保存修改后的環境變量。一般環境變量是存放在外部 flash 中的,uboot 啟動的時候會將環境變量從 flash 讀取到DRAM 中。所以使用命令 setenv 修改的是 DRAM中的環境變量值,修改以后要使用 saveenv 命令將修改后的環境變量保存到 flash 中,否則的話uboot 下一次重啟會繼續使用以前的環境變量值。

比如我們要將環境變量 bootdelay 改為 5,就可以使用如下所示命令:

setenv bootdelay 5
saveenv

有時候我們修改的環境變量值可能會有空格, 比如 bootcmd、 bootargs 等, 這個時候環境變量值就得用單引號括起來,比如下面修改環境變量 bootargs 的值:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

上面命令設置 bootargs 的值為“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相當於四組“值”,這四組“值”之間用空格隔開,所以需要使用單引號‘’將其括起來,表示這四組“值”都屬於環境變量 bootargs。

(2)新建環境變量
命令 setenv 也可以用於新建命令,用法就是修改環境變量一樣,比如我們新建一個環境變量 author, author 的值為12345678,那么就可以使用如下命令:

setenv author zuozhongkai
saveenv

完成以后重啟 uboot,然后使用命令 printenv 查看當前環境變量, 會有環境變量: author,其值為: 12345678

(3)刪除環境變量
既然可以新建環境變量,那么就可以刪除環境變量,刪除環境變量也是使用命令 setenv,要刪除一個環境變量只要給這個環境變量賦空值即可,比如我們刪除掉上面新建的 author 這個環境變量,命令如下:

setenv author
saveenv

上面命令中通過 setenv 給 author 賦空值,也就是什么都不寫來刪除環境變量 author。重啟uboot 就會發現環境變量 author 沒有了

3 內存操作命令
內存操作命令就是用於直接對 DRAM 進行讀寫操作的,常用的內存操作命令有 md、 nm、mm、 mw、 cp 和 cmp。
(1)md 命令
md 命令用於顯示內存值,格式如下:

md[.b, .w, .l] address [# of objects]

命令中的[.b .w .l]對應 byte、 word 和 long,也就是分別以 1 個字節、 2 個字節、 4 個字節來顯示內存值。 address 就是要查看的內存起始地址, [# of objects]表示要查看的數據長度,這個數據長度單位不是字節,而是跟你所選擇的顯示格式有關。比如你設置要查看的內存長度為20(十六進制為 0x14),如果顯示格式為.b 的話那就表示 20 個字節;如果顯示格式為.w 的話就表示 20 個 word,也就是 20*2=40 個字節;如果顯示格式為.l 的話就表示 20 個 long,也就是20*4=80 個字節。注意:uboot 命令中的數字都是十六進制的!不是十進制的!比如你想查看以 0X80000000 開始的 20 個字節的內存值,顯示格式為.b 的話,應該使用如下所示命令:

md.b 80000000 14

(2)nm 命令
nm 命令用於修改指定地址的內存值,命令格式如下:

nm [.b, .w, .l] address 

nm 命令同樣可以以.b、 .w 和.l 來指定操作格式,比如現在以.l 格式修改 0x80000000 地址的數據為 0x12345678。輸入命令:

nm.l 80000000

輸入上述命令以后如圖所示:

 80000000 表示現在要修改的內存地址, ffffff00 表示地址 0x80000000 現在的數據,?后面就可以輸入要修改后的數據 0x12345678,輸入完成以后按下回車,然后再輸入‘q’即可退出,如圖所示:

 修改完成以后在使用命令 md 來查看一下有沒有修改成功,如圖所示:

 從圖中可以看出,此時地址 0X80000000 的值變為了 0x12345678。 

(3) mm 命令
mm 命令也是修改指定地址內存值的,使用 mm 修改內存值的時候地址會自增,而使用命令 nm 的話地址不會自增。比如以.l 格式修改從地址 0x80000000 開始的連續 3 個內存塊(3*4=12個字節)的數據為 0X05050505,操作如圖所示:

 

從圖中可以看出,修改了地址 0X80000000、 0X80000004 和 0X8000000C 的內容為0x05050505。使用命令 md 查看修改后的值,結果如圖所示: 

 從圖中可以看出內存數據修改成功。

(4)mw 命令
命令 mw 用於使用一個指定的數據填充一段內存,命令格式如下:

mw [.b, .w, .l] address value [count]

mw 命令同樣可以以.b、 .w 和.l 來指定操作格式, address 表示要填充的內存起始地址, value為要填充的數據, count 是填充的長度。比如使用.l 格式將以 0X80000000 為起始地址的 0x10 個內存塊(0x10 * 4=64 字節)填充為 0X0A0A0A0A,命令如下: 

mw.l 80000000 0A0A0A0A 10

然后使用命令 md 來查看,如圖所示:

 從圖中可以看出內存數據修改成功。

(5)cp 命令
cp 是數據拷貝命令,用於將 DRAM 中的數據從一段內存拷貝到另一段內存中,或者把 NorFlash 中的數據拷貝到 DRAM 中。命令格式如下:

cp [.b, .w, .l] source target count

cp 命令同樣可以以.b、 .w 和.l 來指定操作格式, source 為源地址, target 為目的地址, count為拷貝的長度。我們使用.l 格式將 0x80000000 處的地址拷貝到 0X80000100 處,長度為 0x10 個內存塊(0x10 * 4=64 個字節),命令如下所示:

cp.l 80000000 80000100 10

結果如圖所示: 

 在圖中,先使用 md.l 命令打印出地址 0x80000000 和 0x80000100 處的數據,然后使用命令cp.l將0x80000100處的數據拷貝到0x80000100處。最后使用命令md.l查看0x80000100處的數據有沒有變化,檢查拷貝是否成功。

(6)cmp 命令
cmp 是比較命令,用於比較兩段內存的數據是否相等,命令格式如下:

cmp [.b, .w, .l] addr1 addr2 count

cmp 命令同樣可以以.b、 .w 和.l 來指定操作格式, addr1 為第一段內存首地址, addr2 為第二段內存首地址, count 為要比較的長度。我們使用.l 格式來比較 0x80000000 和 0X80000100 這兩個地址數據是否相等,比較長度為 0x10 個內存塊(16 * 4=64 個字節),命令如下所示:

cmp.l 80000000 80000100 10

結果如圖所示:

 從圖中可以看出兩段內存的數據相等。 我們再隨便挑兩段內存比較一下,比如地址0x80002000 和 0x800003000,長度為 0X10,比較結果如圖所示:

從圖中可以看出, 0x80002000 處的數據和 0x80003000 處的數據就不一樣。

4.網絡操作命令

將開發板和主機 PC 都連接到同一個路由器上,然后最后設置表中所示的幾個環境變量:

 設置命令如下所示:

注意確保 Ubuntu 主機和開發板的 IP地址在同一個網段內,serverip 設置成Ubuntu 主機的地址。 ethaddr 為網絡 MAC 地址,是一個 48bit 的地址,如果在同一個網段內有多個開發板的話一定要保證每個開發板的 ethaddr 是不同的,否則通信會有問題!設置好網絡相關的環境變量以后就可以使用網絡相關命令了。

(1)ping 命令
開發板的網絡能否使用,是否可以和服務器(Ubuntu 主機)進行通信,通過 ping 命令就可以驗證,直接 ping 服務器的 IP 地址即可,比如服務器 IP 地址為 192.168.1.250,命令如下:

ping 192.168.1.250

結果如圖所示:

 從圖中可以看出, 192.168.1.250 這個主機存在,說明 ping 成功, uboot 的網絡工作正常

注意!只能在 uboot 中 ping 其他的機器,其他機器不能 ping uboot,因為 uboot 沒有對 ping命令做處理,如果用其他的機器 ping uboot 的話會失敗!

 (2)dhcp 命令

dhcp 用於從路由器獲取 IP 地址,前提得開發連接到路由器上的,如果開發板是和電腦直連的,那么 dhcp 命令就會失效。直接輸入 dhcp 命令即可通過路由器獲取到 IP 地址,如圖所示:

 

從圖可以看出,開發板通過 dhcp 獲取到的 IP 地址為 192.168.1.50,和我們手動設置的一樣,這很正常。同時在圖中可以看到“warning: no boot file name;”、“TFTP from server 192.168.1.1”這樣的字樣。這是因為 DHCP 不單單是獲取 IP 地址,其還會通過 TFTP 來啟動 linux 內核。
輸入“? dhcp”可查看 dhcp 命令詳細的信息,如圖所示:

 

(3)nfs 命令
nfs(Network File System)網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,比如我們將 linux 鏡像和設備樹文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令將 Ubuntu 中的 linux 鏡像和設備樹下載到開發板的 DRAM 中。這樣做的目的是為了方便調試 linux 鏡像和設備樹,也就是網絡調試,通過網絡調試是 Linux 開發中最常用的調試方法。使用 uboot 中的 nfs 命令將 Ubuntu 中的文件下載到開發板的 DRAM 中,在使用之前需要開啟 Ubuntu 主機的 NFS 服務,並且要新建一個 NFS 使用的目錄,以后所有要通過NFS 訪問的文件都需要放到這個 NFS 目錄中。 uboot 中的 nfs 命令格式如下所示:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是要保存的 DRAM 地址, [[hostIPaddr:]bootfilename]是要下載的文件地址。比如要保存的 DRAM 地址是0x80800000,要下載的文件路徑是/home/zuozhongkai/linux/nfs/zImage,則命令如下 

nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage

命 令 中 的 “ 80800000 ” 表 示 zImage 保 存 地 址 ,“192.168.1.250:/home/zuozhongkai/linux/nfs/zImage”表示 zImage 在 192.168.1.250 這個主機中,路徑為/home/zuozhongkai/linux/nfs/zImage。下載過程如圖所示:

 在圖中會以“#”提示下載過程,下載完成以后會提示下載的數據大小,這里下載的 6071136 字節,而 zImage 的大小就是 6071136 字節,如圖所示:

 下載完成以后查看 0x80800000 地址處的數據,使用命令 md.b 來查看前 0x100 個字節的數據,如圖所示:

 再使用 winhex 軟件來查看 zImage,檢查一下前面的數據是否和上圖中的一致,結果如下圖所示:

 可以看出兩個圖中的前 100 個字節的數據一致,說明 nfs 命令下載到的zImage 是正確的。

(4)tftp 命令
tftp 命令的作用和 nfs 命令一樣,都是用於通過網絡下載東西到 DRAM 中,只是 tftp 命令使用的 TFTP 協議, Ubuntu 主機作為 TFTP 服務器。因此需要在 Ubuntu 上搭建 TFTP 服務器,需要安裝 tftp-hpa 和 tftpd-hpa,命令如下:

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

NFS 一樣, TFTP 也需要一個文件夾來存放文件,在用戶目錄下新建一個目錄,命令如下: 

mkdir /home/zuozhongkai/linux/tftpboot
chmod 777 /home/zuozhongkai/linux/tftpboot

這 樣 我 就 在 我 的 電 腦 上 創 建 了 一 個 名 為 tftpboot 的 目 錄 ( 文 件 夾 ) , 路 徑 為/home/zuozhongkai/linux/tftpboot。注意!我們要給 tftpboot 文件夾權限,否則的話 uboot 不能從tftpboot 文件夾里面下載文件。最后配置 tftp,安裝完成以后新建文件/etc/xinetd.d/tftp, 如果沒有/etc/xinetd.d 目錄的話自行創建, 然后在里面輸入如下內容:

 完了以后啟動 tftp 服務,命令如下:

sudo service tftpd-hpa start

打開/etc/default/tftpd-hpa 文件,將其修改為如下所示內容:

TFTP_DIRECTORY 就是我們上面創建的 tftp 文件夾目錄,以后我們就將所有需要通過TFTP 傳輸的文件都放到這個文件夾里面,並且要給予這些文件相應的權限。
最后輸入如下命令, 重啟 tftp 服務器:

sudo service tftpd-hpa restart

tftp 服務器已經搭建好了,接下來就是使用了。將 zImage 鏡像文件拷貝到 tftpboot 文件夾中,並且給予 zImage 相應的權限,命令如下:

cp zImage /home/zuozhongkai/linux/tftpboot/
cd /home/zuozhongkai/linux/tftpboot/
chmod 777 zImage

uboot 中的 tftp 命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

看 起 來 和 nfs 命 令 格式 一 樣 的 , loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,[[hostIPaddr:]bootfilename]是要從 Ubuntu 中下載的文件。但是和 nfs 命令的區別在於, tftp 命令不需要輸入文件在 Ubuntu 中的完整路徑,只需要輸入文件名即可。比如我們現在將 tftpboot 文件夾里面的 zImage 文件下載到開發板 DRAM 的 0X80800000 地址處,命令如下: 

tftp 80800000 zImage

下載過程如圖所示:

 上圖是下載成功的過程,若出現下載失敗,如下圖:

提示沒有權限,出現這個錯誤一般有兩個原因:
①、在 Ubuntu 中創建 tftpboot 目錄的時候沒有給予 tftboot 相應的權限。
②、 tftpboot 目錄中要下載的文件沒有給予相應的權限。
針對上述兩個問題,使用命令“chmod 777 xxx”來給予權限,其中“xxx”就是要給予權限的文件或文件夾。

5. EMMC 和 SD 卡操作命令
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般認為 EMMC和 SD 卡是同一個東西。uboot 中常用於操作 MMC 設備的命令為“mmc”。mmc 是一系列的命令,其后可以跟不同的參數,輸入“? mmc”即可查看 mmc 有關的命令,如圖所示:

 

 

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

 

假設芯片有兩個EMMC控制器,分別是EMMC0接SD卡, EMMC1接EMMC存儲芯片。

(1)mmc info 命令
mmc info 命令用於輸出當前選中的 mmc info 設備的信息,輸入命令“mmc info”即可,如圖所示:

從圖中可以看出,當前選中的 MMC設備是 EMMC,版本為 4.5,容量為 3.7GiB(EMMC為 4GB),速度為 52000000Hz=52MHz, 8 位寬的總線。還有一個與 mmc info 命令相同功能的命令: mmcinfo,“mmc”和“info”之間沒有空格。
(2)mmc rescan 命令
mmc rescan 命令用於掃描當前開發板上所有的 MMC 設備,包括 EMMC 和 SD 卡,輸入“mmc rescan”即可。
(3)mmc list 命令
mmc list 命令用於來查看當前開發板一共有幾個 MMC 設備,輸入“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 [dev] [part]

[dev]用來設置要切換的 MMC 設備號, [part]是分區號。如果不寫分區號的話默認為分區 0。使用如下命令切換到 SD 卡:

mmc dev 0 //切換到 SD 卡, 0 為 SD 卡, 1 為 eMMC

結果如圖所示:

 

從圖中可以看出,切換到 SD 卡成功, mmc0 為當前的 MMC 設備,輸入命令“mmc info”即可查看 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~1024000 為第一個分區,扇區 1228800~6504448 為第二個分區。如果 EMMC 里面燒寫了 Linux 系統的話, EMMC 是有3 個分區的,第 0 個分區存放 uboot,第 1 個分區存放 Linux 鏡像文件和設備樹,第 2 個分區存放根文件系統。但是在圖中只有兩個分區,那是因為第 0 個分區沒有格式化,所以識別不出來,實際上第 0 個分區是存在的。一個新的 SD 卡默認只有一個分區,那就是分區 0。如果要將 EMMC 的分區 2 設置為當前 MMC 設置,可以使用如下命令:

mmc dev 1 2

結果如圖所示:

(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 //讀取數據

結果如圖所示:

 

 

 (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 是 2019 年 4 月 15 日 12:52:04 編譯的。我們現在重新編譯一下 uboot,然后將編譯出來的 u-boot.imx(u-boot.bin 前面加了一些頭文件)拷貝到 Ubuntu 中的tftpboot 目錄下。最后使用 tftp 命令將其下載到 0x80800000 地址處,命令如下:

tftp 80800000 u-boot.imx

下載過程如圖所示:

 

 

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

mmc dev 0 0
mmc write 80800000 2 32E 

燒寫過程如圖 所示:

 

 

 燒寫成功,重啟開發板(從 SD 卡啟動),重啟以后再輸入 version 來查看版本號,結果如圖所示:

 

 

從圖中可以看出,此時的 uboot 是 2019 年 4 月 21 號 18:05:59 編譯的,這個時間就是我剛剛編譯 uboot 的時間,說明 uboot 更新成功。這里我們就學會了如何在 uboot 中更新 uboot了,如果要更新 EMMC 中的 uboot 也是一樣的。

同理,如果要在 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 是要擦除的數量。

6. FAT 格式文件系統操作命令

有時候需要在 uboot 中對 SD 卡或者 EMMC 中存儲的文件進行操作,這時候就要用到文件操作命令,跟文件操作相關的命令有: fatinfo、 fatls、 fstype、 fatload 和 fatwrite,但是這些文件操作命令只支持 FAT 格式的文件系統!!

(1)fatinfo 命令

fatinfo 命令用於查詢指定 MMC 設置指定分區的文件系統信息,格式如下:

fatinfo <interface> [<dev[:part]>] 

interface 表示接口,比如 mmc, dev 是查詢的設備號, part 是要查詢的分區。比如我們要查詢 EMMC 分區 1 的文件系統信息,命令如下:

fatinfo mmc 1:1

結果如圖所示:  

 

 

 從上圖可以看出, EMMC 分區 1 的文件系統為 FAT16 格式的。

(2)fatls 命令

fatls 命令用於查詢 FAT 格式設備的目錄和文件信息,命令格式如下:

fatls <interface> [<dev[:part]>] [directory]

interface 是要查詢的接口,比如 mmc, dev 是要查詢的設備號, part 是要查詢的分區, directory是要查詢的目錄。比如查詢 EMMC 分區 1 中的所有的目錄和文件,輸入命令:

fatls mmc 1:1 

結果如圖所示:

 

從上圖可以看出, emmc 的分區 1 中存放着兩個文件: zimage 和 imx6ull-14x14-evk.dtb,這兩個文件分別是 linux 鏡像文件和設備樹。並且在 emmc 的分區 1 中有兩個文件,沒有目錄

(3)fstype 命令

fstype 用於查看 MMC 設備某個分區的文件系統格式,命令格式如下:

fstype <interface> <dev>:<part>

正點原子 EMMC 核心板上的 EMMC 默認有 3 個分區,我們來查看一下這三個分區的文件
系統格式,輸入命令:
 

fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2

結果如圖所示:

  

 

從上圖可以看出,分區 0 格式未知,因為分區 0 存放的 uboot,並且分區 0 沒有格式化,所以文件系統格式未知。分區 1 的格式為 fat,分區 1 用於存放 linux 鏡像和設備樹。分區 2 的格式為 ext4,用於存放 Linux 的根文件系統(rootfs)。

(4)fatload 命令

fatload 命令用於將指定的文件讀取到 DRAM 中,命令格式如下:

fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]

interface 為接口,比如 mmc, dev 是設備號, part 是分區, addr 是保存在 DRAM 中的起始地址, filename 是要讀取的文件名字。 bytes 表示讀取多少字節的數據,如果 bytes 為 0 或者省略的話表示讀取整個文件。 pos 是要讀的文件相對於文件首地址的偏移,如果為 0 或者省略的話表示從文件首地址開始讀取。我們將 EMMC 分區 1 中的 zImage 文件讀取到 DRAM 中的0X80800000 地址處,命令如下:

fatload mmc 1:1 80800000 zImage

(5)fatwrite 命令

注意! uboot 默認沒有使能 fatwrite 命令,需要修改板子配置頭文件,比如 mx6ullevk.h、mx6ull_alientek_emmc.h 等等,板子不同,其配置頭文件也不同。找到自己開發板對應的配置頭文件然后添加如下一行宏定義來使能 fatwrite 命令:

#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */ 

fatwirte 命令用於將 DRAM 中的數據寫入到 MMC 設備中,命令格式如下: 

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

interface 為接口,比如 mmc, dev 是設備號, part 是分區, addr 是要寫入的數據在 DRAM中的起始地址, filename 是寫入的數據文件名字, bytes 表示要寫入多少字節的數據。我們可以通過 fatwrite 命令在 uboot 中更新 linux 鏡像文件和設備樹。我們以更新 linux 鏡像文件 zImage為例,首先將zImage 鏡像文件拷貝到 Ubuntu 中的tftpboot 目錄下。

使用命令 tftp zImage 下載到 DRAM 0X80800000 地址處,命令如下: 

tftp 80800000 zImage

 

 zImage 大小為 6039328(0X5C2720)個字節,接下來使用命令 fatwrite 將其寫入到 EMMC 的分區 1 中,文件名字為 zImage,命令如下:

fatwrite mmc 1:1 80800000 zImage 0x5c2720

完成以后使用“fatls”命令查看一下 EMMC 分區 1 里面的文件,結果如圖所示:  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

注:原文出自 【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.3

 

addr 是數據讀取到 DRAM 中的地址, blk 是要讀取的塊起始地址(十六進制),一個塊是 512
字節,這里的塊和扇區是一個意思,在 MMC 設備中我們通常說扇區, cnt 是要讀取的塊數量(
六進制
)。比如從 EMMC 的第 1536(0x600)個塊開始,讀取 16(0x10)個塊的數據到 DRAM
0X80800000 地址處,命令如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM