Raspberry 2買回來吃了半年灰,慚愧,記錄一下最初的經歷。
首先從github上clone源碼和工具,過程省略,速度比較慢,大概一晚上。
簡單介紹一下git的常用操作:
使用git clone
從遠程服務器下載代碼;
查看所有分支 $git branch -a
包括本地的和遠程服務器的;
刪除分支 $git branch –d/-D branch-name
例如刪除名爲”-r”的分支:git branch -D '-r'
獲取遠程分支的操作:
首先查看所有分支 $ git branch –a
查看本地分支 $ git branch
最後獲取遠程分支 $ git checkout -b new_branch remote_branch
,其中new_branch是本地分支名稱,remote_branch是將要獲取的遠程分支名稱,例如: $ git checkout –b rpi-3.18.y origin/rpi-3.18.y
切換分支使用:git checkout <branch_name>
$ git checkout rpi-3.18.y
Switched to branch 'rpi-3.18.y'
使用 $git fetch git://github.com/raspberrypi/linux.git
更新代碼,需要在本地倉庫的目錄下執行,如果在其它目錄下會出現以下錯誤提示:
fatal: Not a git repository (or any parent up to mount parent )
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
設置raspberry使用的交叉編譯工具
官方提供的編譯工具中包含三套工具鏈
arm-bcm2708hardfp-linux-gnueabi
arm-bcm2708-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
這裏使用第一種交叉編譯工具
首先打開~/.bashrc文件(~符號表示HOME路徑,.bashrc爲隱藏文件)
zfchen@zfchen-E440:~$ sudo gedit ~/.bashrc
然後在文件的最後面添加交叉編譯工具的路徑,如下:
export PATH=$PATH:/home/zfchen/my_repository/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin
保存並退出文件,接下來需要更新當前控制檯所包含的環境變量(使上面添加的path生效),有兩種方法:
- 執行以下命令
source .bashrc
; - 重新登錄系統(不必重啓機器, “開始->logout” 即可),使以上設置生效。(登陸linux,啓動bash時,首先會去讀取~/.bash_profile文件,這樣~/.bashrc也就得到執行了,你的個性化設置也就生效了。)
然後使用 arm-bcm2708hardfp-linux-gnueabi-cc -v
命令來測試交叉編譯工具的路徑是否設置成功。
zfchen@zfchen-E440:/$ arm-bcm2708hardfp-linux-gnueabi-cc -v
Using built-in specs.
COLLECT_GCC=arm-bcm2708hardfp-linux-gnueabi-cc
COLLECT_LTO_WRAPPER=/home/zfchen/my_repository/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/...
Target: arm-bcm2708hardfp-linux-gnueabi
Configured with: /home/extra/crosstool/staginghf/.build/src/gcc-linaro-4.7-2012.04/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-bcm2708hardfp-linux-gnueabi --prefix=/home/dc4/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi --with-sysroot=/home/dc4/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/sysroot --enable-languages=c,c++ --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-float=hard --with-pkgversion='crosstool-NG 1.15.2' --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-mpfr=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-mpc=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-ppl=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-cloog=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-libelf=/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm -L/home/extra/crosstool/staginghf/.build/arm-bcm2708hardfp-linux-gnueabi/buildtools/lib -lpwl' --enable-threads=posix --enable-target-optspace --disable-nls --disable-multilib --with-local-prefix=/home/dc4/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/sysroot --enable-c99 --enable-long-long --with-float=hard
Thread model: posix
gcc version 4.7.1 20120402 (prerelease) (crosstool-NG 1.15.2)
PS:在用戶模式下設置的.bashrc環境變量只對當前用戶有效(如果root直接運行arm-bcm2708hardfp-linux-gnueabi-cc -v
,則會提示“命令未找到”)。
編譯內核
(1)首先生成配置文件
$ make ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- menuconfig
我嘗試過的不同分支如下:
// rpi-3.18.y分支的內核版本爲Linux/arm 3.18.16 Kernel
// rpi-3.18.y-rebase分支的內核版本爲Linux/arm 3.18.9 Kernel Configuration
(2)編譯內核
$ make ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
編譯結果如下,說明成功
... ...
AS arch/arm/boot/compressed/ashldi3.o
SHIPPED arch/arm/boot/compressed/bswapsdi2.S
AS arch/arm/boot/compressed/bswapsdi2.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
第一次make menuconfig時出錯:
zfchen@zfchen-E440:~/my_repository/linux$ make menuconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/mconf.o
In file included from scripts/kconfig/mconf.c:23:0:
scripts/kconfig/lxdialog/dialog.h:38:20: 致命錯誤:curses.h:沒有那個文件或目錄編譯中斷。
原因:宿主機ubuntu系統中缺少一個套件 ncurses devel
解決方法,安裝ncurses
$ sudo apt-get install libncurses5-dev
(注意:內核配置不對也會導致編譯過程出錯,例如“提示缺少XX文件”)
對於raspberry 2B,執行如下操作:
$ cp arch/arm/boot/zImage /boot/kernel7.img
(raspberry pi A/B/B+ 需要用imagetool-uncompressed.py工具生成*.img文件)
(3)提取modules
$ make ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- modules_install INSTALL_MOD_PATH=../modules