史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

Linux 系統要啟動就必須需要一個 bootloader 程序,也就說芯片上電以後先運行一段bootloader程序。這段bootloader程序會先初始化DDR等外設,然後將Linux內核從flash(NAND,NOR FLASH, SD, MMC 等)拷貝到 DDR 中,最後啟動 Linux 內核。當然了, bootloader 的實際工作要複雜的多,但是它最主要的工作就是啟動 Linux 內核, bootloader 和 Linux 內核的關係就跟 PC 上的 BIOS 和 Windows 的關係一樣, bootloader 就相當於 BIOS。


uboot 的全稱是 Universal Boot Loader, uboot 是一個遵循 GPL 協議的開源軟件, uboot 是一個裸機代碼,可以看作是一個裸機綜合例程。現在的 uboot 已經支持液晶屏、網絡、 USB 等高級功能。

文章目錄

    • Uboot 常用命令
      • 信息查詢命令
      • 環境變量命令
      • 內存操作命令
      • 網絡操作命令
      • EMMC 和 SD 卡操作命令
      • FAT格式文件操作命令
      • EXT 格式文件操作命令
      • BOOT操作命令
      • 其他常用命令


Uboot 常用命令

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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


我們輸入“help(或?) 命令名”既可以查看命令的詳細用法,以“setenv”這個命令為例,我們輸入如下命令即可查看“setenv”這個命令的用法:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

信息查詢命令

常用的和信息查詢有關的命令有 3 個: bdinfo、 printenv 和 version。

  • bdinfo 命令用於查看開發板信息
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • printenv用於輸出環境變量信息

uboot 也支持 TAB 鍵自動補全功能,輸入print然後按下 TAB 鍵就會自動補全命令,直接輸入print也可以。

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


uboot 中的環境變量都是字符串,既然叫做環境變量,那麼它的作用就和“變量”一樣。比如 bootdelay 這個環境變量就表示 uboot 啟動延時時間,默認 bootdelay=3,也就默認延時 3秒。前面說的 3 秒倒計時就是由 bootdelay 定義的,如果將 bootdelay 改為 5 的話就會倒計時 5s了。 uboot 中的環境變量是可以修改的,有專門的命令來修改環境變量的值.

  • version 用於查看 uboot 的版本號
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


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

環境變量命令

  • 修改環境變量

環境變量的操作涉及到兩個命令: setenv 和 saveenv,命令

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

setenv的格式:

<code>

setenv

"命令"

"值1 值2 值3"

或者

setenv

"命令"

12

/<code>

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

<code>

setenv

bootdelay 5

saveenv12

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


當我們使用命令 saveenv 保存修改後的環境變量的話會有保存過程提示信息,根據提示可以看出環境變量保存到了 MMC(1)中,也就是 EMMC 中。因為我用的 EMMC版本的核心板, 所以會保存到MMC(1)中。

修改 bootdelay 以後,重啟開發板, uboot 就是變為 5 秒倒計時。

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

<code>

setenv

bootcmd

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

saveenv12/<code>

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

  • 新建環境變量

命令 setenv 也可以用於新建命令,用法就是修改環境變量一樣,比如我們新建一個環境變量 author, author 的值為我的名字拼音: wanliyang,那麼就可以使用如下命令:

<code>

setenv

author wanliyang

saveenv12

/<code>

新建命令 author 完成以後重啟 uboot,然後使用命令 printenv 查看當前環境變量,如圖:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • 刪除環境變量

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

<code>

setenv

author

saveenv12

/<code>

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

內存操作命令

內存操作命令就是用於直接對 DRAM 進行讀寫操作的,常用的內存操作命令有 md、 nm、mm、 mw、 cp 和 cmp。我們依次來看一下這些命令都是做什麼的。

  • md 命令

md 命令用於顯示內存值

,格式如下:

<code>

md

[.b, .w, .l]

address

[# of objects]

1/<code>

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

<code>

md.b

80000000

10

md.w

80000000

10

md.l

80000000

10

123

/<code>

上面這三個命令都是查看以 0X80000000 為起始地址的內存數據,第一個命令以.b 格式顯示,長度為 0x10,也就是 16 個字節;第二個命令以.w 格式顯示,長度為 0x10,也就是 162=32個字節;最後一個命令以.l 格式顯示,長度也是 0x10,也就是 164=64 個字節。這三個命令的執行結果如圖 :

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • nm命令

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

<code>

nm

[.b, .w, .l]

address

1/<code>

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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • mm命令

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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • mw 命令

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

<code>

mw

[.b, .w, .l]

address

value

[count]

1/<code>

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

<code>

mw.l

80000000

0A0A0A0A

10

1

/<code>

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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • cp 命令

cp 是數據拷貝命令,用於將 DRAM 中的數據從一段內存拷貝到另一段內存中,命令格式如下:

<code>cp [.b, .w, .l] 

source

target count 1/<code>

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

<code>

cp.l

80000000

80000100

10

1

/<code>

結果如圖所示:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • cmp 命令

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

<code>

cmp

[.b, .w, .l]

addr1

addr2

count

1/<code>

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

<code>

cmp.l

80000100

80000200

10

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


從圖中我們可以看出,80000000和80000100的地址相同。但是 0x80002000 處的數據和 0x80003000 處的數據就不一樣啦。

網絡操作命令

uboot 是支持網絡的,我們在移植 uboot 的時候一般都要調通網絡功能,因為在移植 linux kernel 的時候需要使用到 uboot 的網絡功能做調試。uboot 支持大量的網絡相關命令,比如 dhcp、ping、 nfs 和 tftpboot等。

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • ping 命令

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

<code>

ping

192.168

.1

.117

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • dhcp命令

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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • nfs命令

nfs 也就是網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,比如我們將linux 鏡像和設備樹文件放到 Ubuntu 中,然後在 uboot 中使用 nfs 命令將 Ubuntu 中的 linux 鏡像和設備樹下載到開發板的 DRAM 中。

我們一般使用 uboot 中的 nfs 命令將 Ubuntu 中的文件下載到開發板的 DRAM 中,在使用之前需要開啟 Ubuntu 主機的 NFS 服務,並且要新建一個 NFS 使用的目錄,以後所有要通過NFS 訪問的文件都需要放到這個 NFS 目錄中。準備好以後就可以使用 nfs 命令來將 zImage 下載到開發板 DRAM 的 0X80800000 地址處,命令如下:

<code>nfs 

80800000

192.168

.

1.105

:/home/wanli/linux/nfs/zImage

1

/<code>

命 令 中 的 “ 80800000 ” 表 示 zImage 保 存 地 址 ,“192.168.1.105:/home/zuozhongkai/linux/nfs/zImage”表示 zImage 在 192.168.1.250 這個主機中,路徑為/home/wanli/linux/nfs/zImage。

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • ftp命令

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

<code>sudo apt-

get

install tftp-hpa tftpd-hpa

1

/<code>

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

<code>

mkdir

/home/wanli/linux/tftpboot

chmod

777

/home/wanli/linux/tftpboot

12

/<code>

最後配置 tftp,打開文件安裝完成以後新建文件/etc/xinetd.d/tftp,然後在裡面輸入如下內容:

<code> 

server

tftp

{

socket_type

=

dgram

protocol

=

udp

wait

=

yes

user

=

root

server

=

/usr/sbin/in.tftpd

server_args

=

-s /home/wanli/linux/tftpboot/

disable

=

no

per_source

=

11

cps

=

100 2

flags

=

IPv4

}

12345678910111213

/<code>

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

<code>

sudo

service tftpd-hpa start

1

/<code>

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

<code> 
TFTP_USERNAME=

"tftp"

TFTP_DIRECTORY=

"/home/wanli/linux/tftpboot"

TFTP_ADDRESS=

":69"

TFTP_OPTIONS=

"-l -c -s"

123456/<code>

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

<code>

sudo

service tftpd-hpa restart

1

/<code>

萬事俱備,只剩驗證了, uboot 中的 tftp 命令格式如下:

<code>

tftpboot

[loadAddress]

[[hostIPaddr:]

bootfilename

] 1/<code>

看 起 來 和 nfs 命 令 格式 一 樣 的 , loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,[[hostIPaddr:]bootfilename]是要從 Ubuntu 中下載的文件。但是和 nfs 命令的區別在於,

tftp 命令不需要輸入文件在 Ubuntu 中的完整路徑,只需要輸入文件名即可。比如我們現在將 tftpboot 文件夾裡面的 zImage 文件下載到開發板 DRAM 的 0X80800000 地址處,命令如下:

<code>

tftp

80800000

zImage

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

EMMC 和 SD 卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般認為 EMMC和 SD 卡是同一個東西,所以沒有特殊說明,mmc 是一系列的命令,其後可以跟不同的參數。

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


注意: 加上 SD 卡一共有兩個 MMC 設備, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。默認會將 EMMC 設置為當前 MMC 設備,這就是為什麼輸入“mmc info”查詢到的是 EMMC 設備信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”來將 SD 卡設置為當前的 MMC 設備。mmc dev 命令用於切換當前 MMC 設備,命令格式如下:

<code>

mmc

dev

[dev]

[part]

1/<code>

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

<code>

mmc

dev

0

//切換到

SD

卡,

0

SD

卡,

1

eMMC

1

/<code>

有時候 SD 卡或者 EMMC 會有多個分區,

第 0 個分區存放 uboot,第 1 個分區存放 Linux 鏡像文件和設備樹,第 2 個分區存放根文件系統。要將數據寫到 MMC 設備裡面,可以使用命令“mmc write”,格式如下:

<code>

mmc

write addr blk

1

/<code>

addr 是要寫入 MMC 中的數據在 DRAM 中的起始地址, blk 是要寫入 MMC 的塊起始地址(十六進制), cnt 是要寫入的塊大小,一個塊為 512 字節。我們可以使用命令mmc write來升級 uboot,也就是在 uboot 中更新 uboot。

通過 nfs 或者 tftp 命令將新的 u-boot.bin 下載到開發板的 DRAM 中,然後再使用命令“mmc write”將其寫入到 MMC設備中。我們就來更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本號,注意編譯時間,輸入命令:

<code>mmc dev 

0

version

12

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


然後將編譯出來的 u-boot.imx(u-boot.bin 前面加了一些頭文件)拷貝到 Ubuntu 中的nfs對應目錄下。最後使用 nfs命令將其下載到 0x80800000 地址處,命令如下:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


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

<code>

mmc

dev

0

mmc

write

80800000

2

33E

12

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


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

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


千萬不要寫 SD 卡或者 EMMC 的前兩個塊(扇區),裡面保存著分區表!
千萬不要寫 SD 卡或者 EMMC 的前兩個塊(扇區),裡面保存著分區表!
千萬不要寫 SD 卡或者 EMMC 的前兩個塊(扇區),裡面保存著分區表!

FAT格式文件操作命令

  • fatinfo 命令

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

<code>fatinfo <

interface

> [<

dev[:part]

>]

1

/<code>

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

<code>

fatinfo

mmc

1

:1

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • fatls 命令

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

<code>

fatls

<

interface

>

[>]

[directory]

1

/<code>

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

<code>

fatls

mmc

1

:1

1

/<code>

結果如圖:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了


從上圖可以看出, emmc 的分區 1 中存放著兩個文件,文件分別是 linux 鏡像(zimage)文件和設備樹。並且在 emmc 的分區 1 中有6個文件,沒有目錄。

  • fstype 命令

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

<code>fstype <

interface

> <

dev

>:

<

part

>

1

/<code>

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

<code>

fstype

mmc

1

:0

fstype

mmc

1

:1

fstype

mmc

1

:2

123

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

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

  • fatload 命令

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

<code>fatload 

<

interface

>

[

<

dev[:part]

>

[

<

addr

>

[

<

filename

>

[bytes [pos]]]]] 1/<code>

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

<code>

fatload

mmc

1

:1

80800000

zImage

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

從上圖可以看出在 153ms 內讀取了 6071136 個字節的數據,速度為 29.2MiB/s,速度是非常快的,因為這是從EMMC 裡面讀取的,而 EMMC 是 8 位的,速度肯定會很快的。

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

<code>

fatwrite

mmc

1

:1

80800000

zImage

0x676908

1

/<code>

完成以後使用“fatls”命令查看一下 EMMC 分區 1 裡面的文件,結果如圖

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

EXT 格式文件操作命令

uboot 有 ext2 和 ext4 這兩種格式的文件系統的操作命令,常用的就四個命令,分別為:ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。這些命令的含義和使用與 fatload、 fatls 和 fatwrit一樣,只是 ext2 和 ext4 都是針對 ext 文件系統的。比如 ext4ls 命令, EMMC 的分區 2 就是 ext4格式的,使用 ext4ls 就可以查詢 EMMC 的分區 2 中的文件和目錄,輸入命令:

<code>

ext4ls

mmc

1

:2

1

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

BOOT操作命令

uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常用的跟 boot 有關的命令有: bootz、 bootm 和 boot。

  • bootz 命令

要啟動 Linux,需要先將 Linux 鏡像文件拷貝到 DRAM 中,如果使用到設備樹的話也需要將設備樹拷貝到 DRAM 中。可以從 EMMC 或者 NAND 等存儲設備中將 Linux 鏡像和設備樹文件拷貝到 DRAM,也可以通過 nfs 或者 tftp 將 Linux 鏡像文件和設備樹文件下載到 DRAM 中。
不管用那種方法,只要能將 Linux 鏡像和設備樹文件存到 DRAM 中就行,然後使用 bootz 命令來啟動, bootz 命令用於自動 zImage 鏡像文件, bootz 命令格式如下:

<code>

bootz

[addr [initrd[:size]

]

[fdt]

] 1/<code>

命令 bootz 有三個參數, addr 是 Linux 鏡像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的話使用‘-’代替即可, fdt 就是設備樹文件在 DRAM 中的地址。使用命令 fatload 將 zImage 和 imx6ull-alientek-emmc.dtb 文件拷貝到 DRAM 中,地址分別為0X80800000 和 0X83000000,最後使用 bootz 啟動,命令如下:

<code>

fatload

mmc

1

:1

80800000

zImage

fatload

mmc

1

:1

83000000

imx6ull-14x14-emmc-7-1024x600-c.dtb

bootz

80800000

-

83000000

123

/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

  • bootm 命令

bootm 和 bootz 功能類似,但是 bootm 用於啟動 uImage 鏡像文件。如果不使用設備樹的話啟動 Linux 內核的命令如下:

<code>

bootm

addr

1

/<code>

addr 是 uImage 鏡像在 DRAM 中的首地址。如果要使用設備樹,那麼 bootm 命令和 bootz 一樣,命令格式如下:

<code>

bootm

[addr [initrd[:size]

]

[fdt]

] 1/<code>

其中 addr 是 uImage 在 DRAM 中的首地址, initrd 是 initrd 的地址, fdt 是設備樹(.dtb)文件在 DRAM 中的首地址,如果 initrd 為空的話,同樣是用“-”來替代。

  • boot命令

boot 命令也是用來啟動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啟動 Linux 系統, bootcmd 是一個很重要的環境變量!其名字分為“boot”和“cmd”,也就是“引導”和“命令”,說明這個環境變量保存著引導命令,其實就

是啟動的命令集合,具體的引導命令內容是可以修改的。
比如想從 EMMC 啟動那就設置 bootcmd 為“fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek_emmc.dtb; bootz 80800000 - 83000000”,然後使用 boot 命令啟動即可,命令如下:

<code>

setenv

bootcmd

'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'

savenevboot123/<code>
史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

其他常用命令

uboot 中還有其他一些常用的命令,比如 reset、 go、 run 和 mtest 等。

  • reset

命令顧名思義就是復位的,輸入“reset”即可復位重啟。

  • go 命令

go 命令用於跳到指定的地址處執行應用,命令格式如下:

<code>

go

addr

1

/<code>

addr 是應用在 DRAM 中的首地址,通過 go 命令我們就可以在 uboot 中運行裸機實驗。

  • run 命令

run 命令用於運行環境變量中定義的命令,比如可以通過“run bootcmd”來運行 bootcmd 中的啟動命令,但是 run 命令最大的作用在於運行我們自定義的環境變量。在後面調試Linux 系統的時候常常要在網絡啟動和 EMMC/NAND 啟動之間來回切換,而 bootcmd 只能保存一種啟動方式,如果要換另外一種啟動方式的話就得重寫 bootcmd,會很麻煩。這裡我們就可以通過自定義環境變量來實現不同的啟動方式,比如定義環境變量 mybootemmc 表示從 emmc 啟動,定義 mybootnet 表示從網絡啟動,定義 mybootnand 表示從 NAND 啟動。如果要切換啟動方式的話只需要運行“run mybootxxx(xxx 為 emmc、 net 或 nand)”即可。


說幹就幹,創建環境變量 mybootemmc、 mybootnet 和 mybootnand,命令如下:

<code>

setenv

mybootemmc

'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;;bootz 80800000 - 83000000'

1

/<code>
<code>

setenv

mybootnand

'nand read 80800000 4000000 800000;nand read 83000000 6000000100000;bootz 80800000 - 83000000'

1

/<code>
<code>

setenv

mybootnet

'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'

1

/<code>
<code>

saveenv

1

/<code>

創建環境變量成功以後就可以使用 run 命令來運行 mybootemmc、 mybootnet 或 mybootnand來實現不同的啟動:

<code>

run

mybootemmc

1

/<code>

<code>

run

mytoobnand

1

/<code>

<code>

run

mybootnet

1

/<code>
  • mtest 命令

metest 命令是一個簡單的內存讀寫測試命令,可以用來測試自己開發板上的 DDR,命令格式如下:

<code>mtest [

start

[

end

[pattern [iterations]]]]

1

/<code>

start是要測試的DRAM 開始地址, end 是結束地址,比如我們測試 0X80000000~0X80001000這段內存,輸入mtest 80000000 80001000,結果如圖所示:

史上最全Uboot常用命令彙總(超全面詳細)收藏這一篇就夠了

測試範圍為 0X80000000~0X80001000,已經測試了 273 次,如果要結束測試就按下鍵盤上的“Ctrl+C”鍵。


分享到:


相關文章: