12.nvram_lcm_兼容

根据NVRAM固定地址的值,加载不同分辨率的屏驱动和logo
if(LVDS_SELECT_FLAG == 0x31)
  B116XAN023_LVDS  1366x768
}else{
  KD116N5_40NV_B12_MIPI 1368x768
}
相关文件:
M       frameworks/base/data/sounds/AllAudio.mk
M       frameworks/base/data/sounds/AudioPackageGo.mk
M       frameworks/base/data/sounds/bootanimation.zip
A       frameworks/base/data/sounds/bootanimation2.zip
M       kernel-4.4/drivers/misc/mediatek/lcm/B116XAN023_LVDS/B116XAN023_LVDS.c
M       system/core/init/init.cpp
M       vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/B116XAN023_LVDS/B116XAN023_LVDS.c
A       vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/fwxganl/
A       vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/fwxganl2/
M       vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk
M       vendor/mediatek/proprietary/bootable/bootloader/lk/lib/libshowlogo/cust_display.h       //普充动画的坐标
M       vendor/mediatek/proprietary/bootable/bootloader/lk/lib/libshowlogo/show_animation_common.c
                          fill_animation_battery_new-> fill_animation_logo()   //根据电量百分比显示第一张charging logo
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/common/storage/blkdev/combo_emmc_ufs_generic_inter.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/include/platform/mt_logo.h
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/load_image.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/mmc_common_inter.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/mt_battery.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/mt_logo.c
                           init_fb_screen->phical_screen.rotation   //lk&kernel logo方向
                          mt_disp_show_low_battery_warning-> fill_animation_logo () (lk\lib\libshowlogo\show_animation_common.c) 低电logo
                          mt_disp_show_boot_logo()-> fill_animation_logo()   //lk logo显示
M       vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/platform.c
M       vendor/mediatek/proprietary/bootable/bootloader/lk/project/tb8167p5_64_bsp.mk
M       vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8167p5_64_bsp/cust_leds.c   //设置开机亮度
                          backlight_default_level = LED_FULL
M       vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8167p5_64_bsp/include/target/cust_battery.h   //battery_profile_t2 电池曲线,用来显示第一张charging logo
M       vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8167p5_64_bsp/include/target/cust_display.h
M       vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8167p5_64_bsp/dct/dct/codegen.dws
M       vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/tb8167p5_64_bsp/dct/dct/codegen.dws
M       vendor/mediatek/proprietary/custom/tb8167p5_64_bsp/kernel/dct/dct/codegen.dws
M       vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp
                           anim_fb_init->phical_screen.rotation   //充电动画方向
                           show_kernel_logo->anim_show_logo   //kernel logo显示
M       vendor/mediatek/proprietary/external/libshowlogo/cust_display.h
M       vendor/mediatek/proprietary/external/libshowlogo/fast_charging_common.h   //快充动画坐标
M       vendor/mediatek/proprietary/external/libshowlogo/show_animation_common.c  
                           fill_animation_battery_fast_new->int display_width = phical_screen.width;  //Android 10的电量百分比方向
                                           ->int display_height = phical_screen.height;
                                           -> fill_animation_logo() (external/libshowlogo/show_animation_common.c) 充电动画显示
                           init_charging_animation_ui_dimension->lcm_width = vinfo.xres  //Android 11的电量百分比方向
                                             ->lcm_height = vinfo.yres;
M      vendor/mediatek/proprietary/external/libshowlogo/show_animation_common.c   //Android 11将cust_display.h的相关坐标定义移到这里
一.添加1366x768( FWXGA) 分辨率和logo
1.在lk\dev\logo新增fwxganl文件夹
//这个没有用到,只是保持一致性
2.bootable\bootloader\lk\lib\libshowlogo\cust_display.h
// add by Isaac for charging animation start   下面的index在第一张充电logo用到
#define COMPAT_LOGO_SHIFT                61        //add
#define FULL_BATTERY_INDEX   42         //37
#define LOW_BATTERY_WARNING_INDEX 60        //add
// add by Isaac for charging animation end
// show fast charging animation logo index Isaac add
#define FAST_CHARGING_BAT_100_INDEX   42
#define FAST_CHARGING_BAT_START_0_INDEX   43
#define FAST_CHARGING_NUM_START_0_INDEX   49
#define FAST_CHARGING_NUM_PERCENT_INDEX   59
//Isaac add
#elif defined(FWXGANL)   没有用到,只是保持一致性
        // kunkun wxganl 1366*768
        // battery capacity rectangle
        #define CAPACITY_LEFT                (601) // battery capacity center
        #define CAPACITY_TOP                 (249)
        #define CAPACITY_RIGHT               (764)//558+163
        #define CAPACITY_BOTTOM              (509)
        #define NUMBER_LEFT                  (628) // number
        #define NUMBER_TOP                   (79)
        #define NUMBER_RIGHT                 (673)//585+45
        #define NUMBER_BOTTOM                (143) //95+64
        #define PERCENT_LEFT                 (718) // percent number_left + 2*number_width
        #define PERCENT_TOP                  (79)
        #define PERCENT_RIGHT                (775) //675+57
        #define PERCENT_BOTTOM               (143)
        #define TOP_ANIMATION_LEFT           (601) // top animation
        #define TOP_ANIMATION_TOP            (100)
        #define TOP_ANIMATION_RIGHT          (764)
        #define TOP_ANIMATION_BOTTOM         (129)
        // for old animation
        #define BAR_LEFT            (568)
        #define BAR_TOP             (234)
        #define BAR_RIGHT           (798)
        #define BAR_BOTTOM          (656)
//这里为加载普充动画时的坐标
3.vendor\mediatek\proprietary\external\libshowlogo\cust_display.h
// add by Isaac for charging animation start   没有用到,只是保持一致性
#define COMPAT_LOGO_SHIFT                61        //add
#define FULL_BATTERY_INDEX   42         //37
#define LOW_BATTERY_WARNING_INDEX 60        //add
// add by Isaac for charging animation end
// show fast charging animation logo index   下面的index在快充动画阶段会用到
#define FAST_CHARGING_BAT_100_INDEX   42
#define FAST_CHARGING_BAT_START_0_INDEX   43
#define FAST_CHARGING_NUM_START_0_INDEX   49
#define FAST_CHARGING_NUM_PERCENT_INDEX   59
#elif defined(FWXGANL)
        // kunkun fwxganl 1366*768
        // battery capacity rectangle
        #define CAPACITY_LEFT                (601) // battery capacity center
        #define CAPACITY_TOP                 (249)
        #define CAPACITY_RIGHT               (764)//558+163
        #define CAPACITY_BOTTOM              (509)
        #define NUMBER_LEFT                  (628) // number
        #define NUMBER_TOP                   (79)
        #define NUMBER_RIGHT                 (673)//585+45
        #define NUMBER_BOTTOM                (143) //95+64
        #define PERCENT_LEFT                 (718) // percent number_left + 2*number_width
        #define PERCENT_TOP                  (79)
        #define PERCENT_RIGHT                (775) //675+57
        #define PERCENT_BOTTOM               (143)
        #define TOP_ANIMATION_LEFT           (601) // top animation
        #define TOP_ANIMATION_TOP            (100)
        #define TOP_ANIMATION_RIGHT          (764)
        #define TOP_ANIMATION_BOTTOM         (129)
        // for old animation
        #define BAR_LEFT            (568)
        #define BAR_TOP             (234)
        #define BAR_RIGHT           (798)
        #define BAR_BOTTOM          (656)
4.vendor\.0\proprietary\bootable\bootloader\lk\target\tb8167p5_64_bsp\include\target\cust_display.h
// show fast charging animation logo index   这个文件的似乎都没有用到,只是保持一致性
#define FULL_BATTERY_INDEX   42         //37
#define LOW_BATTERY_WARNING_INDEX 60        //add 
#define FAST_CHARGING_BAT_100_INDEX  42        //39
#define FAST_CHARGING_BAT_START_0_INDEX  43        //40
#define FAST_CHARGING_NUM_START_0_INDEX  49        //46
#define FAST_CHARGING_NUM_PERCENT_INDEX  59        //56
#elif defined(FWXGANL)
        //laiyw fwxganl 1366*768
        // battery capacity rectangle
        #define CAPACITY_LEFT                (595) // battery capacity center
        #define CAPACITY_TOP                 (254)
        #define CAPACITY_RIGHT               (769) //558+163
        #define CAPACITY_BOTTOM              (504)
        #define NUMBER_LEFT                  (624) // number
        #define NUMBER_TOP                   (91)
        #define NUMBER_RIGHT                 (672)//585+45
        #define NUMBER_BOTTOM                (152) //95+64
        #define PERCENT_LEFT                 (720) // percent number_left + 2*number_width
        #define PERCENT_TOP                  (91)
        #define PERCENT_RIGHT                (780) //675+57
        #define PERCENT_BOTTOM               (152)
        #define TOP_ANIMATION_LEFT           (595) // top animation
        #define TOP_ANIMATION_TOP            (96)
        #define TOP_ANIMATION_RIGHT          (769)
        #define TOP_ANIMATION_BOTTOM         (124)
        // for old animation
        #define BAR_LEFT            (560)
        #define BAR_TOP             (240)
        #define BAR_RIGHT           (806)
        #define BAR_BOTTOM          (614)
//添加快充动画坐标,和WXGANL参数一样,不然就会跑else,导致电量百分比显示错位
5.vendor\mediatek\proprietary\external\libshowlogo\fast_charging_common.h
#elif defined(FWXGANL)
#define TOP_MARGIN_RATIO     1.0/8
#define NUM_WIDTH_RATIO      1.0/20
#define NUM_HEIGHT_RATIO     1.0/8
#else
#define TOP_MARGIN_RATIO     2.0/10
#define NUM_WIDTH_RATIO      1.0/10
#define NUM_HEIGHT_RATIO     1.0/10
#endif
/*
*   Don't use brackets to enclose the definition of macro
*    TOP_MARGIN_RATIO, NUM_WIDTH_RATIO, NUM_HEIGHT_RATIO
*   elsewise, error value would be computed which will cause drawing number uncorrect
*/
#define LOGO_TOP_MARGIN(display_height)    ((int)((display_height) * TOP_MARGIN_RATIO))
#define LOGO_NUM_WIDTH(display_width)      ((int)((display_width) * NUM_WIDTH_RATIO))
#define LOGO_NUM_HEIGHT(display_height)    ((int)((display_height) * NUM_HEIGHT_RATIO))
至此,FWXGANL添加完毕,下面将其编译进来
---------------------------------------------------------------------------------------------------------------------
二.编译两种分辨率logo
由于暂时没有研究如何编译两个logo文件夹,故将两种logo都拷贝到同一文件夹fwxganl,仅通过名字区分
1.\vendor\mediatek\proprietary\bootable\bootloader\lk\project\tb8167p5_64_bsp.mk
BOOT_LOGO=fwxganl
BOOT_LOGO2=fwxganl2
2.\vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo\rules.mk
$(info BOOT_LOGO = $(BOOT_LOGO2))
EMPTY2 :=
UNDER_LINE2 := _
TEMP2 := $(strip $(subst $(UNDER_LINE2), $(EMPTY2), $(BOOT_LOGO2)))
COUNT2 := $(words $(TEMP2))
BASE_LOGO2 := $(word $(COUNT2),$(TEMP2))
EXIST := $(shell if [ -e $(BOOT_LOGO_DIR)/$(BASE_LOGO2) ]; then echo "exist"; else echo "noexist"; fi;)
ifeq ($(EXIST), "noexist")
  BASE_LOGO2 := $(BOOT_LOGO2)
endif
#注释下面两句,使用快充logo和动画(客户要求)
#ifeq ($(strip $(SUPPORT_PUMP_EXPRESS)), yes)
#endif
#增加下面61个logo,以后就可以使用偏移量61来加载不同的logo
RESOURCE_OBJ_LIST +=   \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_uboot.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_battery.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_low_battery.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_charger_ov.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_0.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_1.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_2.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_3.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_4.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_5.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_6.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_7.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_8.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_9.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_num_percent.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_01.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_02.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_03.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_04.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_05.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_06.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_07.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_08.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_09.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_animation_10.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_01.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_02.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_03.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_04.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_05.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_06.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_07.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_08.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_09.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_10_10.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_bg.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_img.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_bat_100.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_kernel.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_low_battery01.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_low_battery02.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_low_battery_remind.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_100.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-01.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-02.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-03.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-04.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-05.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_ani-06.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_00.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_01.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_02.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_03.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_04.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_05.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_06.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_07.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_08.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_09.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_fast_charging_percent.raw \
            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO2)_low_battery_warning.raw
---------------------------------------------------------------------------------------------------------------------
三. 添加NVRAM读取函数
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\load_image.c
// From the inside of the system partition proinfo file reads the specified logo characters. Returns 0 or 1
int  mboot_common_get_lvds_flag(void)
{
        unsigned long begin;
        long len;
#ifdef MTK_EMMC_SUPPORT
        unsigned long long start_addr;
        unsigned long long length;
#else
        unsigned long start_addr;
        unsigned long length;
#endif
        unsigned char lvds_flag = 0;
        part_t *part;
        part_dev_t *dev;
        part_hdr_t *part_hdr;
        char part_name[] = "proinfo";
        length = 1024;
        printf("Isaac [mboot_common_get_lvds_flag] enter! Read logo flag from proinfo\n");
         dev =  mt_part_get_device();   //先记住这个沙雕东西,等一下讲到
        if(! dev)
        {
                printf("Isaac [mboot_common_get_lvds_flag] can't get dev\n");
                return -ENODEV;
        }
        //mt_part_dump();
         part = mt_part_get_partition(" proinfo");
        if(! part)
        {
                printf("Isaac [mboot_common_get_lvds_flag] can't get proinfo\n");
                return -ENODEV;
        }
#ifdef  MTK_EMMC_SUPPORT  //yes
         start_addr = (u64)( part->start_sect) *  dev->blkdev->blksz;
         length = (u64) part->nr_sects *  dev->blkdev->blksz;
#else
        start_addr = part->start_sect * dev->blkdev->blksz;
        length = part->nr_sects * dev->blkdev->blksz;
#endif
        begin = get_timer(0);
        unsigned char * addr;
         length = 512;
         addr = (unsigned char *)malloc( length*sizeof(unsigned char));
        len =  dev->read( devstart_addr, (uchar*) addr, lengthpart->part_id);
        if(len < 0){
                printf("Isaac [mboot_common_get_lvds_flag] len=%d\n",len);
                len = -EIO;
                goto exit;
        }
        lvds_flag =  addr[64+40+40];
        printf("Isaac [mboot_common_get_lvds_flag] lvds_flag=%d\n",lvds_flag);
exit:
        if(part_hdr)
                free(part_hdr);
        return lvds_flag;  //0x31
}
-------------------------------------------------------------------------------------------------
四. 从lk 的屏驱动读取nvram的值
由于lvds屏和mipi屏都不用下初始化代码,上电也一样,所以只需要区分params
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\B116XAN023_LVDS\B116XAN023_LVDS.c
#define FRAME_WIDTH  (1366)
#define FRAME_HEIGHT (768)
#define FRAME_WIDTH_MIPI  (1368)
#define FRAME_HEIGHT_MIPI (768)
extern int  LVDS_SELECT_FLAG;
static void lcm_get_params(LCM_PARAMS *params)
{
        printf("LK Isaac [lcm_get_params] LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);
        if( LVDS_SELECT_FLAG == 0x31)
        {
                printf("[LK/LCM] [lcm_get_params]->B116XAN023_LVDS enter\n");
                memset(params, 0, sizeof(LCM_PARAMS));
                params->type   = LCM_TYPE_DPI;
                params->width  = FRAME_WIDTH;
                params->height = FRAME_HEIGHT;
                params->dpi.format            = LCM_DPI_FORMAT_RGB888;
                params->dpi.rgb_order         = LCM_COLOR_ORDER_RGB;
                params->dpi.clk_pol           = LCM_POLARITY_FALLING;
                params->dpi.de_pol            = LCM_POLARITY_RISING;
                params->dpi.vsync_pol         = LCM_POLARITY_FALLING;
                params->dpi.hsync_pol         = LCM_POLARITY_FALLING;
                params->dpi.hsync_pulse_width   = 16;
                params->dpi.hsync_back_porch    = 16;
                params->dpi.hsync_front_porch   = 32;
                params->dpi.vsync_pulse_width   = 2;
                params->dpi.vsync_back_porch    = 2;
                params->dpi.vsync_front_porch   = 4;
                params->dpi.width = FRAME_WIDTH;
                params->dpi.height = FRAME_HEIGHT;
                params->dpi.PLL_CLOCK           = 67;
                params->dsi.PLL_CLOCK = 150;
                params->dpi.ssc_disable = 1;
                params->dpi.lvds_tx_en = 1;
        }else{
                printf("[LK/LCM] [lcm_get_params]->KD116N5_40NV_B12_MIPI enter\n");
                memset(params, 0, sizeof(LCM_PARAMS));
                params->type                = LCM_TYPE_DSI;
                params->width                = FRAME_WIDTH_MIPI;
                params->height        = FRAME_HEIGHT_MIPI;
                params->dsi.mode = SYNC_PULSE_VDO_MODE;         //SYNC_PULSE_VDO_MODE  SYNC_EVENT_VDO_MODE  BURST_VDO_MODE  CMD_MODE
                // DSI
                // Command mode setting
                params->dsi.LANE_NUM                                = LCM_FOUR_LANE;
                //The following defined the fomat for data coming from LCD engine.
                params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;         //LCM_DSI_FORMAT_RGB565;        //LCM_DSI_FORMAT_RGB888;        //LCM_DSI_FORMAT_RGB666
                // Video mode setting               
                params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;         //LCM_PACKED_PS_16BIT_RGB565;        //LCM_PACKED_PS_24BIT_RGB888;        //LCM_PACKED_PS_18BIT_RGB666;        //;
                params->dsi.vertical_sync_active                        = 4;                //4;        //10;        //5;
                params->dsi.vertical_backporch                                = 32;        //12;        //20;        //48;
                params->dsi.vertical_frontporch                                = 32;        //20;        //20;        //48;
                params->dsi.vertical_active_line                                = FRAME_HEIGHT_MIPI;
                params->dsi.horizontal_sync_active                        = 8;                //20;        //10;        //20;
                params->dsi.horizontal_backporch                        = 160;        //20;        //36;        //120;
                params->dsi.horizontal_frontporch                        = 80;        //20;        //60;        //120;
                params->dsi.horizontal_active_pixel                = FRAME_WIDTH_MIPI;
                /*params->dsi.vertical_sync_active                                = 10;        //16;//4;        //4;
                params->dsi.vertical_backporch                                = 16;        //16;//40;        //10;
                params->dsi.vertical_frontporch                                = 12;        //32;//46;        //6;
                params->dsi.vertical_active_line                                = FRAME_HEIGHT;
                params->dsi.horizontal_sync_active                        =  42;        //2;//10;        //6;
                params->dsi.horizontal_backporch                        =  84;        //2;//94;        //40;
                params->dsi.horizontal_frontporch                        =  68;        //4;//100;        //68;
                params->dsi.horizontal_active_pixel                = FRAME_WIDTH;*/
                params->dsi.PLL_CLOCK = 210;        //210;        //200;
                params->dsi.cont_clock = 1;
                params->dsi.ssc_disable = 1;
        }
}
/*我们可以先在platform.c 定义LVDS_SELECT_FLAG,然后让mboot_common_get_lvds_flag返回一个固定值0x31,在lk屏驱动直接调用mboot_common_get_lvds_flag,获取LVDS_SELECT_FLAG,
   然后将LVDS_SELECT_FLAG添加到cmdline当中,先打通LVDS_SELECT_FLAG从lk->kernel的传递*/
extern int  mboot_common_get_lvds_flag(void);
LVDS_SELECT_FLAG =  mboot_common_get_lvds_flag();
这个只是测试,打通之后,mboot_common_get_lvds_flag()最好在platform.c当中调用
-------------------------------------------------------------------------------------------------
五. 将LVDS_SELECT_FLAG添加到cmdline当中
mt_boot_init->boot_linux_from_storage->boot_linux-> boot_linux_fdt
extern int LVDS_SELECT_FLAG; //Isaac add
int  boot_linux_fdt(void *kernel, unsigned *tags,
                   unsigned machtype,
                   void *ramdisk, unsigned ramdisk_sz)
{
  ...
  /* Append androidboot.serialno=xxxxyyyyzzzz in cmdline */
        snprintf(tmpbuf, TMPBUF_SIZE, "%s%s", "androidboot.serialno=", sn_buf);
        cmdline_append(tmpbuf);
         /*Isaac add lvds flag*/
        printf("Isaac [boot_linux_fdt] get LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);
        snprintf(tmpbuf, TMPBUF_SIZE, "%s%d", "lvds_select_flag=", LVDS_SELECT_FLAG);
        cmdline_append(tmpbuf);
}
通过uart_log可以看到lvds_select_flag的值已经成功保存到cmdline
(190418_21:09:30.218)[1392] g_cmdline size: 869
(190418_21:09:30.218)[1392] cmdline: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_clas
(190418_21:09:30.218)[1394]        : s.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-
(190418_21:09:30.218)[1396]        : 0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.
(190418_21:09:30.218)[1398]        : slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9
(190418_21:09:30.294)[1400]        : bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_
(190418_21:09:30.294)[1401]        : uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEF lvds_select_flag=49 androidboot
(190418_21:09:30.294)[1403]        : .bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000
(190418_21:09:30.372)[    0.000000] <0>-(0)[0:swapper]KernelKernel command line: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_class.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEF lvds_select_flag=49 androidboot.bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000
-------------------------------------------------------------------------------------------------
六. 在kenel 屏驱动获取 LVDS_SELECT_FLAG
kernel-4.4\drivers\misc\mediatek\lcm\B116XAN023_LVDS\B116XAN023_LVDS.c
int LVDS_SELECT_FLAG=0;
#define FRAME_WIDTH  (1366)
#define FRAME_HEIGHT (768)
#define FRAME_WIDTH_MIPI  (1368)
#define FRAME_HEIGHT_MIPI (768)
static int __init get_lvds_select_flag(char *str)
{
        get_option(&str, &LVDS_SELECT_FLAG);
        //LVDS_SELECT_FLAG = simple_strtol(str, NULL, 0);
        return 1;
}
__setup("lvds_select_flag=", get_lvds_select_flag);
__setup是一个宏,用来指导建立obs_kernel_param结构,并编译到内核特定段中。
在内核启动时,将取出obs_kernel_param结构并执行其中的函数。
get_option的原型:
/kernel-4.4/lib/cmdline.c
int get_option(char **str, int *pint)
{
	char *cur = *str;

	if (!cur || !(*cur))
		return 0;
	*pint = simple_strtol(cur, str, 0);
	if (cur == *str)
		return 0;
	if (**str == ',') {
		(*str)++;
		return 2;
	}
	if (**str == '-')
		return 3;

	return 1;
}
EXPORT_SYMBOL(get_option);
其实就是调用了simple_strtol函数:
/**
 * simple_strtol - convert a string to a signed long
 * @cp: The start of the string
 * @endp: A pointer to the end of the parsed string will be placed here
 * @base: The number base to use
 *
 * This function is obsolete. Please use kstrtol instead.
 */
long simple_strtol(const char *cp, char **endp, unsigned int base)
{
	if (*cp == '-')
		return -simple_strtoul(cp + 1, endp, base);

	return simple_strtoul(cp, endp, base);
}
EXPORT_SYMBOL(simple_strtol);
注释写的很清楚,该函数就是将一个字符串转换为signed long
接着,和lk一样,修改lcm_get_params函数,通过不同的LVDS_SELECT_FLAG加载不同的参数
-------------------------------------------------------------------------------------------------
七. 将lvds_select_flag的值保存在ro.lvds.selectflag当中
system\core\init\init.cpp
static void import_kernel_nv(const std::string& key, const std::string& value, bool for_emulator) {
    if (key.empty()) return;
    if (for_emulator) {
        // In the emulator, export any kernel option with the "ro.kernel." prefix.
        property_set("ro.kernel." + key, value);
        return;
    }
    if (key == "qemu") {
        strlcpy(qemu, value.c_str(), sizeof(qemu));
    } else if (android::base::StartsWith(key, "androidboot.")) {
        property_set("ro.boot." + key.substr(12), value);
    }  else if(key == "lvds_select_flag"){
       // PLOG(ERROR) << "Isaac ro.lvds.selectflag FOUND! value=" << value;
       property_set("ro.lvds.selectflag",value);
   }
}
至此,lvds_select_flag的值从lk->kernel->system已经传递完成
-------------------------------------------------------------------------------------------------
八. 从NVRAM读取实际LVDS_SELECT_FLAG的值
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\platform.c
extern  get_battery_capacity(); // add by xuce
static kal_bool  backlight_flag = KAL_TRUE;//xuce_backlight
int  LVDS_SELECT_FLAG = 0;
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
int kernel_charging_boot(void)
{
        if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) && upmu_is_chr_det() == KAL_TRUE) {
                printf("Isaac [%s] Kernel Power Off Charging with Charger/Usb \n", __func__);
                return  1;
        } else if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) && upmu_is_chr_det() == KAL_FALSE) {
                printf("Isaac [%s] Kernel Power Off Charging without Charger/Usb \n", __func__);
                 backlight_flag = KAL_FALSE;//xuce add for judge backlight
                return -1;
        } else
                return 0;
}
#endif
//mmc_legacy_init
extern int  mboot_common_get_lvds_flag(void);
void  platform_init(void)
{
/*****************************************************************/
#ifdef MTK_EMMC_SUPPORT
        mmc_legacy_init(1);        //Isaac add
#endif
  /*从代码结合uart_log跟踪boot流程,可以发现,在platform_init开启了两个线程, disp_thread_routine线程中的mt_disp_get_vram_size函数最终会调用到 get_params
     所以我们必须在此之前就拿到LVDS_SELECT_FLAG的值*/
        LVDS_SELECT_FLAG =  mboot_common_get_lvds_flag();        //Isaac add
/*****************************************************************/
         //disp_thread_routine->mt_disp_get_vram_size->DISP_GetVRamSize->DISP_GetFBRamSize->DISP_GetScreenWidth->primary_display_get_width->disp_lcm_probe->get_params
        THREAD CREATE
        thread_resume(thread_create("disp", & disp_thread_routine, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
        thread_resume(thread_create("storage", & storage_thread_routine, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
#ifdef LK_PROFILING
        time_boot_mode = get_timer(0);
#endif
        boot_mode_select();
#ifdef LK_PROFILING
        dprintf(INFO, "[PROFILE] ------- boot mode select takes %d ms -------- \n", (int)get_timer(time_boot_mode));
#endif
#ifndef MACH_FPGA
         mt65xx_bat_init();
#endif
if (kernel_charging_boot() == 1) {
                        mt_disp_power(TRUE);
// modify by xuce laiyw start Isaac
                         //mt_disp_show_low_battery();
                         mt_disp_show_battery_capacity(get_battery_capacity());
// modify by xuce end
                        mt65xx_leds_brightness_set(6, 110);
        } else if (g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT && g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) {
                if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) {
                        mt_disp_show_boot_logo();
                }
        }
#ifndef MACH_FPGA
                dprintf(CRITICAL,"xuce_debug: g_boot_mode = %d,backlight_flag=%d\n", g_boot_mode,backlight_flag);
                if( backlight_flag){
                        mt65xx_backlight_on();  //xuce_backlight
                }
#endif
                //pwm need display sof
                mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  sw_env();
}
接着从uart_log发现个问题,LVDS_SELECT_FLAG的值不正确,原因是mt_part_get_device的返回值为NULL,对,就是前面说的那个沙雕函数
(190422_15:05:13.493)Isaac [ mboot_common_get_lvds_flag] enter!
(190422_15:05:13.493)Read logo flag from pro_info
(190422_15:05:13.494)Isaac [ mt_part_get_device] enter!
(190422_15:05:13.494) mt_part_dev not exit
(190422_15:05:13.494)mt_part_dev->init_dev not exit
(190422_15:05:13.568)mt_part_dev->init=0
(190422_15:05:13.568)Isaac [ mboot_common_get_lvds_flag] can't get dev
(190422_15:05:13.568)[62] [DISP]func|disp_lcm_probe
(190422_15:05:13.568)Isaac [disp_lcm_probe] _lcm_count()=1
(190422_15:05:13.568)LK Isaac [lcm_get_params] LVDS_SELECT_FLAG=-19
跟踪代码可以发现只有在mmc_legacy_init()->mt_part_register_device()的时候mt_part_dev才会赋值,
所以在获取LVDS_SELECT_FLAG之前,需要执行mmc_legacy_init
而mmc_legacy_init函数是在线程storage_thread_routine里才执行,
所以需要将storage_thread_routine中的mmc_legacy_init注释掉,将mmc_legacy_init放在platform_init里,提前执行。
alps\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\mmc_common_inter.c
int mmc_legacy_init(u32 verbose)
{
  u32 id = verbose - 1;
  if (id != -1) {
  /* FIXME. only one RAW_BOOT dev */
                if (host->boot_type == RAW_BOOT) {
                    boot_dev.id = id;
                    boot_dev. init = 1;
                    boot_dev.blkdev = bdev;
                                boot_dev.erase = mmc_do_erase;
                                printf("Isaac [mmc_legacy_init] before mt_part_register_device\n");
                     mt_part_register_device(& boot_dev);
                    boot_dev_found = 1;
                    MSDC_TRC_PRINT(MSDC_INFO,("[SD%u] boot device found\n", id));
                } else if (host->boot_type == FAT_BOOT) {
                    #if (CONFIG_COMMANDS & CFG_CMD_FAT)
                    if (0 == fat_register_device(bdev, 1)) {
                        boot_dev_found = 1;
                        MSDC_TRC_PRINT(MSDC_INFO,("[SD%u] FAT partition found\n",id));
                    }
                    #endif
                }
  }
}
\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\common\storage\blkdev\combo_emmc_ufs_generic_inter.c
int  mt_part_register_device(part_dev_t * dev)
{
        dprintf(CRITICAL,"Isaac blkdev [mt_part_register_device]\n");
        if (!mt_part_dev) {
                if (!dev->read) {
                        dev->read = mt_part_generic_read;
                }
                if (!dev->write) {
                        dev->write = mt_part_generic_write;
                }
                if (!dev->erase) {
                        dev->erase = mt_part_generic_erase;
                }
                 mt_part_dev =  dev;  //
                mutex_init(&g_part_lock);
                mt_part_buf = (uchar*)memalign(PART_BUF_ALIGN_SIZE, dev->blkdev->blksz * 2);
                if (mt_part_buf == NULL) {
                        dprintf(CRITICAL, "allocate %lu buffer fail!\n", dev->blkdev->blksz * 2);
                }
                if (part_init(dev)) {
                        dprintf(CRITICAL,"partition init error!\n");
                }
        }
        return 0;
}
\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\common\storage\blkdev\combo_emmc_ufs_generic_inter.c
part_dev_t * mt_part_get_device(void)
{
        printf("Isaac [mt_part_get_device] enter!\n");
  /********Isaac add for test start********/
        if( mt_part_dev){
                printf("mt_part_dev exit\n");       
        }else{
                printf("mt_part_dev not exit\n");       
        }
        if(mt_part_dev->init_dev){     //init_dev没有用到,一直都是not exit
                printf("mt_part_dev->init_dev exit\n");       
        }else{
                printf("mt_part_dev->init_dev not exit\n");       
        }
        printf("Isaac mt_part_dev->init=%d\n",mt_part_dev->init);
  /********Isaac add for test end********/
        if (mt_part_dev && !mt_part_dev->init && mt_part_dev->init_dev) {
                mt_part_dev->init_dev(mt_part_dev->id);
                mt_part_dev->init = 1;
        }
        return  mt_part_dev;
}
至此,屏id已经能从nvram正确读取,并且从lk、kernel、android都能获取到相应的值,
下面我们就根据不同的id,修改开机log、充电logo
-------------------------------------------------------------------------------------------------
4.在mt_battery.c 定义相关函数,修改充电逻辑
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\include\platform\mt_logo.h
// add by xuce for charging animation start Isaac
void  mt_disp_show_low_battery_warning(void);
// add by xuce for charging animation end Isaac
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\mt_logo.c
/*
* Initliaze charging animation parameters
*
*/
void init_fb_screen()
{
 //修改lk和kernel logo显示方向,如果有需要的话
   if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3))
    {
        phical_screen.rotation = 0; // 270 alter by Arvin
    } else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "90", 2)){
        phical_screen.rotation = 90;
    } else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3) && (phical_screen.need180Adjust == 1)){
        phical_screen.rotation = 180;  
    } else {
        phical_screen.rotation = 0;   //Isaac boot lk&kernel logo big rotation
    }
}
extern int LVDS_SELECT_FLAG;        //Isaac add
extern int mboot_common_get_lvds_flag(void);
void mt_disp_show_boot_logo(void)
{
    //dprintf(0, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__); 
        printf("Isaac [mt_disp_show_boot_logo]\n");
    mt_logo_get_custom_if();
    if(logo_cust_if->show_boot_logo)
    {
        logo_cust_if->show_boot_logo();
    }
    else
    {
        ///show_logo(0);
        init_fb_screen();
         //Isaac modified
         if(LVDS_SELECT_FLAG == 0x31){
                fill_animation_logo(BOOT_LOGO_INDEX, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
        }else{
                 fill_animation_logo(BOOT_LOGO_INDEX+COMPAT_LOGO_SHIFT, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
         }
         //Isaac modified
        mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
    }
    return;
}
mt_disp_show_charger_ov_logomt_disp_show_low_battery也要根据id进行相应的修改
 
  
 
  
 
  
---------------------------------------------------------------------------------------------------------------------
下面这些函数和lcm兼容没什么关系,主要修改了以下几点:
1. 增加mt_disp_show_low_battery_warning,低电无法开机时也显示3秒低电logo
2.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
---------------------------------------------------------------------------------------------------------------------
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\mt_logo.c
/*
 * Show full battery when poweroff charging
 *
 */
void mt_disp_show_battery_full(void)
{
    dprintf(0, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
    mt_disp_show_battery_capacity(100);
}
/*
* Show animation when poweroff charging
* 这个函数是公版的,公版只有mt_disp_show_battery_full调用了
*/
void  mt_disp_show_battery_capacity(UINT32 capacity)
{
    dprintf(0, "[lk logo: %s %d]capacity =%d\n",__FUNCTION__,__LINE__, capacity);
    mt_logo_get_custom_if();
    if(logo_cust_if->show_battery_capacity)
    {
        logo_cust_if->show_battery_capacity(capacity);
    }
    else
    {   
        init_fb_screen();
        fill_animation_battery_by_ver(capacity, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen, show_animationm_ver);           
        mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
    }
}
// add by xuce laiyw for low battery warning  start Isaac
/*
* Show low battery warning logo
LOW_BATTERY_WARNING_INDEX是我们新加的,让低电无法开机时也显示3秒低电logo
*/
void  mt_disp_show_low_battery_warning(void)
{
    dprintf(0, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
    mt_logo_get_custom_if();
    if(logo_cust_if->show_boot_logo)
    {
        logo_cust_if->show_boot_logo();
    }
    else
    {
        init_fb_screen();
        //show_logo(2);
        //Isaac modified
        if(LVDS_SELECT_FLAG == 0x31)
        {
                fill_animation_logo(LOW_BATTERY_WARNING_INDEX, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
        }else{
                fill_animation_logo(LOW_BATTERY_WARNING_INDEX+COMPAT_LOGO_SHIFT, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
        }
        //Isaac modified
        mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
    }
    return;
}
// add by xuce for low battery warning  end
vendor\mediatek\proprietary\bootable\bootloader\lk\target\tb8167p5_64_bsp\include\target\cust_battery.h
/************Isaac add***************/
typedef struct _BATTERY_PROFILE_STRUCT {
        signed int percentage;
        signed int voltage;
} BATTERY_PROFILE_STRUCT, *BATTERY_PROFILE_STRUCT_P;
BATTERY_PROFILE_STRUCT  battery_profile_t2[] = {
{        0        ,        4182        },
{        1        ,        4170        },
{        2        ,        4159        },
{        3        ,        4148        },
{        4        ,        4138        },
{        5        ,        4128        },
{        6        ,        4118        },
{        7        ,        4109        },
{        8        ,        4099        },
{        9        ,        4090        },
{        10        ,        4081        },
{        11        ,        4073        },
{        12        ,        4065        },
{        14        ,        4056        },
{        15        ,        4046        },
{        16        ,        4037        },
{        17        ,        4027        },
{        18        ,        4018        },
{        19        ,        4009        },
{        20        ,        4001        },
{        21        ,        3994        },
{        22        ,        3988        },
{        23        ,        3981        },
{        24        ,        3975        },
{        25        ,        3968        },
{        26        ,        3961        },
{        27        ,        3955        },
{        28        ,        3949        },
{        29        ,        3942        },
{        30        ,        3936        },
{        31        ,        3930        },
{        32        ,        3924        },
{        33        ,        3919        },
{        34        ,        3913        },
{        35        ,        3907        },
{        36        ,        3901        },
{        37        ,        3895        },
{        38        ,        3887        },
{        39        ,        3878        },
{        41        ,        3867        },
{        42        ,        3857        },
{        43        ,        3848        },
{        44        ,        3841        },
{        45        ,        3836        },
{        46        ,        3831        },
{        47        ,        3827        },
{        48        ,        3823        },
{        49        ,        3819        },
{        50        ,        3816        },
{        51        ,        3812        },
{        53        ,        3809        },
{        55        ,        3806        },
{        56        ,        3803        },
{        57        ,        3800        },
{        59        ,        3797        },
{        60        ,        3795        },
{        61        ,        3792        },
{        63        ,        3790        },
{        64        ,        3789        },
{        65        ,        3787        },
{        66        ,        3785        },
{        67        ,        3783        },
{        69        ,        3781        },
{        71        ,        3779        },
{        73        ,        3778        },
{        74        ,        3777        },
{        76        ,        3776        },
{        77        ,        3774        },
{        79        ,        3772        },
{        80        ,        3768        },
{        82        ,        3766        },
{        83        ,        3763        },
{        85        ,        3760        },
{        86        ,        3757        },
{        89        ,        3753        },
{        91        ,        3749        },
{        92        ,        3745        },
{        94        ,        3743        },
{        95        ,        3723        },
{        96        ,        3704        },
{        97        ,        3676        },
{        98        ,        3622        },
{        99        ,        3576        },
{        100        ,        3516        },
{        101        ,        3516        }
};
/*************Isaac add**************/
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8167\mt_battery.c
//Isaac add
static int g_diso_state = 0;
static int g_vdc_state = 0;
#if defined(GOPO_CHARGING)
        static int g_vpogo_state = 0;
#endif
void  pchr_turn_on_charging(kal_bool bEnable)
{
        unsigned int is_standard_charge;        //Isaac add
        //force leave USBDL mode
        mt6392_upmu_set_rg_usbdl_rst(1);
        kick_charger_wdt();
       //硬件设计,当usb短路输入时(标准充电),会把gpio69拉高,这里获取gpio的状态,改变充电电流
        is_standard_charge = mt_get_gpio_in(69);        //Isaac add 
        printf("Isaac CHR_Type_num = %d,is_standard_charge = %d\n",CHR_Type_num,is_standard_charge);        //Isaac add
        if (bEnable) {  //由于dc的输入并不会拉高gpio69,这里还要结合判断vdc的状态
  #if defined(GOPO_CHARGING)
          if (is_standard_charge || g_vdc_state || g_vpogo_state){
  #else
          if (is_standard_charge || g_vdc_state){        //CHR_Type_num == STANDARD_CHARGER || CHR_Type_num == CHARGING_HOST){
  #endif
                        printf("xiaohonghong 900ma,\n");
                        mt6392_upmu_set_rg_cs_vth(0x07);        //900mA        // CS_VTH, 800mA 0x08
                }else{
                        printf("xiaohonghong 450ma\n");
                        mt6392_upmu_set_rg_cs_vth(0x0C);        // CS_VTH, 450mA 0xC
                }
        }
  ... ...
}
// add by xuce for charging animation start Isaac
int  get_battery_capacity()
{
        int vol;
        int t2_size;
        BATTERY_PROFILE_STRUCT *temp =  battery_profile_t2;
        int capacity = 0;
        int i;
        #if defined(SWCHR_POWER_PATH)
                vol = get_i_sense_volt(1);
        #else
                vol = get_bat_sense_volt(1);
        #endif
        if( vol > temp[0].voltage){
                //printf("%s capacity = 100\n", __FUNCTION__);
                return 100;
        }else if( vol < BATTERY_LOWVOL_THRESOLD ){
                return 0;
        }else{
                t2_size = sizeof( battery_profile_t2) / sizeof(BATTERY_PROFILE_STRUCT);
                //printf("%s size=%d", __FUNCTION__, t2_size);
                for(i=0; i<t2_size-1; i++){               
                        //printf("%s voltage=%d voltage[i]=%d  voltage[i+1]=%d \n", __FUNCTION__, vol, temp[i].voltage, temp[i+1].voltage);
                        if(vol >= temp[i+1].voltage && vol <= temp[i].voltage){
                                //printf("%s return capacity=%d\n", __FUNCTION__, temp[i].percentage);
                                capacity = 100 - temp[i].percentage;
                                if(capacity < 0){
                                        capacity = 0;
                                }
                        }
                }
        }
        return capacity;
}
// add by xuce for charging animation end
//Isaac add
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); //要使用该函数,需要将mtk_auxadc.c编译进来
static unsigned int  diso_get_current_voltage(int Channel)
{
        int ret = 0, data[4], i, ret_value = 0, ret_temp = 0, times = 5;
        //Isaac removed
        /*if (IMM_IsAdcInitReady() == 0) {
                battery_log(BAT_LOG_FULL, "[DISO] AUXADC is not ready");
                return 0;
        }*/
        i = times;
        while (i--) {
                ret_value = IMM_GetOneChannelValue(Channel, data, &ret_temp);
                if (ret_value == 0) {
                        ret += ret_temp;
                } else {
                        times = times > 1 ? times - 1 : 1;
                        dprintf(ALWAYS, "[diso_get_current_voltage] ret_value=%d, times=%d\n",
                        ret_value, times);
                }
        }
        ret = ret*1500/4096;
        ret = ret/times;
        return  ret;
}
static void  diso_get_current_state(void)
{
        int vdc_vol = 0, vusb_vol = 0, vpogo_vol = 0;
        int vdc_state = 0, vusb_state = 0, vpogo_state = 0;
        vdc_vol = diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL);
        //printk("Isaac [_get_polling_state] vdc_vol = %d\n",vdc_vol);
        vdc_vol = (R_DISO_DC_PULL_UP + R_DISO_DC_PULL_DOWN)*100*vdc_vol/(R_DISO_DC_PULL_DOWN)/100;
        printf("Isaac LK [_get_polling_state] vdc_vol=%dmV,VDC_MIN_VOLTAGE=%d,VDC_MAX_VOLTAGE=%d\n",vdc_vol,VDC_MIN_VOLTAGE,VDC_MAX_VOLTAGE);
        vusb_vol = diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL);
        //printk("Isaac [_get_polling_state] vusb_vol = %d\n",vusb_vol);
        vusb_vol = (R_DISO_VBUS_PULL_UP + R_DISO_VBUS_PULL_DOWN)*100*vusb_vol/(R_DISO_VBUS_PULL_DOWN)/100;
        printf("Isaac LK [_get_polling_state] vusb_vol=%dmV,VBUS_MIN_VOLTAGE=%d,VBUS_MAX_VOLTAGE=%d\n",vusb_vol,VBUS_MIN_VOLTAGE,VBUS_MAX_VOLTAGE);
        vpogo_vol = diso_get_current_voltage(AP_AUXADC_DISO_VPOGO_CHANNEL);
        vpogo_vol = (R_DISO_POGO_PULL_UP + R_DISO_POGO_PULL_DOWN)*100*vpogo_vol/(R_DISO_POGO_PULL_DOWN)/100;
        printf("Isaac LK [_get_polling_state] vpogo_vol=%dmV,VPOGO_MIN_VOLTAGE=%d,VPOGO_MAX_VOLTAGE=%d\n",vpogo_vol,VPOGO_MIN_VOLTAGE,VPOGO_MAX_VOLTAGE);
        if (vdc_vol > VDC_MIN_VOLTAGE/1000 && vdc_vol < VDC_MAX_VOLTAGE/1000){
                vdc_state = 1;
                g_vdc_state = 1;
        }else{
                g_vdc_state = 0;
        }
        if (vusb_vol > VBUS_MIN_VOLTAGE/1000 && vusb_vol < VBUS_MAX_VOLTAGE/1000) {
                vusb_state = 1;
        }       
        if (vpogo_vol > VPOGO_MIN_VOLTAGE/1000 && vpogo_vol< VPOGO_MAX_VOLTAGE/1000){
                vpogo_state = 1;
  #if defined(GOPO_CHARGING)
                g_vpogo_state = 1;
        }else{
                g_vpogo_state = 0;
  #endif
        }
        if(vdc_state || vusb_state || vpogo_state){
                g_diso_state = 1;
        }else{
                g_diso_state = 0;
        }
        printf("Isaac vdc_state=%d,vusb_state=%d,vpogo_state=%d,g_diso_state=%d\n",vdc_state,vusb_state,vpogo_state,g_diso_state);
}
//Isaac add
//enter this function when low battery with charger
void  check_bat_protect_status()
{
        kal_int32 bat_val = 0;
#if defined(SWCHR_POWER_PATH)
        bat_val = get_i_sense_volt(1);
#else
        bat_val = get_bat_sense_volt(1);
#endif
        dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, start charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD);
        if (bat_val < BATTERY_LOWVOL_THRESOLD)
                mt65xx_leds_brightness_set(MT65XX_LED_TYPE_RED, LED_FULL);
        while (bat_val < BATTERY_LOWVOL_THRESOLD + BATTERY_CHARGING_VOLTAGE_RAISE) {
                mtk_wdt_restart();
                //if (upmu_is_chr_det() == KAL_FALSE) {        //Isaac removed
                //upmu_is_chr_det();        //        for test
                 diso_get_current_state();                                //Isaac add
                if(! g_diso_state){                                                //Isaac add
                        dprintf(CRITICAL, "[BATTERY] No Charger, Power OFF !\n");
                        mt6575_power_off();
                        while (1);
                }else {
                        printf("[check_bat_protect_status] Charger exit\n");
                }
                pchr_turn_on_charging(KAL_TRUE);
                mdelay(5000);
#if defined(SWCHR_POWER_PATH)
                pchr_turn_on_charging(KAL_FALSE);
                mdelay(100);
                bat_val = get_i_sense_volt(1);
#else
                bat_val = get_bat_sense_volt(1);
                dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD + BATTERY_CHARGING_VOLTAGE_RAISE);
#endif
        }
        dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, stop charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD + BATTERY_CHARGING_VOLTAGE_RAISE);
}
kal_bool  is_low_battery(kal_int32  val)
{
        static UINT8 g_bat_low = 0xFF;
        int battery_lowvol_threshold = BATTERY_LOWVOL_THRESOLD;
        //low battery only justice once in lk
        if (0xFF != g_bat_low)
                return g_bat_low;
        else
                g_bat_low = FALSE;
#if defined(SWCHR_POWER_PATH)
        if (0 == val)
                val = get_i_sense_volt(1);
#else
        if (0 == val)
                val = get_bat_sense_volt(1);
#endif
//add for vol raise
        diso_get_current_state();
        if (g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && g_diso_state) {
                battery_lowvol_threshold += BATTERY_CHARGING_VOLTAGE_RAISE;
                printf("%s, charging, low battery threshold is %d mV\n", __FUNCTION__, battery_lowvol_threshold);
        }
//add for vol raise
        if (val < battery_lowvol_threshold) {
                printf("%s, TRUE\n", __FUNCTION__);
                g_bat_low = 0x1;
        }
        if (FALSE == g_bat_low)
                printf("%s, FALSE\n", __FUNCTION__);
        return g_bat_low;
}
void  mt65xx_bat_init(void)
{
        kal_int32 bat_vol;
        int battery_screenon_threshold = BATTERY_SCREENON_THRESOLD;        //add for vol raise
        // Low Battery Safety Booting
#if defined(SWCHR_POWER_PATH)
        bat_vol = get_i_sense_volt(1);
#else
        bat_vol = get_bat_sense_volt(1);
#endif
        if (upmu_is_chr_det() == KAL_TRUE)
                CHR_Type_num = mt_charger_type_detection();
        pchr_turn_on_charging(KAL_TRUE);
        dprintf(CRITICAL, "[mt65xx_bat_init] check VBAT=%d mV with %d mV\n", bat_vol, BATTERY_LOWVOL_THRESOLD);
        if (g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (mt6392_upmu_get_pwrkey_deb()==0) ) {
                dprintf(CRITICAL, "[mt65xx_bat_init] KPOC+PWRKEY => change boot mode\n");
                g_boot_reason_change = true;
        }
        rtc_boot_check(false);
#ifndef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION
        if ( is_low_battery(bat_vol))
        {
                printf("Isaac [mt65xx_bat_init] g_boot_mode=%d\n",g_boot_mode);
//add for vol raise
                diso_get_current_state();
                if (g_diso_state) {
                        battery_screenon_threshold += BATTERY_CHARGING_VOLTAGE_RAISE;
                        printf("%s, charging, screen on threshold is %d mV\n", __FUNCTION__, battery_screenon_threshold);
                }
//add for vol raise
                if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_boot_mode == RECOVERY_BOOT) && upmu_is_chr_det() == KAL_TRUE) {  // add RECOVERY_BOOT
                        dprintf(CRITICAL, "Isaac [%s] Kernel Low Battery Power Off Charging Mode,bat_vol=%d,battery_screenon_threshold=%d\n", __func__,bat_vol,battery_screenon_threshold);
                        g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT;
                         check_bat_protect_status();
                        return;
                } else {
// add by xuce laiyw for 3.4v - 3.54v show low battery logo 3 second when no DC plus in start
             if(bat_vol >= battery_screenon_threshold){
                              mt_disp_show_low_battery_warning();
                            mt65xx_backlight_on();
                            mdelay(3000);
                            mt65xx_backlight_off();
             }
//add by xuce for 3.4v - 3.6v show low battery logo 3 second when no DC plus in end
                        dprintf(CRITICAL, "[BATTERY] battery voltage(%dmV) <= CLV ! Can not Boot Linux Kernel !! \n\r",bat_vol);
#ifndef NO_POWER_OFF
                        mt6575_power_off();
#endif
                        while (1) {
                                dprintf(CRITICAL, "If you see the log, please check with RTC power off API\n\r");
                        }
                }
        }
#endif
        return;
}
 /vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8167/mt_leds.c
1
2
3
4
5
6
7
8
9
10
11
12
13
void mt65xx_backlight_on( void)
{
     enum led_brightness backlight_level = get_cust_led_default_level();
    LEDS_INFO( "[LEDS]LK: mt65xx_backlight_on:level =  %d\n\r",backlight_level);
    mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, backlight_level);
    LEDS_INFO( "[LEDS]LK: mt65xx_leds_brightness_set is done\n");
}

void mt65xx_backlight_off( void)
{
    LEDS_INFO( "[LEDS]LK: mt65xx_backlight_off \n\r");
    mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF);
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
---------------------------------------------------------------------------------------------------------------------------------------------------------------
vendor\mediatek\proprietary\external\libshowlogo\charging_animation.cpp
#include <cutils/properties.h>        //Isaac add
/*
* Charging animation framebuffer related init
*
*/
int anim_fb_init(void)
{
   if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3))
    {
        phical_screen.rotation = 0; // 270 alter by Arvin
    } else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "90", 2)){
        phical_screen.rotation = 90;
    } else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3) && (phical_screen.need180Adjust == 1)){
        phical_screen.rotation = 180;
    } else {
        phical_screen.rotation = 0;        //Isaac charge aniamation big rotation
    }
}
/*
* Show first boot logo when phone boot up
* 这个不会跑,只是保持一致性
*/
void show_boot_logo(void)
{
        char propertiesValue[128];        //Isaac add
        if (MTK_LOG_ENABLE == 1) {
                SLOGD("Isaac [libshowlogo: %s %d]show boot logo, index = 0 \n",__FUNCTION__,__LINE__);
        }
        if (error_flag == 0) {
                if(property_get("ro.lvds.selectflag", propertiesValue, NULL)){
                        SLOGD("Isaac [show_boot_logo] ro.lvds.selectflag=%s\n", propertiesValue);
                        if(0 == strcmp(propertiesValue, "49")){        //0x31
                                anim_show_logo(BOOT_LOGO_INDEX);
                        }else{
                                #if defined(MTK_CARRIEREXPRESS_PACK)
                                        anim_show_logo(get_logo_index(true));  // return  kernel_logo_position
                                #else
                                        anim_show_logo(BOOT_LOGO_INDEX+COMPAT_LOGO_SHIFT);
                                #endif
                        }
                }else{
                        #if defined(MTK_CARRIEREXPRESS_PACK)
                                anim_show_logo(get_logo_index(true));        // return  kernel_logo_position
                        #else
                                anim_show_logo(BOOT_LOGO_INDEX+COMPAT_LOGO_SHIFT);
                        #endif
                }
  }
}
/*
* Show kernel logo when phone boot up
* 这个是kernel logo的显示函数
*/
void  show_kernel_logo()
{
        char propertiesValue[128];        //Isaac add
        if (MTK_LOG_ENABLE == 1) {
                SLOGD("Isaac [libshowlogo: %s %d]show kernel logo, index = 38 \n",__FUNCTION__,__LINE__);
        }
    if (error_flag == 0) {
           if(property_get("ro.lvds.selectflag", propertiesValue, NULL)){
                        SLOGD("Isaac [show_kernel_logo] ro.lvds.selectflag=%s\n", propertiesValue);
                        if(0 == strcmp(propertiesValue, "49")){        //0x31
                    anim_show_logo(BOOT_LOGO_INDEX);
            }else{
                    #if defined(MTK_CARRIEREXPRESS_PACK)
                            anim_show_logo(get_logo_index(false));  // return  kernel_logo_position
                    #else
                            anim_show_logo(BOOT_LOGO_INDEX+COMPAT_LOGO_SHIFT);
                    #endif
            }
    }else{
           #if defined(MTK_CARRIEREXPRESS_PACK)
                   anim_show_logo(get_logo_index(false));        // return  kernel_logo_position
           #else
                   anim_show_logo(kernel_logo_position+COMPAT_LOGO_SHIFT);
           #endif
    }
  }
}
---------------------------------------------------------------------------------------------------------------------------------------------
mediatek\proprietary\bootable\bootloader\lk\lib\libshowlogo\show_animation_common.c
/*
* Show new charging animation
*
*/
extern int LVDS_SELECT_FLAG;
// modify by xuce for charging animation start
void  fill_animation_battery_new(unsigned int capacity, void *fill_addr, void * dec_logo_addr, void * logo_addr, LCM_SCREEN_T phical_screen)
{
                LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
/*    if (capacity >= 100) {
        //show_logo(37); // battery 100
        if(LVDS_SELECT_FLAG){
                fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
              }else{
                fill_animation_logo(FULL_BATTERY_INDEX+COMPAT_LOGO_SHIFT, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                                }
    } else if (capacity < 10) {
        LOG_ANIM("[show_animation_common: %s %d]charging_low_index = %d\n",__FUNCTION__,__LINE__, charging_low_index);
        charging_low_index ++ ;
                                if(LVDS_SELECT_FLAG){
                fill_animation_logo(LOW_BAT_ANIM_START_0 + charging_low_index, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                fill_animation_number(NUMBER_PIC_START_0 + capacity, 1, fill_addr, logo_addr, phical_screen);
                fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
              }else{
                fill_animation_logo(LOW_BAT_ANIM_START_0+COMPAT_LOGO_SHIFT + charging_low_index, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                fill_animation_number(NUMBER_PIC_START_0+COMPAT_LOGO_SHIFT + capacity, 1, fill_addr, logo_addr, phical_screen);
                fill_animation_dynamic(NUMBER_PIC_PERCENT+COMPAT_LOGO_SHIFT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
                                }
        if (charging_low_index >= 9) charging_low_index = 0;
    } else {
        unsigned int capacity_grids = 0;
        //static RECT_REGION_T battery_rect = {CAPACITY_LEFT,CAPACITY_TOP,CAPACITY_RIGHT,CAPACITY_BOTTOM};
        capacity_grids = CAPACITY_BOTTOM - (CAPACITY_BOTTOM - CAPACITY_TOP) * (capacity - 10) / 90;
        LOG_ANIM("[show_animation_common: %s %d]capacity_grids : %d,charging_animation_index = %d\n",__FUNCTION__,__LINE__, capacity_grids,charging_animation_index);
        //background
        if(LVDS_SELECT_FLAG){
                fill_animation_logo(ANIM_V1_BACKGROUND_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                fill_animation_line(ANIM_LINE_INDEX, capacity_grids, fill_addr,  logo_addr, phical_screen);
                fill_animation_number(NUMBER_PIC_START_0 + (capacity/10), 0, fill_addr, logo_addr, phical_screen);
                fill_animation_number(NUMBER_PIC_START_0 + (capacity%10), 1, fill_addr, logo_addr, phical_screen);
                fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
                                }else{
                                        fill_animation_logo(ANIM_V1_BACKGROUND_INDEX+COMPAT_LOGO_SHIFT, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                fill_animation_line(ANIM_LINE_INDEX+COMPAT_LOGO_SHIFT, capacity_grids, fill_addr,  logo_addr, phical_screen);
                fill_animation_number(NUMBER_PIC_START_0+COMPAT_LOGO_SHIFT + (capacity/10), 0, fill_addr, logo_addr, phical_screen);
                fill_animation_number(NUMBER_PIC_START_0+COMPAT_LOGO_SHIFT + (capacity%10), 1, fill_addr, logo_addr, phical_screen);
                fill_animation_dynamic(NUMBER_PIC_PERCENT+COMPAT_LOGO_SHIFT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
                                }
                                if (capacity <= 90)
                                {
                                        RECT_REGION_T top_animation_rect = {TOP_ANIMATION_LEFT, capacity_grids - (TOP_ANIMATION_BOTTOM - TOP_ANIMATION_TOP), TOP_ANIMATION_RIGHT, capacity_grids};
                                        //top_animation_rect.bottom = capacity_grids;
                                        //top_animation_rect.top = capacity_grids - top_animation_height;
                                        charging_animation_index++;
                                        //show_animation_dynamic(15 + charging_animation_index, top_animation_rect, top_animation_addr);
                                        if(LVDS_SELECT_FLAG){
                                                fill_animation_dynamic(BAT_ANIM_START_0 + charging_animation_index, top_animation_rect, fill_addr, top_animation_addr, logo_addr, phical_screen);
                                        }else{
                                                fill_animation_dynamic(BAT_ANIM_START_0+COMPAT_LOGO_SHIFT + charging_animation_index, top_animation_rect, fill_addr, top_animation_addr, logo_addr, phical_screen);
                                        }
                                        if (charging_animation_index >= 9) charging_animation_index = 0;
         }
    }
*/
        if(LVDS_SELECT_FLAG == 0x31){
                if(  /*capacity > 0 && */capacity <= 15){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen); 
                }else if(capacity > 15 && capacity <= 30){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+1, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 30 && capacity <= 45){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+2, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 45 && capacity <= 60){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+3, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 60 && capacity <= 80){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+4, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 80 && capacity <= 100){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+5, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }/*else if (capacity >= 100) {
                        LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);    
                } */
        }else{
                if(  /*capacity > 0 && */capacity <= 15){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT, fill_addr, dec_logo_addr, logo_addr,phical_screen); 
                }else if(capacity > 15 && capacity <= 30){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT+1, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 30 && capacity <= 45){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT+2, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 45 && capacity <= 60){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT+3, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 60 && capacity <= 80){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT+4, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }else if(capacity > 80 && capacity <= 100){
                        //LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
            fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX+COMPAT_LOGO_SHIFT+5, fill_addr, dec_logo_addr, logo_addr,phical_screen);
                }/*else if (capacity >= 100) {
                        LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
                        fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);    
                } */
        }
}
/*
* Show charging animation by version
*
*/
void fill_animation_battery_by_ver(unsigned int capacity,void *fill_addr, void * dec_logo_addr, void * logo_addr,
                        LCM_SCREEN_T phical_screen, int version)
{
    LOG_ANIM("Isaac lk-lib [show_animation_common: %s %d]version : %d\n",__FUNCTION__,__LINE__, version);
    switch (version)
    {
        case VERION_OLD_ANIMATION:
            fill_animation_battery_old(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
            break;
        case VERION_NEW_ANIMATION:
             fill_animation_battery_new(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
            break;
        case VERION_WIRELESS_CHARGING_ANIMATION:
            fill_animation_battery_wireless_charging(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
            break;
        default:
            fill_animation_battery_old(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
            break;
    }
}
---------------------------------------------------------------------------------------------------------------------------------------------
vendor\mediatek\proprietary\external\libshowlogo\show_animation_common.c
 C Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <cutils/properties.h>         //Isaac add

//add by laiyw start
void fill_animation_battery_fast_new( int capacity,  void *fill_addr,  void *dec_logo_addr,  void *logo_addr, LCM_SCREEN_T phical_screen)
{
     int capacity_index = capacity /  20;
     int temp = charging_low_index + capacity_index ;

    int display_width = phical_screen.width;  //如果充电动画百分比花屏,就调换一下宽高
    int display_height = phical_screen.height;

     int curr_left =  0;
     int num_width =  0;
     int num_height =  0;
     int top_margin_height =  0;
     char propertiesValue[ 128];         //Isaac add

    num_width = LOGO_NUM_WIDTH(display_width);
    num_height = LOGO_NUM_HEIGHT(display_height);
    top_margin_height = LOGO_TOP_MARGIN(display_height);
     if (MTK_LOG_ENABLE ==  1){
        SLOGE( " Isaac external [show_animation_common: %s %d]capacity : %d, num_width:%d, num_height:%d, top_margin_height:%d\n", __FUNCTION__, __LINE__, capacity, num_width, num_height, top_margin_height);
    }

    temp >=  5 ? charging_low_index =  0 : charging_low_index++;
     if (MTK_LOG_ENABLE ==  1){
        SLOGE( " Isaac external [show_animation_common: %s %d]charging_low_index = %d,capacity : %d\n", __FUNCTION__, __LINE__, charging_low_index, capacity);
    }

    property_get( "ro.lvds.selectflag", propertiesValue,  NULL))

     if( 0 == strcmp(propertiesValue,  "49"))          //0x31
    {
         if (capacity >=  100){
            fill_animation_logo(FAST_CHARGING_BAT_100_INDEX, fill_addr, dec_logo_addr, logo_addr, phical_screen);
        } else{
            fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX + charging_low_index + capacity_index, fill_addr, dec_logo_addr, logo_addr, phical_screen);

            curr_left = (display_width - num_width *  2) >>  1;
             unsigned  short tmp_num_addr[( int)phical_screen.width * phical_screen.height /  20];

             if (capacity >=  10){
                curr_left = (display_width - num_width *  3) >>  1;
                RECT_REGION_T tmp_rect_1 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
                 if (MTK_LOG_ENABLE ==  1){
                    SLOGE( " Isaac external [show_animation_common: %s %d]capacity = %d, show 1nd num : %d\n", __FUNCTION__, __LINE__, capacity, capacity /  10);
                }
                fill_animation_dynamic(FAST_CHARGING_NUM_START_0_INDEX + (capacity /  10), tmp_rect_1, fill_addr, tmp_num_addr, logo_addr, phical_screen);
                curr_left += num_width;
            }
            RECT_REGION_T tmp_rect_2 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
             if (MTK_LOG_ENABLE ==  1){
                SLOGE( " Isaac external [show_animation_common: %s %d]capacity = %d, show 2st num : %d\n", __FUNCTION__, __LINE__, capacity, capacity %  10);
            }
            fill_animation_dynamic(FAST_CHARGING_NUM_START_0_INDEX + (capacity %  10), tmp_rect_2, fill_addr, tmp_num_addr, logo_addr, phical_screen);

            curr_left += num_width;
            RECT_REGION_T tmp_rect_3 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
             if (MTK_LOG_ENABLE ==  1){
                SLOGE( " Isaac external [show_animation_common: %s %d]show percent \n", __FUNCTION__, __LINE__);
            }
            fill_animation_dynamic(FAST_CHARGING_NUM_PERCENT_INDEX, tmp_rect_3, fill_addr, tmp_num_addr, logo_addr, phical_screen);
        }
    } else{
         if (capacity >=  100){
            fill_animation_logo(FAST_CHARGING_BAT_100_INDEX + COMPAT_LOGO_SHIFT, fill_addr, dec_logo_addr, logo_addr, phical_screen);
        } else{
            fill_animation_logo(FAST_CHARGING_BAT_START_0_INDEX + COMPAT_LOGO_SHIFT + charging_low_index + capacity_index, fill_addr, dec_logo_addr, logo_addr, phical_screen);

            curr_left = (display_width - num_width *  2) >>  1;
             unsigned  short tmp_num_addr[( int)phical_screen.width * phical_screen.height /  20];

             if (capacity >=  10){
                curr_left = (display_width - num_width *  3) >>  1;
                RECT_REGION_T tmp_rect_1 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
                 if (MTK_LOG_ENABLE ==  1){
                    SLOGE( " Isaac external [show_animation_common: %s %d]capacity = %d, show 1nd num : %d\n", __FUNCTION__, __LINE__, capacity, capacity /  10);
                }
                fill_animation_dynamic(FAST_CHARGING_NUM_START_0_INDEX + COMPAT_LOGO_SHIFT + (capacity /  10), tmp_rect_1, fill_addr, tmp_num_addr, logo_addr, phical_screen);
                curr_left += num_width;
            }
            RECT_REGION_T tmp_rect_2 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
             if (MTK_LOG_ENABLE ==  1){
                SLOGE( " Isaac external [show_animation_common: %s %d]capacity = %d, show 2st num : %d\n", __FUNCTION__, __LINE__, capacity, capacity %  10);
            }
            fill_animation_dynamic(FAST_CHARGING_NUM_START_0_INDEX + COMPAT_LOGO_SHIFT + (capacity %  10), tmp_rect_2, fill_addr, tmp_num_addr, logo_addr, phical_screen);

            curr_left += num_width;
            RECT_REGION_T tmp_rect_3 = {curr_left, top_margin_height, curr_left + num_width, top_margin_height + num_height};
             if (MTK_LOG_ENABLE ==  1){
                SLOGE( " Isaac external [show_animation_common: %s %d]show percent \n", __FUNCTION__, __LINE__);
            }
            fill_animation_dynamic(FAST_CHARGING_NUM_PERCENT_INDEX + COMPAT_LOGO_SHIFT, tmp_rect_3, fill_addr, tmp_num_addr, logo_addr, phical_screen);
        }
    }
}
//add by laiyw end Isaac
 C Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
* Show charging animation by version
*
*/

void fill_animation_battery_by_ver( int capacity,  void *fill_addr,  void * dec_logo_addr,  void * logo_addr,
                        LCM_SCREEN_T phical_screen,  int version)
{
     if (MTK_LOG_ENABLE ==  1) {
        SLOGE( " Isaac external [show_animation_common: %s %d]version : %d\n",__FUNCTION__,__LINE__, version);
    }
     switch (version)
    {
         case VERION_OLD_ANIMATION:
            fill_animation_battery_old(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);

             break;
         case VERION_NEW_ANIMATION:
//modify by laiyw  start Isaac 更换为快充动画
           //  fill_animation_battery_new(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
          fill_animation_battery_fast_new(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);
//modify by laiyw  end
             break;
         case VERION_WIRELESS_CHARGING_ANIMATION:
            fill_animation_battery_wireless_charging(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);

             break;
         default:
            fill_animation_battery_old(capacity, fill_addr, dec_logo_addr, logo_addr, phical_screen);

             break;
    }
}
--------------------------------------------------8321 7.0更换开机动画-------------------------------------------------------------
frameworks\base\data\sounds\AllAudio.mk
    $(LOCAL_PATH)/bootanimation.zip:system/media/bootanimation.zip \
    $(LOCAL_PATH)/bootanimation2.zip:system/media/bootanimation2.zip \
/frameworks/base/cmds/bootanimation/BootAnimation.cpp
/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp
#define SYSTEM_BOOTANIMATION_FILE_TWO "/system/media/bootanimation2.zip"
void BootAnimation::initBootanimationZip() {
...
    if (zipFile == NULL) {
        // If the device has encryption turned on or is in process
        // of being encrypted we show the encrypted boot animation.
        char decrypt[PROPERTY_VALUE_MAX];
        //lwj add begin
        char logo_anim_index[PROPERTY_VALUE_MAX];
        //lwj add end
...
    //lwj add begin
    property_get("persist.sys.kernel.logo_anim", logo_anim_index, "");
            if (0 == strcmp(logo_anim_index, "logo_anim_two") && (access(SYSTEM_BOOTANIMATION_FILE_TWO, R_OK) == 0))
            {
                zipFile = ZipFileRO::open(SYSTEM_BOOTANIMATION_FILE_TWO);
                ZipFileName = SYSTEM_BOOTANIMATION_FILE_TWO;
                ALOGD("BootAnimation SYSTEM_BOOTANIMATION_FILE_TWO");
            }
            //lwj add end
            mZip = zipFile;
            mZipFileName = ZipFileName;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值