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

来源:互联网 发布:艺恩数据 编辑:程序博客网 时间:2024/05/19 15:19

        目前的产品分辨率是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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小学生数学学不好怎么办 小学生不爱学英语怎么办 小学生基础知识没学好怎么办 小学生应用题学不明白怎么办 不提供纸质发票怎么办 餐厅不提供发票怎么办 餐馆不提供发票怎么办 星巴克小票丢了怎么办 手机发票丢了怎么办 天猫退货发票怎么办 店家不给发票怎么办 淘宝发票要收钱怎么办 个人卖水果怎么办发票 公司报销没发票怎么办 作废的发票丢失怎么办 淘宝上需要发票怎么办 淘宝发票掉了怎么办 购货方丢失发票怎么办 买手机没发票怎么办 员工报销没发票怎么办 餐饮发票超了怎么办 售后商家不发货怎么办 淘宝五天不发货怎么办 淘宝代购卖假怎么办 淘宝发虚假发货怎么办 天猫虚假签收怎么办 退款中自动确认怎么办 淘宝付款后代发怎么办 淘宝揽件超时怎么办 买单侠还钱不消条怎么办 买家迟迟不退款怎么办 淘宝买家不退款怎么办? 新车发票丢了怎么办 淘宝迟迟不发货怎么办? 淘宝发货太慢怎么办 买东西不开税票怎么办 亚马逊评论没了怎么办 阿里上被卖家投诉了怎么办 换货一直不发货怎么办 买家就是不退款怎么办 sdk拍照授权失败怎么办