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目录下,编译和上面的方式一样。