我们分Driver 、HAL 、APP 三层来分别说明
驱动层:
在"kernel-4.4/drivers/power/mediatek/battery_common.c" 文件中
电池初始化时会设置电池的最大充电温度:
#if defined(MAX_CHARGE_TEMPERATURE)
batt_cust_data.max_charge_temperature = MAX_CHARGE_TEMPERATURE;
#endif
MAX_CHARGE_TEMPERATURE 在文件中设置的值是50度
drivers/misc/mediatek/include/mt-plat/mt6771/include/mach/mtk_charging.h
#define MAX_CHARGE_TEMPERATURE 50
在函数 mt_battery_notify_VBatTemp_check 中,当 检查到 电池的温度超过MAX_CHARGE_TEMPERATURE这个设置时,就会将g_BatteryNotifyCode值设置为2,我们记住这个数字2,这个数字会在后续的应用中用到
static void mt_battery_notify_VBatTemp_check(void)
{
......
if (BMT_status.temperature >= batt_cust_data.max_charge_temperature) {
g_BatteryNotifyCode |= 0x0002;
battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too high)\n",
BMT_status.temperature);
}
......
BMT_status.temperature 的值通过读取电池的热感寄存器的值来获取的。
同时对g_BatteryNotifyCode 这个变量进行赋值的还有mt_battery_notify_VBat_check、mt_battery_notify_ICharging_check、mt_battery_notify_TotalChargingTime_check等函数。
g_BatteryNotifyCode 这个变量的值会存到sys文件系统下的一个属性文件中:"/sys/devices/platform/charger/BatteryNotify"
在驱动中对这个文件的读写操作进行实现:
static ssize_t show_BatteryNotify(struct device *dev, struct device_attribute *attr, char *buf)
{
battery_log(BAT_LOG_CRTI, "[Battery] show_BatteryNotify : %x\n", g_BatteryNotifyCode);
return sprintf(buf, "%u\n", g_BatteryNotifyCode);
}
static ssize_t store_BatteryNotify(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
/*char *pvalue = NULL;*/
int rv;
unsigned long reg_BatteryNotifyCode = 0;
battery_log(BAT_LOG_CRTI, "[Battery] store_BatteryNotify\n");
if (buf != NULL && size != 0) {
battery_log(BAT_LOG_CRTI, "[Battery] buf is %s and size is %Zu\n", buf, size);
rv = kstrtoul(buf, 0, ®_BatteryNotifyCode);
if (rv != 0)
return -EINVAL;
g_BatteryNotifyCode = reg_BatteryNotifyCode;
battery_log(BAT_LOG_CRTI, "[Battery] store code : %x\n", g_BatteryNotifyCode);
}
return size;
}
static DEVICE_ATTR(BatteryNotify, 0664, show_BatteryNotify, store_BatteryNotify);
HAL 层:
这里有一个进程叫做batteryWarning 的进程对电池的情况进行实时监控,其实这个进程监控的就是上面讲解的驱动里面写好的文件
"vendor/mediatek/proprietary/frameworks/opt/batterywarning/batterywarning.cpp"
#define FILE_NAME "/sys/devices/platform/charger/BatteryNotify"
void readType(char* buffer) {