在移植 Linux之前我們需要先移植一個 bootloader 代碼,這個 bootloader 代碼用于啟動 Linux 內核, bootloader有很多,常用的就是 U-Boot。
移植好 U-Boot 以后再移植 Linux 內核,移植完 Linux 內核以后Linux 還不能正常啟動,還需要再移植一個根文件系統(rootfs),根文件系統里面包含了一些最常用的命令和文件。
所以 U-Boot、 Linux kernel 和 rootfs 這三者一起構成了一個完整的 Linux 系統,一個可以正常使用、功能完善的 Linux 系統。一個完整的linux系統,通常包含了Uboot、kernel、設備樹以及根文件系統。
| 硬件平臺
綜合了多方開發板,最終選擇的是野火(i.MX6ULL eMMC),板子的顏值也比較高,但是原子的教程會詳細一點,以「野火EBF6ULL Pro開發板教程」和「正點原子i.MX6ULL阿爾法開發板教程」為參考,進行學習實踐。
(以具體的開發板為準)
| Uboot介紹
uboot 的全稱是 Universal Boot Loader, uboot 是一個遵循 GPL 協議的開源軟件, uboot 是一個裸機代碼,可以看作是一個裸機綜合例程。現在的 uboot 已經支持液晶屏、網絡、 USB 等高級功能。
我們一般不會直接用 uboot 官方的 U-Boot 源碼的。uboot 官方的 uboot 源碼是給半導體廠商準備的,半導體廠商會下載 uboot 官方的 uboot 源碼,然后將自家相應的芯片移植進去。也就是說半導體廠商會自己維護一個版本的 uboot,這個版本的 uboot 相當于是他們定制的。
| Uboot編譯
編譯前還要在Ubuntu 中「安裝ncurses 庫」,安裝命令如下:
sudoapt-getinstalllibncurses5-dev
提示:有些庫在Ubuntu中已經自帶,如果編譯出錯記得把需要的庫安裝;
獲取原廠的uboot源碼:
通過正點原子官網獲取資源,在「01、例程源碼/04、NXP官方原版Uboot和Linux」目錄下即可找到uboot(uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)源碼,然后放到方便找到的目錄下,比如直接放在桌面,本人直接放在桌面/saver目錄下;源碼文件是.bz2格式,需要對文件進行解壓,解壓命令:
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
解壓后的文件如下圖所示:
uboot的目錄結構如下圖所示:
首先看下「uboot的配置」,configs目錄下有很多的配置文件,找到與實際開發板相同類似的配置文件。正點原子和野火的I.MX6ULL開發板參考的就是「NXP官方的I.MX6ULL EVK開發板」做的硬件,因為手頭上的開發板是emmc版本的,所以就使用下面這個配置文件。
mx6ull_14x14_evk_emmc_defconfig
編譯uboot使用的指令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
命令解析:
ARCH=arm 設置目標為 arm 架構;
CROSS_COMPILE 指定所使用的交叉編譯器。
第1條命令相當于make distclean,目的是清除工程,一般在編譯的時候需要清理一下工程已存在的編譯文件。
第2條指令相當于make mx6ull_14x14_evk_emmc_defconfig,用于配置 uboot,配置文件為 mx6ull_14x14_evk_emmc_defconfig。
第3條指令相當于make -j8,也就是使用8核來編譯uboot。
為了方便使用直接寫個腳本文件,新建一個build.sh文件,寫入相關腳本:
#!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
運行腳本編譯uboot:
. build.sh
編譯后的文件結構:
編譯后會生成不少中間文件,其中編譯生成的 u-boot.imx文件就是我們最終要燒寫到開發板中的 uboot 鏡像文件;
| 燒寫鏡像
燒寫鏡像的方法有很多,這里采用的是SD卡燒錄的方式,簡單理解就是讓開發板從SD啟動,開發板的啟動方式是通過撥碼開關實現切換的;
配置撥碼開關:
(截圖來源于正點原子,具體根據實際開發板配置)
(截圖來源于野火,具體根據實際開發板配置)
野火使用的是USB OTG或Etcher的方式更新鏡像,但是正點原子專門編寫了一個軟件來將編譯出來的.bin 文件燒寫到 SD 卡中,這個軟件叫做"imxdownload",路徑為:開發板光盤->5、開發工具->2、Ubuntu 下裸機燒寫軟件->imxdownload,注意imxdownlaod 只能在 Ubuntu 下使用;
使用步驟:
1. 將 imxdownload 拷貝到工程根目錄下,也就是和 **.bin 處于同一個文件夾下,要不然燒寫會失敗的;
2.給予 imxdownload 可執行權限,imxdownload 默認是沒有可執行權限的,需要給予 imxdownload 可執行權限;
chmod 777 imxdownload
3. 燒錄到SD卡,注意提前備份數據,燒錄會格式化SD卡;
Ubuntu 下所有的設備文件都在目錄“/dev”里面,所以插上 SD 卡以后也會出現在“/dev”里面,其中存儲設備都是以“/dev/sd”開頭的。
//查看電腦所有存儲設備 ls /dev/sd*
注意:SD卡一定要連接到ubuntu中,如果出現設備無法連接到它的理想主機控制器,就需要把usb兼容性改成3.0;
imxdownload向SD卡燒寫u-boot.bin文件,命令格式如下:
./imxdownload u-boot.bin /dev/sdb
imxdownload:imxdownload工具;
u-boot.bin:需要燒寫到SD卡的文件;
/dev/sdb:插入的SD卡設備;
注意:不要選擇錯設備,一定要保證是自己插入的SD卡設備;
注意這個燒寫速度,如果這個燒寫速度在幾百 KB/s 以下那么就是正常燒寫,如果這個燒寫速度大于幾十 MB/s、甚至幾百 MB/s 那么肯定是燒寫失敗了! 燒寫完成以后會在當前工程目錄下生成一個 load.imx 的文件,load.imx 這個文件就是軟件 imxdownload 根據 NXP 官方啟動方式介紹的內容,在 u-boot.bin文件前面添加了一些數據頭以后生成的。最終燒寫到 SD 卡里面的就是這個 load.imx 文件,而非boot.bin。
|驗證效果
把啟動方式切換到SD卡啟動,重新上電啟動開發板,當出現倒計時時(串口打印上出現Hit any key to stop autoboot)按下回車,就可以進行uboot面板,默認倒計時3秒,3秒內沒有按下按鍵就會啟動內核;
使用MobaXterm工具查看開發板數據,波特率設置為115200;
| uboot命令 輸入help或?,然后按下回車即可查看當前 uboot 所支持的命令,不同版本的uboot支持的命令會有一點出入:
uboot支持的命令比較多,具體使用可以去官網看看文檔。
審核編輯:劉清
-
u-boot
+關注
關注
0文章
121瀏覽量
38222 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21644
原文標題:i.MX6ULL|uboot初探
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論