编译主线内核
更新时间:2018-03-09 阅读:10766
1 预编译固件
为方便测试,现提供预先编译好的使用主线内核的 Ubuntu 14.04 固件,其特性为:
集成 Mali 内核和用户驱动,以及 OpenGL ES 示例。
使用板载的 eMMC 存储,无需额外的 TF 卡。
HDMI 显示支持。
2 准备工作
本文假定工作目录是 "~/proj/linux-rockchip":
mkdir -p ~/proj/linux-rockchip
2.1 安装开发包
安装开发包:
sudo apt-get install build-essential lzop libncurses5-dev libssl-dev # 如果使用的是 64 位的 Ubuntu,还需要安装: sudo apt-get install libc6:i386
2.2 交叉编译工具链
本文使用 Android SDK 的预置交叉编译工具链来编译测试。
将 Android SDK 的 prebuilt 目录拷贝到工作目录下:
cd ~/proj/linux-rockchip cp -rl ANDROID_SDK/prebuilts .
"prebuilts/gcc/linux-x86/arm/" 里的 arm-eabi-4.6 和 arm-eabi-4.7 是所需要的交叉编译工具链。其中,U-Boot 使用 arm-eabi-4.7,内核使用 arm-eabi-4.6。
2.3 工具
将 ANDROID SDK 里的一些工具安装到系统中:
cd ANDROID_SDK cp ./kernel/mkkrnlimg /usr/local/bin cp ./RKTools/linux/Linux_Upgrade_Tool_v1.2/upgrade_tool /usr/local/bin
另外建议安装 rkflashkit: https://github.com/linuxerwang/rkflashkit
3 parameter
以下是固件使用的 parameter 文件,最主要是分区的设定:
kernel: 烧写 kernel.img (RK KNRL 格式,用 mkkrnlimg 打包)
boot: 烧写 boot.img (RK KNRL 格式,用 mkkrnlimg 打包)
linuxroot: 烧写 linuxroot.img (ext4fs 格式)
FIRMWARE_VER:4.4.2 MACHINE_MODEL:rk30sdk MACHINE_ID:007 MANUFACTURER:RK30SDK MAGIC: 0x5041524B ATAG: 0x60000800 MACHINE: 3066 CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 #KERNEL_IMG: 0x62008000 #FDT_NAME: rk-kernel.dtb #RECOVER_KEY: 1,1,0,20,0 CMDLINE:console=ttyS2,115200 earlyprintk root=/dev/block/mtd/by-name/linuxroot rw rootfstype=ext4 init=/sbin/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00008000@0x00002000(kernel),0x00008000@0x0000A000(boot),0x00002000@0x00012000(misc),0x00001000@0x00014000(backup),-@0x00015000(linuxroot)
烧写 paramter 文件到设备上:
sudo rkflashkit flash @parameter parameter.txt
要提取设备上的 parameter 文件,可以使用:
sudo rkflashkit backup @parameter parameter.txt
4 U-Boot
主线内核需要配套的 U-Boot,而不是 SDK 上的。
4.1 编译 U-Boot
下载并编译 U-Boot:
cd ~/proj/linux-rockchip git clone -b u-boot-rk3288 https://github.com/linux-rockchip/u-boot-rockchip.git u-boot cd u-boot make rk3288_defconfig make -j4
U-Boot 编译成功后,最后的几行信息是:
LD u-boot OBJCOPY u-boot.bin OBJCOPY u-boot.srec ./tools/boot_merger --subfix ".01.bin" ./tools/rk_tools/RKBOOT/RK3288.ini out:RK3288UbootLoader.bin fix opt:RK3288UbootLoader_V2.19.01.bin merge success(RK3288UbootLoader_V2.19.01.bin)
"RK3288UbootLoader_V2.19.01.bin" 就是成功编译出来的映像,可以用 upgrade_tool 烧写到板子上。
4.2 Flash U-Boot
sudo upgrade_tool ul RK3288UbootLoader_V2.19.01.bin
5 内核
由于主线内核版本更新很快,目前测试的版本是基于 v4.0-rc1 。
测试分支位于:
https://github.com/TeeFirefly/linux-rockchip/tree/firefly
该分支基于:
https://git.kernel.org/cgit/linux/kernel/git/mmind/linux-rockchip.git/log/?h=v4.1-armsoc/dts
并加入 Mali 内核驱动代码:
https://github.com/mmind/linux-rockchip/tree/devel/mali-workbench
因为加入了命令行参数 “mtdparts=” 指定分区的支持,这样可以维持原有 RK SDK 方式,在 parameter 文件中设定 eMMC 分区。
5.1 编译内核
首先是下载源码:
cd ~/proj/linux-rockchip git clone -b firefly https://github.com/TeeFirefly/linux-rockchip.git kernel
然后编译内核和模块:
cd ~/proj/linux-rockchip/kernel export ARCH=arm export CROSS_COMPILE=$PWD/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- make rk3288_firefly_defconfig make -j4 zImage make rk3288-firefly.dtb cat arch/arm/boot/zImage arch/arm/boot/dts/rk3288-firefly.dtb > zImage-dtb mkkrnlimg zImage-dtb kernel.img # 编译并安装模块 make -j4 modules [ -d install_mod ] && rm -rf install_mod make INSTALL_MOD_PATH=$PWD/install_mod modules_install # 复制 install_mod 目录里的文件到根文件系统
5.2 烧写内核
sudo rkflashkit flash @kernel /path/to/kernel.img
6 initramfs
6.1 创建 boot.img
cd ~/proj/linux-rockchip git clone https://github.com/TeeFirefly/initrd.git make -C initrd mkkrnlimg initrd.img boot.img # 打包成 RK KRNL 格式
6.2 烧写 boot.img
sudo rkflashkit flash @boot /path/to/boot.img
7 根文件系统
要创建根文件系统 linuxroot.img,请参考《创建 Ubuntu 根文件系统》一文。
烧写 linuxroot.img:
sudo upgrade_tool di linuxroot /path/to/linuxroot.img
8 FAQ
8.1 已知问题
VGA: VGA 显示支持尚未添加。
WiFi:AP6335 驱动尚未移植。
由于 RK3288 的主线内核支持尚未完善,在使用过程中会出现的 HDMI 显示刷新慢,USB 外设支持不好等问题。
8.2 zImage-dtb 是什么?
zImage-dtb 是内核加设备树块,当 CONFIG_ARM_APPENDED_DTB 打开时,内核会在尾部查找 DTB。