1.U-Boot簡介
Linux系統要啟動就必須需要一個bootloader程序,也就是說芯片上電后先運行一段bootloader程序,這段bootloader程序會先初始化DDR等外設,然后將Linux內核從flash(NAND/NOR FLASH/SD/MMC等)拷貝到DDR中,最后啟動Linux內核
bootloader和Linux內核的關系跟PC上的BIOS和Windows的關系一樣,bootloader就相當于BIOS。 目前有很多現成的bootloader軟件可用,比如U-Boot、vivi、RedBoot等,其中以U-Boot使用最為廣泛
uboot(Universal Boot Loader),是一個遵循GPL協議的開源軟件,是一個裸機代碼,可以看作是一個裸機綜合例程。
uboot官網代碼
uboot官網上下載的是最原始的uboot源碼。 uboot官網下載地址如下:
https://www.denx.de/wiki/U-Boot/
移植uboot時一般不會直接用 uboot 官方的源碼的,官方的源碼是給半導體廠商準備的,半導體廠商會根據自家的芯片,維護自己芯片對應的uboot。 NXP維護的的uboot地址:
https://github.com/Freescale/u-boot-fslc
開發板廠商uboot代碼
開發板廠商做的開發板需要修改芯片廠商官方的uboot,使其支持開發板廠商生產的評估板。 本文使用的正點原子i. MX6ULL開發板的uboot下載地址:
http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
2.U-Boot源碼分析
這里使用開發板廠商提供的uboot源碼( uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2)來對uboot工程目錄進行分析:以EMMC版的核心板為例,以下是uboot的目錄,左側為未編譯的源碼,右側為編譯后的源碼(編譯方法見本文下一小節)
需要關注或了解的文件夾或文件如下:
arch文件夾:存放與架構有關的文件,這里只關注arch/arm文件夾即可
- mach開頭的文件夾跟具體的設備有關
- cpu文件夾里是和cpu架構有關的
board文件夾:和具體的板子有關的,打開freescale文件夾,freescale芯片的板子都在此文件夾下
- mx6ul開頭的,表示使用IMX6UL芯片的板子
- mx6ull開頭的,表示使用IMX6ULL芯片的板子
- mx6ullevk是NCP官方的IMX6ULL開發板
configs文件夾:存放uboot配置文件,一般半導體或開發板廠商會制作好一個配置文件,供用戶在此基礎上進行修改,配置文件統一命名為“xxx_defconfig”,xxx表示開發板名字
使用"make xxx_defconfig"命令,即可配置uboot
.u-boot.xxx_cmd文件:是一系列編譯生成的命令文件
#該變量的作用:拷貝一份u-boot-nodtb.bin文件,并重命名為u-boot.bin
cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin
#用到了arm-linux-gnueabihf-objcopy來將ELF格式的u-boot文件轉換為二進制的u-boot-nodtb.bin
cmd_u-boot-nodtb.bin := arm-linux-gnueabihf-objcopy --gap-fill=0xff
-j .text......-O binary u-boot u-boot-nodtb.bin
#用到了arm-linux-gnueabihf-ld.bfd鏈接工具,將各個built-in.o文件鏈接在一起形成u-boot文件
cmd_u-boot := arm-linux-gnueabihf-ld.bfd ......-Map u-boot.map
#用到了工具tools/mkimage,IVT/DCD等數據保存在了文件mximage.cfg.cfgtmp中
#tools/mkimage工具就是讀取IVT/DCD等數據并添加到u-boot.bin頭部,并生成u-boot.imx
cmd_u-boot.imx := ./tools/mkimage -n board/freescale/mx6ull_alientek_emmc/imximage.cfg.cfgtmp
-T imximage -e 0x87800000 -d u-boot.bin u-boot.imx
Makefile文件:頂層Makefile文件,Makefile是支持嵌套的,也就是頂層Makefile可以調用子目錄中的Makefile文件
u-boot.xxx文件:一系列文件,其含義如下
- u-boot:編譯出來的ELF格式的uboot鏡像文件
- u-boot.bin:編譯出來的二進制格式的uboot可執行鏡像文件
- u-boot.cfg:uboot的另外一種配置文件
- u-boot.imx:u-boot.bin添加頭部信息后的文件
- u-boot.lds:鏈接腳本
- u-boot.map:uboot映射文件,可查看某個函數被鏈接到哪個地址上了
- u-boot.srec:S-Record格式的鏡像文件
- u-boot.sym:uboot符合文件
- u-boot-nodtb.bin:和u-boot.bin一樣,u-boot.bin是u-boot-nodtb.bin的復制文件
.config文件:uboot配置文件,使用命令"make xxx_defconfig"配置uboot后就會自動生成
README:描述了uboot的詳細信息,包括uboot該如何編譯、uboot中各文件夾的含義、相應的命令等
3.U-Boot初次編譯
本文以正點原子i. MX6ULL阿爾法開發板實驗開發板,核心板為512MB(DDR3) + 8GB(EMMC),進行學習實踐
在Ubuntu中安裝ncurses庫,以防止編譯報錯
sudo apt-get install libncurses5-dev
創建相應目錄,將開發板廠商提供的uboot源碼拷貝至此目錄中
mkdir /home/andyxi/linux/uboot
cd /home/andyxi/linux/uboot
cp uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 .
解壓uboot源碼
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
使用以下命令編譯uboot
#ARCH=arm表示設置目標為arm架構,相當于make distclean,清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
#配置uboot,配置文件為mx6ull_14x14_ddr512_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
#V=1用于設置編譯過程中的信息輸出級別,相當于make -j12,即使用12核來編譯uboot
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
#每次編譯uboot都需要輸入一長串命令
#為了簡單起見,建立一個shell腳本文件,將這些命令寫到shell腳本里
#執行shell腳本即可完成編譯工作
#新建mx6ull_alientek_emmc.sh腳本文件
##########################################################################
#!/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
##########################################################################
#通過命令“./mx6ull_alientek_emmc.sh”編譯uboot
4.U-Boot燒寫與啟動
uboot編譯好后就可以燒寫到開發板上使用了,這里使正點原子提供的燒寫工具imxdownload
將imxdownload燒寫工具拷貝到文件夾中,并給與可執行權限
chmod 777 imxdownload
使用imxdownload軟件將bin文件下載到SD卡中
./imxdownload u-boot.bin /dev/sdb
燒寫成功后,插入SD卡,使用USB線將USB_TTL和電腦相連,打開串口工具后復位開發板。 在“Hit any key to stop autoboot”倒計時結束之前,按下鍵盤上的回車鍵,就會進入uboot命令行模式; 否則uboot就會使用默認參數來啟動Linux內核了
5.U-Boot常用命令
進入uboot命令行模式后輸入help或 ? ,回車后即可查看當前uboot所支持的命令; 使用 help cmd 或 ? cmd 命令還可以查看命令的具體用法
信息查詢命令
bdinfo #用于查看板子信息
printenv #用于輸出環境變量信息
version #用于查看uboot版本號
環境變量操作命令
=> setenv bootdelay 5 #將環境變量bootdelay改為5
=> saveenv #保存修改后,uboot倒計時變為5秒
Saving Environment to MMC... #保存過程提示...
Writing to MMC(0)...done #保存到MMC(0)中,即SD卡中
################################################################
#有時修改的環境變量值可能會有空格,此時需要用單引號括起來
=> setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
=> saveenv #保存修改
#上面命令相當于設置了"console=...","root=...","rootwait","rw"四組值
################################################################
=> setenv author andyxi #新建環境變量author,其值為andyxi
=> saveenv #保存修改
=> setenv author #給環境變量author賦空值,即刪除該環境變量
=> saveenv #保存修改
內存操作命令
md #用于顯示內存值
nm #用于修改指定地址的內存值
mm #用于修改指定地址的內存值,與nm命令的區別是,mm修改內存值時地址會自增
mw #用于使用一個指定的數據填充一段內存
cp #拷貝命令,用于將DRAM中的數據從一段內存拷貝到另一段內存中
cmp #比較命令,用于比較兩段內存的數據是否相等
網絡操作命令
=> setenv ipaddr 192.168.10.50 #開發板IP地址
=> setenv ethaddr b8:ae:1d:01:00:00 #開發板MAC地址
=> setenv gatewayip 192.168.10.1 #網關地址
=> setenv netmask 255.255.255.0 #子網掩碼
=> setenv serverip 192.168.10.100 #服務器IP地址(即Ubuntu主機地址)
=> saveenv
#######################################################################
ping #開發板的網絡是否能使用
dhcp #用于從路由器獲取IP地址,前提是開發板與路由器連接
nfs #網絡文件系統,可以在計算機之間通過網絡來分享資源
tftp #通過使用TFTP協議網絡下載東西到DRAM中
EMMC和SD卡操作命令
mmc info #輸出MMC設備信息
mmc read #讀取MMC中的數據
mmc write #向MMC中寫入數據
mmc rescan #掃描MMC設備
mmc part #列出MMC設備的分區
mmc dev #切換MMC設備
mmc list #列出當前有效的所有MMC設備
......
FAT格式文件系統操作命令
fatinfo #用于查詢指定MMC設備分區的文件系統信息
fatls #用于查詢FAT格式設備的目錄和文件信息
fstype #用于查看MMC設備某個分區的文件系統格式
fatload #用于將指定的文件讀取到DRAM中
fatwrite #用于將DRAM中的數據寫入到MMC設備中
NAND操作命令
nand info #用于打印NAND Flash信息
nand device #用于切換NAND Flash
nand erase #用于擦除NAND Flash
nand write #用于向指定地址寫入指定的數據
nand read #用于從NAND Flash中指定地址讀取指定大小的數據到DRAM中
BOOT操作命令
bootz #用于啟動zImage鏡像文件
bootm #用于啟動uImage鏡像文件
boot #用于啟動Linux系統的,該命令會讀取環境變量bootcmd來啟動Linux
bootcmd #環境變量保存著引導命令(啟動的命令集合)
#####################################################################
#例如使用tftp命令從網絡啟動Linux
tftp 80800000 zImage #下載zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb #下載設備樹
bootz 80800000 - 83000000 #啟動Linux
#以上實例可以通過設置bootcmd,保存后直接使用boot命令來實現
setenv bootcmd 'tftp 80800000 zImage;
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv
boot
其他常用命令
reset #復位重啟
go #用于跳到指定的地址處執行應用
run #用于運行環境變量中定義的命令
#例如通過“run bootcmd”來運行bootcmd中的啟動命令
mtest #簡單的內存讀寫測試命令,可以測試開發板上的DDR
-
內核
+關注
關注
3文章
1372瀏覽量
40282 -
Linux
+關注
關注
87文章
11296瀏覽量
209361 -
源碼
+關注
關注
8文章
639瀏覽量
29185 -
u-boot
+關注
關注
0文章
121瀏覽量
38222 -
命令
+關注
關注
5文章
683瀏覽量
22017
發布評論請先 登錄
相關推薦
評論