附录 - 交叉编译新内核和驱动模块 ================================= 建立交叉编译环境 ---------------- 这部分内容,参见 `附录-建立树莓派交叉编译环境 <附录-建立树莓派交叉编译环境.html>`_ 准备交叉编译需要的代码 ---------------------- Linux 内核源代 ^^^^^^^^^^^^^^^^^^ git仓库位于 https://github.com/raspberrypi/linux 把源码克隆到 ``~/project/git/rpi_linux`` 目录: .. code-block :: shell $ cd ~/project/git $ git clone https://github.com/raspberrypi/linux rpi_linux 接下来,对内核源码进行清理(清除遗留的配置文件和编译结果): .. code-block :: shell $ cd ~/project/git/rpi_linux $ make mrprope .config 内核配置文件 ^^^^^^^^^^^^^^^^^^^^^^^^ .config文件是编译一个linux镜像文件的蓝图脚本,负责保存对于特定系统的内容配置,它放在了linux文件树下的顶层文件中。 实际上,我们已经提供了一套完整的配置和编译结果,但这里只须用到 config 配置文件: * ``config`` 配置文件 * ``/lib/frameware`` 固件 * ``/lib/modules`` 驱动模块 git仓库位于 https://github.com/openRPi/linux_generate,克隆到 ``~/project/git/openRPi/linux_gererate`` 目录: .. code-block :: shell $ cd ~/project/git/openRPi $ git clone https://github.com/openRPi/linux_generate linux_generate 配置好的config文件位于 ``~/project/git/openRPi/linux_gererate`` 目录顶层。我们把它复制并到 rpi_linux 源码目录下,重命名为 .config .. code-block :: shell $ cp ~/project/git/openRPi/linux_generate/config ~/project/git/rpi_linux $ mv ~/project/git/rpi_linux/config ~/project/git/rpi_linux/.config **此时,交叉编译已经全部准备好了** 开始交叉编译 -------------- 接下来的所有命令,都在 ``~/project/git/rpi_linux`` 源码目录下执行。 .. code-block :: shell $ cd ~/project/git/rpi_linux 启用 .config 的配置 ------------------------- .. code-block :: shell $ make oldconfig ARCH=arm CROSS_COMPILE=arm-bcm2708-linux-gnueabi- 这一步可能会弹出一些询问选项。这是因为内核源码经过了更新,多出了一些 .config 中没有涉及到的配置,这时候 make 指令便询问用户是否启用新配置。我们全部选择默认值,也就是不停地回车,直到 make 命令结束。 交叉编译所有代码: ^^^^^^^^^^^^^^^^^ .. code-block :: shell $ make ARCH=arm CROSS_COMPILE=arm-bcm2708-linux-gnueabi- -j3 -j3参数加快编译速度,一般数值为CPU核心数加1。这一步可能需要30分钟到1个小时。 make 执行结束后,内核映像和驱动模块都编译好了,但它们分散在源代码的各个目录下,我们需要将它们分别取出。 复制编译好的内核映像 ^^^^^^^^^^^^^^^^^^^^^ 内核映像名为 zImage ,位于目录 ``~/project/git/rpi_linux/arch/arm/boot`` 下。我们将它复制到目录 ``~/project/git/openRPi/linux_generate`` 。 .. code-block :: shell $ cp ~/project/git/rpi_linux/arch/arm/boot/zImage ~/project/git/openRPi/linux_generate 处理内核映像: ^^^^^^^^^^^^^^ 此时,zImage映像还不能直接使用,需要处理成树莓派适用的格式 kernel.img。官方给出了处理工具,路径位于 ``~/project/git/rpi_tools/mkimage/imagetool-uncompressed.py``。这是一个 Python 脚本。不太方便的地方是,这个工具只能处理同目录下的zImage,因此我们应该先把zImage复制到同目录下,处理生成 kernel.img。 .. code-block :: shell $ 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 文件。我们把它复制回去。 .. code-block :: shell $ cp ~/project/git/rpi_tools/mkimage/kernel.img ~/project/git/openRPi/linux_generate 导出编译好的驱动模块: ^^^^^^^^^^^^^^^^^^^^^^^ .. code-block :: shell $ 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`` 目录看起来就像这样: .. code-block :: shell $ 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 安装全新的内核映像、固件和驱动模块 -------------------------------------- 覆盖树莓派对应的文件(夹)即可