8. 附录 - 交叉编译新内核和驱动模块

8.1. 建立交叉编译环境

这部分内容,参见 附录-建立树莓派交叉编译环境

8.2. 准备交叉编译需要的代码

8.2.1. Linux 内核源代

git仓库位于 https://github.com/raspberrypi/linux 把源码克隆到 ~/project/git/rpi_linux 目录:

$ cd ~/project/git
$ git clone https://github.com/raspberrypi/linux rpi_linux

接下来,对内核源码进行清理(清除遗留的配置文件和编译结果):

$ cd ~/project/git/rpi_linux
$ make mrprope

8.2.2. .config 内核配置文件

.config文件是编译一个linux镜像文件的蓝图脚本,负责保存对于特定系统的内容配置,它放在了linux文件树下的顶层文件中。

实际上,我们已经提供了一套完整的配置和编译结果,但这里只须用到 config 配置文件:

  • config 配置文件
  • /lib/frameware 固件
  • /lib/modules 驱动模块

git仓库位于 https://github.com/openRPi/linux_generate,克隆到 ~/project/git/openRPi/linux_gererate 目录:

$ cd ~/project/git/openRPi
$ git clone https://github.com/openRPi/linux_generate linux_generate

配置好的config文件位于 ~/project/git/openRPi/linux_gererate 目录顶层。我们把它复制并到 rpi_linux 源码目录下,重命名为 .config

$ cp ~/project/git/openRPi/linux_generate/config   ~/project/git/rpi_linux
$ mv ~/project/git/rpi_linux/config   ~/project/git/rpi_linux/.config

此时,交叉编译已经全部准备好了

8.3. 开始交叉编译

接下来的所有命令,都在 ~/project/git/rpi_linux 源码目录下执行。

$ cd ~/project/git/rpi_linux

8.4. 启用 .config 的配置

$ make oldconfig ARCH=arm CROSS_COMPILE=arm-bcm2708-linux-gnueabi-

这一步可能会弹出一些询问选项。这是因为内核源码经过了更新,多出了一些 .config 中没有涉及到的配置,这时候 make 指令便询问用户是否启用新配置。我们全部选择默认值,也就是不停地回车,直到 make 命令结束。

8.4.1. 交叉编译所有代码:

$ make ARCH=arm CROSS_COMPILE=arm-bcm2708-linux-gnueabi- -j3

-j3参数加快编译速度,一般数值为CPU核心数加1。这一步可能需要30分钟到1个小时。

make 执行结束后,内核映像和驱动模块都编译好了,但它们分散在源代码的各个目录下,我们需要将它们分别取出。

8.4.2. 复制编译好的内核映像

内核映像名为 zImage ,位于目录 ~/project/git/rpi_linux/arch/arm/boot 下。我们将它复制到目录 ~/project/git/openRPi/linux_generate

$ cp ~/project/git/rpi_linux/arch/arm/boot/zImage    ~/project/git/openRPi/linux_generate

8.4.3. 处理内核映像:

此时,zImage映像还不能直接使用,需要处理成树莓派适用的格式 kernel.img。官方给出了处理工具,路径位于 ~/project/git/rpi_tools/mkimage/imagetool-uncompressed.py。这是一个 Python 脚本。不太方便的地方是,这个工具只能处理同目录下的zImage,因此我们应该先把zImage复制到同目录下,处理生成 kernel.img。

$ cp ~/project/git/openRPi/linux_generate/zImage  ~/project/git/rpi_tools/mkimage
$ cd ~/project/git/rpi_tools/mkimage
$ python imagetool-uncompressed.py  zImage

此时,同目录下出现 kernel.img 文件。我们把它复制回去。

$ cp ~/project/git/rpi_tools/mkimage/kernel.img   ~/project/git/openRPi/linux_generate

8.4.4. 导出编译好的驱动模块:

$ make modules_install ARCH=arm CROSS_COMPILE=arm-bcm2708-linux-gnueabi- INSTALL_MOD_PATH=~/project/git/openRPi/linux_generate

命令执行后,所有的 frameware 固件和驱动模块都出现在了 ~/project/git/openRPi/linux_generate 目录下。

好了,到这里,我们已经生成了全新的内核映像、固件和驱动模块,~/project/git/openRPi/linux_generate 目录看起来就像这样:

$ tree -L 4
.
├── config
├── kernel.img
├── modules
│   └── lib
│       ├── firmware
│       │   ├── cpia2
│       │   ├── edgeport
│       │   ├── emi26
│       │   ├── emi62
│       │   ├── kaweth
│       │   ├── keyspan_pda
│       │   ├── mts_cdma.fw
│       │   ├── mts_edge.fw
│       │   ├── mts_gsm.fw
│       │   ├── ti_3410.fw
│       │   ├── ti_5052.fw
│       │   ├── whiteheat.fw
│       │   ├── whiteheat_loader.fw
│       │   └── yam
│       └── modules
│           └── 3.12.24+
├── README.md
└── zImage

8.5. 安装全新的内核映像、固件和驱动模块

覆盖树莓派对应的文件(夹)即可