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