高通平台第一帧splash和Bootanimation
A.Splash image/第一帧图像/开机logo(有很多叫法,但比较官方的一般叫bootloader logo或者LK display logo)
替换LK display (bootloader) logo有两种方式
a.利用平台自带的logo_gen.py生成splash.img镜像,可以使用fastboot重新刷splash.img分区
b.利用三方软件将.png转为bootable/bootloader/lk/platform/msm_shared/include/splash.h头文件中的buffer并替换
方法b只适用于分辨率较低的图片(经测试临界点大概在320*240左右),方法a适用于各种分辨率图片(.png)
看源码bootable/bootloader/lk/dev/fbcon/fbcon.c中的逻辑
系统会先通过fetch_image_from_partition()获取.img格式镜像,如失败
会去splash.h头文件获取数组,如果数组无效或者获取失败,会显示default fbimg
先说下生成splash.img的步骤
- 需要符合屏幕分辨率的.png图像
- 将图像放到目录device/qcom/common/display/logo,并确认该目录下有logo_gen.py脚本
- python ./logo_gen.py logo.png
如果遇到以下错误:
的话请安装Pillow 组件(pip install Pillow) - 在partition.xml添加splash分区
- 在contents.xml添加splash.img
<download_file minimized=“true” fastboot=“true”>
<file_name>splash.img</file_name>
<file_path>LINUX/android/out/target/product/msm8937_32go/</file_path>
</download_file>
Fastboot一定要为true否则无法fastboot烧录 - 在编译脚本中把splash.img copy到代码out目录
PRODUCT_COPY_FILES += device/qcom/common/display/logo/splash.img:splash.img - 在打包脚本中把splash.img copy到pub out目录
cp -f LA.UM.7.6.2/LINUX/android/device/qcom/common/display/logo/splash.img R E L E A S E D I R / RELEASE_DIR/ RELEASEDIR/TAR_VER/LA.UM.7.6.2/LINUX/android/out/target/product/${TARGET_PRODUCT}/ - 如果按上面方法操作了还不生效,请打串口log看下是否有splash image相关报错,我在改的过程中碰到了header invalid的错误,最后发现是logo_gen.py中header起始/终止地址有误。修改文件读取指针的位置后就ok了,一般有splash image报错都是由于生成脚本本身有问题
下面说下方法b, - 找到bootable/bootloader/lk/platform/msm_shared/include/splash.h,会发现里面有三个buffer: imageBuffer[], imageBuffer_rgb888[]和image_batt888[]。生效的逻辑也在fbcon.c中:
#if DISPLAY_TYPE_MIPI
fbimg->image = (unsigned char *)imageBuffer_rgb888;
#else
fbimg->image = (unsigned char *)imageBuffer;
#endif - 用三方工具将.png转为buffer, 我用的是Image2Lcd,转出来的buffer大小如果大于源码中buffer的大小,会有异常,可以通过降低输出图像的色彩位数减少buffer size(不影响效果的前提下)。如果需要修改buffer size上限,方法如下
a. 找到项目.dtsi, arch/arm/boot/dts/qcom/msmxxxx.dtsi
b. 在64位的版本中buffer地址为4M,
reserved-memory {
…
cont_splash_mem: splash_region@83000000 {
reg = <0x0 0x90000000 0x0 0x1400000>;
};
}
debug可以通过kernal log看是否有类似报错:
[ 0.000000] memblock_reserve: [0x0000008e000000-0x00000090800000] dma_contiguous_reserve_area+0xdc/0x1e4
[ 0.000000] cma: CMA: reserved 40 MiB at 0x000000008e000000 for cont_splash_mem
[ 0.000000] reserved[0x3] [0x0000008e000000-0x000000907fffff], 0x2800000 bytes
Kernal log添加方法如下:
a. 在kernal 配置文件中扩大kernal log buffer的大小:
// msm-perf_defconfig
CONFIG_LOG_BUF_SHIFT=18
b. 打开memblock debug
//arch/arm/boot/dts/qcom/msmxxxx.dtsi
chosen {
// bootargs = “boot_cpus=0,1,2,3,4 sched_enable_hmp=1”;
bootargs = “boot_cpus=0,1,2,3,4 sched_enable_hmp=1 memblock=debug”; };
- 如果想删除第一帧的话,找到 arch/arm/boot/dts/qcom/msmxxxx-mdss.dtsi ,注掉以下行代码
mdss_fb0: qcom,mdss_fb_primary {
cell-index = <0>;
compatible = “qcom,mdss-fb”;
// qcom,mdss-fb-splash-logo-enabled;
qcom,cont-splash-memory {
linux,contiguous-region = <&cont_splash_mem>;
};
};
B.Boot animation
这个比较简单,甚至都没有什么需要debug的点
1.bootanimation.zip由两部分组成(配置文件和图片文件夹)
a.desc.txt - 动画配置文件,帧数循环次数,文件名称, 需注意文件格式需要改为ANSI
480 960 1 - “480” 为动画播放宽度,”960”为动画播放高度,不确定的话可以用adb shell wm size或者adb shell dumpsys window displays看一下,”1”为fps值
p 1 0 part0 - “p”是一个标志位, 说明当service.bootanim.exit属性为true时,不用等待所有图片播放完毕就跳出播放,第一位为”c”时,说明当service.bootanim.exit属性为true时,必须要等播放完成后才会跳出这部分。”1” 为循环次数,如果这个值为”0”的话,说明此部分动画会一直循环,直到service.bootanim.exit为true。”0”为播放完这部分的暂停,为0代表无暂停。”part0”为存放动画图片的文件夹名
p 0 0 part1
b.part0, part1个文件夹 - 也可以手动根据需求添加part3,或者改文件夹名字
2.Zip/unzip bootaimation.zip的所有动作最好都在Linux环境下完成
特别需要注意的是,压缩bootanimation.zip的时候压缩模式必须为存储模式:
zip -r -0 bootanimation.zip part0 part1 desc.txt
压缩完成后请用:
Unzip -t bootanimation检查压缩包是否完整
3.本地验证可以直接把存储模式的bootanimation.zip push到device的/system/media目录下验证
4.编译的话需要在.mk中将bootanimation.zip拷贝到system/media目录:
PRODUCT_COPY_FILES += device/qcom/msm8937_64/bootanimation.zip:system/media/bootanimation.zip