不同分辨率的LCM进行兼容
1.讀取不同LCM ID的時序不同,如何處理?
2.開機后android會自動resize圖片資源的大小,但開機logo無法自行resize,如何操作?保證識別到不同分辨率的LCM后開機logo可以正常顯示
[Analysis]
1.?關于時序
JB版本中,接口disp_drv_get_lcm_driver實現compare id并獲取到lcm driver以及lcm param的動作,其工作流程如下
從上圖可以看到,對于DSI,每次嘗試讀取id之前都會根據lcm driver中的設置重新設置時序,所以擔心時序不同無法讀取id的擔心就顯得多余了
?
2.?關于開機logo
我們默認的做法,在ProjectConfig.mk中會定義Macro BOOT_LOGO方便在目錄\mediatek\custom\common\lk\logo中讀取到相應的資源,作為開機logo顯示。
這里的開機logo分為兩種,分別為U-boot logo以及kernel logo。我們分別討論這兩種logo的顯示原理
·?????????U-boot logo(and Battery logo)
U-boot logo是開機后的第一個界面,U-boot logo以及Battery logo會統一打包為logo.bin。對于JB版本,主要工作?流程如下
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,如下
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)_low_battery.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_charger_ov.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_0.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_1.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_2.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_3.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_4.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_5.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_6.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_7.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_8.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_9.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_num_percent.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_01.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_02.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_03.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_04.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_05.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_06.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_07.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_08.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_09.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_animation_10.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_01.raw \
?????? ?????$(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_02.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_03.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_04.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_05.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_06.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_07.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_08.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_09.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_10_10.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_bg.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_img.raw \
??????????? $(BOOT_LOGO_DIR)/$(BOOT_LOGO)/$(BOOT_LOGO)_bat_100.raw \
·?????????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目錄下。
?
[Solution]
對于U-boot logo,只需要將不同分辨率的圖片壓縮至logo.bin中,在讀取時根據不同的索引顯示相應的圖片即可
而對于Kernel logo,我們需要將不同分辨率的boot_logo raw data文件生成出來并copy到手機中,boot_logo_updater根據不同的分辨率進行識別,讀取相應的logo文件。
以qhd與hd720兩種分辨率相互兼容為例,方案大致如下,注意,logo的對應需要貴司自行完成
RESOURCE_OBJ_LIST :=?? \
??????????? $(BOOT_LOGO_DIR)/$qhd/$qhd_uboot.raw \
??????????????? …
??????????????? …
?????????$(BOOT_LOGO_DIR)/$hd720/$hd720_uboot.raw \
??????????????? …
??????????????? …
?
5.此步驟在不同的SW版本上修改的文件不同。在JB上,修改mediatek\custom\common\lk\logo\rules.mk修改如下內容:
#########################################################
ifneq ($(strip $(MTK_PLATFORM)),)
include $(CLEAR_VARS)
?
LOCAL_MODULE :=boot_logo_qhd
LOCAL_MODULE_TAGS :=user
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
??
#########################################################
ifneq ($(strip $(MTK_PLATFORM)),)
include $(CLEAR_VARS)
?
LOCAL_MODULE :=boot_logo_hd720
LOCAL_MODULE_TAGS :=user
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
在JB2上,在文件mediatek\external\boot_logo_updater\Android.mk中添加上述的內容,注意不要添加語句
LOCAL_MODULE_TAGS :=user,否則編譯不通過。
6.此步驟在不同的SW版本上修改方法不同。在JB上,\build\core\user_tags.mk中GRANDFATHERED_USER_MODULES增加boot_logo_qhd & boot_logo_hd720;在JB2上,\build\target\product\$Project.mk中PRODUCT_PACKAGES增加boot_logo_qhd & boot_logo_hd720
7.?在boot_logo_updater中首先定義兩種raw data的路徑,再在main函數中根據LCM的分辨率讀取相應的raw data文件
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的不同分辨率的LCM进行兼容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SD卡驱动分析(二)
- 下一篇: 开机logo切换逻辑深入研究