mtk 充电驱动中的bat_thread核心线程中做的主要事情
void BAT_thread(void)------------------------------核心线程中做的事情--------------------------
////////////////////////////////////////////////////////////////////////////////////////
static kal_bool battery_meter_initilized = KAL_FALSE;
////////////////////////////////////////////////////////////////////////////
// 0. 第一次执行时运行,获得开机显示电量,初始化电池算法 oam 参数
// 开机时就会运行,只会运行一次,对电池算法 oam 方案进行初始化, 并获得开机显示电量百分比
if (battery_meter_initilized == KAL_FALSE) {
// 进行的一系列的电池参数与温度对应关系的表格的初始化,并根据电池当前电压,hw ocv 取一个较合适值,
// 取合适值对应容量,再与 RTC 保存容量比较,选择一个合适量,为开机电池容量,最后初始化 oam 算法参数
battery_meter_initial(); /* move from battery_probe() to decrease booting time
使用battery_probe()中的amove运行以减少启动时间进程内容 */
/* 获得要监控的电量,(用这个电量反换出电压来校验?)*/
BMT_status.nPercent_ZCV = battery_meter_get_battery_nPercent_zcv();
battery_meter_initilized = KAL_TRUE;
#if defined(CONFIG_POWER_EXT)
#else
BMT_status.SOC = gFG_capacity_by_c; //soc 电池容量
BMT_status.UI_SOC = gFG_capacity_by_c;//soc UI上的电池容量
BMT_status.ZCV = battery_meter_get_battery_zcv();//开路电压
BMT_status.temperatureV = battery_meter_get_tempV();/* 这里用来获取电池 NTC 的电压 */
BMT_status.temperatureR = battery_meter_get_tempR(BMT_status.temperatureV);/* 获得 下拉电阻与 NTC 并并联的电压 */
BMT_status.bat_vol = battery_meter_get_battery_voltage(KAL_TRUE);// 获得 BATSNS 引脚电压
BMT_status.temperature = battery_meter_get_battery_temperature();/* 通过获得当前 NTC 电压,查表并进行线性插值法,得到当前的温度值 */
battery_update(&battery_main);
battery_log(BAT_LOG_CRTI,
"[battery_meter_initilized] uisoc=soc=%d.\n", gFG_capacity_by_c);
#endif
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1. 判断是插入的是否充电器还是电脑 USB,看能不能进行充电
// 如果连接的 USB 线为 USB 充电线,或者电脑 USB 线,则打开 USB,
// 这里会通过 BC1.1 来判断是电脑 USB 还是 USB 充电器,来决定充电电流
// 否则连接的不是充电线或者 USB 作为一个从设备使用,要断开 USB?
mt_battery_charger_detect_check();
if (fg_battery_shutdown)
return;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 2. 通过具体的充电芯片来获得电池信息,充电信息, 获得电池电量百分比
// 通过 oam 算法,获得电量百分比
mt_battery_GetBatteryData();
if (fg_battery_shutdown)
return;
if (BMT_status.charger_exist == KAL_TRUE)
check_battery_exist();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 3. 电池温度保护
// 电池温度检查,如果温度超过 60 度,关机重启
mt_battery_thermal_check();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 4. 电池状态检查
// 对电池状态进行检查,如果有问题,则会调用 printk() 进行打印
mt_battery_notify_check();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 5. 调用具本的硬件相关函数进行充电,充电时会进行 CC/CV 之类的状态机切换就是在这里进行的
// 如果存在充电线,则调用具体充电芯片相关的函数进行充电
if (BMT_status.charger_exist == KAL_TRUE && !fg_battery_shutdown) {
// 检查电池状态,设置到 BMT_status.bat_charging_state 中
mt_battery_CheckBatteryStatus();
// 充电策略,这里有两个文件: switch_charging.c 和 linear_charging.c
// 他们的关系是,如果定义了任一外部充电 IC,则选择 switch_charging.c 的函数,否则就是 linear_charging.c 的函数
// 这里就是调用具体的芯片的充电相关函数进行充电
mt_battery_charging_algorithm();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 6. 更新电池显示状态
// 更新设置节点的内容:
// /sys/class/power_supply/下的文件夹
// wireless_main
// battery_main
// ac_main
// usb_main
mt_battery_update_status();
mt_kpoc_power_off_check();
}