Linux主機上使用交叉編譯移植u-boot到樹莓派

0環境html

Linux主機OS:Ubuntu14.04 64位,運行在wmware workstation 10虛擬機linux

樹莓派版本:raspberry pi 2 B型.git

樹莓派OS: Debian Jessie  Raspbian Jessiegithub

1樹莓派的啓動過程ubuntu

樹莓派1,2,3的啓動過程大體相同,主要分爲3個階段:ROM上的GPU bootloader啓動GPU,GPU啓動CPU,CPU直接啓動內核或經過u-boot啓動內核.架構

因爲樹莓派涉及到GPU的東西不開源,移植u-boot到樹莓派並非真正意義上的bootloader,可是鑑於u-boot普遍的應用,仍是頗有學習的必要wordpress

樹莓派啓動過程:工具

HOW THE RASPBERRY PI BOOTS UPpost

樹莓派3啓動過程概述學習

RPi Software

2移植u-boot到Debian Jessie系統

最初想直接移植u-boot到Raspbian,嘗試了屢次都失敗了結.google上u-boot啓動raspberry pi大都是基於Debian Jessie,因此先照葫蘆畫瓢試一把.

移植u-boot到樹莓派參考例程

(1)最全面的RPi u-boot例程RPi U-Boot

(2)基於RPi2的例程Booting a Raspberry Pi2, with u-boot and HYP enabled

(3)基於RPi2,提供現成文件的例程Raspberry Pi 2 – Debian Jessie and U-Boot

(4)基於mainline u-boot的例程How to compile mainline u-boot for Raspberry Pi ?

 

MicroSD卡燒寫鏡像:debian jessie下載地址

Ubuntu主機上u-boot使用Mainline版本,官網源碼 亞馬遜下載地址

Ubuntu主機上文件位置以下

家目錄(/root)下u-boot-2016.09文件夾是解壓後的u-boot

家目錄(/root)下script_u-boot文件夾是本身寫的環境配置,腳本

u-boot-2016.09文件夾以下,能夠先讀讀README

script_u-boot文件夾內以下圖,從左到右是scr配置文件,環境配置文件,生成u-boot.bin文件,生成scr文件

env_gnueabihf_mkimage文件代碼以下

#添加樹莓派的交叉編譯工具鏈路徑(主機是64位)
export PATH
=$PATH:/root/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin #指定編譯目標架構爲arm,編譯器爲PATH路徑中的交叉編譯器

export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

樹莓派交叉編譯工具鏈地址https://github.com/raspberrypi/tools

樹莓派交叉編譯能夠參考Linux主機上實現樹莓派的交叉編譯及文件傳輸,遠程登錄

在後續操做以前先source一下這個文件使配置生效,關閉終端或者從新登錄Ubuntu須要再次source

用echo查看變量,注意使用tab自動補全路徑

make_ubootbin文件代碼以下

#從腳本文件夾切換到u-boot文件夾下 cd /root/u-boot-2016.09 #配置適用於樹莓派2的u-boot make rpi_2_defconfig #編譯 make all
#返回腳本文件夾 cd
/root/script_u-boot

切換路徑是由於執行這個腳本是在script_u-boot文件夾,而make命令執行Makefile是在u-boot-2016.09文件夾,最後切迴路徑方便後續的source

這裏make rpi_2_defconfig是針對樹莓派2板,其它版本樹莓派的make config參考前文的移植u-boot到樹莓派參考例程(1)(4)

執行make_ubootbin無報錯

在u-boot-2016.09文件夾下生成了u-boot.bin

把debian jessie的SD卡經過讀卡器插到電腦,注意先選中虛擬機的Ubuntu系統,Ubuntu會自動讀取(mount)SD卡

rootfs(根文件系統)分區:

firmware(debian jessie下的啓動分區):

關於啓動分區config.txt bootcode.bin cmdline.txt start.elf kernel7.img等文件,參考前文的樹莓派啓動過程

至此能夠把u-boot.bin拷到sd卡的firmware(對於debian jessie系統)

而後在config.txt添加

kernel=u-boot.bin

指定用u-boot.bin啓動內核kernel7,config.txt是內核的配置文件,相似電腦的BIOS配置

配置內核的方法:

一種方法是在u-boot階段手動輸入命令,而mainline版本的u-boot不支持usb輸入,嘗試過例程(1)中的Stephen Warren版本,也沒法輸入(問題還有待調查)

另外一種是把u-boot中輸入的命令寫到一個腳本文件,經過mkimage命令將這個腳本生成.scr鏡像,而後放到啓動分區,u-boot會自動讀取腳原本啓動內核,這樣更簡單更容易修改,可是不利於調試錯誤信息

用第一種方法能夠拔出SD卡,在樹莓派上配置內核啓動,注意在u-boot階段只能經過HDMI外接顯示屏或者串口來查看輸出信息.關於串口能夠參考RPi Serial Connection

用第二種方法是在Ubuntu主機上生成boot.scr鏡像,先寫一個配置文件:在script_u-boot文件夾下新建configure_scr_file,內容以下

#設置環境爲樹莓派2 setenv machid 0x00000c42 
#設置打印信息,容許HDMI,容許串口,設置根文件系統路徑和類型 setenv bootargs
"earlyprintk console=tty0 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait noinitrd"
#保存環境配置 saveenv
#載入內核鏡像到MMC0的第一分區 fatload mmc
0:1 ${kernel_addr_r} kernel7.img
#啓動內核 bootz ${kernel_addr_r}
 

以上命令的語法都是u-boot軟件規定,關於命令的細節能夠參考RPi U-Boot   官方文檔U-Bootdoc   

而後新建一個腳本make_ubootscr生成scr鏡像,make_ubootscr內容以下

#生成boot.scr鏡像文件 mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /path/to/script /boot/firmware/boot.scr

/path/to/script是configure_scr_file的路徑,替換後以下

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /root/script_u-boot/configure_scr_file /boot/firmware/boot.scr

source報錯,提示未安裝mkimage

命令找不到一般是未安裝軟件,或者沒添加路徑,mkimage應該是包含在u-boot軟件中的,因爲以前用過樹莓派交叉編譯工具鏈的經驗,在u-boot-2016.09文件夾的tools文件夾找到了mkimage程序

更通用的是用find命令查找

find 查找路徑 -name 文件名

看來是沒有添加mkimage的路徑到環境變量,只需在env_gnueabihf_mkimage添加路徑而後source

env_gnueabihf_mkimage修改以下

export PATH=$PATH:/root/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/root/u-boot-2016.09/tools export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

提示路徑不存在

這時就須要瞭解這條mkimage命令的具體含義了,參考mkimage - Generate image for U-Boot

/boot/firmware/boot.scr是生成boot.scr文件的路徑,若是在樹莓派上直接操做這個路徑就是啓動分區,可是我是在Ubuntu主機操做,SD卡是掛載到Ubuntu主機的路徑被改變了

查看塊設備能夠用命令

lsblk

sdb就是SD卡,sdb1是firmware啓動分區,sdb2是rootfs文件系統分區

事實上插入SD卡時Ubuntu自動把SD卡mount到了主機的/media路徑,因此前面才能對u-boot.bin直接複製粘貼操做

可是想把SD卡的第一分區掛載到其它路徑,好比主機的/mnt文件夾下,應該

mount /dev/sdb1 /mnt

注意設備的實際路徑和掛載後路徑的區別,/dev/xxx纔是實際的設備路徑

在運行原版debian jessie的樹莓派2上查看SD卡掛載路徑以下

debian jessie把SD卡兩個分區mmcblk0p1,mmcblk0p2分別掛載到/root和根目錄

能夠把boot.scr直接生成到firmware下(先在Ubuntu插好SD卡)

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /root/script_u-boot/configure_scr_file /media/boot/firmware/boot.scr

更推薦生成在其它目錄(好比u-boot-2016.09文件夾)再拷到SD卡,最終改成以下,-n是生成的文件名

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n boot.scr -d /root/script_u-boot/configure_scr_file /root/u-boot-2016.09/boot.scr

成功生成boot.scr

在把u-boot.bin boot.scr拷到SD卡的firmware之後,確認config.txt添加了kernel=u-boot.bin就能夠拔出SD卡啓動樹莓派2了

啓動過程以下

進入登錄界面

登錄名(login):root  

密碼(password):debian

登陸成功,至此在debian jessie上的u-boot移植完成

在主機上交叉編譯生成boot.bin,也能夠不添加環境變量ARCH,CROSS_COMPILE,直接在make語句指定編譯器

make_ubootbin能夠改成以下

cd /root/u-boot-2016.09
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- rpi_2_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 cd /root/script_u-boot
-j4是採用四核處理器四線程編譯,取決於主機CPU WIN7下查看CPU核心數

3移植u-boot到Raspbian Jessie系統

有了前面的嘗試,後面的就水到渠成了.raspbian jessie我用的2015年的官網鏡像,新版應該區別不大 raspbian下載

若是直接把剛纔生成的u-boot.bin boot.scr拷到raspbian,在config.txt添加kernel=u-boot.bin

啓動後停留在starting kernel...

信息顯示kernel7已經經過boot.scr讀取了,說明問題出在啓動內核以後的部分

對比一下debian jessie和raspbian jessie的分區,文件系統都同樣,就是啓動分區有差異

debian jessie的啓動分區

raspbian jessie的啓動分區

發現raspbian多了一個kernel.img,幾個.dtb文件,overlay裏面也是.dtb文件

參考RPi U-Boot後感受須要加載dtb(Device Tree binary)

修改boot.scr的配置文件(configure_scr_file)的內容以下

setenv machid 0x00000c42 #添加變量fdtfile的值爲bcm2709-rpi-2-b.dtb setenv fdtfile bcm2709-rpi-2-b.dtb setenv bootargs "earlyprintk console=tty0 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait noinitrd" saveenv fatload mmc 0:1 ${kernel_addr_r} kernel7.img #載入fdtfile的值 fatload mmc 0:1 ${fdt_addr_r} ${fdtfile} bootz ${kernel_addr_r} - ${fdt_addr_r}

這裏添加bcm2709-rpi-2-b.dtb是由於使用樹莓派2,若是是其它版本酌情修改

而後source生成boot.scr

source make_ubootbin

將新的boot.scr拷到boot分區,u-boot.bin和以前徹底相同,config.txt添加kernel=u-boot.bin

主機上拔出SD卡,啓動樹莓派

 自動登陸進入桌面

 至此u-boot在raspbian jessie上移植完成 

 

本文容許轉載,轉載請聲明原文地址http://www.cnblogs.com/cursorhu/p/5896800.html

相關文章
相關標籤/搜索