概述
客户要求:
1. 3.45以下lk充电
2. 3.45 - 3.6 kernel充电
3. 3.6以上自动开机
-----------------------------------------------------------------------------
vendormediatekproprietarybootablebootloaderlkplatformmt8163platform.c
void platform_init(void)
{
......
#ifdef LK_PROFILING
time_bat_init = get_timer(0);
#endif
mt65xx_bat_init(); //Isaac check if it's low battery!!!
......
#ifdef MTK_KERNEL_POWER_OFF_CHARGING
if (kernel_charging_boot() == 1) { //Isaac judge boot mode
......
}
vendormediatekproprietarybootablebootloaderlkplatformmt8163mt_battery.c
#if defined(CUST_BATTERY_LOWVOL_THRESOLD) //Isaac no
#define BATTERY_LOWVOL_THRESOLD CUST_BATTERY_LOWVOL_THRESOLD
#else
#define BATTERY_LOWVOL_THRESOLD 3450 //3450 Isaac
#endif
void mt65xx_bat_init(void)
{
kal_int32 bat_vol;
// 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
pchr_turn_on_charging(KAL_TRUE);
//dprintf(CRITICAL, "[mt65xx_bat_init] check VBAT=%d mV with %d mVn", bat_vol, BATTERY_LOWVOL_THRESOLD);
printf("Isaac [mt65xx_bat_init] check VBAT=%d mV with %d mVn", bat_vol, BATTERY_LOWVOL_THRESOLD); //Isaac
if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (upmu_get_pwrkey_deb()==0) ) {
dprintf(CRITICAL, "[mt65xx_bat_init] KPOC+PWRKEY => change boot moden");
g_boot_reason_change = true;
}
rtc_boot_check(false);
#ifndef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION //Isaac no
#ifndef MTK_BATLOWV_NO_PANEL_ON_EARLY //Isaac no
if (bat_vol < BATTERY_LOWVOL_THRESOLD)
#else
if (is_low_battery(bat_vol))
#endif
{
if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE)
{
dprintf(CRITICAL, "[%s] Kernel Low Battery Power Off Charging Moden", __func__);
g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT;
#ifndef SWCHR_POWER_PATH
check_bat_protect_status(); //Isaac LOOP CHARGE!!!
#endif
return;
}
else
{
dprintf(CRITICAL, "[BATTERY] battery voltage(%dmV) <= CLV ! Can not Boot Linux Kernel !! nr",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 APInr");
}
}
}
#endif
return;
}
------------------------------------------------------------
vendormediatekproprietarybootablebootloaderlkplatformmt6580platform.c
int kernel_charging_boot(void)
{
//Isaac add for low power
int USB_BOOT_JUDGE = 0;
int My_bat_volt = get_bat_sense_volt(5);
if(My_bat_volt >=3590){
g_boot_mode = NORMAL_BOOT;
USB_BOOT_JUDGE = 1;
}
printf("Isaac My_bat_volt = %d, USB_BOOT_JUDGE = %dn", My_bat_volt, USB_BOOT_JUDGE);
//Isaac add for low power
if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) && upmu_is_chr_det() == KAL_TRUE) {
dprintf(INFO,"[%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) {
dprintf(INFO,"[%s] Kernel Power Off Charging without Charger/Usb n", __func__);
return -1;
} else
return 0;
}
kernel-3.18driverspowermediateklinear_charging.c
#include <mt-plat/mt_boot.h> //Isaac #include "mt_boot_common.h"
//Isaac add
#include <linux/reboot.h>
//#include <mt-plat/mt_boot_common.h> //boot_mode_t get_boot_mode()
//Isaac add
PMU_STATUS BAT_ConstantCurrentModeAction(void)
{
battery_log(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%d on %d !!nr",
BMT_status.CC_charging_time, BMT_status.total_charging_time);
BMT_status.PRE_charging_time = 0;
BMT_status.CC_charging_time += BAT_TASK_PERIOD;
BMT_status.TOPOFF_charging_time = 0;
BMT_status.total_charging_time += BAT_TASK_PERIOD;
ulc_cv_charging_current_flag = KAL_FALSE;
ulc_cv_charging_current = g_temp_CC_value;
printk("Isaac [BAT_ConstantCurrentModeAction] check VBAT=%d mVm, get_boot_mode() = %dn", BMT_status.bat_vol, get_boot_mode());
//Isaac add for low power charge
if ((BMT_status.bat_vol > 3620) && (get_boot_mode() == KERNEL_POWER_OFF_CHARGING_BOOT || get_boot_mode() == LOW_POWER_OFF_CHARGING_BOOT))
kernel_power_off();
//battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL);
//Isaac add for low power charge
if (BMT_status.bat_vol > v_cc2topoff_threshold)
BMT_status.bat_charging_state = CHR_TOP_OFF;
#if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) /* defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) */
/* no disable charging#else */
#else
{
kal_bool charging_enable = KAL_FALSE;
/* Charging 9s and discharging 1s : start */
battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
msleep(1000);
}
#endif
charging_current_calibration();
pchr_turn_on_charging();
return PMU_STATUS_OK;
}
在kernel阶段判断的电压要比lk阶段的启动电压要大,否则kernel充电到3.6自动关机重启后电压只有3.58,lk阶段判断启动电压不满足,继续充电,3.6关机,死循环!!
REFERENCE:
3.45V 以下关机充电 g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT //9
3.45V 以上关机充电 g_boot_mode = KERNEL_POWER_OFF_CHARGING_BOOT //8
kernel-3.18driversmiscmediatekincludemt-platmt_boot_common.h
/* return boot mode */
unsigned int get_boot_mode(void)
{
init_boot_common(__LINE__);
return g_boot_mode;
}
vendormediatekproprietarybootablebootloaderlkplatformmt8163includeplatformboot_mode.h
/* boot type definitions */
typedef enum
{
NORMAL_BOOT = 0,
META_BOOT = 1,
RECOVERY_BOOT = 2,
SW_REBOOT = 3,
FACTORY_BOOT = 4,
ADVMETA_BOOT = 5,
ATE_FACTORY_BOOT = 6,
ALARM_BOOT = 7,
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
KERNEL_POWER_OFF_CHARGING_BOOT = 8,
LOW_POWER_OFF_CHARGING_BOOT = 9,
#endif
FASTBOOT = 99,
DOWNLOAD_BOOT = 100,
UNKNOWN_BOOT
} BOOTMODE;
kernel-3.18driversmiscmediatekincludemt-platmt_boot_common.h
/* boot type definitions */
enum boot_mode_t {
NORMAL_BOOT = 0,
META_BOOT = 1,
RECOVERY_BOOT = 2,
SW_REBOOT = 3,
FACTORY_BOOT = 4,
ADVMETA_BOOT = 5,
ATE_FACTORY_BOOT = 6,
ALARM_BOOT = 7,
#if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)
KERNEL_POWER_OFF_CHARGING_BOOT = 8,
LOW_POWER_OFF_CHARGING_BOOT = 9,
#endif
DONGLE_BOOT = 10,
UNKNOWN_BOOT
};
/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8163/mt_pmic_mt6323.c
int get_bat_sense_volt(int times)
{
return PMIC_IMM_GetOneChannelValue(VBAT_CHANNEL_NUMBER,times,1);
}
int get_i_sense_volt(int times)
{
return PMIC_IMM_GetOneChannelValue(ISENSE_CHANNEL_NUMBER,times,1);
}
int get_charger_volt(int times)
{
return PMIC_IMM_GetOneChannelValue(VCHARGER_CHANNEL_NUMBER,times,1);
}
int get_tbat_volt(int times)
{
return PMIC_IMM_GetOneChannelValue(VBATTEMP_CHANNEL_NUMBER,times,1);
}
————————————————
版权声明:本文为CSDN博主「0_0i_i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chylovecsd/article/details/125349862
最后
以上就是冷艳小猫咪为你收集整理的插入USB开机的全部内容,希望文章能够帮你解决插入USB开机所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复