Firefly-RK3288/Build kernel

来自Firefly wiki
跳转至: 导航搜索

准备工作

安装开发包

安装开发包:

sudo apt-get install build-essential lzop libncurses5-dev libssl-dev
# 如果使用的是 64 位的 Ubuntu,还需要安装:
sudo apt-get install libc6:i386

安装 mkbootimg 工具

git clone https://github.com/neo-technologies/rockchip-mkbootimg.git
cd rockchip-mkbootimg
make && sudo make install

获取内核源码和安装交叉编译工具链

如果已经下载 Firefly-RK3288 Android SDK,内核源码和交叉编译工具链分别在 SDK/kernel 和 SDK/prebuilts 目录里,无需额外下载,请跳到下一步。

如果没有下载 SDK,则需要下载内核源码及 Android 的 arm-eabi-4.6 交叉编译工具链。

下载内核源码:

git clone https://bitbucket.org/T-Firefly/firefly-rk3288-kernel.git

如果使用 Firefly-RK3288-Reload 版的开发板,请下载内核源码的"lollipop"分支,并切换到"lollipop"分支:

git fetch origin lollipop:lollipop
git checkout lollipop

注意:这其实就是 SDK 里的内核源码,为方便仅需要下载内核的用户,特意提取出来成为独立的源码仓库。

Android 的 arm-eabi-4.6 交叉编译工具链,可以看其它 Android SDK 的 prebuilts/gcc/linux-x86/arm/arm-eabi-4.6 目录是否存在,有则可以重用,没有则需要到这里下载,并解压。

编译内核

编译内核映像

如果不是在 SDK 里编译内核,则需要先指定 ARCH 和 CROSS_COMPILE:

export ARCH=arm
export CROSS_COMPILE=/path/to/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-

在内核源码目录里执行:

make firefly-rk3288-linux_defconfig
make -j8 firefly-rk3288-linux.img 

如果使用的是 Firefly-RK3288-Reload 版的开发板,在内核源码目录里执行:

make firefly-rk3288-reload-linux_defconfig
make -j8 firefly-rk3288-reload-linux.img

注意,如果是 beta 版的开发板,请将 firefly-rk3288.img 替换成 firefly-rk3288_beta.img 。

编译内核模块

在内核源码目录里执行:

make modules
mkdir modules_install
make INSTALL_MOD_PATH=./modules_install modules_install

内核模块是需要拷到根文件系统中即可:

rsync -av ./modules_install/ /path/to/your/rfs/

也可以远程拷贝到开发板的根文件系统中,这需要开发板可以通过 ssh 远程连接:

rsync -av ./modules_install/ root@开发板IP:/

最后清理一下模块安装目录(该目录含有链接,会影响 SDK 的编译):

rm -rf ./modules_install

创建 boot.img

创建内存盘

内核启动时会加载内存盘作为初始的根文件系统,再加载实际的根存储设备,最后切换过去。因为开发板使用的是 eMMC 存储,不需要特别的驱动,因此实际上可以跳过此步。但内存盘可以做得非常灵活和强大,例如可以做多系统启动。

git clone https://github.com/TeeFirefly/initrd.git
make -C initrd

打包内核和内存盘

将 kernel 和 initrd 打包成 boot.img:

mkbootimg --kernel arch/arm/boot/zImage --ramdisk initrd.img -o boot.img

修改 parameter 文件

Linux 的根文件系统(RFS)可能在不同的分区或存储设备上(eMMC、TF 卡或 U 盘),所以需要在内核的参数中指定。修改 parameter 文件中的 CMDLINE 行:

CMDLINE:console=tty0 console=ttyS2 ... mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),...,-@0x00394000(user)

根据实际情况加入以下之一(# 后是注释,不需要加入):

root=/dev/block/mtd/by-name/linuxroot        # 名为 "linuxroot" 的 nand 分区
root=/dev/mmcblk0p1          # TF 卡的第一个分区
root=/dev/sda1               # U 盘或 USB 硬盘的第一个分区
root=LABEL=linuxroot         # 卷标为 "linuxroot" 的分区,可以是任一存储设备

烧写到设备

参考《升级固件》,选择生成的 boot.img 和修改过的 parameter 文件,分别烧写到 "boot" 和 "parameter" 分区,则可完成内核的更新。

如果还没有烧写根文件系统的,可以下载预先做好的镜像,或定制自己的根文件系统,并烧写到 parameter 文件指定的根分区中。