MTK平台添加高分屏兼容界面详程

13 篇文章 0 订阅

        目前的产品分辨率是320*240的屏幕,所谓的低分屏,由于有提升用户体验的需求,需要添加一批次的高分屏(480*360),因此系统在surface系统启动之前的阶段图形显示都需要做一个高低分屏的适配逻辑。

硬件平台:MTK(MT6572)

软件平台:Android 4.4.2


从业数几载,业内人士反应MTK代码超级乱的情况早有耳闻,不过百闻终将不如一见。

下面入正题,首先要把相关的bmp图片资源加入系统:

--- a/mediatek/custom/common/lk/logo/rules.mk
+++ b/mediatek/custom/common/lk/logo/rules.mk

@@ -4,7 +4,9 @@ BOOT_LOGO_DIR := $(LOCAL_DIR)
 
 BMP_TO_RAW := $(BOOT_LOGO_DIR)/../logo_tool/bmp_to_raw
 ZPIPE := $(BOOT_LOGO_DIR)/../logo_tool/zpipe
-            
+
+HVGA :=cu_hvga
+

 $(info BMP_TO_RAW=$(BMP_TO_RAW))
 $(info ZPIPE=$(ZPIPE))
 $(info CUSTOM_LK_LOGO=$(CUSTOM_LK_LOGO))
@@ -129,7 +131,112 @@ RESOURCE_OBJ_LIST :=   \
             $(BOOT_LOGO_DIR)/$(CUSTOM_LK_LOGO)_ani_07.raw \
             $(BOOT_LOGO_DIR)/$(CUSTOM_LK_LOGO)_ani_08.raw \
             $(BOOT_LOGO_DIR)/$(CUSTOM_LK_LOGO)_ani_09.raw \
-            $(BOOT_LOGO_DIR)/$(CUSTOM_LK_LOGO)_charging_bg.raw
+            $(BOOT_LOGO_DIR)/$(CUSTOM_LK_LOGO)_charging_bg.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_uboot.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_kernel.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_low_battery.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_charger_ov.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_000.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_001.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_002.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_003.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_004.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_005.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_006.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_007.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_008.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_009.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_010.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_011.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_012.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_013.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_014.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_015.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_016.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_017.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_018.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_019.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_020.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_021.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_022.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_023.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_024.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_025.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_026.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_027.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_028.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_029.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_030.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_031.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_032.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_033.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_034.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_035.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_036.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_037.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_038.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_039.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_040.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_041.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_042.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_043.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_044.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_045.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_046.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_047.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_048.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_049.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_050.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_051.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_052.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_053.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_054.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_055.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_056.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_057.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_058.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_059.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_060.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_061.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_062.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_063.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_064.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_065.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_066.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_067.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_068.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_069.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_070.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_071.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_072.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_073.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_074.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_075.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_076.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_077.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_078.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_079.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_080.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_081.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_082.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_083.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_084.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_085.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_086.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_087.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_088.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_089.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_090.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_091.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_092.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_093.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_094.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_095.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_096.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_097.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_098.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_099.raw \
+            $(BOOT_LOGO_DIR)/$(HVGA)_num_100.raw

 
 ifeq ($(strip $(MTK_WIRELESS_CHARGER_SUPPORT)), yes)
 RESOURCE_OBJ_LIST +=   \

源码里边有一个bmp格式处理的工具,会将该目录下的bmp格式转化为raw模式,上述代码添加的图片为uboot,kernel第一屏界面,以及charger模式电量从1~100的百张图片。


第二步,逻辑相关的代码修改

--- a/mediatek/external/libshowlogo/show_animation_common.c
+++ b/mediatek/external/libshowlogo/show_animation_common.c
@@ -101,6 +101,12 @@ void fill_animation_logo(unsigned int index, void *fill_addr, void * dec_logo_ad
     LOGO_PARA_T logo_info;
     int logo_width;
     int logo_height;
+
+    if (HIGH_RESOLUTION_WIDTH == phical_screen.width) {
+        if (CHARGER_OV_INDEX == index) index = HIGH_RESOLUTION_BASE + index - 1;
+        else index = HIGH_RESOLUTION_BASE + index;
+    }
+

     if(check_logo_index_valid(index, logo_addr, &logo_info) != CHECK_LOGO_BIN_OK)
         return; 
               
@@ -269,9 +275,13 @@ void fill_animation_battery_vinci_cust(unsigned int capacity, void *fill_addr, v
  int anima_index = 0;
  anima_index = (capacity % 10);
 // VINCI_ANI_BEGIN =  VINCI_BAT_END + 1
+
+    if (HIGH_RESOLUTION_WIDTH == phical_screen.width) {
+        fill_animation_logo(BETWEEN_BASE_BAT + capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
+ } else {

         fill_animation_logo(VINCI_ANI_BEGIN + anima_index, fill_addr, dec_logo_addr, logo_addr, phical_screen);
         fill_animation_dynamic(VINCI_BAT_BEGIN + capacity, capacity_rect, fill_addr, cust_percent_pic_addr, logo_addr, phical_screen);
-
+    }
 }
 #endif

下边是一些相关宏定义,分辨率以及图片基址编号定义:

--- a/mediatek/custom/common/lk/include/target/cust_display.h
+++ b/mediatek/custom/common/lk/include/target/cust_display.h
@@ -94,6 +94,9 @@
 /*
  * Vinci index
  */
+#define        HIGH_RESOLUTION_BASE    117
+#define        BETWEEN_BASE_BAT        4
+

 #define        BOOT_LOGO_INDEX         0
 #define        KERNEL_LOGO_INDEX       1


--- a/mediatek/external/libshowlogo/show_animation_common.h
+++ b/mediatek/external/libshowlogo/show_animation_common.h
@@ -63,6 +63,8 @@ typedef struct {
     unsigned int inaddr;
 } LOGO_PARA_T;
 
+#define HIGH_RESOLUTION_WIDTH 360
+

 /********** show_animationm_ver:  charging animation version  ************/
 /*                                                                       */ 
 /* version 0: show 4 recatangle growing animation without battery number */


第三步,修改Recovery界面的动画帧逻辑。

--- a/bootable/recovery/screen_ui.cpp
+++ b/bootable/recovery/screen_ui.cpp

@@ -104,7 +104,12 @@ void ScreenRecoveryUI::draw_install_overlay_locked(int frame)
 void ScreenRecoveryUI::draw_background_locked(Icon icon)
 {
     pagesIdentical = false;
-    gr_color(0, 0, 0, 255);  //这部分的改动是由于高低分屏的背景色RGB不一致,需要做一下适配
+    //gr_color(0, 0, 0, 255);
+ if (HIGH_RESOLUTION_WIDTH == gr_fb_width())
+        gr_color(38, 40, 39, 255);
+    else
+        gr_color(0, 0, 0, 255);
+

     gr_fill(0, 0, gr_fb_width(), gr_fb_height());
 
     if (icon) {
@@ -379,9 +384,15 @@ void ScreenRecoveryUI::Init()
     text_cols = gr_fb_width() / char_width;
     if (text_cols > kMaxCols - 1) text_cols = kMaxCols - 1;
 
-    LoadBitmap("icon_installing", &backgroundIcon[INSTALLING_UPDATE]);
+    if (HIGH_RESOLUTION_WIDTH == gr_fb_width()) {
+        LoadBitmap("icon_hinstalling", &backgroundIcon[INSTALLING_UPDATE]);
+        LoadBitmap("icon_herror", &backgroundIcon[ERROR]);
+    } else {
+        LoadBitmap("icon_installing", &backgroundIcon[INSTALLING_UPDATE]);
+        LoadBitmap("icon_error", &backgroundIcon[ERROR]);
+    }

     backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE];
-    LoadBitmap("icon_error", &backgroundIcon[ERROR]);
+    //LoadBitmap("icon_error", &backgroundIcon[ERROR]);
     backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR];
 
     LoadBitmap("progress_empty", &progressBarEmpty);
@@ -406,12 +417,22 @@ void ScreenRecoveryUI::Init()
     if (installing_frames > 0) {
         installationOverlay = (gr_surface*)malloc(installing_frames *
                                                    sizeof(gr_surface));
-        for (i = 0; i < installing_frames; ++i) {
-            char filename[40];
-            // "icon_installing_overlay01.png",
-            // "icon_installing_overlay02.png", ...
-            sprintf(filename, "icon_installing_overlay%02d", i+1);
-            LoadBitmap(filename, installationOverlay+i);

+        if (HIGH_RESOLUTION_WIDTH == gr_fb_width()) {
+            for (i = 0; i < installing_frames; ++i) {
+                char filename[40];
+                // "icon_installing_overlay01.png",
+                // "icon_installing_overlay02.png", ...
+                sprintf(filename, "icon_installing_hoverlay%02d", i+1);
+                LoadBitmap(filename, installationOverlay+i);
+            }
+        } else {
+            for (i = 0; i < installing_frames; ++i) {
+                char filename[40];
+                // "icon_installing_overlay01.png",
+                // "icon_installing_overlay02.png", ...
+                sprintf(filename, "icon_installing_overlay%02d", i+1);
+                LoadBitmap(filename, installationOverlay+i);
+            }

         }
     } else {
         installationOverlay = NULL;


diff --git a/bootable/recovery/screen_ui.h b/bootable/recovery/screen_ui.h
index 1d5ff4b..3b170c9 100644
--- a/bootable/recovery/screen_ui.h
+++ b/bootable/recovery/screen_ui.h

@@ -22,6 +22,8 @@
 #include "ui.h"
 #include "minui/minui.h"
 
+#define HIGH_RESOLUTION_WIDTH 360
+

 // Implementation of RecoveryUI appropriate for devices with a screen
 // (shows an icon + a progress bar, text logging, menu, etc.)
 class ScreenRecoveryUI : public RecoveryUI {


第四步,修改bootloader首张图片的逻辑处理。之前做过调适,因为单单修改external下的该文件,bootloader阶段的第一屏图片显示不对,因此特意对bootloader中的代码做了再次处理。

--- a/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.c
+++ b/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.c

@@ -97,6 +97,12 @@ int check_logo_index_valid(unsigned int index, void * logo_addr, LOGO_PARA_T * l
 void fill_animation_logo(unsigned int index, void *fill_addr, void * dec_logo_addr, void * logo_addr, LCM_SCREEN_T phical_screen)
 {
     LOGO_PARA_T logo_info;
+
+    if (HIGH_RESOLUTION_WIDTH == phical_screen.width) {
+        if (CHARGER_OV_INDEX == index) index = HIGH_RESOLUTION_BASE + index -1;
+        else index = HIGH_RESOLUTION_BASE + index;
+    }
+

     if(check_logo_index_valid(index, logo_addr, &logo_info) != CHECK_LOGO_BIN_OK)
         return; 
               
diff --git a/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.h b/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.h
index 55aecaf..7dfb968 100644
--- a/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.h
+++ b/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.h

@@ -63,6 +63,7 @@ typedef struct {
     unsigned int inaddr;
 } LOGO_PARA_T;
 
+#define HIGH_RESOLUTION_WIDTH 360
 
 // version_0 animation
 #define ANIM_V0_REGIONS  4 


自此,适配工作大功告成,不过资源文件的diff没有上传,依个人情况做改动吧。。。。。。












  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值