一.proload電源管理分析
pmic_init
//detect V battery Drop
pmic_DetectVbatDrop(); //檢測是否是PMIC_VBAT_DROP
pmic_read_interface( MT6328_STRUP_CON9, (&just_rst), MT6328_PMIC_JUST_PWRKEY_RST_MASK, MT6328_PMIC_JUST_PWRKEY_RST_SHIFT );
pmic_config_interface(MT6328_STRUP_CON9, 1, MT6328_PMIC_CLR_JUST_RST_MASK, MT6328_PMIC_CLR_JUST_RST_SHIFT);
if(just_rst)
vbat_status = PMIC_VBAT_DROP;
else
vbat_status = PMIC_VBAT_NOT_DROP;
if(hw_check_battery()==1) //探測電池是否存在,如果存在
pmic_disable_usbdl_wo_battery(); //關閉usb下載模式
pmic_6328_efuse_management //pmic熔斷保護機制,比電池過壓保護等
upmu_set_rg_vio18_184(); //設置VIO18的校准電壓
mt6311_driver_probe();
mt6311_hw_component_detect
update_mt6311_chip_id(); //獲取id,看看pmic是否存在
if(g_mt6311_hw_exist==1)
mt6311_hw_init //硬件寄存器的一些初始化
g_mt6311_driver_ready=1;
pl_check_bat_protect_status //檢測電池狀態,//單獨分析1
//單獨分析1
pl_check_bat_protect_status //檢測電池狀態
bat_val = get_bat_sense_volt(5); //得到bat sense電壓
chr_volt= get_charger_volt(1); //得到charger電壓
#if defined(MTK_FAN5405_SUPPORT)
fan5405_hw_init(); //如果是fan5404需要初始化一下
#endif
while (bat_val < BATTERY_LOWVOL_THRESOLD) //mtk默認3.3v,宇龍1.5v
{ mtk_wdt_restart //重新開始看門狗計數
if(upmu_is_chr_det() == KAL_FALSE) //如果沒有充電器
break
chr_volt= get_charger_volt(1); //charge電壓大於6.5v
break;
pchr_turn_on_charging
pmic_config_interface(MT6328_PMIC_RG_CS_VTH_ADDR,0xc 。。) //450ma
#if defined(MTK_FAN5405_SUPPORT)
fan5405_turn_on_charging(); //如果電壓fan5405啟動充電
#endif
for(i=0;i<10;i++)
{ current=get_charging_current(1);
chr_volt=get_charger_volt(1);
if(current<100 && chr_volt<4400) //如果電流小於100 && 電壓低於4400V
cnt++;
}
if(cnt>=8) //大於8就直接停止充電
pchr_turn_on_charging(KAL_FALSE);
bat_val = get_bat_sense_volt(5);
}
二.LK電源管理相關
Mt_battery.c (bootable\bootloader\lk\platform\mt6735)
#if defined(MTK_BQ24296_SUPPORT)
#define SWCHR_POWER_PATH //帶路徑管理的充電芯片
#endif
mt65xx_bat_init
#if defined(SWCHR_POWER_PATH)
bat_vol = get_i_sense_volt(1); //ADC_isense
#else
bat_vol = get_bat_sense_volt(1); //ADC_batsense
#endif
#if defined(MTK_FAN5405_SUPPORT) //resolve 5405 register lock
pchr_turn_on_charging(KAL_TRUE); //開始充電
#endif
if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (pmic_get_register_value(PMIC_PWRKEY_DEB)==0) ) //電源鍵沒有按下
g_boot_reason_change = true; //充電啟動模式
rtc_boot_check(false); //不是定時器啟動
if (bat_vol < BATTERY_LOWVOL_THRESOLD) //MTK默認是3.45V,如果小於3.45在里面循環充電,大於就跳出開機,單獨分析1
fgauge_initialization(NULL); //初始化 fgauge
pchr_turn_on_charging(KAL_FALSE); //關閉充電
get_dlpt_imix_r(); //得到電阻值
pchr_turn_on_charging(KAL_TRUE); //開始充電
check_bat_protect_status //看單獨分析1里面的check_bat_protect_status
單獨分析1
if (bat_vol < BATTERY_LOWVOL_THRESOLD) //MTK默認是3.45V,如果小於3.45在里面循環充電,大於就跳出開機
if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE) //關機充電模式
check_bat_protect_status
#if defined(SWCHR_POWER_PATH)
bat_val = get_i_sense_volt(5);
#else
bat_val = get_bat_sense_volt(5);
#endif
while (bat_val < BATTERY_LOWVOL_PROTECT) //小於3.3V
mtk_wdt_restart(); //重啟看門狗
pchr_turn_on_charging(KAL_TRUE); //開始充電
設置pmic充電電流等......
bq24296_hw_init(); //充電芯片初始化設置
bq24296_charging_enable(bEnable); //開始充電
bq24296_dump_register //打印充電芯片寄存器值
mdelay(5000); //5S
#if defined(SWCHR_POWER_PATH) //再次讀取電池電壓
bat_val = get_i_sense_volt(5);
#else
bat_val = get_bat_sense_volt(5);
#endif
else //正常開機
mt_disp_show_low_battery(); //顯示低電圖片
init_fb_screen();
fill_animation_logo(LOW_BATTERY_INDEX, mt_get_fb_addr(), mt_get_tempfb_addr(), logo_addr, phical_screen);
mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LOW_BAT_LEDS_BRIGHT); //設置背光亮度