uboot使用指南

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是個裸機程序,因此需要在其前面加上頭部(IVTDCD等數據)才能在I.MX6U
上執行,圖中的 u-boot.imx 文件就是添加頭部以后的 u-boot.binu-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”來配置 ubootxxx_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.MX6ULLI.MX
前屬于飛思卡爾,然而飛思卡爾被 NXP 收購了),頻率為 792MHz,但是此時運行在 396MHz
這顆芯片是工業級的,結溫為-40°C~105°C
????????第 5 行是復位原因,當前的復位原因是 PORI.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
????????有時候我們修改的環境變量值可能會有空格,比如 bootcmdbootargs 等,這個時候環境變
量值就得用單引號括起來,比如下面修改環境變量 bootargs 的值:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

新建環境變量

setenv author zuozhongkai
saveenv

刪除環境變量

setenv author
saveenv

內存操作命令

????????內存操作命令就是用于直接對 DRAM 進行讀寫操作的,常用的內存操作命令有 mdnm
mmmwcp 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.253ethaddr 為網絡 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 通常是燒寫到 EMMCNAND FlashSPI Flash 等外置 flash 中,但是
嵌入式 Linux 開發也沒有 MDKIAR 這樣的 IDE,更沒有燒寫算法,因此不可能通過點擊一個
download”按鈕就將固件燒寫到外部 flash 中。雖然半導體廠商一般都會提供一個燒寫固件的
軟件,但是這個軟件使用起來比較復雜,這個燒寫軟件一般用于量產的。其遠沒有 MDKIAR
的一鍵下載方便,在 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、出廠系統鏡像->2kernel 鏡像\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 這兩種格式的文件系統的操作命令,常用的就四個命令,分別為:
ext2loadext2lsext4loadext4ls ext4write。這些命令的含義和使用與 fatloadfatls fatwrite 一樣,只是 ext2 ext4 都是針對 ext 文件系統的。比如 ext4ls 命令,EMMC 的分區 2 就是 ext4 格式的,使用 ext4ls 就可以查詢 EMMC 的分區 2 中的文件和目錄,輸入命令:
ext4ls mmc 1:2
BOOT 操作命令
????????uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常
用的跟 boot 有關的命令有:bootzbootm boot
1bootz 命令
????????要啟動 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
2bootm 命令
????????bootm 和 bootz 功能類似,但是 bootm 用于啟動 uImage 鏡像文件。如果不使用設備樹的話
啟動 Linux 內核的命令如下:
bootm addr
addr 是 uImage 鏡像在 DRAM 中的首地址。
如果要使用設備樹,那么 bootm 命令和 bootz 一樣
3boot 命令
????????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.其他常用命令

1reset 命令
2go 命令
????????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 中運行裸機例程。
3run 命令
????????run 命令用于運行環境變量中定義的命令,比如可以通過“run bootcmd”來運行 bootcmd
的啟動命令,但是 run 命令最大的作用在于運行我們自定義的環境變量。在后面調試 Linux
統的時候常常要在網絡啟動和 EMMC/NAND 啟動之間來回切換,而 bootcmd 只能保存一種啟
動方式,如果要換另外一種啟動方式的話就得重寫 bootcmd,會很麻煩。這里我們就可以通過
自定義環境變量來實現不同的啟動方式,比如定義環境變量 mybootemmc 表示從 emmc 啟動,
定義 mybootnet 表示從網絡啟動,定義 mybootnand 表示從 NAND 啟動。如果要切換啟動方式
的話只需要運行“run mybootxxx(xxx emmcnet 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
4mtest 命令
????????mtest 命令是一個簡單的內存讀寫測試命令,可以用來測試自己開發板上的 DDR

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92755.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習率預熱總結

學習率預熱是什么? 學習率預熱(Learning Rate Warmup) 是一種在深度學習訓練初期逐漸增加學習率的策略。其核心思想是:在訓練開始時使用較小的學習率,逐步增加到目標學習率,以避免模型參數在初始階段因學習…

初識SYSCFG(System Configuration Controller)寄存器映射

SYSCFG(System Configuration Controller)寄存器映射的詳細說明,以 STM32(如 F1/F4/F7 系列)為例。SYSCFG 控制器用于系統級配置,如外部中斷映射、存儲器重映射等。SYSCFG 寄存器映射概述 基地址&#xff1…

《P3403 跳樓機》

題目背景DJL 為了避免成為一只咸魚,來找 srwudi 學習壓代碼的技巧。題目描述Srwudi 的家是一幢 h 層的摩天大樓。由于前來學習的蒟蒻越來越多,srwudi 改造了一個跳樓機,使得訪客可以更方便的上樓。經過改造,srwudi 的跳樓機可以采…

【GPT-OSS 全面測評】釋放推理、部署和自主掌控的 AI 新紀元

目錄 一、背景與意義 二、核心參數對比 三、性能評測(Benchmark) 四、硬件適配與優化 五、安全性與風險 六、部署方式 七、適用場景 八、大型語言模型對比表(2025 年 8 月版) 總結 一、背景與意義 💡 為什么…

醫療健康Agent:診斷輔助與患者管理的AI解決方案

醫療健康Agent:診斷輔助與患者管理的AI解決方案 🌟 Hello,我是摘星! 🌈 在彩虹般絢爛的技術棧中,我是那個永不停歇的色彩收集者。 🦋 每一個優化都是我培育的花朵,每一個特性都是我放…

python魔法屬性__doc__介紹

doc: 魔法屬性。類、函數的描述信息。 __doc__在python中類的使用方法: class Person(object):"""人類---類的描述信息""" # 只能使用多行注釋,單行注釋無效passprint(Person.__doc__)運行結果如圖所示:__d…

PostgreSQL 批量COPY導入優化參數配置

💡 場景假設我們進行的是 頻繁批量導入、對數據持久性容忍較高 的場景,比如日志表、緩存表、臨時數據表等。如果系統崩潰可重導入,那我們就可以犧牲一點寫入安全性來換極致性能。?? 參數配置推薦(postgresql.conf)參…

BeanDefinition 與 Bean 生命周期(面試高頻考點)

Bean 是 Spring 應用的核心組件,而 BeanDefinition 作為 Bean 的 “元數據描述”,貫穿了 Bean 從定義到銷毀的全生命周期。理解 BeanDefinition 的加載注冊機制,以及 Bean 的完整生命周期,是掌握 Spring 容器管理邏輯的關鍵&#…

node.js 學習筆記2 進程/線程、fs

進程和線程 進程:進行中的程序。比如有一段程序,程序已經載入內存了,CPU正在執行這段程序,這時候就會產生一個進程。進程,也可以看做程序的一次執行過程。 在window中打開任務管理器,可以查看計算機中的所…

【線性代數】其他

上一節:【線性代數】線性方程組與矩陣——(3)線性方程組解的結構 總目錄:【線性代數】目錄 文章目錄11. 向量的內積、長度及正交性12. 方陣的特征值與特征向量13. 相似矩陣14. 對稱矩陣的對角化15. 二次型及其標準形11. 向量的內積…

Spring Cloud LoadBalancer 實現自定義負載均衡策略(基于服務元數據篩選)

💡 Spring Cloud LoadBalancer 實現自定義負載均衡策略(基于服務元數據篩選) 在微服務架構中,我們常常希望對服務實例進行更精細的路由控制,例如: 灰度發布:不同環境訪問不同版本操作系統差異&a…

Javaweb(1)html、css、js

注:圖來自黑馬 一、HTML(超文本標記語言) HTML 是網頁的 “骨架”,負責定義頁面的結構和內容,通過標簽(tag)描述文本、圖片、鏈接等元素。 1. 基礎結構 文檔聲明:<!DOCTYPE html>(告訴瀏覽器這是 HTML5 文檔)。 根標簽:<html> 包裹整個文檔,包含 &l…

MQTT:Dashboard數據集成(待補充)

目錄一、工作原理二、基本使用三、連接器基本使用一、工作原理 數據集成使用sink和source組件與外部數據系統對接。 sink&#xff1a;用于將消息發送到外部數據系統&#xff0c;例如MySQL、Kafka或Http服務等。source&#xff1a;用于從外部數據系統接收消息&#xff0c;例如…

VisionMoE本地部署的創新設計:從架構演進到高效實現

本地部署VisionMoE的時代需求 在人工智能技術飛速發展的今天&#xff0c;視覺語言模型(Vision-Language Models, VLMs)已成為多模態理解的核心工具。然而&#xff0c;傳統的大型視覺語言模型主要依賴云端GPU集群進行部署和推理&#xff0c;這不僅帶來了高昂的運營成本&#xf…

機試備考筆記 8/31

2025年8月8日 小結&#xff1a;省流&#xff0c;寫了倆道巨簡單的&#xff08;被卡好久的傳參指針和指針的引用的區別&#xff09;&#xff0c;一題遞歸&#xff08;意滿&#xff09;&#xff1b;這筆記還是0809寫的&#xff0c;嘖&#xff0c;今天可能不寫了&#xff0c;明天也…

java9學習筆記-part2

進程 API在 Java 9 之前&#xff0c;Process API 仍然缺乏對使用本地進程的基本支持&#xff0c;例如獲取進程的 PID 和所有者&#xff0c;進程的開始時間&#xff0c;進程使用了多少 CPU 時間&#xff0c;多少本地進程正在運行等。Java 9 向 Process API 添加了一個名為 Proce…

AI智能編程工具匯總

AI智能編程工具匯總 以下是一份關于主流大模型開發工具的綜合介紹&#xff0c;涵蓋 Gemini CLI、Qwen-Code、Kimi K2 等關鍵工具的功能特性、安裝方式與使用建議。 &#x1f31f; Gemini CLI 開發者&#xff1a;Google DeepMind 簡介&#xff1a;命令行工具&#xff0c;用于調…

算法_python_牛客華為機試筆記_01

刷題是必須的&#xff0c;通過刷題以及別人對題目的解析&#xff0c;可以快速理解&#xff0c;提高效率。 00_題庫與參考視頻 華為機試_在線編程_牛客網 HJ3 明明的隨機數_嗶哩嗶哩_bilibili 這套華為機試是華為筆試面試機考在線練習&#xff0c;共138道題&#xff0c;目前…

Java基礎-完成局域網內溝通軟件的開發

目錄 案例要求&#xff1a; 實現思路&#xff1a; itheima-chat-server包 src com.itheima Constant類&#xff1a; Server類: ServerReaderThread類: itheima-chat-system包 src com.itheima.ui ChatEntryFrame類&#xff1a; ClientChatFrame類: ClientReaderTh…

windows內核研究(內存管理-線性地址的管理)

內存管理線性地址的管理 進程空間的地址劃分分區x86 32位Windows空指針賦值區0x00000000 - 0x0000FFFF用戶模式區0x00010000 - 0x7FFEFFFF64KB禁入區0x7FFF0000 - 0x7FFFFFFF內核0x80000000 - 0xFFFFFFFF線性地址有4GB&#xff0c;但是并不是所有的地方都能訪問&#xff08;這里…