前言

由于手头上的RK3288板子厂家没有提供内核的源码,所以无法定制修改内核。在Firefly官网上有Firefly-RK3288的相关资料,下载了对应的Linux-SDK 源码包,尝试自行编译内核,并烧入新的boot.img/recovery.img,发现无法正常启动。后来在rockchip-linux的Github上,拉取了最新稳定版的代码分stable-4.4-rk3288-linux-v2.x,才可以正常启动内核,但遇到显示等不适配问题。后来了解到,不同板子厂家的设备树DTB是不同,所以只能从厂家原来的镜像中抽出来,再重新打包成新的镜像使用。(理论上可以使用安卓镜像中的DTB打包Linux版系统)

dts dtsi dtc dtb 说明

dts(Device Tree Source)文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个.dts文件对应一个ARM的machine。
由于一个SOC可能有多个不同电路板,而每个电路板拥有一个dts文件。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树讲这些共同部分提炼保存在dtsi(Device Tree Source Include File)文件中,供不同的dts共同使用。dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include dtsi文件。当然,dtsi本身也支持include另一个dtsi文件。
dtc(Device Tree Complier)为编译工具,它可以将dts文件编译成dtb文件。DTC的源码位于内核的scripts/dtc目录下,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。
dtb(Device Tree Blob),bootloader在引到内核时,会预先读取dtb到内存,进而由内核解析。

unpack_bootimg解包img

在内核的scripts目录下,有unpack_bootimg.py脚本,使用该脚本可以解包boot.img和recovery.img,解包命令如下:

scripts/unpack_bootimg --boot_img boot.img --out boot

上述命令可以把img镜像进行解包,并保存到boot文件夹内,会得到如下三个文件:
img解包后截图
其中kernel文件为内核编译后的二进制文件,ramdisk为内核挂载时,所有可能需要的驱动/模块/文件等。由于RK3288开源方案中将驱动打包进了内核,所以这里该文件大小为0。second文件需要再次解包,才能看到详细的内容。

resource_tool解包second

这里将second文件重命名为resource.img,并执行如下命令解包:

scripts/resource_tool --unpack resource

解包完成后,在resource文件夹下会解压出三个文件:
second解包后截图
其中rk-kernel.dtb文件就是编译后的设备树二进制文件。

dtc反编译dtb为dts

在内核编译过程中,dtc工具会被编译,使用如下命令可以反编译dtb文件为dts:

scripts/dtc/dtc -I dtb -O dts rk-kernel.dtb > rk3288.dts

dts文件可以直接用文本编辑器看到里面的设备信息,将该文件放到arch/arm/boot/dts目录下,并修改编译mk文件中RK_KERNEL_DTS的值为rk3288即可在自动编译过程中使用,如:

# Kernel dts
export RK_KERNEL_DTS=rk3288

mkbootimg重新打包

可以将自己编译的内核二进制文件kernel替换掉原有镜像的内核文件,然后使用mkbootimg.py脚本打包为新的镜像,具体命令如下:

scripts/mkbootimg --kernel out/kernel --ramdisk out/ramdisk --second out/second --output newboot.img

最终可以得到重新打包后的镜像文件newboot.img,对于recovery.img也可以按步骤进行重新打包。

Logo

更多推荐