MTK6582+Android4.4.2之LK和kernel logo显示
之前写过《MTK6577+Android增加支持新显示屏的显示》,链接:
http://blog.csdn.net/loongembedded/article/details/38535143
mediatek\config\itek82_wet_kk\ProjectConfig.mk相关的环境变量配置如下:
BOOT_LOGO=cu_wvga
CUSTOM_LK_LCM=ili9806e
CUSTOM_KERNEL_LCM=ili9806e
LCM_HEIGHT=800
LCM_WIDTH=480
1. Preloader和lk显示屏的初始化流程
LK和kernel阶段的logo位于mediatek\custom\common\lk\logo\cu_wvga名字为
mt_disp_show_boot_logo();负责lk第1个logo的显示,显示的图片名字为cu_wvga_uboot.bmp
开机过程总共有的logo有3个
(1) 第1个对应的图片是cu_wvga_uboot.bmp,mt_disp_show_boot_logo()显示的
(2) 第2个对应的图片是cu_wvga_kernel.bmp, show_kernel_logo()显示
(3) 第3个是android动画。
图1
2. 第1个logo cu_wvga_uboot.bmp的显示
platform_init()-->mt_disp_show_boot_logo()显示的 /* * Show first boot logo when phone boot up * */ voidmt_disp_show_boot_logo(void) { dprintf(INFO, "[lk logo: %s%d]\n",__FUNCTION__,__LINE__); mt_logo_get_custom_if(); if(logo_cust_if->show_boot_logo) { logo_cust_if->show_boot_logo(); } else { ///show_logo(0); init_fb_screen(); fill_animation_logo(BOOT_LOGO_INDEX,mt_get_fb_addr(), mt_get_tempfb_addr(), logo_addr, phical_screen); mt_disp_update(0, 0, CFG_DISPLAY_WIDTH,CFG_DISPLAY_HEIGHT); } return; }
图2
3. 第2个logo cu_wvga_kernel.bmp的显示
mediatek\external\boot_logo_updater\ boot_logo_updater.c的main函数调用show_kernel_logo()显示kernel的logo
kernel logo的常用修改
3.1 Logo.bin不包含kernel的图片
(1) 修改rules.mk文件
mediatek\custom\common\lk\logo\rules.mk RESOURCE_OBJ_LIST:= \ $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_uboot.raw\ $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_battery.raw \ … # $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_kernel.raw
logo/update 文件中会调用tool/bmp_to_raw将bmp文件转换成raw文件,并且在make uboot时会将这些资源文件放到logo.bin 中
注释掉(BOOT_LOGO)_kernel.raw这一项
(2) 修改update文件
mediatek\custom\common\lk\logo\update文件,注释掉下面的内容
#./tool/bmp_to_raw./boot_logo ./$p/"${p}_kernel".bmp
update文件中会调用tool/bmp_to_raw将bmp文件转换成raw文件,并且在make uboot时会将这些资源文件放到logo.bin 中,这里同时把cu_wvga_kernel.bmp转成raw文件后重命名为boot_logo
./mk lk,更新logo.bin即可,但有时候很奇怪,需要./mk n才可以。
3.2 为了让开机第1个logo(LK也就是uboot)和第2个logog(kernel)相同,可以让cu_wvga_kernel.bmp和cu_wvga_uboot.bmp是内容相同的照片
3.3 不显示kernel阶段的logo
(1) 修改mediatek\external\libshowlogo\charging_animation.cpp内容
4.4的kernel logo和ipo快速开机用的是同一个接口。
在boot_logo_updater.c的main中与4.2的方法不同使用了show_kernel_logo函数调用显示了包在logo.bin中的kernel.logo,修改方法可以在alps\mediatek\external\libshowlogo\charging_animation.cpp
中对这部分代码进行尝试读取nv显示修改,kernel层的logo index可以查看文件
mediatek\custom\common\lk\logo\rules.mk中kernel.bmp的顺序
voidshow_kernel_logo() { LOG_ANIM("[charging_animation: %s%d]show kernel logo, index = 38 \n",__FUNCTION__,__LINE__); if (error_flag == 0) { anim_show_logo(kernel_logo_position); } }
由于快速开关机部分alps\mediatek\external\ipod\bootlogo.cpp
也是使用了此接口,若添加,应该就可以做到暗码修改了。
Libshowlogo生成libshowlogo.so放在out\target\product\itek82_wet_kk\system\lib目录下。
编译命令和更新对应的部分:
./mk mm ./mediatek/external/libshowlogo
./mk snodsystemimage
更新system.img即可
(2) 修改mediatek\external\boot_logo_updater\ boot_logo_updater.c
main函数
int main(void) { printf("[boot_logo_updater%s %d]boot_logo_updater,\n",__FUNCTION__,__LINE__); int ret = update_boot_reason(); if (ret == 1) { printf("[boot_logo_updater]skipthe boot logo!\n"); set_int_value(LCD_BACKLIGHT_PATH, 120); return 0; } else if (ret == 2) { printf("[boot_logo_updater]schedule on\n"); } // set parameter before init set_draw_mode(DRAW_ANIM_MODE_FB); anim_init(); show_kernel_logo(); anim_deinit(); return 0; }
此文件夹生成boot_logo_updater放在system\bin目录下,编译和上面的方式一样。