第1部分:搭建交叉编译环境 tools
1) 下载工具链
$ git clone git://github.com/raspberrypi/tools.git tools
2) 下载最新的BCM2835 SDK,并交叉编译出libbcm2835.a
注意:--host 指定的是交叉编译工具链的前缀
$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz
$ tar xzf bcm2835-1.35.tar.gz
$ cd bcm2835-1.35
$ ./configure --host=arm-linux-gnueabihf
$ make
$ ls -l src/libbcm2835.a
第2部分:编译 Linux kernel
1) 下载 linux-rpi 源代码
注意:我测试过很多zip源码包,编译都有错误。目前只有git clone的源代码才可以正常工作。
$ git clone git://github.com/raspberrypi/linux.git linux-rpi
2) 从运行的树莓派中获得内核配置文件,并据此生成新的 .config
注意:ARCH类型和编译器路径
$ cd linux-rpi
$ scp [email protected]:/proc/config.gz ./
$ zcat config.gz > .config
$ make ARCH=arm CROSS_COMPILE=~/workspace/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- menuconfig
3) 编译内核镜像,并解压缩zImage到kernel.img
注意:-j4 是同时用4个job来编译,可以加快速度
$ make ARCH=arm CROSS_COMPILE=~/workspace/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- -j4
Physical address of main memory (PHYS_OFFSET) [] (NEW)0x48000000
...
编译完成后,arch/arm/boot/zImage就是我们编译获得的文件。
zImage 是 Compressed kernel image 文件,要转换为 kernel.img 还需要进一步处理。
执行下面的命令,在当前目录下面就有新生成的kernel.img
$ cd tools/mkimage/
$ ./imagetool-uncompressed.py ../../linux-rpi/arch/arm/boot/zImage
4) 提取模块文件
新的Kernel要正确运行,还需要编译所需的module,主要对应”/lib”目录下的内容。
$ cd linux-rpi
$ make modules_install ARCH=arm CROSS_COMPILE=~/workspace/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- INSTALL_MOD_PATH=../upgrade-rpi.3.18.11
第3部分:升级树莓派的Firmware、kernel、lib
注意:将SD卡拔下插在电脑上(可使用读卡器)
1) 下载 firmware 源代码
$ git clone git://github.com/raspberrypi/firmware.git
2)升级树莓派前,首先备份相关文件
$ cd ~/workspace/upgrade-rpi.bak
$ cp -r /media/bambreeze/boot/ ./
$ cp -r /media/bambreeze/5d18be51-3217-4679-9c72-a54e0fc53d6b/lib/ ./
$ cp -r /media/bambreeze/5d18be51-3217-4679-9c72-a54e0fc53d6b/opt/vc ~/workspace/upgrade-rpi.bak/
3) 升级 firmware
打开firmware/boot/目录,将以下文件拷入SD卡boot分区:
fbootcode.bin fixup.dat fixup_cd.dat start.elf
$ cd ~/workspace/firmware/boot
$ sudo cp bootcode.bin fixup.dat fixup_cd.dat start.elf /media/bambreeze/boot/
然后,将新的vc库复制到SD卡,因为之前选用的工具链是hardfp(硬浮点),所以现在所选用的vc库也是硬浮点的版本(firmware/hardfp/opt/vc)。
$ cd ~/workspace/firmware/hardfp/opt/
$ sudo cp -r vc/ /media/bambreeze/5d18be51-3217-4679-9c72-a54e0fc53d6b/opt/
4) 升级 kernel
将新编好的内核拷入SD卡boot分区,改名为:kernel_3_18_11.img
打开SD卡的boot分区,找到config.txt文件,加入:kernel=kernel_3_18_11.img这一行
$ cd ~/workspace/upgrade-rpi.3.18.11/
$ sudo cp kernel.img /media/bambreeze/boot/kernel_3_18_11.img
$ cd /media/bambreeze/boot
$ vim config.txt
kernel=kernel_3_18_11.img
5) 升级 modules
将新编好的 lib 拷入SD卡的根分区
$ cd upgrade-rpi.3.18.11/
$ sudo cp -r lib/ /media/bambreeze/5d18be51-3217-4679-9c72-a54e0fc53d6b/
How to update to v3.16.5
$ cd ~/workspace/upgrade-rpi.3.16.5/
$ sudo cp kernel.img /media/bambreeze/boot/kernel_3_16_5.img
$ sudo cp -r lib/ /media/bambreeze/5d18be51-3217-4679-9c72-a54e0fc53d6b/
$ cd /media/bambreeze/boot
$ vim config.txt
kernel=kernel_3_16_5.img
参考资料
1. 树莓派学习笔记——交叉编译工具链
2. configure交叉编译
3. C library for Broadcom BCM 2835 as used in Raspberry Pi
4. Raspberry Pi -- Cross Compiling on Mac OSX
5. ARM EABI Toolchains
6. Cross compiling for RaspBerry/BeagleBone on Mac OS X – Part 1/3
7. 树莓派交叉编译环境搭建 for Mac
8. 树莓派开发系列教程8——树莓派内核编译与固件升级
9. 树莓派上编译linux内核
10. [raspberry pi] 树莓派 Kernel 编译笔记
11. Lab4_1树莓派上增加一个Linux系统调用