1.uboot的分類
????????本節是 uboot 的使用,所以就直接使用正點原子已經移植好的 uboot,這個已經放到了開發板光盤中了,路徑為:開發板光盤->1、程序源碼->3、正點原子 Uboot 和 Linux 出廠源碼->uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2。
2.uboot初次編譯
????????首先在 Ubuntu 中安裝 ncurses 庫,否則編譯會報錯,安裝命令如下:
sudo apt-get install libncurses5-dev
????????在 Ubuntu 中創建存放 uboot 的目錄,比如我的是/home/$USER/linux/uboot,然后在此目錄
下新建一個名為“alientek_uboot”的文件夾用于存放正點原子提供的 uboot 源碼。
????????將其拷貝到 Ubuntu 中新建的 alientek_uboot 文件夾下,完成以后如圖所示:

????????使用如下命令對其進行解壓縮:
tar -vxjf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2
????????解壓完成以后 alientek_uboot 文件夾內容如圖:

????????如果使用的是 512MB+8GB 的 EMMC 核心板,使用如下命令來編譯對應的 uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格)
mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
????????這三條命令中 ARCH=arm 設置目標為 arm 架構,CROSS_COMPILE 指定所使用的交叉編
譯器。第一條命令相當于“make distclean”,目的是清除工程,一般在第一次編譯的時候最好清
理一下工程。第二條指令相當于“make mx6ull_14x14_ddr512_emmc_defconfig”,用于配置 uboot, 配置文件為 mx6ull_14x14_ddr512_emmc_defconfig。最后一條指令相當于 “make -j12”也就是使用 12 核來編譯 uboot。當這三條命令執行完以后 uboot 也就編譯成功了.如圖:

????????編譯完成以后的 alentek_uboot 文件夾內容如圖所示:

????????可以看出,編譯完成以后 uboot 源碼多了一些文件,其中 u-boot.bin 就是編譯出來的 uboot
二進制文件。uboot是個裸機程序,因此需要在其前面加上頭部(IVT、DCD等數據)才能在I.MX6U
上執行,圖中的 u-boot.imx 文件就是添加頭部以后的 u-boot.bin,u-boot.imx 就是我們最
終要燒寫到開發板中的 uboot 鏡像文件。
每次編譯 uboot 都要輸入一長串命令,為了簡單起見,我們可以新建一個 shell 腳本文件,
將這些命令寫到 shell 腳本文件里面,然后每次只需要執行 shell 腳本即可完成編譯工作。新建
名為 mx6ull_alientek_emmc.sh 的 shell 腳本文件,然后在里面輸入如下內容:
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
????????第 1 行是 shell 腳本要求的,必須是“#!/bin/bash”或者“#!/bin/sh”。
????????第 2 行使用了 make 命令,用于清理工程,也就是每次在編譯 uboot 之前都清理一下工程。
這里的 make 命令帶有三個參數,第一個是 ARCH,也就是指定架構,這里肯定是 arm;第二個
參數 CROSS_COMPILE 用于指定編譯器,只需要指明編譯器前綴就行了,比如 arm-linux-gnueabihf-gcc 編譯器的前綴就是“arm-linux-gnueabihf-”;最后一個參數 distclean 就是清除工程。
????????第 3 行也使用了 make 命令,用于配置 uboot。同樣有三個參數,不同的是,最后一個參數
是 mx6ull_14x14_ddr512_emmc_defconfig。前面說了 uboot 是 bootloader 的一種,可以用來引導 Linux,但是 uboot 除了引導 Linux 以外還可以引導其它的系統,而且 uboot 還支持其它的架構
和外設,比如 USB、網絡、SD 卡等。這些都是可以配置的,需要什么功能就使能什么功能。所
以在編譯 uboot 之前,一定要根據自己的需求配置 uboot?mx6ull_14x14_ddr512_emmc_defconfig 就是正點原子針對 I.MX6U-ALPHA 的 EMMC 核心板編寫的配置文件,這個配置文件在 uboot 源碼的 configs 目錄中。在 uboot 中,通過“make xxx_defconfig”來配置 uboot,xxx_defconfig 就是不同板子的配置文件,這些配置文件都在 uboot/configs 目錄中。
????????第 4 行有 4 個參數,用于編譯 uboot,通過第 3 行配置好 uboot 以后就可以直接“make”編
譯 uboot 了。其中 V=1 用于設置編譯過程的信息輸出級別;-j 用于設置主機使用多少線程編譯
uboot,最好設置成我們虛擬機所設置的核心數,如果在 VMware 里面給虛擬就分配了 4 個核,
那么使用-j4 是最合適的,這樣 4 個核都會一起編譯。
????????使用 chmod 命令給予 mx6ull_alientek_emmc.sh 文件可執行權限,然后就可以使用這個 shell 腳本文件來重新編譯 uboot,命令如下:
./mx6ull_alientek_emmc.sh
3.uboot燒寫與啟動
????????uboot 編譯好以后就可以燒寫到板子上使用了,這里我們跟前面裸機例程一樣,將 uboot
燒寫到 SD 卡中,然后通過 SD 卡來啟動來運行 uboot。使用 imxdownload 軟件燒寫,命令如
下:
chmod 777 imxdownload //給予 imxdownload 可執行權限,一次即可
./imxdownload u-boot.bin /dev/sdd //燒寫到 SD 卡,不能燒寫到/dev/sda 或 sda1 設備里面!
????????等待燒寫完成,完成以后將 SD 卡插到 I.MX6U-ALPHA 開發板上,BOOT 設置從 SD 卡啟
動,使用 USB 線將 USB_TTL 和電腦連接,也就是將開發板的串口 1 連接到電腦上。打開
MobaXterm,設置好串口參數并打開,最后復位開發板。在 MobaXterm 上出現“Hit any key to
stop autoboot: ”倒計時的時候按下鍵盤上的回車鍵,默認是 3 秒倒計時,在 3 秒倒計時結束以
后如果沒有按下回車鍵的話 uboot 就會使用默認參數來啟動 Linux 內核了。如果在 3 秒倒計時
結束之前按下回車鍵,那么就會進入 uboot 的命令行模式,

????????當進入到 uboot 的命令行模式以后,左側會出現一個“=>”標志。
????????uboot 啟動的時候會輸出一些信息,這些信息如下所示:
1 U-Boot 2016.03-gd3f0479 (Aug 07 2020 - 20:47:37 +0800)
2
3 CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
4 CPU: Industrial temperature grade (-40C to 105C) at 51C
5 Reset cause: POR
6 Board: I.MX6U ALPHA|MINI
7 I2C: ready
8 DRAM: 512 MiB
9 MMC: FSL_SDHC: 0, FSL_SDHC: 1
10 Display: ATK-LCD-7-1024x600 (1024x600)
11 Video: 1024x600x24
12 In: serial
13 Out: serial
14 Err: serial
15 switch to partitions #0, OK
16 mmc1(part 0) is current device
17 Net: FEC1
18 Error: FEC1 address not set.
19
20 Normal Boot
21 Hit any key to stop autoboot: 0
22 =>
????????第 1 行是 uboot 版本號和編譯時間,可以看出,當前的 uboot 版本號是 2016.03,編譯時
間是 2020 年 8 月 7 日凌晨 20 點 47 分。
????????第 3 和第 4 行是 CPU 信息,可以看出當前使用的 CPU 是飛思卡爾的 I.MX6ULL(I.MX 以
前屬于飛思卡爾,然而飛思卡爾被 NXP 收購了),頻率為 792MHz,但是此時運行在 396MHz。
這顆芯片是工業級的,結溫為-40°C~105°C。
????????第 5 行是復位原因,當前的復位原因是 POR。I.MX6ULL 芯片上有個 POR_B 引腳,將這
個引腳拉低即可復位 I.MX6ULL。
????????第 6 行是板子名字,當前的板子名字為“I.MX6U ALPHA|MINI”。
????????第 7 行提示 I2C 準備就緒。
????????第 8 行提示當前板子的 DRAM(內存)為 512MB,如果是 NAND 版本的話內存為 256MB。
????????第 9 行提示當前有兩個 MMC/SD 卡控制器:FSL_SDHC(0)和 FSL_SDHC(1)。I.MX6ULL
支持兩個 MMC/SD,正點原子的 I.MX6ULL EMMC 核心板上 FSL_SDHC(0)接的 SD(TF)卡,
FSL_SDHC(1)接的 EMMC。
????????第 10 和第 11 行是 LCD 型號,當前的 LCD 型號是 ATK-LCD-7-1024x600 (1024x600),分
辨率為 1024x600,格式為 RGB888(24 位)。
????????第 12~14 是標準輸入、標準輸出和標準錯誤所使用的終端,這里都使用串口(serial)作為終
端。
????????第 15 和 16 行是切換到 emmc 的第 0 個分區上,因為當前的 uboot 是 emmc 版本的,也就
是從 emmc 啟動的。我們只是為了方便將其燒寫到了 SD 卡上,但是它的“內心”還是 EMMC
的。所以 uboot 啟動以后會將 emmc 作為默認存儲器,當然了,你也可以將 SD 卡作為 uboot 的
存儲器,這個我們后面會講解怎么做。
????????第 17 行是網口信息,提示我們當前使用的 FEC1 這個網口,I.MX6ULL 支持兩個網口。
????????第 18 行提示 FEC1 網卡地址沒有設置,后面我們會講解如何在 uboot 里面設置網卡地址。
????????第 20 行提示正常啟動,也就是說 uboot 要從 emmc 里面讀取環境變量和參數信息啟動 Linux
內核了。
????????第 21 行是倒計時提示,默認倒計時 3 秒,倒計時結束之前按下回車鍵就會進入 Linux 命令
行模式。如果在倒計時結束以后沒有按下回車鍵,那么 Linux 內核就會啟動,Linux 內核一旦啟
動,uboot 就會壽終正寢。
????????這個就是 uboot 默認輸出信息的含義,NAND 版本的 uboot 也是類似的,只是 NAND 版本
的就沒有 EMMC/SD 相關信息了,取而代之的就是 NAND 的信息,比如 NAND 容量大小信息。
uboot 是來干活的,我們現在已經進入 uboot 的命令行模式了,進入命令行模式以后就可以
給 uboot 發號施令了。當然了,不能隨便發號施令,得看看 uboot 支持哪些命令,然后使用這些
uboot 所支持的命令來做一些工作。下一節就講解 uboot 命令的使用。
4.uboot的使用
????????進入 uboot 的命令行模式以后輸入“help”或者“?”,然后按下回車即可查看當前 uboot 所
支持的命令。
????????uboot 是可配置的,需要什么命令就使能什么命令。目前所使用的命令是正點原子提供的 uboot 中使能的命令,uboot 支持的命令還有很多,而且也可以在 uboot 中自定義命令。
????????以“bootz”這個命令為例,我們輸入如下命令即可查看“bootz”這個命令的用法:
? bootz 或 help bootz
4.1信息查詢命令
bdinfo 命令,此命令用于查看板子信息,直接輸入“bdinfo”即可。
????????可以得出 DRAM 的起始地址和大小、啟動參數保存起始地址、波特率、 sp(堆棧指針)起始地址等信息。
????????命令“printenv”用于輸出環境變量信息,uboot 也支持 TAB 鍵自動補全功能,輸入“print”
然后按下 TAB 鍵就會自動補全命令,直接輸入“print”也可以.

????????命令 version 用于查看 uboot 的版本號.
4.2 環境變量操作
????????環境變量的操作涉及到兩個命令: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
新建環境變量
setenv author zuozhongkai
saveenv
刪除環境變量
setenv author
saveenv
內存操作命令
????????內存操作命令就是用于直接對 DRAM 進行讀寫操作的,常用的內存操作命令有 md、nm、
mm、mw、cp 和 cmp。該部分并不是重點,使用時網上搜索即可,故不再詳細講解。uboot 命令中的數字都是十六進制的!不是十進制的!
網絡操作命令
????????uboot 是支持網絡的,我們在移植 uboot 的時候一般都要調通網絡功能,因為在移植 linux
kernel 的時候需要使用到 uboot 的網絡功能做調試。uboot 支持大量的網絡相關命令,比如 dhcp、ping、nfs 和 tftpboot,我們接下來依次學習一下這幾個和網絡有關的命令。
????????在使用 uboot 的網絡功能之前先用網線將開發板的 ENET2 接口和電腦或者路由器連接起
來,I.MX6U-ALPHA 開發板有兩個網口:ENET1 和 ENET2,一定要連接 ENET2,不能連接錯
了,ENET2 接口如圖所示。


setenv ipaddr 192.168.18.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.18.1
setenv netmask 255.255.255.0
setenv serverip 192.168.18.211
saveenv
????????注意,網絡地址環境變量的設置要根據自己的實際情況,確保 Ubuntu 主機和開發板的 IP
地址在同一個網段內,比如我現在的開發板和電腦都在 192.168.1.0 這個網段內,所以設置開
發板的 IP 地址為 192.168.1.50,我的 Ubuntu 主機的地址為 192.168.1.253,因此 serverip 就是
192.168.1.253。ethaddr 為網絡 MAC 地址,是一個 48bit 的地址,如果在同一個網段內有多個
開發板的話一定要保證每個開發板的 ethaddr 是不同的,否則通信會有問題!設置好網絡相關
的環境變量以后就可以使用網絡相關命令了。
????????
ping 192.168.18.211
????????注意!只能在 uboot 中 ping 其他的機器,其他機器不能 ping uboot,因為 uboot 沒有對 ping命令做處理,如果用其他的機器 ping uboot 的話會失敗!
????????dhcp 用于從路由器獲取 IP 地址,前提得開發板連接到路由器上的,如果開發板是和電腦
直連的,那么 dhcp 命令就會失效。直接輸入 dhcp 命令即可通過路由器獲取到 IP 地址.DHCP 不單單是獲取 IP 地址,其還會通過 TFTP 來啟動 linux 內核.
????????nfs(Network File System)網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,
比如我們將 linux 鏡像和設備樹文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令將 Ubuntu 中
的 linux 鏡像和設備樹下載到開發板的 DRAM 中。這樣做的目的是為了方便調試 linux 鏡像和
設備樹,也就是網絡調試,通過網絡調試是 Linux 開發中最常用的調試方法。原因是嵌入式 linux
開發不像單片機開發,可以直接通過 JLINK 或 STLink 等仿真器將代碼直接燒寫到單片機內部
的 flash 中,嵌入式 Linux 通常是燒寫到 EMMC、NAND Flash、SPI Flash 等外置 flash 中,但是
嵌入式 Linux 開發也沒有 MDK,IAR 這樣的 IDE,更沒有燒寫算法,因此不可能通過點擊一個
“download”按鈕就將固件燒寫到外部 flash 中。雖然半導體廠商一般都會提供一個燒寫固件的
軟件,但是這個軟件使用起來比較復雜,這個燒寫軟件一般用于量產的。其遠沒有 MDK、IAR
的一鍵下載方便,在 Linux 內核調試階段,如果用這個燒寫軟件的話將會非常浪費時間,而這
個時候網絡調試的優勢就顯現出來了,可以通過網絡將編譯好的 linux 鏡像和設備樹文件下載
到 DRAM 中,然后就可以直接運行。
????????我們一般使用 uboot 中的 nfs 命令將 Ubuntu 中的文件下載到開發板的 DRAM 中,在使用
之前需要開啟 Ubuntu 主機的 NFS 服務,并且要新建一個 NFS 使用的目錄,以后所有要通過
NFS 訪問的文件都需要放到這個 NFS 目錄中。Ubuntu 的 NFS 服務開啟我們在 4.2.1 小節已經
詳細講解過了,包括 NFS 文件目錄的創建,如果忘記的話可以去查看一下 4.2.1 小節。我設置
的/home/hequanxin/linux/nfs 這個目錄為我的 NFS 文件目錄。
????????這 里我們將正點原子官方編譯出來的 Linux 鏡像文件 zImage 下載到開發板 DRAM 的 0x80800000 這個地址處。正點原子編譯出來的 zImage 文件已經放到了開發板光盤中,路徑為:8、系統鏡像->1、出廠系統鏡像->2、kernel 鏡像\linux-imx-4.1.15-2.1.0-gbfed875-v1.6 ->zImage。將文件 zImage 通 過 FileZilla 發 送 到 Ubuntu 中 的 NFS 目 錄 下 , 比 如 我 的 就 是 放 到 /home/hequanxin/linux/nfs 這個目錄下.
????????準備好以后就可以使用 nfs 命令來將 zImage 下載到開發板 DRAM 的 0X80800000 地址處,
命令如下:
nfs 80800000 192.168.18.211:/home/hequanxin/linux/nfs/zImage
????????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/hequanxin/linux/tftpboot
chmod 777 /home/hequanxin/linux/tftpboot
????????這 樣 我 就 在 我 的 電 腦 上 創 建 了 一 個 名 為 tftpboot 的目錄 ( 文 件 夾 ) , 路 徑 為
/home/hequanxin/linux/tftpboot。注意!我們要給 tftpboot 文件夾權限,否則的話 uboot 不能從
tftpboot 文件夾里面下載文件。
????????最后配置 tftp,安裝完成以后新建文件/etc/xinetd.d/tftp,如果沒有/etc/xinetd.d 目錄的話自行
創建,然后在里面輸入如下內容
1 server tftp
2 {
3 socket_type = dgram
4 protocol = udp
5 wait = yes
6 user = root
7 server = /usr/sbin/in.tftpd
8 server_args = -s /home/hequanxin/linux/tftpboot/
9 disable = no
10 per_source = 11
11 cps = 100 2
12 flags = IPv4
13 }
啟動TFTP服務
sudo service tftpd-hpa start
打開/etc/default/tftpd-hpa 文件,將其修改為如下所示內容:# /etc/default/tftpd-hpaTFTP_USERNAME="tftp"TFTP_DIRECTORY="/home/hequanxin/linux/tftpboot"TFTP_ADDRESS=":69" TFTP_OPTIONS="-l -c -s"重啟TFTP
sudo service tftpd-hpa restart將nfs中的zimage拷貝到tftpboot目錄下,在開發板uboot下輸入以下命令即可
tftp 80800000 zImage
????????uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般認為 EMMC
和 SD 卡是同一個東西,所以沒有特殊說明,本教程統一使用 MMC 來代指 EMMC 和 SD 卡。
uboot 中常用于操作 MMC 設備的命令為“mmc”。關于指令不做過多講解。
????????如果 EMMC 里 面燒寫了 Linux 系統的話,EMMC 是有 3 個分區的,第 0 個分區存放 uboot,第 1 個分區存放 Linux 鏡像文件和設備樹,第 2 個分區存放根文件系統。但是在圖 中只有兩個分區,那 是因為第 0 個分區沒有格式化,所以識別不出來,實際上第 0 個分區是存在的。一個新的 SD 卡默認只有一個分區,那就是分區 0,所以前面講解的 uboot 燒寫到 SD 卡,其實就是將 u-boot.bin燒寫到了 SD 卡的分區 0 里面。后面學習 Linux 內核移植的時候再講解怎么在 SD 卡中創建并格式化第二個分區,并將 Linux 鏡像文件和設備樹文件存放到第二個分區中。
????????千萬不要寫 SD 卡或者 EMMC 的前兩個塊(扇區),里面保存著分區表!
FAT 格式文件系統操作命令
fatinfo 命令用于查詢指定 MMC 設備分區的文件系統信息,格式如下
fatinfo mmc 1:1fatls 命令用于查詢 FAT 格式設備的目錄和文件信息
fatls mmc 1:1fstype 用于查看 MMC 設備某個分區的文件系統格式
fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2fatload 命令用于將指定的文件讀取到 DRAM 中
fatload mmc 1:1 80800000 zImagefatwirte 命令用于將 DRAM 中的數據寫入到 MMC 設備中
注意!uboot 默認沒有使能 fatwrite 命令,需要修改板子配置頭文件,比如 mx6ullevk.h、
mx6ull_alientek_emmc.h 等等,板子不同,其配置頭文件也不同。找到自己開發板對應的配置頭
文件然后添加如下一行宏定義來使能 fatwrite 命令
#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */
fatwrite mmc 1:1 80800000 zImage 6788f8 (先用TFTP下載到DRAM,會顯示鏡像的大小)
EXT 格式文件系統操作命令
????????uboot 有 ext2 和 ext4 這兩種格式的文件系統的操作命令,常用的就四個命令,分別為:
ext2load、ext2ls、ext4load、ext4ls 和 ext4write。這些命令的含義和使用與 fatload、fatls 和 fatwrite 一樣,只是 ext2 和 ext4 都是針對 ext 文件系統的。比如 ext4ls 命令,EMMC 的分區 2 就是 ext4 格式的,使用 ext4ls 就可以查詢 EMMC 的分區 2 中的文件和目錄,輸入命令:
ext4ls mmc 1:2
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 鏡像文件。
Linux 鏡像文件和設備樹都準備好了,我們先學習如何通過網絡啟動 Linux,使用 tftp 命令
將zImage 下載到DRAM的0X80800000地址處,然后將設備樹imx6ull-14x14-emmc-7-1024x600-
c.dtb 下載到 DRAM 中的 0X83000000 地址處,最后之后命令 bootz 啟動,命令如下:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-4.3-480x272-c.dtb
bootz 80800000 - 83000000
????????上圖就是我們通過 tftp 和 bootz 命令來從網絡啟動 Linux 系統,如果我們要從 EMMC 中啟
動 Linux 系統的話只需要使用命令 fatload 將 zImage 和 imx6ull-14x14-emmc-4.3-480x272-c.dtb 從 EMMC 的分區 1 中拷貝到 DRAM 中,然后使用命令 bootz 啟動即可。先使用命令 fatls 查看要
下 EMMC 的分區 1 中有沒有 Linux 鏡像文件和設備樹文件,如果沒有的話參考講解的 fatwrite 命令將 tftpboot 中的 zImage 和 imx6ull-14x14-emmc-4.3-480x272-c.dtb 文件燒寫 到 EMMC 的分區 1 中。然后使用命令 fatload 將 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 文件拷貝到 DRAM 中,地址分別為 0X80800000 和 0X83000000,最后使用 bootz 啟動,命令如下:
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-480x272-c.dtb
bootz 80800000 - 83000000
2、bootm 命令
????????bootm 和 bootz 功能類似,但是 bootm 用于啟動 uImage 鏡像文件。如果不使用設備樹的話
啟動 Linux 內核的命令如下:
bootm addr
addr 是 uImage 鏡像在 DRAM 中的首地址。
如果要使用設備樹,那么 bootm 命令和 bootz 一樣
3、boot 命令
????????boot 命令也是用來啟動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啟動 Linux 系
統,bootcmd 是一個很重要的環境變量!其名字分為“boot”和“cmd”,也就是“引導”和“命
令”,說明這個環境變量保存著引導命令,其實就是啟動的命令集合,具體的引導命令內容是可
以修改的。比如我們要想使用 tftp 命令從網絡啟動 Linux 那么就可以設置 bootcmd 為“tftp
80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 -
83000000”,然后使用 saveenv 將 bootcmd 保存起來。然后直接輸入 boot 命令即可從網絡啟動
Linux 系統,命令如下
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-4.3-480x272-c.dtb;
bootz 80800000 - 83000000'
saveenv
boot
????????如果想從 EMMC 啟動那就設置 bootcmd 為“fatload mmc 1:1 80800000 zImage; fatload mmc
1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000”,然后使用 boot命令啟動即可,命令如下:
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-
emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
savenev
boot
4.其他常用命令
1、reset 命令
2、go 命令
????????addr 是應用在 DRAM 中的首地址,我們可以編譯一下裸機例程的實驗 13_printf,然后將編
譯出來的 printf.bin 拷貝到 Ubuntu 中的 tftpboot 文件夾里面,注意,這里要拷貝 printf.bin 文件,
不需要在前面添加 IVT 信息,因為 uboot 已經初始化好了 DDR 了。使用 tftp 命令將 printf.bin
下載到開發板 DRAM 的 0X87800000 地址處,因為裸機例程的鏈接首地址就是 0X87800000,
最后使用 go 命令啟動 printf.bin 這個應用,命令如下:
tftp 87800000 printf.bin
go 87800000
通過 go 命令我們就可以在 uboot 中運行裸機例程。
3、run 命令
????????run 命令用于運行環境變量中定義的命令,比如可以通過“run bootcmd”來運行 bootcmd 中
的啟動命令,但是 run 命令最大的作用在于運行我們自定義的環境變量。在后面調試 Linux 系
統的時候常常要在網絡啟動和 EMMC/NAND 啟動之間來回切換,而 bootcmd 只能保存一種啟
動方式,如果要換另外一種啟動方式的話就得重寫 bootcmd,會很麻煩。這里我們就可以通過
自定義環境變量來實現不同的啟動方式,比如定義環境變量 mybootemmc 表示從 emmc 啟動,
定義 mybootnet 表示從網絡啟動,定義 mybootnand 表示從 NAND 啟動。如果要切換啟動方式
的話只需要運行“run mybootxxx(xxx 為 emmc、net 或 nand)”即可。
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-
14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000
100000;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv啟動指令
run mybootemmc
4、mtest 命令
????????mtest 命令是一個簡單的內存讀寫測試命令,可以用來測試自己開發板上的 DDR
