目前的产品分辨率是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没有上传,依个人情况做改动吧。。。。。。