【北京迅爲】i.MX6ULL終結者Uboot編譯及移植U-Boot介紹

1 u-boot的使用

uboot是一段裸機代碼,它的實現非常複雜,主要是初始化一些硬件,部署整個計算機系統,將內核讀到內存,根據環境變量去啓動內核,並向內核傳遞參數。它的目標就是啓動內核,內核啓動後它的生命也隨之結束。
u-boot是SourceForge上的開源項目,由一個人發起,然後由整個世界所有感興趣的人共同維護髮展而來的一個bootloader,bootloader是用來引導和加載內核,向內核傳遞參數的,是內核引導程序的統稱,bootloader除了u-boot還有bios,LilO,redboot,vivi等。

1.1 環境變量

在uboot命令行輸入printenv,打印出環境變量(使用的 NAND flash版本):
在這裏插入圖片描述

圖 1.1.1

1.baudrate=115200,波特率爲115200。
2.bootargs=console=ttymxc0,115200 root=ubi0:rootfs rootfstype=ubifs ubi.mtd=5 mtdparts=gpmi-nand:4m(u-boot),2m(-boot-env),4m(logo),10m(kernel),2m(dtb),-(rootfs) rootwait rw
參數說明:.bootargs後面的變量是傳遞給linux內核的參數,主要用來告訴內核啓動信息,分區信息和根文件系統所在的分區,console=ttymxc0代表串口節點ttymxc0實現內核和PC的交互。波特率是115200,root=ubi0:rootfs文件系統的名字叫做rootfs,分區依次是uboot,uboot環境變量,開機logo,內核,設備樹,文件系統。進入內核可以在/proc/mtd看到分區信息:
在這裏插入圖片描述

圖 1.1.2

通過bootargs可以設置文件系統的掛載方式,可以掛載flash中的根文件系統,還可以通過NFS掛載網絡文件系統。
3.bootcmd=nand read ${loadaddr} 0xa00000 0xa00000; nand read ${fdt_addr} 0x144B000 0xc800;bootz ${loadaddr} - ${fdt_addr}
bootcmd後面是系統自啓動參數,在啓動參數由一些uboot命令組成,在倒計時結束後uboot會依次執行設置好的命令,
NAND read ${loadaddr} 0xa00000 0xa00000:將nand flash的偏移地址0xa00000開始,讀大小爲0xa00000的內核鏡像到內存的開始地址爲loadaddr處,loadaddr爲0x80800000,如圖 1.1.3。
在這裏插入圖片描述

圖 1.1.3

nand read ${fdt_addr} 0x144B000 0xc800:將設備樹從flash的偏移地址0x144B000讀0xC800大小到內存的fdt_addr處,fdt_addr爲0x83000000

在這裏插入圖片描述

圖 1.1.4

然後從內存的{loadaddr}讀取Linux內核,從{fdt_addr}讀設備樹。
在這裏插入圖片描述

圖 1.1.5

可以看出最後內核是從內存中啓動的,我們可以從flash中獲取內核,也可以用tftp服務從網絡中下載內核,最後在內存中啓動。
4.bootdelay=3代表uboot啓動後倒計時的秒數。
5.此外還有網絡相關的環境變量,比如服務器地址serverip,網關gatewayip,開發板IP ipaddr,子網掩碼netmask等,設置了這些參數才能使用tftp服務。
關於uboot的環境變量還有很多,這裏只列出了常用的幾個,還可以根據需要自定義環境變量。

1.2 常用命令

進入uboot命令行,輸入help查看幫助信息,會彈出很多命令和介紹:
在這裏插入圖片描述

圖 1.2.1

U-Boot的命令有很多,而且還可以自定義進行添加,下面介紹常用的幾個。
1.printenv:查看環境變量:
2.setenv:修改環境變量:setenv 環境變量名 環境變量值
刪除環境變量:setenv 環境變量名
例如設置自啓動倒計時環境變量bootdelay,設置前爲3秒:
在這裏插入圖片描述

圖 1.2.2

輸入命令setenv bootdelay 10,
然後輸入printenv查看環境變量,發現環境變量已經改變。但是重新啓動後新設置的環境失效,這是因爲環境變量沒有保存到flash。
在這裏插入圖片描述

圖 1.2.3

3.保存環境變量: saveenv,將環境變量保存到flash,重啓後依然存在。
4.啓動內核:boot,按照環境變量bootcmd啓動內核。
在這裏插入圖片描述

圖 1.2.4

5.重新啓動:reset。
6.nand命令介紹:
nand info :查看nand 信息
nand read addr offset count:讀命令;
nand erase:擦除整片NAND;
nand erase offset count:擦除指定NAND指定的區域;
nand write addr offset count:將內存的數據寫到NAND指定區域;
addr是內存基地址,offset是 NAND的偏移地址,count是寫入字節數。
7.eMMC命令,
mmc info:打印mmc的信息,
mmc list :查看mmc設備,
mmc read addr blk# cnt:從eMMC讀cnt個塊數據到內存addr處;
mmc write addr blk# cnt:把內存addr處的cnt個塊數據寫到eMMC。
mmc erase blk# cnt:擦除blk#開始的cnt個數據塊
addr爲內存地址,blk#是mmc的塊號,cnt是設備塊的個數,塊的單位是512字節。

8.網絡相關命令
uboot使用網絡相關命令要保證網卡能正常使用(此例程使用的uboot在網盤:終結者ULL光盤資料\i.MX6ULL終結者光盤資料\08_開發板系統鏡像\01_Uboot\02_NAND FLASH核心板\u-boot.imx),啓動後能夠識別出網卡:
在這裏插入圖片描述

圖 1.2.5

發現下方顯示「Error: FEC1 address not set.」,這是因爲沒有設置MAC地址,輸入命令setenv ethaddr 73:70:F4:E6:36:EA設置以太網物理地址,saveenv保存。
設置開發板IP地址:setenv ipaddr 192.168.1.120
設置服務器的IP地址(Ubuntu):setenv serverip 192.168.1.12
設置網關:setenv gatewayip 192.168.1.1
設置子網掩碼:setenv netmask 255.255.255.0
這些環境變量要根據實際情況設置,設置好後測試與主機(Ubuntu)的網絡連接:ping 192.168.1.12:
在這裏插入圖片描述

圖 1.2.6

出現「host ***** is alive」即爲設置成功。
9.tftp下載命令: tftp addr file,網絡設置好了以後可以使用tftp命令從tftp服務器端下載鏡像到內存,addr爲內存地址,file爲服務器端的文件,具體使用方法可參照」tftp下載和nfs網絡啓動」相關章節。
10.bootm -引導uImage鏡像啓動
11.bootz -從內存啓動Linux鏡像和設備
12.ping - 測試與主機的網絡連接
13.loadb -通過串口Kermit協議下載二進制數據到內存指定位置。
14.loady 通過串口線下載文件到內存
15.go -跳轉到內存地址處,運行程序
16.env default -a -重置環境變量。
17.run:可以執行環境變量中的命令,如輸入「run bootcmd」啓動內核
18.ls [<dev[:part]> [directory]]:uboot下查看文件系統結構(使用的emmc版本):
ls mmc 1:1,查看分區1:
在這裏插入圖片描述

圖 1.2.7

ls mmc 1:2,查看分區2文件系統目錄
在這裏插入圖片描述

圖 1.2.8

ls mmc 1:2 etc,查看目錄包含信息:
在這裏插入圖片描述

圖 1.2.9

2 獲取u-boot

2.1 獲取源碼

U-boot源碼可以從官網ftp://ftp.denx.de/pub/u-boot/獲取(後綴有rcx表示測試版本),但是有的芯片廠家沒有把修改過的源碼開源到官網中,所以有些芯片的u-boot不能直接從網站獲取。NXP官方也是用的此網站的2016.03版本u-boot,他們在源碼里加入自己的東西,且一直在維護此版本,本文檔將使用NXP移植好的源碼編譯u-boot。
我們已經下載好了 NXP提供的源碼,源碼壓縮包放在了網盤中(終結者ULL光盤資料\i.MX6ULL終結者光盤資料\05_uboot linux源碼\目錄下\uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2),拷貝到Ubuntu下解壓。
解壓:tar -jxvf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
在這裏插入圖片描述

圖 2.1.1

修改目錄名爲uboot:mv uboot-imx-rel_imx_4.1.15_2.1.0_ga uboot -f
進入解壓後的目錄uboot-imx-rel_imx_4.1.15_2.1.0_ga,查看README文檔,裏面詳細介紹了源碼從哪下載
在這裏插入圖片描述

圖 2.1.2

還有如何配置到自己的處理器上(如下圖),這些操作NXP已經做好了,
在這裏插入圖片描述

圖 2.1.3

在這裏插入圖片描述

圖 2.1.4

2.2 目錄介紹

接下來分析源碼目錄裏幾個重要的文件夾和文件
與平臺架構直接相關的文件夾:
/arch 不同架構芯片使用的文件,如PowerPC,ARM,x86,MIPS等。
我們只關心/arch/arm下的文件
在這裏插入圖片描述

圖 2.2.1

/api 存放接口函數
/board 板級相關文件,主要包含一些驅動程序。
/board/freescale /我們的目標板在此目錄下操作。
在這裏插入圖片描述

圖 2.2.2

/configs 板子默認配置文件,移植過程中需要用到此目錄
在這裏插入圖片描述

圖 2.2.3

/fs 文件系統(cramfs, ext2, jffs2, etc.)
還有包含不同架構處理器通用的驅動程序或函數的文件夾:
/common 通用架構使用的代碼,主要處理命令行,檢測內存大小和故障。
/disk 磁盤分區代碼。
/lib 通用庫文件。
/net 網絡相關代碼,如網絡協議棧,TFTP,NFS等功能。
/post 上電自檢代碼。
/drivers 驅動代碼。
還有存放uboot說明文檔,工具的文件夾:
/doc 純英文文檔。
/examples 例程.。
/include 存放着頭文件。
include/configs/目錄下包含着我們需要的頭文件。
在這裏插入圖片描述

圖 2.2.4

/scripts 存放腳本和生成文件。
/tools 工具,檢查生成的目標文件。
重要文件:
Makefile:管理整個工程。
Kconfig:圖形化配置界面的管理工具。
u-boot.imx:u-boot鏡像,用mfgtools燒錄工具燒寫到開發板。
u-boot.lds:鏈接腳本。在這裏插入圖片描述