根据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显示
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(
dev,
start_addr, (uchar*)
addr,
length,
part->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_logo和
mt_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
//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;
}