mmc erase blk# cnt
blk 為要擦除的起始塊,cnt 是要擦除的數量。沒事不要用 mmc erase 擦除 MMC 設備!
七、FAT 格式文件系統操作命令
有時候需要在 uboot 中對 SD 卡或者 EMMC 中存儲的文件進行操作,這時候就要用到文件操作命令,跟文件操作相關的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,但是這些文件操作命令只支持 FAT 格式的文件系統!
1、fatinfo 命令
fatinfo 命令用于查詢指定 MMC 設備分區的文件系統信息,格式如下:
fatinfo[ ]
interface 表示接口,比如 mmc,dev 是查詢的設備號,part 是要查詢的分區。比如我們要查詢 EMMC 分區 1 的文件系統信息,命令如下:
fatinfo mmc 1:1
2、fatls 命令
fatls 命令用于查詢 FAT 格式設備的目錄和文件信息,命令格式如下:
fatls[ ] [directory]
interface 是要查詢的接口,比如 mmc,dev 是要查詢的設備號,part 是要查詢的分區,directory是要查詢的目錄。比如查詢 EMMC 分區 1 中的所有的目錄和文件,輸入命令:
fatls mmc 1:1
3、fstype 命令
fstype 用于查看 MMC 設備某個分區的文件系統格式,命令格式如下:
fstype:
EMMC 核心板上的 EMMC 默認有 3 個分區,我們來查看一下這三個分區的文件
系統格式,輸入命令:
fstype mmc 1:0fstype mmc 1:1fstype mmc 1:2
分區 0 格式未知,因為分區 0 存放的 uboot,并且分區 0 沒有格式化,所以文件系統格式未知。分區 1 的格式為 fat,分區 1 用于存放 linux 鏡像和設備樹。分區 2 的格式為 ext4,用于存放 Linux 的根文件系統(rootfs)。
4、fatload 命令
fatload 命令用于將指定的文件讀取到 DRAM 中,命令格式如下:
fatload[ [ [ [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 為接口,比如 mmc,dev 是設備號,part 是分區,addr 是要寫入的數據在 DRAM中的起始地址,filename 是寫入的數據文件名字,bytes 表示要寫入多少字節的數據。
可以通過 fatwrite 命令在 uboot 中更新 linux 鏡像文件和設備樹。以更新 linux 鏡像文件 zImage為例,首先將開發板提供的 zImage 鏡像文件拷貝到 Ubuntu 中的tftpboot 目錄下,拷貝完成以后使用命令 tftp 將 zImage 下載到 DRAM 的 0X80800000地址處,命令如下:
tftp 80800000 zImage
zImage 大小為 6785272(0X6788f8)個字節,接下來使用命令 fatwrite 將其寫入到 EMMC 的分區 1 中,文件名字為 zImage,命令如下:
fatwrite mmc 1:1 80800000 zImage 6788f8
使用“fatls”命令查看一下 EMMC 分區 1 里面的文件:
八、EXT 格式文件系統操作命令
uboot 有 ext2 和 ext4 這兩種格式的文件系統的操作命令,常用的就四個命令,分別為:ext2load、ext2ls、ext4load、ext4ls 和 ext4write。這些命令的含義和使用與fatload、fatls 和 fatwrite 一樣。
比如 ext4ls 命令,EMMC 的分區 2 就是 ext4格式的,使用 ext4ls 就可以查詢 EMMC 的分區 2 中的文件和目錄,輸入命令:
ext4ls mmc 1:2
ext 格式文件系統其他命令的操作可以參考FAT相對應的命令。
九、NAND 操作命令
uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版本的核心板,并且編譯 NAND 核心板對應的 uboot,然后使用 imxdownload 軟件將 u-boot.bin 燒寫到 SD 卡中,最后通過 SD 卡啟動。一般情況下 NAND 版本的核心板已經燒寫好了 uboot、linux kernel 和 rootfs 這些文件,所以可以將 BOOT 撥到 NAND,然后直接從 NAND Flash 啟動即可。
NAND 版核心板啟動信息如圖所示:
從圖中可以看出,當前開發板的 NAND 容量為 512MiB。輸入“? nand”即可查看
NAND 相關命令,如圖所示:
本節講解一些常用的命令。
1、nand info 命令
此命令用戶打印 NAND Flash 信息,輸入“nand info”,結果如圖所示:
圖中給出了 NAND 的頁大小、OOB 域大小,擦除大小等信息。
2、nand device 命令
nand device 用于切換 NAND Flash,如果你的板子支持多片 NAND 的話就可以使用此命令來設置當前所使用的 NAND。這個需要你的 CPU 有兩個 NAND 控制器,并且兩個 NAND 控制器各接一片 NAND Flash。就跟 I.MX6U 有兩個 SDIO 接口,這兩個 SDIO 接口可以接兩個 MMC設備一樣。不過一般情況下 CPU 只有一個 NAND 接口,而且在使用中只接一片 NAND。
3、nand erase 命令
nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性決定了在向 NAND Flash 寫數據之前一定要先對要寫入的區域進行擦除。“nand erase”命令有三種形式:
nand erase[.spread] [clean] off size //從指定地址開始(off)開始,擦除指定大小(size)的區域。nand erase.part [clean] partition //擦除指定的分區nand erase.chip [clean] //全篇擦除
NAND 的擦除命令一般是配合寫命令的,后面講解 NAND 寫命令的時候在演示如何使用“nand erase”。
4、nand write 命令
此命令用于向 NAND 指定地址寫入指定的數據,一般和“nand erase”命令配置使用來更新 NAND 中的 uboot、linux kernel 或設備樹等文件,命令格式如下:
nand write addr off size
addr 是要寫入的數據首地址,off 是 NAND 中的目的地址,size 是要寫入的數據大小。
由于 I.MX6ULL 要求 NAND 對應的 uboot 可執行文件還需要另外包含 BCB 和 DBBT,因此直接編譯出來的 uboot.imx 不能直接燒寫到 NAND 里面。關于 BCB 和 DBBT 的詳細介紹請參考《I.MX6ULL 參考手冊》的 8.5.2.2 小節,筆者目前沒有詳細去研究 BCB 和 DBBT,因此不能在 NAND 版的 uboot 里面更新 uboot 自身。除非大家去研究一下 I.MX6ULL 的 BCB 和 DBBT,然后在 u-boot.imx 前面加上相應的信息,否則即使將 uboot 燒進去了也不能運行。使用 mfgtool 燒寫系統到 NAND 里面的時候,mfgtool 會使用一個叫做“kogs-ng”的工具完成 BCB 和 DBBT 的添加。
但是可以在 uboot 里面使用“nand write”命令燒寫 kernel 和 dtb。先編譯出來 NAND 版本的 kernel 和 dtb 文件,在燒寫之前要先對 NAND 進行分區,也就是規劃好 uboot、linux kernel、設備樹和根文件系統的存儲區域,I.MX6U-ALPHA 開發板出廠系統 NAND 分區如下:
0x000000000000-0x0000003FFFFF : 'boot'0x000000400000-0x00000041FFFF : 'env'0x000000420000-0x00000051FFFF : 'logo'0x000000520000-0x00000061FFFF : 'dtb'0x000000620000-0x000000E1FFFF : 'kernel'0x000000E20000-0x000020000000 : 'rootfs'
一共有六個分區:
第一個分區存放 uboot,地址范圍為 0x0~0x3FFFFF(共 4MB);
第二個分區存放 env(環境變量),地址范圍 0x400000~0x420000(共 128KB);
第三個分區存放 logo(啟動圖標),地址范圍為 0x420000~0x51FFFF(共 1MB);
第四個分區存放 dtb(設備樹),地址范圍為 0x520000~0x61FFFF(共 1MB);
第五個分區存放 kernel(linux),地址范圍為0x620000~0xE1FFFF(共 8MB);
剩下的所有存儲空間全部作為最后一個分區,存放 rootfs(根文件系統)。
可以看出 kernel 是從地址 0x620000 開始存放的,將 NAND 版本 kernel 對應的 zImage 文件放到 Ubuntu 中的 tftpboot 目錄中,然后使用 tftp 命令將其下載到開發板的 0X87800000 地址處,最終使用“nand write”將其燒寫到 NAND 中,命令如下:
tftp 0x87800000 zImage //下載 zImage 到 DRAM 中nand erase 0x620000 0x800000 //從地址 0x620000 開始擦除 8MB 的空間nand write 0x87800000 0x620000 0x800000 //將接收到的 zImage 寫到 NAND 中
這里擦除了 8MB 的空間,因為一般 zImage 就是 6,7MB 左右,8MB 肯定夠了,如果不夠的話就再多擦除一點就行了。
同理,最后燒寫設備樹(dtb)文件文件,命令如下:
tftp 0x87800000 imx6ull-14x14-emmc-7-1024x600-c.dtb //下載 dtb 到 DRAM 中nand erase 0x520000 0x100000 //從地址 0x520000 開始擦除 1MB 的空間nand write 0x87800000 0x520000 0x100000 //將接收到的 dtb 寫到 NAND 中
dtb 文件一般只有幾十 KB,所以擦除 1M 是綽綽有余的了。注意!出廠系統在 NAND 里面燒寫了很多種設備樹文件!這里只是舉例燒寫一種的方法,在實際產品開發中肯定只有一種設備樹。
根文件系統(rootfs)就不要在 uboot 中更新了,還是使用 NXP 提供的 Mfgtool 工具來燒寫,因為根文件系統太大!很有可能超過開發板 DRAM 的大小,這樣連下載都沒法下載,更別說更新了。
4、nand read 命令
此命令用于從 NAND 中的指定地址讀取指定大小的數據到 DRAM 中,格式如下:
nand read addr off size
addr 是目的地址,off 是要讀取的 NAND 中的數據源地址,size 是要讀取的數據大小。比如讀取設備樹(dtb)文件到 0x83000000 地址處,命令如下:
nand read 0x83000000 0x520000 0x19000
過程如圖所示:
設備樹文件讀取到 DRAM 中以后就可以使用 fdt 命令來對設備樹進行操作了,首先設置 fdt 的地址,fdt 地址就是 DRAM 中設備樹的首地址,命令如下:
fdt addr 83000000
設置好以后可以使用“fdt header”來查看設備樹的頭信息,輸入命令:
fdt header
結果如圖所示:
輸入命令“fdt print”就可以查看設備樹文件的內容,輸入命令:
fdt print
NAND 常用的操作命令就是擦除、讀和寫,至于其他的命令大家可以自行研究一下,一定不要嘗試全片擦除 NAND 的指令!否則 NAND 就被全部擦除掉了,什么都沒有了,又得重頭燒整個系統。
十、SPI FLASH操作命令
uboot 中如果支持 spi/qspi flash, 那么可以使用 sf 的 erase、read、write 命令操作spi flash。
sf read //用來讀取flash數據到內存sf write //寫內存數據到flashsf erase //擦除指定位置,指定長度的flash內容, 擦除后內容全1
具體用法:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus and chip selectsf read addr offset len - read `len' bytes starting at`offset' to memory at `addr'sf write addr offset len - write `len' bytes from memor at `addr' to flash at `offset'sf erase offset [+]len - erase `len' bytes from `offset' `+len' round up `len' to block sizesf update addr offset len - erase and write `len' bytes from memory at `addr' to flash at `offset'
使用范例:
在使用sf read sf write之前,一定要調用sf probe
sf probe
寫數據
sf write 0x82000000 0x0 0x20000 //把內存 0x82000000 處的數據, 寫入 flash 的偏移 0x0, //寫入數據長度為 0x20000(128KB), 操作偏移和長度最小單位是 Byte
讀數據
sf read 0x82000000 0x10000 0x20000//把 flash 偏移 0x10000(64KB) 處, 長度為 0x20000(128KB) 的數據, //寫入到內存 0x82000000, 操作偏移和長度最小單位是 Byte
擦除數據
sf erase 0x0 0x10000//擦除偏移0x0處, 到0x10000之間的擦除塊, 擦除操作是以erase block為單位的,// 要求 offset 和 len 參數必須是 erase block 對齊的
從sf命令,可以看出幾點:
spi flash 沒有 oob 數據存在, 不用考慮EDC ECC, 也沒有壞塊管理概念.
支持Byte級的讀寫操作, 支持隨機訪問.
十一、BOOT 操作命令
uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常用的跟 boot 有關的命令有:bootz、bootm 和 boot。
1、bootz 命令
要啟動 Linux,需要先將 Linux 鏡像文件拷貝到 DRAM 中,如果使用到設備樹的話也需要將設備樹拷貝到 DRAM 中。可以從 EMMC 或者 NAND 等存儲設備中將 Linux 鏡像和設備樹文件拷貝到 DRAM,也可以通過 nfs 或者 tftp 將 Linux 鏡像文件和設備樹文件下載到 DRAM 中。不管用那種方法,只要能將 Linux 鏡像和設備樹文件存到 DRAM 中就行,然后使用 bootz 命令來啟動,bootz 命令用于啟動 zImage 鏡像文件,bootz 命令格式如下:
bootz [addr [initrd[:size]] [fdt]]
命令 bootz 有三個參數,addr 是 Linux 鏡像文件在 DRAM 中的位置,initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的話使用 ‘-’ 代替即可,fdt 就是設備樹文件在 DRAM 中的地址。
TFTP啟動:Linux 鏡像文件和設備樹都準備好,使用 tftp 命令將 zImage 下載到 DRAM 的 0X80800000 地址處,然后將設備樹imx6ull-14x14-emmc-7-1024x600-c.dtb 下載到 DRAM 中的 0X83000000 地址處,最后之后命令 bootz 啟動,命令如下:
tftp 80800000 zImagetftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtbbootz 80800000 - 83000000
EMMC啟動:要從 EMMC 中啟動 Linux 系統,先切換到emmc設備,使用命令 fatls 查看要下 EMMC 的分區 1 中有沒有 Linux 鏡像文件和設備樹文件。再使用命令 fatload 將 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 文件拷貝到 DRAM 中,地址分別為 0X80800000 和 0X83000000,最后使用 bootz 啟動,命令如下:
mmc dev 1fatload mmc 1:1 80800000 zImagefatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtbbootz 80800000 - 83000000
2、bootm 命令
bootm 和 bootz 功能類似,但是 bootm 用于啟動 uImage 鏡像文件。如果不使用設備樹的話啟動 Linux 內核的命令如下:
bootm addr
addr 是 uImage 鏡像在 DRAM 中的首地址。
如果要使用設備樹,那么 bootm 命令和 bootz 一樣,命令格式如下:
bootm [addr [initrd[:size]] [fdt]]
其中 addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是設備樹(.dtb)文件在 DRAM 中的首地址,如果 initrd 為空的話,同樣是用 “-” 來替代。
3、boot 命令
boot 命令也是用來啟動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啟動 Linux 系統,bootcmd 是一個很重要的環境變量,這個環境變量保存著引導命令,其實就是啟動的命令集合,具體的引導命令內容是可以修改的。
使用 tftp 命令從網絡啟動 Linux 那么就可以設置 bootcmd 為:
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
然后使用 saveenv 將 bootcmd 保存起來:
saveenv
然后直接輸入 boot 命令即可從網絡啟動Linux 系統:
boot
uboot 倒計時結束以后就會啟動 Linux 系統,其實就是執行的 bootcmd 中的啟動
命令。只要不修改 bootcmd 中的內容,以后每次開機 uboot 倒計時結束以后都會使用 tftp 命令從網絡下載 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后啟動 Linux。
如果想從 EMMC 啟動,首先切換到emmc:
mmc dev 1
然后設置 bootcmd 為:
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
然后保存并使用 boot命令啟動即可:
savenevboot
如果不修改 bootcmd 的話,每次開機 uboot 倒計時結束以后都會自動從 EMMC 里面讀取 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后啟動 Linux。
在啟動 Linux 內核的時候可能會遇到如下錯誤:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
這個錯誤的原因是 linux 內核沒有找到根文件系統,因為沒有設置 uboot 的 bootargs 環境變量,關于 bootargs 環境變量后面會講解。
上一篇:【IMX6ULL學習筆記】三、U-BOOT Makefile詳解
下一篇:【IMX6ULL學習筆記】一、Linux開發環境搭建
推薦閱讀最新更新時間:2025-04-24 21:56


設計資源 培訓 開發板 精華推薦
- esp32c3_tmc2209_dcdc
- 基于 PCM1864 的圓形麥克風板 (CMB) 參考設計
- 采用 EM3588 的 ZigBee Wi-Fi 以太網網關參考設計
- 【實測成功】通用式晶振測試儀
- 36尹定英STM32
- LTC3630AMPMSE 4V 至 76V 輸入至 3.3V 輸出、500mA 降壓轉換器的典型應用電路
- LTC3215EDD 演示板,低噪聲、高電流 LED 閃光燈充電泵,VIN = 2.9V-4.4V,AOT
- 【深大電賽】簡易電壓表
- LTC3649EUFD 雙相操作、降壓型穩壓器的典型應用電路
- LTC3801ES6 演示板,550kHz 微功率降壓型 DC/DC 控制器,Vin = 2.5V-9.8V,Vout = 2.5V @ 1A
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析