最近做RK3588案子,修改dts后,导致boot.img过大,编译出错,整体分析下boot.img过大的原因是因为在打包boot.img过程中,dbt.img过大导致,所以整体分析下boot.img编译过程,尤其是dbt.img的生成过程.
boot.img生成过程
在Andorid跟目录下执行, source build/envsetup.sh 然后lunch xx(xx是指版本的lunch选项),然后执行make bootimage ,可以编译生成boot.img.
在跟目录下找到build/core/Makefile,在里面找到boot.img的生成过程.如下图
其实就是把kernel ramdisk dtb打包到一起生成的boot.img
dtb.img生成过程
生成boot.img的时候需要用到dtb.img,因为用到的dtb.img过大导致编译不过,所以分析下dtb.img的生成过程.
dtb.img其实就是把kernl下面的dts文件重新命名然后拷贝到out目录下面的.
先看build/core/Makefile下面dtb.img的生成过程,如下图
777行是要在out目录下面生成dtb.img.
779行是生成dtb.img的过程,就是把BOARD_PREBUILT_DTBIMAGE_DIR这个目录下面的dtb文件做个排序,然后 cat到dtb.img.
下面就去找BOARD_PREBUILT_DTBIMAGE_DIR的定义,一般会定义在device/rockchip/目录下面(如果是xx平台,就在device/xx下面),进入device/rockchip,搜寻BOARD_PREBUILT_DTBIMAGE_DIR的定义
可以看到搜到的结果在common/BoardConfig.mk下面
因为我用的平台是64位的,所以定义位第81行.BOARD_PREBUILT_DTBIMAGE_DIR为kernel目录下面的arch/arm64/boot/dts/rockchip.
dtb的生成
如果kernel没有编译过,是没有dtb文件的,需要在对应的平台下面先编译kernel.编译kernel过程不讲解,编译成功后会在arch/arm64/boot/dts/rockchip目录下面生成对应的dtb文件.
dtb文件就是把dts文件做了二进制化,dtb过大肯定就是修改的dts文件导致的.
总结
编译kernel生成对应的dtb文件,3588平台为rk3588-e088.dtb,然后会把rk3588-e088.dtb cat到out目录下面生成dtb.img. 编译boot.img的时候会把dtb.img打到boot.img里面.
因为修改了dts,导致dtb生成的过大,进而导致boot.img无法生成.找到修改的dts文件,看修改的方法是否合适.如果必须那么修改dts文件,在修改boot.img的大小,也可以编译成功,记得同时修改分区表,否则无法烧录.