开机logo切换逻辑深入研究

增加暗码命令切换开关机logo功能


u-boot logo显示原理:
1.————Little Kernel会在platform_early_init阶段首先会获取lcm params,其工作流
程就是透过读id找到现在插入的LCM,根据LCM的分辨率申请相应大小的frame buffer
并确定frame buffer起始地址
2. 为logo.bin预留4M Ram
3. 之后在platform_init阶段,直接将logo.bin载入到4M Ram中
4, 完成载入后,在platform_init中mt_disp_show_boot_logo();会调用
show_logo(0);完成第一张logo显示。其中的index=0代表在logo.bin中压缩的第一张
图片,logo.bin中的图片压缩顺序可以察看文件
mediatek\custom\common\lk\logo\rules.mk


2.————4.2的kernel logo显示原理:
Kernel logo的工作方式与U-boot logo不同,是透过init.rc中注册的
boot_logo_updater service完成读取raw data文件,进行绘画的,所以在kernel
logo只是经过了bmp向raw的转换,在目录mediatek\custom\common\lk\logo\下生成
raw data 文件boot_logo。之后透过脚本文件将boot_logo文件搬移到
out\target\product\xxxx\system\media\images下,打包为system.img,download
到手机种,并存放于/system/media/images目录下。


3.————4.2对于ipo快速开机,请在目录mediatek\external\ipod\bootlogo.cpp中的
mt65xx_disp_show_boot_logo();做相应修改


4.————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层的logoindex可以查看文件
mediatek\custom\common\lk\logo\rules.mk中kernel.bmp的顺序
void show_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
也是使用了此接口,若添加,应该就可以做到暗码修改了。


对于U-boot logo,只需要将不同分辨率的图片压缩至logo.bin中,在读取时根据不
同的NVflag显示相应的图片即可
而对于Kernel logo,我们需要将不同分辨率的boot_logo raw data文件生成出来并
copy到手机中,boot_logo_updater根据不同的分辨率进行识别,读取相应的logo文
件。在boot_logo_updater识别部分对NVflag进行判断,进而调用不同的boot_logo。






一、主要修改文件:
1.mediatek/external.git
boot_logo_custom这部分代码在4.4上是没有编译的,所以不用增加这部分的编译机制
这部分的logo是动画之前的那个logo,可以使用adb shell,cd 到/system/bin,执行
boot_logo_updater查看这个logo具体是哪张图片




diff --git a/boot_logo_updater/Android.mk b/boot_logo_updater/Android.mk
index 5a28913..1b046f8 100755
--- a/boot_logo_updater/Android.mk
+++ b/boot_logo_updater/Android.mk
@@ -66,3 +66,17 @@ LOCAL_SRC_FILES := custom/$(LOCAL_MODULE)
 
 include $(BUILD_PREBUILT)
 endif
+############################################################
+ifneq ($(strip $(MTK_PLATFORM)),)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := boot_logo_custom
+
+LOCAL_MODULE_CLASS := DATA
+LOCAL_MODULE_PATH := $(TARGET_OUT)/media/images
+
+LOCAL_GENERATE_CUSTOM_FOLDER := custom:lk/logo
+LOCAL_SRC_FILES := custom/$(LOCAL_MODULE)
+
+include $(BUILD_PREBUILT)
+endif


这部分脚本编译是为了将生成的boot_logo_custom搬到system/media/images下的


diff --git a/boot_logo_updater/boot_logo_updater.c b/boot_logo_updater/boot_logo_updater.c
index 5836f21..745d64f 100755
--- a/boot_logo_updater/boot_logo_updater.c
+++ b/boot_logo_updater/boot_logo_updater.c
@@ -93,7 +93,7 @@ extern void bootlogo_fb_init();
 extern void bootlogo_fb_deinit();
 */
 const char LOGO_PATH[] = "/system/media/images/boot_logo";
-
+const char LOGO_CUSTOM_PATH[] = "/system/media/images/boot_logo_custom";// **** add changeLogo 20140508
 #define RGB565_TO_ARGB8888(x)   \
     ((((x) &   0x1F) << 3) |    \
      (((x) &  0x7E0) << 5) |    \
@@ -113,8 +113,8 @@ const char LOGO_PATH[] = "/system/media/images/boot_logo";
 #define LCD_BACKLIGHT_PATH "/sys/class/leds/lcd-backlight/brightness"
 #define BOOT_REASON_SYS_PROPERTY "sys.boot.reason"
 #define BOOT_PACKAGE_SYS_PROPERTY "persist.sys.bootpackage"
-
-
+#define MAX_RETRY_COUNT 20 // **** add changeLogo 20140508
+#define uchar unsigned char
 /*
  * return value:
  * 0: normal
@@ -210,7 +210,61 @@ void set_int_value(const char * path, const int value)
 
  write_to_file(path, buf, strlen(buf));
 }
-
+// **** add changeLogo 20140508 begin
+int do_read()
+{
+ int fd,of,i=0,n,sectorSize,index;
+
+ char *buffer = NULL;
+ sectorSize=512;
+ buffer = (char*)malloc(sectorSize);
+ if(buffer == NULL)
+ {
+ printf("ERROR buffer malloc fail!");
+ return -1;
+ }
+ memset(buffer, 0, sectorSize);
+ char PN[20];
+ sprintf(PN,"/dev/pro_info");
+ printf("PN:%s\n",PN);//open your raw data partiton
+
+ fd= open(PN,O_RDWR);
+ if(fd<= 0)
+ {
+ printf("ERROR open fail %d\n",fd);
+ return -1;
+ }
+
+ //read
+ buffer = NULL;
+ buffer = (char*)malloc(sectorSize);
+ if(buffer == NULL)
+ {
+ printf("ERROR buffer malloc fail!");
+ return -1;
+
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值