编译内核
更新时间:2018-07-26 阅读:11882
Ubuntu 16.04 固件
1 准备工作
1.1 编译环境初始化
Ubuntu 14.04 软件包安装:
$ sudo apt-get install git gnupg flex bison gperf build-essential \ zip tar curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 cmake tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 lzop $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
安装 ARM 交叉编译工具链和编译内核相关软件包
$ sudo apt-get install gcc-arm-linux-gnueabihf \ gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev \ libssl1.0.0 libssl-dev 工具链: git clone https://github.com/T-Firefly/prebuilts.git
1.2 获取内核源码
git clone -b firefly https://github.com/FireflyTeam/kernel.git
2 编译内核
编译前执行如下命令配置环境变量:
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf-
编译 firefly-rk3288
make firefly_linux_defconfig make rk3288-firefly-linux.img -j4
编译 aio-3288j
make rk3288-firefly-aio-linux.img -j4
编译完成后,会在 kernel 目录下生成 kernel.img 和 resource.img.
如需编译 arch/arm/boot/dts/rockchip/ 目录下某个 xxx.dts,则
make xxx.img -j4
3 升级分区镜像
3.1 查看 parameter 文件
CMDLINE:console=ttyS2,115200 root=/dev/mmcblk2p6 rw rootwait \ mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),\ 0x00008000@0x00006000(resource),0x0000A000@0x0000E000(kernel),\ 0x00002000@0x00018000(backup),-@0x0001A000(boot)
注意点
root=/dev/mmcblk2p6 ---> rootfs 分区 如 根文件分区大小异常, resize2fs /dev/mmcblk2p6 0x0000A000@0x0000E000(kernel) ---> kernel 分区 kernel ---> 分区名称 0x0000E000 ---> 分区起始地址 0x0000A000 ---> 分区大小,一般不需要关注
3.2 Linux upgrade_tool 升级分区镜像( xx.img )
注意,parameter 分区对应的名称,是否相对应
sudo upgrade_tool di kernel kernel.img sudo upgrade_tool di boot rootfs.img ... kernel ---> 上点 parameter 所述分区名称 kernel.img ---> 编译生产的 kernel.img 分区镜像
3.3 Windows AndroidTool 工具升级分区镜像
注意,parameter 分区对应的起始地址,是否相对应
3.4 其他分区镜像
可通过 《定制 Android 固件》一文,解包官方发布固件获取。
Ubuntu 14.04 固件
1 准备工作
1.1 安装开发包
安装开发包:
sudo apt-get install build-essential lzop libncurses5-dev libssl-dev # 如果使用的是 64 位的 Ubuntu,还需要安装: sudo apt-get install libc6:i386
1.2 安装 mkbootimg 工具
git clone https://github.com/neo-technologies/rockchip-mkbootimg.git cd rockchip-mkbootimg make && sudo make install
1.3 获取内核源码和安装交叉编译工具链
如果已经下载 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 目录是否存在,有则可以重用,没有则需要到GoogleGit下载,并解压。
2 编译内核
2.1 编译内核映像
如果不是在 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 。
2.2 编译内核模块
在内核源码目录里执行:
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
3 创建 boot.img
3.1 创建内存盘
内核启动时会加载内存盘作为初始的根文件系统,再加载实际的根存储设备,最后切换过去。因为开发板使用的是 eMMC 存储,不需要特别的驱动,因此实际上可以跳过此步。但内存盘可以做得非常灵活和强大,例如可以做多系统启动。
git clone -b for-kernel_4.4 https://github.com/T-Firefly/initrd.git make -C initrd
3.2 打包内核和内存盘
将 kernel 和 initrd 打包成 boot.img:
# mkbootimg --kernel arch/arm/boot/zImage --ramdisk initrd.img -o boot.img mkbootimg --kernel zImage --ramdisk initrd.img --second resource.img --output boot.img
4 修改 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" 的分区,可以是任一存储设备
5 烧写到设备
参考《升级固件》,选择生成的 boot.img 和修改过的 parameter 文件,分别烧写到 "boot" 和 "parameter" 分区,则可完成内核的更新。
如果还没有烧写根文件系统的,可以下载预先做好的镜像,或定制自己的根文件系统,并烧写到 parameter 文件指定的根分区中。