Ubuntu 16.04 (x64)树莓派B+(Raspberry Pi B+)源代码编译

树莓派上的操作


1.升级到最新版内核保证与下载的内核源码版本一致

$ sudo rpi-update

2.升级完整后重启

$ sudo reboot

3.查看内核版本

$ uname -r

4.把最新版本的内核配置保存到.config中,以备以后编译内核使用

$ sudo modprobe configs

文件被存储到了/proc/config.gz中。

目前最新版本是4.4.12,因此下面的编译都是针对4.4.y这个分支进行的。

Debian/Ubuntu下编译


1.获取内核源代码

$ cd ~

$ mkdir rpi

$ cd rpi

2,以下步骤时间很长,可以在睡觉前执行,并且可能需要重试几次才行,建议同时开三个Shell一起执行。

# core.symlinks=true  软连接处理,否则会出现各种找不到文件的问题

$ git -c core.symlinks=true clone https://github.com/raspberrypi/firmware.git rpi-firmware

$ git -c core.symlinks=true clone https://github.com/raspberrypi/linux.git rpi-linux

$ git -c core.symlinks=true clone https://github.com/raspberrypi/tools.git rpi-tools

3.给予整个rpi-tools目录执行权限,默认可能没有执行权限

$ chmod +x -R rpi-tools

4.整个的rpi-linux的文件夹的所有者更改为当前用户,否则存在一定程度的编译问题,特别是代码从其他系统上拷贝过来的情况

$ sudo chown -R `whoami` rpi-linux/

5.设置编译器的路径

$ export PATH=$PATH:~/rpi/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

6.配置编译类型

$ cd rpi-linux/

# 检出分支
$ git checkout rpi-4.4.y

$ KERNEL=kernel

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

如果提示是否增加新的驱动支持,默认全部选择否(输入大写的字母N,小写字母无效),否则会导致无法编译通过。

7.开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。

$ make clean

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j5

8.编译错误修正,如果提示如下错误

  DTC     arch/arm/boot/dts/bcm2708-rpi-b.dtb
In file included from arch/arm/boot/dts/bcm2708.dtsi:1:0,
                 from arch/arm/boot/dts/bcm2708-rpi-b.dts:3:
arch/arm/boot/dts/bcm2708_common.dtsi:1:39: fatal error: dt-bindings/clock/bcm2835.h: 没有那个文件或目录
 #include "dt-bindings/clock/bcm2835.h"
                                       ^
compilation terminated.
scripts/Makefile.lib:293: recipe for target 'arch/arm/boot/dts/bcm2708-rpi-b.dtb' failed
make[1]: *** [arch/arm/boot/dts/bcm2708-rpi-b.dtb] Error 1
arch/arm/Makefile:340: recipe for target 'dtbs' failed
make: *** [dtbs] Error 2

这个现象的原因是 git 在检出代码的时候,没有正确处理软连接,我们只需要重新处理一次即可。如下:

# 软连接处理,否则会出现各种找不到文件的问题

$ git config core.symlinks true

$ git reset --hard

9.查看生成的内核镜像文件

$ cd rpi-linux/arch/arm/boot

生成的zImage就是我们需要的kernel.img

10.编译modules

$ cd ../..

$ mkdir modules

$ cd rpi-linux

$ make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../modules -j5
安装编译好的内核

Ubuntu下面,SD卡会自动挂载,默认挂载到了/media/目录下面,如果是使用NOOBS安装的话,系统目录是固定的,执行如下命令拷贝到目标SD卡上面

$ mv /media/`whoami`/boot/kernel.img /media/`whoami`/boot/kernel_old.img

$ cp rpi-linux/arch/arm/boot/zImage /media/`whoami`/boot/kernel.img

$ mv /media/`whoami`/boot/bootcode.bin /media/`whoami`/boot/bootcode_old.bin

$ mv /media/`whoami`/boot/fixup.dat /media/`whoami`/boot/fixup_old.dat

$ mv /media/`whoami`/boot/fixup_cd.dat /media/`whoami`/boot/fixup_cd_old.dat

$ mv /media/`whoami`/boot/start.elf /media/`whoami`/boot/start_old.elf

$ cd rpi-firmware/boot

$ cp bootcode.bin fixup.dat fixup_cd.dat start.elf /media/`whoami`/boot/

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注