歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 不同分辨率的LCM進行兼容

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目錄下。

 對於U-boot logo,只需要將不同分辨率的圖片壓縮至logo.bin中,在讀取時根據不同的索引顯示相應的圖片即可
 而對於Kernel logo,我們需要將不同分辨率的boot_logo raw data文件生成出來並copy到手機中,boot_logo_updater根據不同的分辨率進行識別,讀取相應的logo文件。
 以qhd與hd720兩種分辨率相互兼容為例,方案大致如下,注意,logo的對應需要貴司自行完成
lcm driver中實現compare id接口
U-boot logo壓縮,在mediatek\custom\common\lk\logo\rules.mk中,修改RESOURCE_OBJ_LIST列表,使用期望的分辨率代替BOOT_LOGO變量,(makefile中BOOT_LOGO的定義將無效)
RESOURCE_OBJ_LIST :=  \
            $(BOOT_LOGO_DIR)/$qhd/$qhd_uboot.raw \
                …
                …
        $(BOOT_LOGO_DIR)/$hd720/$hd720_uboot.raw \
                …
                …

記錄每組分辨率插入的raw data個數
mt_disp_show_boot_logo();函數中根據LCM的分辨率讀取相應id的uboot logo;對於ipo快速開機,請在目錄mediatek\external\ipod\bootlogo.cpp中的mt65xx_disp_show_boot_logo();做同樣的修改
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文件

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved