Jimmy Chen

A Programmer

(原创)高通aboot显示logo流程

  今天继续分析分析源码,看看高通8909的aboot是如何显示logo的。既然涉及到aboot,那么我们就从aboot的入口函数aboot_init开始分析。

aboot_init

aboot_init —> target_display_init

target_display_init函数在lk/target/msm8909文件夹内

target_display_init —> gcdb_display_init

gcdb_display_init —> msm_display_init

msm_display_init —> display_image_on_screen

display_image_on_screen —> fetch_image_from_partition

fetch_image_from_partition —> splash_screen_mmc

所以只有成功读取到splash分区,并且分区中的logo的信息没有错误,最后才会返回0,否则都会返回-1。下面我们返回display_image_on_screen看看

下面我们看看default模式显示logo是怎么个处理法。

display_image_on_screen —> display_default_image_on_screen

到此,显示logo的内容就完了。总结来说,显示logo有两种方法,第一种就是添加一个splash分区,将logo制作成splash.img镜像,然后刷到splash分区;另一种就是讲logo转换并填充到imageBuffer_rgb888数组即可。了解了原理,下面我们就来实践一下吧。高通MSM8909的代码都没有实现,需要自己实现。

方法一:转换成imageBuffer_rgb888数组

  好吧,这种方法当然是可以的。但是试了几次之后发现,这种方法只适合分辨率较小的logo图,博主试过720×1280、480×800和200×320这三个,发现就只有200×320可以显示成功,所以这种方法并不适合分辨率较高的logo

首先是准备好自己的logo图像,这里假设图像文件名为logo.png,依次执行下面三部得到素组

  • convert logo.png -recolor “0 0 1,0 1 0,1 0 0” logo_re.png
  • convert -depth 8 logo_re.png rgb:logo_raw.raw
  • xxd -i logo_raw.raw > splash_test.h

这里得到的splash_test.h文件内就包含我们需要的logo数组了。我们只需将里面的数组替换到lk/platform/msm_share/splash.h中的imageBuffer_rgb888数组中即可,当然要记得修改SPLASH_IMAGE_WIDTH和SPLASH_IMAGE_HEIGHT这两个宏为图像实际分辨率。

方法二:使用splash.img

首先在device/qcom/common/generate_extra_images文件中添加splash.img的编译选项,添加的内容如下:

其次是,根据上面填写的内容,我们要见logo图像命名为logo.png,同时将logo图像放到device/qcom/msm8909test/logo.png下,各位可以根据自己项目的需要更换这个路径

最后就是修改partition.xml,默认的partition.xml文件是这样的

可以看出,在执行flattern的时候并不会获取hlos中编译的splash.img,所以这里我们将splash.img加上去即可。

这样使用方法二来显示lk的logo就完成了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注